3

在我的CMakeLists.txt中,全局 C 和 CXX 标志是使用命令add_definitions()add_compile_options 设置的

多次尝试检索 C/CXX 标志:

  1. ${CMAKE_C_FLAGS}并且${CMAKE_CXX_FLAGS}是空的
  2. ${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE}}是原始的默认 CMake 值
    (例如-gfor CMAKE_C_FLAGS_DEBUG
  3. ${CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}}和上面一样
  4. get_cmake_property(def COMPILE_DEFINITIONS)NOTFOUND
  5. get_cmake_property(opt COMPILE_OPTIONS)也是NOTFOUND

我想将我的自定义 C/CXX 标志传递给基于以下内容的外部项目./configure

ExternalProject_Add( my_external_lib
  DEPENDS            Threads::Threads
  SOURCE_DIR         ${CMAKE_CURRENT_LIST_DIR}
  BUILD_IN_SOURCE    1
  UPDATE_COMMAND     echo "Full clean" && make distclean
  CONFIGURE_COMMAND  ${CMAKE_CURRENT_LIST_DIR}/configure
       --prefix=${CMAKE_BINARY_DIR}
       --cc=${CMAKE_C_COMPILER}
       --cxx=${CMAKE_CXX_COMPILER}
       --CFLAGS=${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE}}
       --CXXFLAGS=${CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}}
       --LDFLAGS=${CMAKE_STATIC_LINKER_FLAGS_${CMAKE_BUILD_TYPE}}
       --ARFLAGS=${CMAKE_STATIC_LINKER_FLAGS_${CMAKE_BUILD_TYPE}}
       --enable-static
)

(1)如何获取add_definitions()add_compile_options设置的编译标志?

注意:我使用 CMake 版本 3.3.2


在写这个问题时,我意识到我想知道另一个问题:

我使用ccache./configure脚本看不到我的环境变量CCCXX当我这样设置它们时:

get_cmake_property(launcher   RULE_LAUNCH_COMPILE)
set(ENV{CC}  ${launcher} ${CMAKE_C_COMPILER})
set(ENV{CXX} ${launcher} ${CMAKE_CXX_COMPILER})

(2)以上这些 CMake 语句是否正确?


哎呀我又问了一个问题:

我从同一个变量中检索LDFLAGSand 。 (3)是否需要设置另一个 CMake 变量ARFLAGS${CMAKE_STATIC_LINKER_FLAGS}
ARFLAGS

4

1 回答 1

2

一篇文章中有几个问题,但都很简单:

  1. 明确的文档链接add_definitions()是指目录目标COMPILE_DEFINITION 属性。其中第一个是使用get_directory_property()提取的,第二个是使用get_target_property()提取的。它们中的任何一个也可以使用get_property()提取。get_cmake_property您尝试使用的在这里不适用(它用于其他类型的属性)。

  2. 您在配置步骤设置环境变量 CC 和 CXX ,但所有命令ExternalProject_Add都在构建步骤执行。

目前ExternalProject_Add不支持简单设置环境变量。正如此错误报告中所建议的,对于不带空格的设置变量值,您可以在命令前添加“VAR=VAL”子句。但是对于您的情况,由于逃避问题,这将不起作用。

另请参阅 CMake 常见问题解答:如何获取或设置环境变量?

[...] CMakeLists.txt 中的
环境变量仅对 cmake 本身生效(configure-time),因此您不能使用此方法设置自定义命令可能需要的环境变量(build-time)。除非各种 CMake 命令(例如,目前尚不支持)支持环境变量,可接受的解决方法可能是调用 shell 脚本,而不是包装要执行的命令。SETadd_custom_command()

用于设置环境变量并运行实际命令的简单包装脚本:

包装器.sh.in

export "CC=ccache @CMAKE_C_COMPILER@"
export "CXX=ccache @CMAKE_XX_COMPILER@"
eval "$*"

CMakeLists.txt

configure_file(wrapper.sh.in wrapper.sh @ONLY)
ExternalProject_Add(my_external_lib
    ...
    CONFIGURE_COMMAND /bin/sh ${CMAKE_CURRENT_BINARY_DIR}/wrapper.sh
        ${CMAKE_CURRENT_LIST_DIR}/configure ...
    BUILD_COMMAND /bin/sh ${CMAKE_CURRENT_BINARY_DIR}/wrapper.sh make
)

请注意,您应该为需要此变量的每个命令使用包装器。在您的情况下,这些是 CONFIGURE_COMMAND 和 BUILD_COMMAND。

  1. CMAKE_STATIC_LINKER_FLAGS 的文档说这些标志用于链接器,因此您可能会将它们用作 LDFLAGS。至于 ARFLAGS,它们直接硬编码为CMAKE_C_ARCHIVE_CREATE变量,包含ar. 默认情况下,此命令仅使用链接器标志,因此您的方法似乎也是正确的。
于 2016-01-13T00:24:53.733 回答