调用“find_path”后,Cmake“set”对同一个变量不起作用

时间:2011-02-15 16:19:49

标签: windows macos cmake

在Cmake模块中,我试图找到不同的路径。在某些情况下,我想在最初使用相同变量调用“find_path”后“设置”变量:

# general search for this include dir
find_path(LIBRARY_INCLUDE_DIR
  NAMES LibraryName/LibraryHeader.h
)

# specific option enabled by user
if(USE_OTHER_LIB)
find_path(OTHER_LIB_ROOT_DIR
  NAMES OtherLib/OtherLib.h
)
set(LIBRARY_INCLUDE_DIR ${OTHER_LIB_ROOT_DIR}/database/include)
endif(USE_OTHER_LIB)

这种方法在Windows XP(CMake 2.8.1)下运行良好。但是,它在Mac OS 10.6(CMake 2.8.3)下无效。有人知道mac / windows版本之间是否有区别以及如何解决这个问题?

非常感谢!

1 个答案:

答案 0 :(得分:5)

这是关于“set”和CMake缓存变量的常见误解。

该行:

set(LIBRARY_INCLUDE_DIR ${OTHER_LIB_ROOT_DIR}/database/include)

为LIBRARY_INCLUDE_DIR设置一个本地覆盖值,该值对CMakeLists文件的其余处理生效,但它对同名的缓存变量没有影响。因此,在cmake-gui或ccmake缓存编辑程序中可见。

如果你想让它可见,你必须强制它的值进入同名的缓存变量,可能是这样的:

set(LIBRARY_INCLUDE_DIR ${OTHER_LIB_ROOT_DIR}/database/include)
set(LIBRARY_INCLUDE_DIR ${LIBRARY_INCLUDE_DIR} CACHE FILEPATH "" FORCE)

然而,这通常不赞成,因为当最终用户调整cmake-gui程序中的值时,您的代码将使用FORCE-d值覆盖用户选择。所以...我建议你只使用你一直在使用的那条线:抵抗FORCE。

要确保它确实生效,只需在CMakeLists.txt的末尾添加此代码:

message(STATUS "LIBRARY_INCLUDE_DIR='${LIBRARY_INCLUDE_DIR}'")

所以......鉴于你的代码是正确的,必然会有其他事情导致你认为某些事情是错的。我很想知道那可能是什么......也许是你的下一个Stack Overflow问题。