CMake生成的makefile不会扩展所有`make`变量

时间:2015-02-02 14:26:08

标签: cmake makefile

我有一个项目,包含单独构建的模块。有些模块仅使用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个变量。它应该工作正常,如果我不能使它工作,我可能会做的事情。但是,将这些变量定义一次并让其他所有变量都考虑在内就不错了。

1 个答案:

答案 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缓存变量。