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

Led*_*Led 3 cmake

在我项目的任何子目录中,应该可以在任何地方创建一个名为“ 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})
Run Code Online (Sandbox Code Playgroud)

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

正则表达式

然后我尝试使用REGEX。

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

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

foreach循环

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

Kam*_*olo 5

我想,方法之一就是这样:

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)
Run Code Online (Sandbox Code Playgroud)

只需/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)
Run Code Online (Sandbox Code Playgroud)

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

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

注意3:考虑到gg99的评论

  • 行`list (REMOVE_ITEM ${SOURCE_FILES} ${TMP_PATH})` 实际上应该是:`list (REMOVE_ITEM SOURCE_FILES ${TMP_PATH})` 即在 SOURCE_FILES 周围没有 ${} (2认同)