CMake生成的makefile不会展开所有“make”变量
我有一个由单独构建的模块组成的项目。一些模块仅使用CMake生成的makefile不会展开所有“make”变量,cmake,makefile,Cmake,Makefile,我有一个由单独构建的模块组成的项目。一些模块仅使用make,其他模块使用cmake 顶层项目有一个makefile,用于触发子模块的构建。顶部的makefile为libs、includes和二进制文件的路径定义了make变量。然后子模块使用这些变量 我的问题是,我无法将所有这些make变量传递给使用cmake的项目 对于include目录,在CMakeLists.txt INCLUDE_DIRECTORIES("/$(INCLUDE_DIR)") 字符串按原样传递到生成的makefile,然后
make
,其他模块使用cmake
顶层项目有一个makefile,用于触发子模块的构建。顶部的makefile为libs、includes和二进制文件的路径定义了make
变量。然后子模块使用这些变量
我的问题是,我无法将所有这些make
变量传递给使用cmake
的项目
对于include目录,在CMakeLists.txt
INCLUDE_DIRECTORIES("/$(INCLUDE_DIR)")
字符串按原样传递到生成的makefile,然后在构建时通过make
展开。前导斜杠是必需的。如果没有它,INCLUDE_DIR
的内容将以cmake
项目根作为前缀(然后将其视为相对路径)
此解决方案不适用于链接:
LINK_DIRECTORIES("/$(LIB_DIR)")
我在构建时看到的link命令具有文本字符串-L/$(LIB_DIR)
。删除前导斜杠会发出有关相对路径的警告,并且link命令仍然具有未展开的$LIB_DIR
- 如何确保通过
传递到生成的makefile的cmake
变量make
的扩展工作正常?因为运行链接器的是LIB_DIR
(我想是吧?),我不明白为什么它不会扩展make
- 是否还有另一个不那么难看的解决方案,也就是为
修复它的解决方案INCLUDE\u DIR
备份解决方案是让顶级makefile定义
CMAKE
变量。它应该工作得很好,如果我不能让它工作的话,我可能会这么做。但最好只定义一次这些变量,并将其他所有因素都考虑在内。一个选项是使用环境变量设置CMake变量。例如:
set (INCLUDE_DIR $ENV{INCLUDE_DIR})
然后像使用其他CMake变量一样使用CMake变量:
INCLUDE_DIRECTORIES(${INCLUDE_DIR})
如果希望变量显示在cmake gui或cmake中,可以使用以下命令将其放入缓存:
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缓存变量 我会使用
$ENV{VAR}
来创建这些CMake变量,我的意思是set(INCLUDE_DIR$ENV{INCLUDE_DIR})
这很有效!回答这个问题,你就会得到荣誉。谢谢现在我用了最简单的方法:INCLUDE\u目录($ENV{INCLUDE\u DIR})
。