上层看到较低级别选项

时间:2013-05-06 16:27:31

标签: cmake

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

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

我想获得上层构建,以便从较低级别的构建中看到TOOLA_SUPPORT标志。就像现在一样,有2个TOOLA_SUPPORT标志。一个位于较低位置,另一个位于较高级别。这是一个麻烦,因为他们都需要处于相同的状态才能成功构建。

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

Edit_1
dirUpper/src/CMakeLists.txt(不包含dirLower)我希望这些cmakelists从 dirLower /src/CMakeLists.txt

继承“缓存var 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设置。

1 个答案:

答案 0 :(得分:0)

假设使用ADD_SUBDIRECTORY()将较低级别“包含”在较高级别中,则应该已经在高位和低位之间共享高速缓存变量。您可以使用命令行选项来设置值,或使用SET(... CACHE ... FORCE)以确保按实际意图设置值。然后从其他级别引用它。

如果您想要常规变量,那么在 ADD_DIRECTORY()之前将常规变量设置为向下传递到较低级别。要将常规变量UP传递给一个级别,请使用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)

输出为“ON”。

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

如果您仍然遇到问题,请发布一个最低限度的代码示例,说明哪些内容无效。