cmake check_source_compiles: не перезапускается при непустом кеше
Для работы с временными зонами по условию поддержки компилятором std::chrono::time_zone или её отсутствию формируется условная компиляция и линковка libdate. Проверка осуществляется средствами cmake путем вызова
cmake_minimum_required(VERSION 3.15)
project(cmake-check)
set(CMAKE_CXX_EXTENSIONS OFF)
message("C++ standard: ${CMAKE_CXX_STANDARD}")
include(CheckSourceCompiles)
#unset(STL_TIME_ZONE) #не помогает
#set(STL_TIME_ZONE "" CACHE INTERNAL "" FORCE) #не помогает
check_source_compiles(CXX "
#include <chrono>
int main(){
std::chrono::time_zone* tz;
return 0;
}
" STL_TIME_ZONE)
message("stl time zone: ${STL_TIME_ZONE}")
- cmake version 3.28.3
- gcc 13
При запуске:
cmake -DCMAKE_BUILD_TYPE:STRING=Debug -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE -DCMAKE_C_COMPILER:FILEPATH=/usr/bin/gcc -DCMAKE_CXX_COMPILER:FILEPATH=/usr/bin/g++ -DCMAKE_CXX_STANDARD=20 --no-warn-unused-cli -S /home/user/projects/cmake-cppcheck -B /home/user/build/vscode/cmake-cppcheck -G Ninja
Первом запуске всё отлично отрабатывает, но если я понижаю стандарт
-DCMAKE_CXX_STANDARD=17
и кеш не пуст проверка похоже даже не вызывается. Если принудительно сбрасывать/задавать переменную кеша как FORCE, он всё равно не переписывает. Как заставить cmake делать проверочную компиляцию постоянно?
Ответы (1 шт):
Переменная кэша удаляется с помощью CACHE опции команды unset
:
# Удаляем переменную из кэша
unset(STL_TIME_ZONE CACHE)
# Проверочная компиляции будет выполняться каждый запуск 'cmake'.
check_source_compiles(... STL_TIME_ZONE)
Вариант безусловной проверочной компиляции может быть полезен в мелких CMake проектах, но в больших проектах это приведёт к существенному увеличению времени пересборки проекта. При этом, чаще всего повторная проверочная компиляция не будет нужна: настройки проекта и системы меняются редко, чаще всего меняется только код (сишные файлы).
Как указали в комментарии, простым и эффективным подходом является перекладывание необходимости удалять кэши на пользователя, если он поменял параметры сборки проекта или настройки системы (удалил или обновил какой-то пакет, с которым потенциально может работать проект).