CMake: установите ggc-min-expand и -heapsize с помощью target_compile_options - PullRequest
0 голосов
/ 07 сентября 2018

Минимальный рабочий пример внизу.

Давайте предположим, что я хочу изменить сборку мусора GCC для конкретной цели CMake, назовите ее foo. Мой инстинкт был бы попытаться, например:

target_compile_options(foo <PRIVATE|INTERFACE|PUBLIC> --param ggc-min-heapsize=32768) 

Это отлично работает. Но если я попробую:

target_compile_options(foo <PRIVATE|INTERFACE|PUBLIC> --param ggc-min-expand=1 --param ggc-min-heapsize=32768)

или

target_compile_options(foo <PRIVATE|INTERFACE|PUBLIC> --param ggc-min-expand=1)
target_compile_options(foo <PRIVATE|INTERFACE|PUBLIC> --param ggc-min-heapsize=32768)

Я получаю в ответ:

ggc-min-heapsize=32768: No such file or directory

Добавление кавычек вокруг аргументов или вокруг каждого аргумента не помогает. Я пробовал это на CMake 3.5.1 и 3.11, GCC 4.8 и GCC 7, без изменений.

Как ни странно, в старом стиле

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --param ggc-min-expand=1 --param ggc-min-heapsize=32768)

Кажется, работает просто отлично. Я что-то упускаю из-за современного использования target_compile_options?

Минимальный рабочий пример

CMakeLists.txt

cmake_minimum_required(VERSION 3.5.1 FATAL_ERROR)
project(test)

add_executable(test main.cpp) 
target_compile_options(test PRIVATE --param ggc-min-expand=1)
// Uncommenting the below causes compilation to fail
// target_compile_options(test PRIVATE --param ggc-min-heapsize=32768)

main.cpp

int main() {}

1 Ответ

0 голосов
/ 07 сентября 2018

Проблема в том, что флаги CMake для дедупликации передаются в target_compile_options, поэтому в конечном итоге он передает "--param gcc-min-expand = 1 gcc-min-heapsize = 32768" в gcc.Это явно неправильно.Есть проблема с людьми, жалующимися на это.

Чтобы обойти это, некоторые новые функции были недавно добавлены .Вы можете заключить опции в кавычки и добавить до SHELL:.Аргументы будут рассматриваться как единое целое для целей дедупликации, но будут передаваться в gcc как несколько аргументов (как если бы они были разделены вашей оболочкой).Это изменение было выпущено в CMake 3.12, поэтому версия из диспетчера пакетов вашего дистрибутива, вероятно, еще не имеет его.

cmake_minimum_required(VERSION 3.12.1 FATAL_ERROR)
project(example)

add_executable(example main.cpp) 
target_compile_options(example PRIVATE "SHELL:--param ggc-min-expand=1")
target_compile_options(example PRIVATE "SHELL:--param ggc-min-heapsize=32768")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...