我有一个项目,包含单独构建的模块。有些模块仅使用make
,其他模块使用cmake
。
顶级项目有一个makefile,用于触发子模块的构建。顶部的makefile定义了{lib},包含和二进制文件的make
变量。然后子模块使用这些变量。
我的问题是我无法将所有这些make
变量传递给使用cmake
的项目。
对于include目录,CMakeLists.txt
中的解决方法有效:
INCLUDE_DIRECTORIES("/$(INCLUDE_DIR)")
字符串一直传递给生成的makefile,然后在构建时由make
扩展。需要领先的斜线。没有它,INCLUDE_DIR
的内容会以cmake
项目根为前缀(然后将其视为相对路径)。
此解决方案不适用于链接:
LINK_DIRECTORIES("/$(LIB_DIR)")
我在构建时看到的链接命令具有文字字符串-L/$(LIB_DIR)
。删除前导斜杠会发出有关相对路径的警告,并且链接命令仍然是未展开的$LIB_DIR
。
make
变量LIB_DIR
通过cmake
传递给生成的makefile?由于它是make
运行链接器(我想?),我不明白为什么它不会扩展。INCLUDE_DIR
修复它的解决方案吗?备份解决方案是让顶级makefile定义CMAKE
个变量。它应该工作正常,如果我不能使它工作,我可能会做的事情。但是,将这些变量定义一次并让其他所有变量都考虑在内就不错了。
答案 0 :(得分:2)
一种选择是使用环境变量来设置CMake变量。例如:
set (INCLUDE_DIR $ENV{INCLUDE_DIR})
然后像其他CMake变量一样使用CMake变量:
INCLUDE_DIRECTORIES(${INCLUDE_DIR})
如果您希望变量显示在cmake-gui或ccmake中,您可以使用以下内容将其放入缓存中:
set(INCLUDE_DIR $ENV{INCLUDE_DIR} CACHE PATH "An environment variable containing a path" FORCE)
对于我的项目,我已将概念包装在cmake函数中:
function( define_from_environment VariableName PackageName)
if (NOT DEFINED ${VariableName})
message( STATUS "${VariableName}=$ENV{${VariableName}}" )
if (NOT "$ENV{${VariableName}}" STREQUAL "")
set(${VariableName} $ENV{${VariableName}} CACHE PATH "Set the path variable ${VariableName} for ${PackageName}" FORCE)
endif (NOT "$ENV{${VariableName}}" STREQUAL "")
endif(NOT DEFINED ${VariableName})
endfunction( define_from_environment)
此CMake功能的一个示例用法是
define_from_environment(GDCM_DIR GDCM)
如果设置了环境变量GDCM_DIR,则将CMake变量GDCM_DIR设置为CMake缓存变量。