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

  • 如何确保通过
    cmake
    传递到生成的makefile的
    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})