3

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 を削除し、重複しない 2 つの行のみを使用すると、次のようになります。

source_group("src\\some_group" REGULAR_EXPRESSION "${REG1}${REC}" )
source_group("src\\some_other_group" REGULAR_EXPRESSION "${REG2}${REC}" )

動作はほぼ意図したとおりです。つまり、2 つの正規表現に一致するすべてのファイルは意図したとおりに編成されますが、残りのファイルは Xcode によって作成されたデフォルトの「ソース ファイル」グループに移動します (別の IDE には別のデフォルト フォルダがあります)。

そのため、CMake のドキュメントで反対のことが述べられていても、最初の source_group が残りの 2 つを何らかの形でオーバーライドしているように見えます (source_group に関する CMake のドキュメントからの抜粋)。

ファイルが複数のグループに一致する場合、ファイルを明示的にリストする最後のグループがあれば優先されます。ファイルを明示的にリストするグループがない場合、正規表現がファイルに一致する LAST グループが優先されます。

これは私の一部の誤解によるものですか、それとも CMake->source_group は実際に宣伝されているものとは異なる方法で動作しますか?

OSX プラットフォームで cmake バージョン 2.8.10 を使用しています。

4

1 に答える 1

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

または、独自の正規表現順序を作成し、REGULAR_EXPRESSION の代わりに FILES を使用します。

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})
于 2013-07-05T10:26:27.383 に答える