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

CMake generated makefile does not expand all `make` variables

我有一个由单独构建的模块组成的项目。一些模块仅使用 make,其他模块使用 cmake.

顶级项目有一个makefile,用于触发子模块的构建。顶部的 makefile 为 libs、include 和二进制文件的路径定义 make 变量。然后子模块使用这些变量。

我的问题是我无法将所有这些 make 变量传递给使用 cmake 的项目。

对于包含目录,CMakeLists.txt 中的解决方法有效:

INCLUDE_DIRECTORIES("/$(INCLUDE_DIR)")

字符串按原样一直传递到生成的 makefile,然后在构建时扩展 make。需要前导斜杠。没有它,INCLUDE_DIR 的内容将以 cmake 项目根为前缀(然后它被认为是相对路径)。

此解决方案不适用于 linking:

LINK_DIRECTORIES("/$(LIB_DIR)")

我在构建时看到的 link 命令具有文字字符串 -L/$(LIB_DIR)。删除前导斜杠会发出有关相对路径的警告,并且 link 命令仍然具有未扩展的 $LIB_DIR.

备用解决方案是让顶层 makefile 定义 CMAKE 变量。它应该工作正常,如果我不能让它工作,我可能会这样做。但是最好只定义一次这些变量,然后让其他一切都考虑到它们。

一种选择是使用环境变量来设置 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 缓存变量。