2017-05-01 4 views
1

J'ai un projet CMake qui permet à une variable définie globalement (définie avec -DARDUINO_SDK_PATH=/a/b/c sur la ligne de commande) de disparaître, c'est-à-dire de supprimer soudainement la valeur donnée, ce qui conduit à une erreur fatale.Comment une variable CMake peut-elle être cachée?

Je sais qu'il sont différentes façons de « cacher » une variable (par exemple des fonctions à l'intérieur ou des projets externes)

Dans mon cas:

  • la variable n'est pas défini explicitement partout dans le code (par exemple via set() ou find_path())
  • l'accès qui conduit à l'erreur est au niveau supérieur (c'est-à-dire pas à l'intérieur d'une fonction)
  • il existe des instructions (c.-à-d. même fichier/ligne) où dans un cas la variable a la valeur qu'il a été donné et la prochaine fois, il est parti

Tracing la variable avec variable_watch(ARDUINO_SDK_PATH) je peux voir que tout fonctionne bien avant que le compilateur est en cours de vérification:

cmake -DARDUINO_SDK_PATH=/a/b/c <path> 
... 
... everything fine, ${DARDUINO_SDK_PATH} == '/a/b/c' everywhere 
... 

-- Check for working C compiler: /usr/bin/avr-gcc 

... 
... here the variable is empty and not being traced any more 
... 

Voici ma suggestion: le contrôle du compilateur (indiqué par check for working C compiler .. sur le terminal) ont son propre espace variable et ne connaît pas les variables fournies sur la ligne de commande?

Note: Cette question est une généralisation de la question this, qui est devenue beaucoup trop spécialisée, mais pourrait offrir quelques informations de base utiles.

Répondre

0

Je ne suis pas sûr que ce soit un bug ou une fonctionnalité mais (au moins certaines) les variables CMake ne sont pas disponibles dans certaines étapes de la procédure de configuration CMake.

Vous pouvez vérifier cela en ajoutant quelque chose comme ceci à votre fichier toolchain:

MESSAGE("FOO: ${FOO}") 

et exécuter CMake comme celui-ci

cd build-dir 
cmake -DFOO=TEST .. 

Vous verrez probablement FOO imprimé avec une valeur TEST une fois au début du processus de configuration et plus tard imprimé à nouveau mais étant vide. N'accédez simplement pas aux variables de l'espace global à l'intérieur d'un fichier de chaîne d'outils (il n'appartient pas à ce cas de toute façon).

0

Que toute modification de variable ne soit pas tracée après la commande variable_watch() semble être un bug quelque part dans CMake pour moi. En règle générale, une "variable CMake mise en cache" peut être masquée par une "variable CMake normale" du même nom. Mais par exemple find_path() ne sera pas exécuté à nouveau ou modifier une variable si déjà défini.

Voici un exemple:

cmake_minimum_required(VERSION 2.4) 

project(VariableWatchTest NONE) 

variable_watch(MY_TEST_VAR) 

set(MY_TEST_VAR "something" CACHE INTERNAL "") 
message("${MY_TEST_VAR}") 

set(MY_TEST_VAR "hiding something") 
message("${MY_TEST_VAR}") 

unset(MY_TEST_VAR) 
message("${MY_TEST_VAR}") 

find_path(MY_TEST_VAR NAMES "CMakeLists.txt" HINTS "${CMAKE_CURRENT_LIST_DIR}") 
message("${MY_TEST_VAR}") 

Donnerait (sans les variable_watch() messages:

-- something 
-- hiding something 
-- something 
-- something 

Références