Как очистить кэш проектов SCons? CheckLibWithHeader возвращает "нет" при первом вызове," да " во второй раз


У меня есть файл SConstruct, который проверяет библиотеку Google protobuf, вот так:

main['HAVE_PROTOBUF'] = main['PROTOC'] and 
conf.CheckLibWithHeader('protobuf', 'google/protobuf/message.h',
                        'C++', 'GOOGLE_PROTOBUF_VERIFY_VERSION;')

Я заметил, что этот вызов CheckLibWithHeader возвращал "нет". Я выполнял некоторую отладку скрипта, и мне стало очевидно, что последующие идентичные вызовы CheckLibWithHeader возвращали "yes". Когда я поместил идентичную строку в файл SConstruct сразу после предыдущей, результат был следующим:

.
.
.
Checking for accept(0,0,0) in C++ library None... (cached) yes
Checking for zlibVersion() in C++ library z... (cached) yes
Checking for GOOGLE_PROTOBUF_VERIFY_VERSION in C++ library protobuf... (cached) no
Checking for GOOGLE_PROTOBUF_VERIFY_VERSION in C++ library protobuf... (cached) yes
Checking for clock_nanosleep(0,0,NULL,NULL) in C library None... no
Checking for clock_nanosleep(0,0,NULL,NULL) in C library rt... yes
.
.
.

У меня есть библиотеки протобуфа. А кто-нибудь знает знаете, почему первый вызов CheckLibWithHeader возвращает "нет"?

Эта проблема для меня возникает в CentOS, но не в Ubuntu.

Обновление: я больше не могу воспроизвести вышеописанную проблему. Однако я обнаружил, что когда я сталкиваюсь с проблемой с scons, использующей значение, помеченное как "(кэшированный)", которое кажется неправильным, я могу сделать две вещи, чтобы помочь получить решение. Я помещу их в ответ ниже.

2 4

2 ответа:

Параметр командной строки --config=force должен повторно выполнить все тесты конфигурации, не глядя на кэшированные результаты. Согласно man-странице для SCons :

--config=force

If this option is specified, all configuration tests will be re-run
regardless of whether the cached results are out of date. This can 
be used to explicitly force the configuration tests to be updated in
response to an otherwise unconfigured change in a system header file 
or compiler.

Я обнаружил, что когда я сталкиваюсь с проблемой с scons, используя значение, помеченное как "(кэшированный)", которое кажется неправильным, я могу сделать две вещи, чтобы помочь решить эту проблему.

  1. Проверьте " config.log " файл, который показывает, какие действия scons фактически предпринимает, когда он выполняет свои проверки. Это даст намек на то, почему проверка не выполняется.

  2. Удалите файл ".бра.дблите" и каталог".sconf_temp". Это, кажется, очищает кэш scons, как во время следующих сборок маркировка "(кэшированный)" не появляется.