Получить флаги C/CXX, установленные командами add_definitions() и add_compile_options()

В моем 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 по умолчанию
    (например -g за 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 скрипт не видит мои переменные окружения CC а также CXX когда я установил их так:

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

(2) Правильны ли эти утверждения CMake?


Ой, у меня снова другой вопрос:

Я получаю LDFLAGS а также ARFLAGS из той же переменной ${CMAKE_STATIC_LINKER_FLAGS},
(3) Есть ли другая переменная CMake для установки ARFLAGS ?

1 ответ

Решение

Несколько вопросов в одном посте, но все они просты:

  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 FAQ: Как я могу получить или установить переменные окружения?

[...]
переменные среды SET в CMakeLists.txt действуют только для самого cmake (времяконфигурирования), поэтому вы не можете использовать этот метод для установки переменной окружения, которая может потребоваться пользовательской команде (времясборки). Запрет поддержки переменных окружения различными командами CMake (например, add_custom_command()(в настоящее время еще не поддерживается), приемлемый обходной путь может заключаться в том, чтобы вместо этого вызывать сценарии оболочки, которые обертывают команды, которые должны быть выполнены.

Простой скрипт- обертка для установки переменных окружения и запуска актуальной команды:

wrapper.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, По умолчанию эта команда просто использует флаги компоновщика, поэтому ваш подход тоже выглядит правильным.
Другие вопросы по тегам