2013-05-06 83 views
1

我有一个较低级别的项目,建立了几个库。上层使用库并将它们链接到许多可执行文件中。下层有此选项:上级看到较低级别的选项

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

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以 “继承” 缓存VAR TOOLA_SUPPORT(不是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设置。

回答

0

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

如果您需要常规变量,则看起来在之前设置的常规变量 ADD_DIRECTORY()会传递到较低级别。并且要传递一个常量变量UP,使用SET(... PARENT_SCOPE)。

编辑:

代码写出我最建议: 在文件〜/测试/的CMakeLists.txt:

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

在文件〜/测试/测试2 /的CMakeLists.txt:

SET(TOOLA_SUPPORT ON CACHE BOOL "" FORCE) 

输出为“ON”。

我认为你遇到的麻烦是一旦设置了缓存值,它就不会被改变,所以顶级值就成立了。这就是FORCE进来的地方。

如果你仍然有困难,请发布一个最小的代码示例,演示什么是不工作。

+0

我想你的意思是ADD_SUBDIRECTORY(),因为我找不到任何ADD_DIRECTORY()。上下级cmakelists.txt并不能很好地协同工作。上部cmake在上部范围内运行下部cmakelists。即没有更低的缓存设置正在传递,新的上部变量正在创建W /默认设置。我不想运行较低的cmakelists.txt,只需抓取一个缓存变量设置。那可能吗? – Doug 2013-05-07 15:48:34

+0

通过编辑添加了更多详细信息,并修复了ADD_SUBDIRECTORY()错字,对此感到抱歉。 – Peter 2013-05-07 19:00:56

+0

在上面添加了edit_1。这是我最近的尝试。我试图描述我所看到的。基本上,它没有做我想做的事,并且一路上发出警告。 (这很难描述。)dir-tree问题看起来很重要。建议? (感谢您的时间。) – Doug 2013-05-10 21:59:11

相关问题