在CMake中使用source_group来组织源文件(在本例中为Xcode),结果比预期更乏味。
set(REG1 ".*/some_folder1/")
set(REG2 ".*/some_folder2/")
set(REC ".*([.]cpp|[.]c)")
source_group("src" REGULAR_EXPRESSION "${REC}" )
source_group("src\\some_group" REGULAR_EXPRESSION "${REG1}${REC}" )
source_group("src\\some_other_group" REGULAR_EXPRESSION "${REG2}${REC}" )
我希望上面的内容将some_folder1中的所有源文件放在IDE中的src / some_group中,some_folder2放在src / some_other_group中,其余文件直接放在src组中。
但结果是所有文件都直接进入src组。
如果我删除第一个source_group-line并且只使用两个不重叠的:
source_group("src\\some_group" REGULAR_EXPRESSION "${REG1}${REC}" )
source_group("src\\some_other_group" REGULAR_EXPRESSION "${REG2}${REC}" )
行为几乎与预期一致。即匹配两个正则表达式的所有文件按预期组织,但其余文件进入由Xcode创建的默认“源文件”组(另一个IDE将具有不同的默认文件夹)。
所以看起来第一个source_group以某种方式覆盖剩下的两个,即使CMake的文档说明相反(摘自CMake关于source_group的文档):
如果文件与多个组匹配, 显式列出文件的LAST组将受到青睐,如果有的话。如果没有组 显式列出文件,其正则表达式与文件匹配的LAST组 将受到青睐。
这是由于我的一些误解还是CMake-> source_group实际上表现得与宣传不同?
我在OSX平台上使用cmake版本2.8.10。
答案 0 :(得分:3)
是的,看起来源组生成不正确。如果您对解决方法感兴趣,可以将第一个正则表达式重写为与其他组不匹配:
cmake_minimum_required(VERSION 2.8.4)
project(example_simple CXX)
file(
GLOB
src
"${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/src/*.c"
"${CMAKE_CURRENT_SOURCE_DIR}/headers/*.hpp"
"${CMAKE_CURRENT_SOURCE_DIR}/headers/*.h"
)
add_executable(simple_bin ${src})
set(REG_SRC ".*/src/")
set(REG_HDR ".*/headers/")
set(REG_EXT "[^/]*([.]cpp|[.]c|[.]h|[.]hpp)$")
source_group("src" REGULAR_EXPRESSION "${CMAKE_CURRENT_SOURCE_DIR}/${REG_EXT}")
source_group("src\\[sources]" REGULAR_EXPRESSION "${REG_SRC}${REG_EXT}")
source_group("src\\[headers]" REGULAR_EXPRESSION "${REG_HDR}${REG_EXT}")
或编写自己的正则表达式并使用FILES,而不是REGULAR_EXPRESSION:
cmake_minimum_required(VERSION 2.8.4)
project(example_simple CXX)
file(
GLOB
src
"${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/src/*.c"
"${CMAKE_CURRENT_SOURCE_DIR}/headers/*.hpp"
"${CMAKE_CURRENT_SOURCE_DIR}/headers/*.h"
)
add_executable(simple_bin ${src})
set(REG_SRC ".*/src/")
set(REG_HDR ".*/headers/")
set(REG_EXT ".*([.]cpp|[.]c|[.]h|[.]hpp)")
foreach(filename ${src})
string(REGEX MATCH "${REG_SRC}${REG_EXT}" match_group_sources ${filename})
string(REGEX MATCH "${REG_HRD}${REG_EXT}" match_group_headers ${filename})
if(match_group_sources)
list(APPEND group_sources ${filename})
elseif(match_group_headers)
list(APPEND group_headers ${filename})
else()
list(APPEND group_other ${filename})
endif()
endforeach()
source_group("src" FILES ${group_other})
source_group("src\\[sources]" FILES ${group_sources})
source_group("src\\[headers]" FILES ${group_headers})