【问题标题】:Upper level seeing a lower level option上层看到下层选项
【发布时间】:2013-05-11 05:53:56
【问题描述】:

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

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/“继承”缓存 var TOOLA_SUPPORT CMakeLists.txt

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 树的一部分)我想将 TOOLA_SUPPORT 从此 cmakelists 传递给 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 设置。

【问题讨论】:

    标签: cmake


    【解决方案1】:

    假设使用 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)
    

    输出为“ON”。

    我认为您遇到的问题是,一旦设置了缓存值,它就不会被更改,因此顶级值仍然存在。这就是 FORCE 的用武之地。

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

    【讨论】:

    • 我猜你的意思是 ADD_SUBDIRECTORY(),因为我找不到任何 ADD_DIRECTORY()。上层和下层的 cmakelists.txt 不能一起玩。上层 cmake 是运行上层范围内的下层 cmakelists。即没有传递任何较低的缓存设置,正在使用默认设置创建新的上层变量。我不想运行较低的 cmakelists.txt,只需获取缓存变量设置。这可能吗?
    • 通过编辑添加了更多细节,还修复了 ADD_SUBDIRECTORY() 错字,对此感到抱歉。
    • 在上面添加了 edit_1。这是我最近的尝试。我试图描述我所看到的。基本上,它没有做我想做的事,并在此过程中收到警告。 (很难描述。) dir-tree 问题似乎很重要。建议? (感谢您的宝贵时间。)
    • 我确实尝试了你的建议,但没有成功。
    • 从另一个中包含一个的全部意义在于它们将共享一个缓存文件。换句话说,从顶层构建整个事物。您将拥有一个缓存、一个构建目录等。我仍然不知道 COMPILER_FLAGS 应该来自哪里,或者为什么它不会按预期设置。我也看不到 TOOLA_SUPPORT 设置为 OFF 以外的任何位置,那么要继承什么? IF(TOOLA_SUPPORT) 表示如果关闭,则保持关闭。如果您需要更多帮助,请将您的示例修复为完整且可运行,并说明您希望输出的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多