Comparaison du numéro de version dans le fichier makefile
Dans un makefile, j'aimerais définir une variable indiquant si le courant redhat-release est supérieure à 5.3. (Cette variable sera passé à gcc comme un #define)
Jusqu'à présent, je suis venu avec:
# Find out which version of Red-Hat we're running
RH_VER_NUM = $(shell /bin/grep -o [0-9].[0-9] /etc/redhat-release)
RH_GT_5_3 = $RH_VER_NUM > '5.3'
Quelle serait la bonne façon de définir RH_GT_5_3?
source d'informationauteur tsotso
Vous devez vous connecter pour publier un commentaire.
GNU Make ne contient pas toutes les comparaisons de chaînes autres que de l'égalité, et
test
ne peut faire moins que/plus grand que les tests sur des entiers. Diviser le numéro de version dans ses parties intégrantes et de faire la comparaison de cette façon. Essayez ceci (notez également que:=
est mieux que=
ici, que de faire de l'évaluation différée voudrais appeler votre$(shell)
commandes beaucoup plus de fois que nécessaire:La solution la plus simple je pense est d'utiliser
bc
:Ce sera égale à 1 si plus de 5,3, et 0 autrement.
Je réalise que c'est une vieille question, mais tout de même. En fait, vous pouvez recourir à
lsb_release
que j'ai trouvé pour être installé sur tous les récents système RedHat.Pour être précis, vous auriez du faire usage de
à l'intérieur de
$(shell ...)
et puis coupé à la.
comme ceci:vous avez maintenant la majeure/mineure de la version et pouvez le vérifier à l'encontre de tout ce que vous voulez.
Le cas classique serait
$(filter ...)
et les autres fonctions de texte GNU faire offre.Néanmoins je suis d'accord qu'une sorte de
config.h
aurait plus de sens, bien que les Autotools est pas parfait pour tous les scénarios (il existe d'autres outils de construction qui tentent la même chose, tout de même).Un peu plus courte est la solution de:
Ce sera mis en RH_GT_5_3 sur "OUI" si RH_VER_NUM est supérieure ou égale à 5,4 (donc supérieure à 5.3). Sinon RH_GT_5_3 sera vide.
Si plusieurs numéros de version doivent être vérifiés, nous pouvons définir une fonction:
J'ai utilisé le "$(word 2,..." au lieu de "$(lastword,..." parce que le plus tard ne fonctionne pas en 3.8. Et plus courte...
... quelques siècles et des siècles plus tard
J'ai essayé de résoudre la comparaison de version interne makefile fonctions. J'ai trouvé un projet (GNU Make Bibliothèque Standard (GMSL)), ce qui ajoute un include pour le makefile qui implémente l'arithmétique des nombres entiers. Malheureusement avec la commune unaire système de numération. Mais en comparant les numéros de version sont plus complexes. Comme j'ai travaillé avec les versions d'avoir un nombre de plus de 100_000 j'ai décidé de mettre en œuvre un cadre plus général de la solution. Il fonctionne avec un nombre arbitraire de la subversion numéros de chaque avec des chiffres arbitraires. Quelques idées ont été empruntés à la GMSL projet
Il met en œuvre le ver.lt de la fonction. Il renvoie 'T' si le premier numéro de la version est inférieure à la seconde. Elle renvoie une chaîne vide sinon. Bien sûr, la subversion numéros sont comparés numériquement pas lexicographiquement. Donc 1.20 est supérieure à 1.3. Il y a certaines questions. 1.2 < 1.2.0, 1.0.1 < 1.00.1, 1.9.1 < 1.01.1 (comme il est prévu qu'un nombre commence par un chiffre différent de zéro. Sauf le 0.). Je ne veux pas les résoudre maintenant.
La solution
Il est testAed sous gnu make 3.82.90. Il y a quelques lignes très longues comme makefile ajouter des espaces si les '\' est utilisée. J'ai laissé certaines mises en œuvre, mais pas les fonctions utilisées dans le code. J'aurais peut-être une meilleure utilisation temporaire des noms de variables (comme GMSL utilise _gmsl). Parfois, les variables temporaires pourraient être arrêté, mais le code sera plus cryptique.
Et la sortie
Plus de musique
J'ai trouvé un autre projet intéressant appelé makepp (makepp.sourceforge.net). Il permet de mettre en œuvre de nouvelles fonctions en perl à l'intérieur du makefile.
Que sur l'utilisation de la fonction de tri:
ifeq "$(firstword $($(RH_VER_NUM),5.3))" "5.3"
RH_GT_5_3 = 1
endif
(bien qu'il serait en fait de test pour un plus grand ou égal, mais vous voyez l'idée)
Bravo à TrueY de venir avec une version qui n'utilise pas du tout cher de commandes du shell. J'ai une version plus simple qui compare uniquement 2 petits entiers (souvent à vous ne se soucient que de la version majeure).
L'idée est tout simplement
x > y
= y, est membre de {0,1,2,3,4 ..., x - 1)
Les membres de l'opérateur peuvent être mis en œuvre avec GNU make $(filtre) et de générer l'ensemble peut être réalisé avec $(liste de mots)
Une manière moderne serait d'obtenir la version en faire (à l'aide d'une coquille d'invocation), par exemple:
Et ensuite avoir la version des indicateurs spécifiques:
Et de les imprimer:
De sortie: