Как да проследя загубена стойност на променлива в CMake?

Редактиране: приетият отговор все още не решава проблема ми, но отговори на въпроса, който зададох - ако можете да ми помогнете с действителния ми проблем, описан по-долу, може да отговорите този въпрос.

Имам CMake-проект, който използва рамка, която се нуждае от настройка на променлива (а именно https://github.com/queezythegreat/arduino-cmake, който се нуждае от ARDUINO_SDK_PATH)

Странно, след като зададох тази променлива в командния ред, тя първо има стойност, но изглежда, че изчезва след известно време.

бягам

cmake -DARDUINO_SDK_PATH=/path/to/sdk ..

.. и получавам съобщение за грешка, което ми казва, че не е зададено. Отпечатването на стойността в горната част на моя CMakeLists.txt и дълбоко в тази рамка, където се проверява променливата, ми дава нещо подобно:

>>> ARDUINO_SDK_PATH (beginning): '/home/me/project/arduino-1.8.2'
>>> ARDUINO_SDK_PATH (before check): '/home/me/project/arduino-1.8.2'
-- The C compiler identification is GNU 6.2.0
-- The CXX compiler identification is GNU 6.2.0
-- Check for working C compiler: /usr/bin/avr-gcc
>>> ARDUINO_SDK_PATH (before check): ''
CMake Error at /home/me/project/arduino-cmake/cmake/ArduinoToolchain.cmake:84 (message):
  Could not find Arduino SDK (set ARDUINO_SDK_PATH)!
Call Stack (most recent call first):
  /home/me/project/build/CMakeFiles/3.6.2/CMakeSystem.cmake:6 (include)
  /home/me/project/build/CMakeFiles/CMakeTmp/CMakeLists.txt:3 (project)

CMake Error: Internal CMake error, TryCompile configure of cmake failed
-- Configuring incomplete, errors occurred!
See also "/home/me/project/build/CMakeFiles/CMakeOutput.log".

Така че изглежда, че ARDUINO_SDK_PATH губи стойността си по някакъв начин. Не намерих действителна команда, на която да й е присвоена някаква стойност, така че не знам как да продължа. Сега, разбира се, мога да добавя код към моя CMake проект навсякъде, за да отпечатам стойността на ARDUINO_SDK_PATH, но се чудя дали има вграден начин за проследяване на стойности на променливи.

Опитах cmake --trace .. и cmake --trace-expand .., но резултатът не изглежда полезен..

Система: Fedora 25 с CMake 3.6.2

Актуализация

Благодарение на Florian добавих variable_watch(ARDUINO_SDK_PATH) като мой първи ред в CMakeLists.txt и сега моите променливи линии за проследяване (message()) изглеждат така:

CMake Debug Log at arduino-cmake/cmake/ArduinoToolchain.cmake:41 (MESSAGE):
  Variable "ARDUINO_SDK_PATH" was accessed using READ_ACCESS with value
  "/home/me/project/arduino-1.8.2".
Call Stack (most recent call first):
  /usr/share/cmake/Modules/CMakeDetermineSystem.cmake:98 (include)
  CMakeLists.txt:10 (project)

>>> ARDUINO_SDK_PATH (before check): /home/me/project/arduino-1.8.2

Имам около 30 съобщения като това, но следват няколко реда за проследяване без стойността и без съобщението за проследяване.

Така че изглежда, че променливата ARDUINO_SDK_PATH се заменя с нова, която е празна и която вече не се проследява.

Възпроизвеждане

За да направя това поведение възпроизводимо, качих кода: https://github.com/frans-fuerst/trinket_led

Забележка: предоставеният CMakeLists.txt все още не съдържа полезен код - той просто възпроизвежда грешката.

Трябва да изтеглите Arduino-SDK, да го разархивирате и да предоставите пътя към командата линия:

tar xvf ~/Downloads/arduino-1.8.2-linux64.tar.xz 
git clone https://github.com/frans-fuerst/trinket_led
cd trinket_led
git submodules update --init
mkdir build
cd build
cmake -DARDUINO_SDK_PATH=/path/to/arduino-1.8.2 ..

Забележка: има команда find_path в ArduinoToolchain.cmake, която изглежда подозрително. Но можете да го премахнете със същия резултат..

CMakeFiles/CMakeOutput.log

The target system is: Arduino -  - 
The host system is: Linux - 4.10.12-200.fc25.x86_64+debug - x86_64
Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded.
Compiler: /usr/bin/avr-gcc 
Build flags: 
Id flags: 

The output was:
0


Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "a.out"

The C compiler identification is GNU, found in "/home/frans/_HOME/1704_trinket_led/build/CMakeFiles/3.6.2/CompilerIdC/a.out"

Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded.
Compiler: /usr/bin/avr-g++ 
Build flags: 
Id flags: 

The output was:
0


Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "a.out"

The CXX compiler identification is GNU, found in "/home/frans/_HOME/1704_trinket_led/build/CMakeFiles/3.6.2/CompilerIdCXX/a.out"

person frans    schedule 30.04.2017    source източник


Отговори (1)


Просто поставете variable_watch(ARDUINO_SDK_PATH) в горната част на вашето CMakeLists.txt.

Референции

person Florian    schedule 30.04.2017
comment
Това поне е много полезно - би ви дало +10, ако беше възможно. Но сега наблюдавам много по-странно поведение: получавам съобщение Variable "ARDUINO_SDK_PATH" was accessed using READ_ACCESS with value .. с правилната стойност около 30 пъти, НО ВНЕЗАПНО това съобщение вече не се отпечатва и моите съобщения за проследяване показват празни стойности. Изглежда, че самата променлива (която се проследява) се заменя (като в EXTERNAL_PROJECT) - person frans; 30.04.2017
comment
@frans Strange. Но можете да опитате да добавите set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) (само защото вашето съобщение за грешка предполага, че CMake не може да свърже изпълним файл в try_compile()). - person Florian; 30.04.2017
comment
@frans Бихте ли разгледали CMakeFiles/CMakeOutput.log и CMakeFiles/CMakeError.log, моля? Предполагам, че в тези файлове ще има повече информация какво се е объркало. - person Florian; 30.04.2017
comment
няма CMakeError.log - добавих CMakeOutput.log към публикацията си - не можах да намеря нищо полезно - person frans; 30.04.2017
comment
@frans Добре. Единственото нещо, което може да презапише вашата кеширана променлива в същия проект, може да бъде друга некеширана, която крие кешираната. Все още не съм имал време да разгледам кода ви, но може да е свързан с това. - person Florian; 01.05.2017
comment
така изглежда и на мен - но как може глобално зададена CMake променлива да бъде презаписана? Проверих всички срещания на ARDUINO_SDK_PATH и всички те просто прочетоха стойността (с изключение на find_path, който премахнах) - person frans; 01.05.2017
comment
Добавих друг въпрос, който е по-общ: stackoverflow.com/questions/43718042/ - person frans; 01.05.2017