2

我有带有子目录的项目,我想将每个目录的源列表分开。

我有:

SET( SUBDIR_SOURCES
  ${CMAKE_CURRENT_SOURCE_DIR}/a.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/b.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/c.cpp
  PARENT_SCOPE
)

我想要:

SET( SUBDIR_SOURCES
  a.cpp
  b.cpp
  c.cpp
  PARENT_SCOPE
)
some_magic_fuction( SUBDIR_SOURCES ${CMAKE_CURRENT_SOURCE_DIR} )
4

3 回答 3

2

some_magic_function传递源列表,首先您需要避免设置它们,PARENT_SCOPE因为它们在子目录的 CMakeList 范围内不可用。

您也不需要将 传递${CMAKE_CURRENT_SOURCE_DIR}给函数,因为无论函数本身在哪里定义,它都可以在函数内部使用。

因此,您可以执行以下操作:

SET( SUBDIR_SOURCES a.cpp b.cpp c.cpp )
some_magic_function( SUBDIR_SOURCES )
SET( SUBDIR_SOURCES ${SUBDIR_SOURCES} PARENT_SCOPE )

功能可能是:

FUNCTION( some_magic_function SOURCE_FILES )
  FOREACH( SOURCE_FILE ${${SOURCE_FILES}} )
    SET( MODIFIED ${MODIFIED} ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE_FILE} )
  ENDFOREACH()
  SET( ${SOURCE_FILES} ${MODIFIED} PARENT_SCOPE )
ENDFUNCTION()

在函数内部,${SOURCE_FILES}SUBDIR_SOURCES,所以我们需要使用${${SOURCE_FILES}}来获取实际的文件列表。

函数有自己的作用域,所以由于我们要替换SUBDIR_SOURCES函数外作用域内的值,所以需要PARENT_SCOPE在调用时使用SET( ${SOURCE_FILES}...

有关这些命令的更多信息,请运行:

cmake --help-command set
cmake --help-command function
于 2012-10-28T11:03:26.097 回答
2

我通常CMakeLists.txt为每个子目录编写一个小目录,它将该目录中的所有文件编译到一个库中。

在父目录中CMakeLists.txt,我将每个子目录添加到add_subdirectory( blah ).

如果您必须有一个指定的变量,以下应该可以工作(注意,我还没有实际测试过):

MACRO( prepend_path _srcs _path )
    unset( _tmp )
    foreach( src ${_srcs} )
        list( append _tmp ${_path}/${src} )
    endforeach( src ${_srcs} )
    set( _srcs ${_tmp} )
ENDMACRO( prepend_path _srcs )

这样称呼它:

prepend_path( SUBDIR_SOURCES ${CMAKE_CURRENT_SOURCE_DIR} )
于 2012-10-27T20:49:05.930 回答
0

我通常也更喜欢具有自己的局部变量范围的函数,但在您的情况下,我建议您编写自己的宏命令。

因此,采用 Fraser 的代码如下所示:

macro( set_subdir_sources )
    foreach( SOURCE_FILE ${ARGN} )
        set( SUBDIR_SOURCES ${SUBDIR_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE_FILE} )
    endforeach()
    set( SUBDIR_SOURCES ${SUBDIR_SOURCES} PARENT_SCOPE )
endmacro()

或使用相对路径:

macro( set_subdir_sources )
    get_directory_property( _PARENTDIR PARENT_DIRECTORY )
    file( RELATIVE_PATH _SUBDIR ${_PARENTDIR} ${CMAKE_CURRENT_SOURCE_DIR} )
    foreach( SOURCE_FILE ${ARGN} )
        set( SUBDIR_SOURCES ${SUBDIR_SOURCES} ${_SUBDIR}/${SOURCE_FILE} )
    endforeach()
    set( SUBDIR_SOURCES ${SUBDIR_SOURCES} PARENT_SCOPE )
endmacro()

只需致电:

set_subdir_sources( a.cpp b.cpp c.cpp )

无论如何,您的父母CMakeLists.txt都必须知道该SUBDIR_SOURCES变量。这还有一个优点,您可以在子目录的CMakeLists.txt.

但是你真的需要一个CMakeLists.txt一开始就没有定义自己的目标的子目录吗?我只是将源添加到您的父目录CMakeLists.txt

set( 
  SUBDIR_SOURCES
  SubDir/a.cpp
  SubDir/b.cpp
  SubDir/c.cpp
)

另请参阅多个库和可执行文件的 CMakeLists.txt 文件

于 2015-06-03T19:41:40.903 回答