J'ai besoin d'exécuter certaines règles de création de façon conditionnelle, uniquement si le Python installé est supérieur à une certaine version (disons 2.5).
Je pensais pouvoir faire quelque chose comme exécuter:
python -c 'import sys; print int(sys.version_info >= (2,5))'
puis en utilisant la sortie ('1' si ok, '0' sinon) dans une ifeq
instruction make.
Dans un simple script shell bash, c'est juste:
MY_VAR=`python -c 'import sys; print int(sys.version_info >= (2,5))'`
mais cela ne fonctionne pas dans un Makefile.
Aucune suggestion? Je pourrais utiliser toute autre solution de contournement raisonnable pour y parvenir.
Réponses:
Utilisez le Make
shell
Make comme dansMY_VAR=$(shell echo whatever)
la source
$
.Envelopper la mission dans un
eval
travail pour moi.la source
.PHONY always make these targets
.Voici un exemple un peu plus compliqué de tuyauterie et d'affectation de variables dans la recette:
la source
PODNAME
nom du déploiement:$(eval PODNAME=$(shell sh -c "kubectl get pod -l app=sqlproxy -o jsonpath='{.items[0].metadata.name}'"))
J'écris une réponse pour augmenter la visibilité de la syntaxe réelle qui résout le problème. Malheureusement, ce que quelqu'un peut considérer comme insignifiant peut devenir un casse-tête très important pour quelqu'un qui cherche une réponse simple à une question raisonnable.
Mettez ce qui suit dans le fichier "Makefile".
Le comportement que vous aimeriez voir est le suivant (en supposant que vous avez installé python récent).
Si vous copiez et collez le texte ci-dessus dans le Makefile, l'obtiendrez-vous? Probablement pas. Vous obtiendrez probablement une erreur semblable à ce qui est signalé ici:
makefile: 4: *** séparateur manquant. Arrêtez
Pourquoi: Parce que même si j'ai personnellement utilisé un véritable onglet, Stack Overflow (essayant d'être utile) convertit mon onglet en un certain nombre d'espaces. Vous, citoyen Internet frustré, copiez maintenant ceci, pensant que vous avez maintenant le même texte que j'ai utilisé. La commande make lit maintenant les espaces et constate que la commande "all" n'est pas formatée correctement. Copiez donc le texte ci-dessus, collez-le, puis convertissez l'espace avant "@echo" en onglet, et cet exemple devrait enfin, espérons-le, fonctionner pour vous.
la source
Méfiez-vous des recettes comme celle-ci
Cela fait deux choses mal. La première ligne de la recette est exécutée dans une instance de shell distincte de la deuxième ligne. La variable est perdue entre-temps. La deuxième chose qui cloche, c'est que le
$
n'est pas échappé.Les deux problèmes ont été corrigés et la variable est utilisable. La barre oblique inverse combine les deux lignes pour s'exécuter dans un seul shell, d'où le réglage de la variable et la lecture des mots de passe variables, fonctionne.
Je me rends compte que le message d'origine disait comment obtenir les résultats d'une commande shell dans une variable MAKE, et cette réponse montre comment l'obtenir dans une variable shell. Mais d'autres lecteurs pourraient en bénéficier.
Une dernière amélioration, si le consommateur s'attend à ce qu'une "variable d'environnement" soit définie, alors vous devez l'exporter.
aurait besoin de cela dans le makefile
J'espère que cela aide quelqu'un. En général, il faut éviter de faire un vrai travail en dehors des recettes, car si quelqu'un utilise le makefile avec l'option '--dry-run', pour SEULEMENT voir ce qu'il fera, il n'aura pas d'effets secondaires indésirables. Chaque
$(shell)
appel est évalué au moment de la compilation et certains travaux réels pourraient accidentellement être effectués. Mieux vaut laisser le vrai travail, comme générer des identifiants, à l'intérieur des recettes lorsque cela est possible.la source
Avec GNU Make, vous pouvez utiliser
shell
eteval
stocker, exécuter et affecter la sortie des appels de ligne de commande arbitraires. La différence entre l'exemple ci-dessous et ceux qui utilisent:=
est l':=
affectation qui se produit une fois (lorsqu'elle est rencontrée) et pour tous. Les variables étendues récursivement définies avec=
sont un peu plus "paresseuses"; les références à d'autres variables restent jusqu'à ce que la variable elle-même soit référencée, et l'expansion récursive suivante a lieu à chaque fois que la variable est référencée , ce qui est souhaitable pour rendre "des extraits cohérents et appelables". Voir le manuel sur la définition des variables pour plus d'informations.la source
$(SET_ID)
vie à l' intérieur d'uneif
clause qui est faux alors il est encore appelé .Dans l'exemple ci-dessous, j'ai stocké le chemin d'accès au dossier Makefile
LOCAL_PKG_DIR
, puis j'utilise uneLOCAL_PKG_DIR
variable dans les cibles.Makefile:
Sortie borne:
la source