如何将 C/CXX 标志传递到 CMake 中的外部项目

Cia*_*ard 5 cmake

我使用 CMake 来驱动项目的构建,但有一些子项目需要使用自动工具构建。我使用 CMake 中的ExternalProject 功能来构建它,但在将完整的默认 C/CXX 标志集传递给子项目的配置脚本时遇到问题。

目前,我只传递 CMAKE_C_FLAGS、CMAKE_CXX_FLAGS 等。问题是,这不包括 build_type 特定标志,这会导致在使用调试信息(例如)进行编译时出现问题,因为我必须手动传播 -g 标志。

当前的外部项目配置如下所示:

ExternalProject_Add(
  openthread-build
  SOURCE_DIR ${openthread_SOURCE_DIR}
  BINARY_DIR ${openthread_BINARY_DIR}
  CONFIGURE_COMMAND cd ${openthread_SOURCE_DIR}
        COMMAND ${openthread_SOURCE_DIR}/configure ${OPENTHREAD_CONFIGURE_OPTS}
        "CXX=${CMAKE_CXX_COMPILER}"
        "CPP=${CMAKE_C_COMPILER} -E"
        "CC=${CMAKE_C_COMPILER}"
        "AR=${CMAKE_C_COMPILER_AR}"
        "RANLIB=${CMAKE_C_COMPILER_RANLIB}"
        "NM=${CMAKE_NM}"
        "STRIP=${CMAKE_STRIP}"
        "CFLAGS=${CMAKE_C_FLAGS} ${OPENTHREAD_INCLUDE_ARG}"
        "CPPFLAGS=${CMAKE_C_FLAGS} ${OPENTHREAD_INCLUDE_ARG}"
        "CXXFLAGS=${CMAKE_CXX_FLAGS} ${OPENTHREAD_INCLUDE_ARG}"
        "LDFLAGS=${CMAKE_EXE_LINKER_FLAGS}"
        "--host=${MACHINE_NAME}"
  BUILD_COMMAND ${OPENTHREAD_MAKE} ${OPENTHREAD_MAKE_ARGS}
  BUILD_ALWAYS ON
  DOWNLOAD_COMMAND  cd ${openthread_SOURCE_DIR} && ./bootstrap
  INSTALL_COMMAND   ""
  TEST_COMMAND      ""
)
Run Code Online (Sandbox Code Playgroud)

问题线是这样的:

"CFLAGS=${CMAKE_C_FLAGS} ${OPENTHREAD_INCLUDE_ARG}"
Run Code Online (Sandbox Code Playgroud)

理想情况下可能是类似 的东西${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE}},但由于变量名称区分大小写,这不起作用。

"CFLAGS=${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE}} ${OPENTHREAD_INCLUDE_ARG}"
Run Code Online (Sandbox Code Playgroud)

所以我想最后的选择是编写一个形成 的函数CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE},将其转换为 upper,然后扩展它,但这看起来相当笨重。

是否有任何简单的方法可以将 C/CXX 标志的默认基本集传递到外部项目,而不需要为每种构建类型进行手动硬编码或添加功能?我希望包含默认的 CMAKE_C_FLAGS 和构建类型的 CMAKE_C_FLAGS_* 。

Cia*_*ard 3

我仍然对其他答案持开放态度,但现在我已经决定创建 build_type 的大写版本,并使用它来提取 build_type 特定标志。

# get an uppercase version of the build type, for extracting build_type specific flags
if(CMAKE_BUILD_TYPE)
    string(TOUPPER ${CMAKE_BUILD_TYPE} BUILD_TYPE_UC)
endif()
Run Code Online (Sandbox Code Playgroud)

所以各个标志线看起来像:

"CFLAGS=${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${BUILD_TYPE_UC}} ${OPENTHREAD_INCLUDE_ARG}"
Run Code Online (Sandbox Code Playgroud)

完整的 externalproject 调用非常拥挤,但看起来像:

ExternalProject_Add(
  openthread-build
  SOURCE_DIR ${openthread_SOURCE_DIR}
  BINARY_DIR ${openthread_BINARY_DIR}
  CONFIGURE_COMMAND cd ${openthread_SOURCE_DIR}
        COMMAND ${openthread_SOURCE_DIR}/configure ${OPENTHREAD_CONFIGURE_OPTS}
        "CXX=${CMAKE_CXX_COMPILER}"
        "CPP=${CMAKE_C_COMPILER} -E"
        "CC=${CMAKE_C_COMPILER}"
        "AR=${CMAKE_C_COMPILER_AR}"
        "RANLIB=${CMAKE_C_COMPILER_RANLIB}"
        "NM=${CMAKE_NM}"
        "STRIP=${CMAKE_STRIP}"
        "CFLAGS=${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${BUILD_TYPE_UC}} ${OPENTHREAD_INCLUDE_ARG}"
        "CPPFLAGS=${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${BUILD_TYPE_UC}} ${OPENTHREAD_INCLUDE_ARG}"
        "CXXFLAGS=${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${BUILD_TYPE_UC}} ${OPENTHREAD_INCLUDE_ARG}"
        "LDFLAGS=${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS_${BUILD_TYPE_UC}}"
        "--host=${MACHINE_NAME}"
  BUILD_COMMAND ${OPENTHREAD_MAKE} ${OPENTHREAD_MAKE_ARGS}
  BUILD_ALWAYS ON
  DOWNLOAD_COMMAND  cd ${openthread_SOURCE_DIR} && ./bootstrap
  INSTALL_COMMAND   ""
  TEST_COMMAND      ""
)
Run Code Online (Sandbox Code Playgroud)