1

我有一个构建多个库的较低级别的项目。上层获取库并将它们链接到许多可执行文件中。下层有这个选项:

option(TOOLA_SUPPORT "Ena/Disable toolA support" OFF) 

我想让上层构建看到TOOLA_SUPPORT来自下层构建的标志。就像现在一样,有 2 个TOOLA_SUPPORT标志。一个在下层,另一个在上层构建。这很麻烦,因为它们都需要处于相同的状态才能成功构建。

我不确定如何让一个 CMakeLists.txt 文件从另一个(缓存)继承标志。(只需要这个标志,而不是整个较低的 CMakeLists.txt/cache 设置。)哪些命令可能会有所帮助,或者在哪里查找信息?

Edit_1:(
dirUpper/src/CMakeLists.txt 不包含 dirLower)我希望这个 cmakelists 从dirLower /src/CMakeLists.txt “继承”缓存变量TOOLA_SUPPORT

option(TOOLA_SUPPORT "" OFF)  
add_subdirectory(${dirLower}/src ${dirLower}/lib EXCLUDE_FROM_ALL)
if(TOOLA_SUPPORT)
 link_directories(blah bla bla)
else()
 link_directories(blah bla)
endif()

dirLower/src/CMakeLists.txt (不是 dirUpper 树的一部分)我想将此 cmakelists 中的 TOOLA_SUPPORT 传递给dirUpper /src/cmakelists.txt

IF(NOT (${COMPILER_FLAGS} MATCHES "-Wall"))  #this only applies to dirLower
 MESSAGE(FATAL_ERROR "compiler flag not properly set") #will crash the dirUpper 'config'
ENDIF()
OPTION(TOOLA_SUPPORT "" OFF)
IF(TOOLA_SUPPORT)
 INCLUDE_DIRECTORIES(some/dir/include)
 SET(TOOLA_SUPPORT ON CACHE "" FORCE PARENT_SCOPE)
ELSE()
 MESSAGE("TOOLA is not supported")
 SET(TOOLA_SUPPORT OFF CACHE "" FORCE PARENT_SCOPE)
ENDIF()

当我运行 dirLower 文件时,我收到一个 cmake 警告,告诉我它没有父级。(不是 dirUpper 树的一部分)
当我运行 dirUpper 文件时,由于 dirLower 文件中的 COMPILER_FLAG 测试,我收到了一个致命错误。当我绕过这个问题时,我没有看到从 dirLower 继承的 TOOLA_SUPPORT 设置。

4

1 回答 1

0

假设使用 ADD_SUBDIRECTORY() 将下层“包含”在上层中,缓存变量应该已经在上层和下层之间共享。您可以使用命令行选项来设置值,或使用 SET( ... CACHE ... FORCE) 来确保按照您的实际意图设置值。然后只需从另一个级别引用它。

相反,如果您想要常规变量,则似乎在 ADD_DIRECTORY()之前设置的常规变量会向下传递到较低级别。并且要将常规变量向上传递一个级别,请使用 SET(... PARENT_SCOPE)。

编辑:

我的首要建议是用代码写出:在文件 ~/test/CMakeLists.txt 中:

OPTION(TOOLA_SUPPORT "" OFF)
ADD_SUBDIRECTORY(test2)
MESSAGE(STATUS "${TOOLA_SUPPORT}")

在文件 ~/test/test2/CMakeLists.txt 中:

SET(TOOLA_SUPPORT ON CACHE BOOL "" FORCE)

输出为“开”。

我认为您遇到的麻烦是,一旦设置了缓存值,它就不会被更改,因此顶级值保持不变。这就是 FORCE 的用武之地。

如果您仍然遇到困难,请发布一个最低限度的代码示例,以演示什么不起作用。

于 2013-05-06T18:00:05.780 回答