gpt4 book ai didi

c++ - CMake、source_group 使用不当或行为不正确?

转载 作者:太空狗 更新时间:2023-10-29 21:23:48 26 4
gpt4 key购买 nike

在 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}" )

行为几乎符合预期。 IE。所有匹配这两个正则表达式的文件都按预期组织,但其余文件进入 Xcode 创建的默认“源文件”组(不同的 IDE 将有不同的默认文件夹)。

所以看起来第一个 source_group 以某种方式覆盖了其余两个,即使 CMake 的文档说明相反(摘自 CMake 关于 source_group 的文档):

If a file matches multiple groups, the LAST group that explicitly lists the file will be favored, if any. If no group explicitly lists the file, the LAST group whose regular expression matches the file will be favored.

这是由于我的一些误解还是 CMake->source_group 实际上的行为方式与宣传的不同?

我在 OSX 平台上使用 cmake 版本 2.8.10。

最佳答案

是的,看起来源组生成不正确。如果您对解决方法感兴趣,您可以重写第一个正则表达式以不匹配其他组:

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})

关于c++ - CMake、source_group 使用不当或行为不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17364616/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com