在我项目的任何子目录中,应该可以在任何地方创建一个名为“ 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循环,但无法获得所有“隐藏”目录的列表。
我想,方法之一就是这样:
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的评论
| 归档时间: |
|
| 查看次数: |
11253 次 |
| 最近记录: |