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 шт):

Автор решения: Tsyvarev

Переменная кэша удаляется с помощью CACHE опции команды unset:

# Удаляем переменную из кэша
unset(STL_TIME_ZONE CACHE)
# Проверочная компиляции будет выполняться каждый запуск 'cmake'.
check_source_compiles(... STL_TIME_ZONE)

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

Как указали в комментарии, простым и эффективным подходом является перекладывание необходимости удалять кэши на пользователя, если он поменял параметры сборки проекта или настройки системы (удалил или обновил какой-то пакет, с которым потенциально может работать проект).

→ Ссылка