如何使CMakeList.txt属于某个目标或文件夹?

时间:2015-08-19 14:34:18

标签: cmake

我举了下面的例子来说明我的问题。这些项目具有以下结构:

CMakeLists.txt
Dir1
Dir2
Dir3

在CMakeLists.txt中,我有以下定义:

macro(obtain_sublist result _curdir)
  set(curdir ${${_curdir}})
  FILE(GLOB children RELATIVE ${curdir} ${curdir}/*)
  SET(dirlist "")


  FOREACH(child ${children})
    IF(IS_DIRECTORY ${curdir}/${child})
        LIST(APPEND dirlist ${child})
    ENDIF()
  ENDFOREACH()
  SET(${result} ${dirlist})
endmacro()

set(curDir ${CMAKE_CURRENT_SOURCE_DIR})
obtain_sublist(subdir curDir)
foreach(var ${subdir})
    add_subdirectory(${var})
endforeach()

在每个子目录(Dir1, Dir2 and Dir3)内构建目标。当使用Visual Studio构建项目时,我可以清楚地观察到每个目标以及用于创建目标的相应CMakeLists.txt。但是,此示例中的顶级CMakeLists.txt在项目中是未显示的,因为它不会创建任何目标。有没有办法在项目中包含这个CMakeLists.txt?如果可能的话,我可以把它放在某个文件夹中吗?谢谢。

1 个答案:

答案 0 :(得分:1)

它应该已经出现在我认为的ALL_BUILD目标中。

如果需要,您可以创建一个自定义目标来保存它。在顶级CMakeLists.txt中:

add_custom_target(CMakeFiles SOURCES ${CMAKE_SOURCE_DIR}/CMakeLists.txt)

或者您可以将其添加到一个或多个或子目录中的现有目标。因此,在子目录CMakeLists.txt中,您可以添加:

add_executable(Dir1 dir1.cpp ${CMAKE_SOURCE_DIR}/CMakeLists.txt)

您可以使用source_group在VS解决方案中创建目标的子文件夹(不需要与实际的文件系统文件夹相关):

source_group("root" FILES ${CMAKE_SOURCE_DIR}/CMakeLists.txt)