Свойство COMPILE_OPTIONS не заполнено в CMake - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь получить текущие флаги компиляции из цели (которые будут флагами по умолчанию из CMAKE_CXX_FLAGS_RELWITHDEBINFO), распечатать их, а затем заменить один из этих флагов и установить измененный список флагов с помощью target_compile_options.Однако этот пост только о первой части, в которой рассматриваются параметры компиляции.Я поставил вопросы / проблемы в комментариях прямо в коде ниже:

cmake_minimum_required(VERSION 3.13.2)
project(hello)
add_executable(hello WIN32 hello.cpp)

# target_compile_options(hello PUBLIC "$<$<CONFIG:RELWITHDEBINFO>:/Od>")
# (see below comment for this)

get_property(HELLO_GLOBAL_COMPILE_OPTIONS GLOBAL PROPERTY COMPILE_OPTIONS) # both GLOBAL and DIRECTORY return an empty variable
message(${HELLO_GLOBAL_COMPILE_OPTIONS})
# 1) => This returns an empty variable. Shouldn't this have been populated with the contents of CMAKE_CXX_FLAGS_RELWITHDEBINFO?

get_target_property(HELLO_COMPILE_OPTIONS hello COMPILE_OPTIONS)
get_target_property(HELLO_COMPILE_OPTIONS_INTERFACE hello INTERFACE_COMPILE_OPTIONS)
message(${HELLO_COMPILE_OPTIONS})
message(${HELLO_COMPILE_OPTIONS_INTERFACE})
# 2) => These both print HELLO_COMPILE_OPTIONS-NOTFOUND. Shouldn't they have been populated with the contents of CMAKE_CXX_FLAGS_RELWITHDEBINFO at this stage?

message(${CMAKE_CXX_FLAGS_RELWITHDEBINFO})
# This prints as expected, "/MD /Zi /O2 /Ob1 /DNDEBUG" (for MSVC).

3) Если я раскомментирую target_compile_options в 5-й строке, HELLO_COMPILE_OPTIONS возвращает $<$<CONFIG:RELWITHDEBINFO>:/Od>.Но не должен ли он также вернуть «глобальные» флаги из CMAKE_CXX_FLAGS_RELWITHDEBINFO?Поскольку исполняемый файл hello компилируется с и , глобальными флагами и флагами, прикрепленными к цели hello.

4) Может иметь значение: prop_tgt: документация COMPILE_OPTIONS говорит "Это свойство инициализируется свойством каталога COMPILE_OPTIONS при создании цели и используется генераторами для установки параметров компилятора." и prop_dir: документация COMPILE_OPTIONS говорит "Это свойство используется для инициализации целевого свойства COMPILE_OPTIONS при создании цели, которое используется генераторами для установки параметров компилятора." .

Так что яхочу сделать следующее.Я хочу получить флаги компиляции cmake-default для конфигурации RELWITHDEBINFO.Затем, для одной конкретной цели , я хочу заменить /O2 (по умолчанию) на /Od и установить параметры компиляции для этой цели на эти измененные.

Я могуПохоже, что не найти способ сделать это без изменения глобальных флагов (очень плохая практика), или дважды добавив опции компиляции для моей цели.

1 Ответ

0 голосов
/ 19 декабря 2018

1) Нет, COMPILE_OPTIONS является целевым свойством.Глобальной версии не существует, и она не найдена.

2) Нет, они инициализируются с помощью свойства directory через add_compile_options перед определением цели.Этого нет в скрипте и он не использует CMAKE_CXX_FLAGS_RELWITHDEBINFO вообще.Из-за этого целевое свойство не было определено.

3) Нет, поскольку CMAKE_CXX_FLAGS_RELWITHDEBINFO является переменной, а не свойством, и нет документации о том, что свойства инициализируются какими-либо переменными.

4) Именно поэтому ответы - «Нет», и в инициализации свойств не упоминаются переменные.

5) Вы можете сделать это, но это необходимо.Когда генератор собирает все различные параметры компиляции, он берется из переменных и свойств.Таким образом, все, что вы будете делать, это просто добавлять избыточные опции и новые.Он не заменяет старые.

Этот вопрос, похоже, связан с тем, который был задан вчера. Как переопределить флаг уровня оптимизации в современном CMake

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...