Как передать 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 и варнингов не будет. Как быть?
В 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.
CMAKE_<LANG>_FLAGS изначально инициализируется переменными окружения.
Таким образом можно написать что-то вроде
cmake -E env CXXFLAGS="-stdlib=libc++" cmake #...
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости