Как передать флаги C / CXX во внешний проект в CMake - PullRequest
0 голосов
/ 28 мая 2019

Я использую CMake для управления сборкой проекта, но есть некоторые подпроекты, которые нужно создавать с помощью автоинструментов. Я использую функцию ExternalProject в CMake для его сборки, но у меня возникают проблемы при передаче полного набора флагов 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      ""
)

Проблемные строки:

"CFLAGS=${CMAKE_C_FLAGS} ${OPENTHREAD_INCLUDE_ARG}"

В идеале это может быть что-то вроде ${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE}}, но это не работает из-за чувствительности к регистру имен переменных.

"CFLAGS=${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE}} ${OPENTHREAD_INCLUDE_ARG}"

Так что я думаю, что последний вариант - написать функцию, которая формирует CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE}, преобразует ее в верхнюю и затем расширяет ее, но это кажется довольно неуклюжим.

Существует ли какой-либо простой способ передачи стандартного базового набора флагов C / CXX во внешний проект без необходимости ручного жесткого кодирования для каждого типа сборки или добавления функций? Я ожидаю, что будут включены CMAKE_C_FLAGS по умолчанию и CMAKE_C_FLAGS_ * для типа сборки.

1 Ответ

1 голос
/ 29 мая 2019

Я все еще открыт для других ответов, но сейчас я остановился на создании заглавной версии 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()

Итак, отдельные строки флагавыглядит так:

"CFLAGS=${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${BUILD_TYPE_UC}} ${OPENTHREAD_INCLUDE_ARG}"

и полный вызов внешнего проекта довольно многолюден, но выглядит так:

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      ""
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...