Получить флаги C/CXX, установленные командами add_definitions() и add_compile_options()
В моем CMakeLists.txt
Глобальные флаги C и CXX устанавливаются с помощью команд add_definitions() и add_compile_options.
Много попыток получить флаги C/CXX:
${CMAKE_C_FLAGS}
а также${CMAKE_CXX_FLAGS}
пусты${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE}}
исходное значение CMake по умолчанию
(например-g
заCMAKE_C_FLAGS_DEBUG
)${CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}}
так же, как и вышеget_cmake_property(def COMPILE_DEFINITIONS)
являетсяNOTFOUND
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 ответ
Несколько вопросов в одном посте, но все они просты:
Ссылка на документацию для
add_definitions()
явно ссылается на каталог и целевые свойства COMPILE_DEFINITION. Первый из них извлекается с помощью get_directory_property (), второй - с помощью get_target_property (). Любой из них также может быть извлечен с помощью get_property ().get_cmake_property
вы пытались использовать неприменимо здесь (это используется для другого типа свойств).Вы устанавливаете переменные среды 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.
- Документация для CMAKE_STATIC_LINKER_FLAGS гласит, что эти флаги используются для компоновщика, поэтому вы, вероятно, можете использовать их в качестве LDFLAGS. Что касается ARFLAGS, они жестко закодированы непосредственно в переменную CMAKE_C_ARCHIVE_CREATE, содержащую полную командную строку для
ar
, По умолчанию эта команда просто использует флаги компоновщика, поэтому ваш подход тоже выглядит правильным.