2017-09-29 3 views
0

Ceci est ma recette de faire, je passe la valeur nonle *, bien que la variable bamboo_nonle_password est d'avoir un mot de passe, la fonction ne parvient toujours pasGNU Make créé dynamiquement nom de la variable

validatevar.%: $(if $(IS_BAMBOO),) 
     @echo "\n################################################################################" 
     @echo ">>> validatevar" 
     @echo ">>> Start: Validate bamboo variables " 
ifndef bamboo_$*_password 
     @echo "Bamboo variable bamboo_$*_password is empty" 
     exit 1 
endif 
ifndef bamboo_$*_server 
     @echo "Bamboo variable bamboo_$*_server is empty" 
     exit 1 
endif 
     @echo "<<< Done: validatevar" 
     @echo "################################################################################\n\n" 
+0

Pourquoi cette virgule supplémentaire ici, 'validatevar%. $ (si $ (IS_BAMBOO),) '? peut-être que vous pouvez avoir 1 ou 0, de sorte que vous pouvez faire comme 'IS_BAMBOO = 1' comme ça. – LethalProgrammer

+0

ouais, c'est aussi possible, de toute façon ça marche toujours, je vais changer ça dans mon code. mais le vrai problème est dans le nom de la variable génératrice i.e qui génère le nom de la variable bamboo _ $ * _ password. – user1841951

Répondre

0

Vous fou :)

Make développera la recette juste avant de vouloir l'exécuter. À ce stade faire sait ce que le % correspond à, et peut donc assurer $* est définie de façon appropriée. Malheureusement, la paire ifndef ... endif est évaluée lorsque le fichier makefile est lu, non pas lorsque la recette est développée. Cela suggère la réponse: utiliser des macros. Peut-être $(origin …) ou $(flavor …) quelque chose comme

validatevar.%: 
    @echo 
    $(if $(filter undefined,$(origin bamboo_$*_password)),@echo "Bamboo variable bamboo_$*_password is undefined") 
    $(if $(filter undefined,$(origin bamboo_$*_password)),exit 1) 

Naturellement vous pouvez ranger ce un peu. Peut-être :

die-if-undefined = $(if $(filter undefined,$(origin $1)),$(error "$1" is undefined)) 

validatevar.%: 
    $(call die-if-undefined,bamboo_$*_password) 
    $(call die-if-undefined,bamboo_$*_server) 
    @echo 
    @echo 

Deux choses à noter:

  1. L'ensemblede la recette est dilatée en une seule fois, avant l'une des lignes sont exécutées. Le résultat de ceci est que peu importe où vous étendez les assertions $(error). Je les ai mis en haut.
  2. ifndef détecte également les variables vides, ainsi que celles indéfinies. Vous pouvez ajuster die-if-undefined pour prendre en compte ceci (et le renommer en die-if-empty).

(tout cela serait beaucoup plus facile si faire ne prendrait un paramètre --error-undefined-variables, juste pour correspondre au paramètre --warn-undefined-variables existant.)