Добавление опций компилятору извне cmake

163
18 апреля 2019, 20:00

Как передать cmake флаги компилятора, при этом не перезаписывая объявленные в CMakeLists, а добавляя к ним? Нужно изменить стандартную библиотеку для компиляции компилятором clang. В CMakeLists указаны -Wall и т.п. флаги, а внешне хочу добавить к ним -stdlib=libc++ (стандартная библиотека от llvm вместо libstdc++ от gcc).

Пробую вызывать cmake с опцией -DCMAKE_CXX_FLAGS="${CMAKE_CXX_FLAGS} -stdlib=libc++", однако появляются ошибки. Скорее всего потому что ${CMAKE_CXX_FLAGS} не подставляется в таком контексте. Если вызывать просто -DCMAKE_CXX_FLAGS="-stdlib=libc++", то по идее перезаписываются опции из CMakeLists и варнингов не будет. Как быть?

Answer 1

В CMakeLists.txt нужно правильно прописать установку переменных, упомянув предыдущее значение:

set (CMAKE_CXX_FLAGS "-Wall ${CMAKE_CXX_FLAGS}")

После этого ни каких дополнительных телодвижений совершать не надо. Просто передать -DCMAKE_CXX_FLAGS="<свои флаги>" cmake'у и всё будет работать.

Если флаги устанавливаются не таким способом, то изменить их разумными средствами невозможно.

Немного деталей как это работает

При вызове cmake -DCMAKE_CXX_FLAGS=<...> устанавливается кешированная переменная, которая сохраняется в CMakeCache.txt. В дальнейшем при выполнение команды set из CMakeLists.txt её значение будет использовано и дописано в необходимое место. При этом команда set устанавливает локальную переменную, значение которой не сохраняется, но применяется для последующих команд, как например add_executable.

Answer 2

CMAKE_<LANG>_FLAGS изначально инициализируется переменными окружения.

  • CMAKE_C_FLAGS инициализируется значением переменой окружения CFLAGS
  • CMAKE_CXX_FLAGS инициализируется значением переменой окружения CXXFLAGS
  • CMAKE_CUDA_FLAGS инициализируется значением переменой окружения CUDAFLAGS
  • CMAKE_Fortran_FLAGS инициализируется значением переменой окружения FFLAGS

Таким образом можно написать что-то вроде

cmake -E env CXXFLAGS="-stdlib=libc++" cmake #...
READ ALSO
Как прочитать NDEF сообщение? (M24SR04-Y)

Как прочитать NDEF сообщение? (M24SR04-Y)

У меня есть микросхема M24SR04-Y, на которую я записал информацию с помощью NFCМне нужно прочитать эту информацию, используя i2c

153
Класс - матрица со случайными значениями

Класс - матрица со случайными значениями

Цель - создать класс матрица, который бы умел создавать двумерные массивы заданных размеров, но со случайными значениямиМассив создаётся,...

143