从cmake源文件列表中排除文件结构中某个目录的目录

 手机用户2502872795 发布于 2023-01-07 08:04

在我项目的任何子目录中,应该可以在任何地方创建一个名为“ hide”的目录,并在其中放置一些代码文件(.c,.cpp,.h,...)。CMake将忽略那些文件。我该如何实现?有任何简单方法的建议吗?在网上搜索,但找不到解决方案。

我试过的

文件和全局

file(GLOB_RECURSE SOURCE_FILES "*.cpp" "*.c")
file(GLOB_RECURSE REMOVE_SOURCES  
  "*/hide/*"
  "${PROJECT_SOURCE_DIR}/CMakeFiles/*"
  "*main.c")
file(GLOB_RECURSE REMOVE_SOURCES "*/hide/*")
list(REMOVE_ITEM SOURCE_FILES ${REMOVE_SOURCES})

如果目录路径已知(如“ CMakeFiles”目录)或文件已知(如“ main.c”文件),则第二行工作正常。但是,如果字符串中有两个“ *”,则它不起作用。我找不到位于某处的目录的简单解决方案。

正则表达式

然后我尝试使用REGEX。

file(GLOB_RECURSE SOURCE_FILES "*.cpp" "*.c")
string(REGEX REPLACE ";.*/hide/.*;" ";" FOO ${SOURCE_FILES})

因为源文件列表用分号分隔,所以如果其中包含字符串“ hide”,则上面的行应将字符串从一个分号删除到另一个分号。该表达式似乎对分号有问题。使用任何分号会使命令一无所获。

foreach循环

我尝试了一些foreach循环,但无法获得所有“隐藏”目录的列表。

1 个回答
  • 我想,方法之一就是这样:

    set (EXCLUDE_DIR "/hide/")
    file (GLOB_RECURSE SOURCE_FILES "*.cpp" "*.c")
    foreach (TMP_PATH ${SOURCE_FILES})
        string (FIND ${TMP_PATH} ${EXCLUDE_DIR} EXCLUDE_DIR_FOUND)
        if (NOT ${EXCLUDE_DIR_FOUND} EQUAL -1)
            list (REMOVE_ITEM SOURCE_FILES ${TMP_PATH})
        endif ()
    endforeach(TMP_PATH)
    

    只需/hide/从列表中搜索字符串中的子字符串。如果找到子字符串---从列表中删除整个字符串。

    当心,这可能只是针对Linux的解决方案。并且可能不适用于较旧版本的CMake(根据此 <2.8.5 )。

    在上述情况下,您可以执行以下操作:

    # try to replace substring with empty string, compare to original:
    string (REPLACE ${EXCLUDE_DIR} "" REPLACED_PATH ${TMP_PATH})
    string (COMPARE EQUAL ${TMP_PATH} ${REPLACED_PATH} EXCLUDE_DIR_FOUND)
    

    注意: GLOB_RECURSE被认为是万恶之源。

    注意2:另一件事要注意-CMake将空变量与string匹配的错误。

    注意3:考虑到gg99的评论

    2023-01-07 08:14 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有