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
.
- 如何确保通过
cmake
传递给生成的 makefile 的 make
变量 LIB_DIR
的扩展有效?因为它是 make
运行 linker(我想?)我不明白为什么它不会扩展。
- 是否还有另一个不那么难看的解决方案,也可以解决
INCLUDE_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 缓存变量。
我有一个由单独构建的模块组成的项目。一些模块仅使用 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
.
- 如何确保通过
cmake
传递给生成的 makefile 的make
变量LIB_DIR
的扩展有效?因为它是make
运行 linker(我想?)我不明白为什么它不会扩展。 - 是否还有另一个不那么难看的解决方案,也可以解决
INCLUDE_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 缓存变量。