Как мне перейти с COMPILE_FLAGS на target_compile_options в CMake? - PullRequest
0 голосов
/ 05 марта 2020

У меня есть следующий код в CMakeLists.txt для установки некоторых флагов компилятора и компоновщика для моего проекта emscripten:

Старый, рабочий код

set_target_properties(prolog_bfs PROPERTIES COMPILE_FLAGS "-s USE_BOOST_HEADERS=1 -s DISABLE_EXCEPTION_CATCHING=0")
set_target_properties(prolog_bfs PROPERTIES LINK_FLAGS "--bind --emrun -s USE_BOOST_HEADERS=1 -s DISABLE_EXCEPTION_CATCHING=0")

Это прекрасно работает, и мой Компилятор вызывается с параметрами, как и должно (мне все еще интересно, откуда пробелы после em ++, но это не проблема):

em++    -s USE_BOOST_HEADERS=1 -s DISABLE_EXCEPTION_CATCHING=0 -std=gnu++17 -o xy.o -c xy.cpp

Однако, COMPILE_FLAGS и LINK_FLAGS устарела , поэтому я хочу перейти на новый / рекомендуемый подход использования target_compile_options() и target_link_options() вместо.

Таким образом, Я изменил свой CMakeLists.txt следующим образом:

Новый подход

target_compile_options(prolog_bfs PUBLIC -s USE_BOOST_HEADERS=1;-s DISABLE_EXCEPTION_CATCHING=0)
target_link_options(prolog_bfs PUBLIC --bind;--emrun;-s USE_BOOST_HEADERS=1;-s DISABLE_EXCEPTION_CATCHING=0)

Я понимаю, что функция параметров target _ * _ требует разделения флагов точкой с запятой, что я и сделал. Кроме того, я не вижу других существенных отличий.

Проблема

При построении моего проекта с этими изменениями компилятор будет вызываться так:

em++    -s USE_BOOST_HEADERS=1 DISABLE_EXCEPTION_CATCHING=0 -std=gnu++17 -o xy.o -c xy.cpp

Обратите внимание, что -s перед вторым флагом отсутствует , Я не понимаю, почему это исчезает. Интересно, что первый остается там.

Вопрос

Как мне преобразовать мой исходный код CMakeLists.txt в современный подход без потери -s?

1 Ответ

2 голосов
/ 06 марта 2020

По умолчанию CMake дедуплицирует Параметры компиляции и ссылки. Это явно указано в документации для команды target_compile_options. Кроме того, в документации предлагается использовать префикс SHELL: для избежания разбиения групп по следующим причинам:

Окончательный набор параметров компиляции или ссылки, используемых для цели, создается путем накопления параметров из текущей цели и требования к использованию его зависимостей. Набор параметров не дублируется, чтобы избежать повторения. Несмотря на то, что шаг устранения дублирования полезен для отдельных опций, он может разбить группы опций. Например, -D A -D B становится -D A B. Можно указать группу параметров, используя кавычки в виде оболочки вместе с префиксом SHELL:. Префикс SHELL: удаляется, а остальная часть строки параметров анализируется в режиме separate_arguments() UNIX_COMMAND. Например, "SHELL:-D A" "SHELL:-D B" становится -D A -D B.

То есть в вашем случае вы можете указать

target_compile_options(prolog_bfs PUBLIC "SHELL:-s USE_BOOST_HEADERS=1" "SHELL:-s DISABLE_EXCEPTION_CATCHING=0")
...