Je voudrais utiliser des commutateurs d'avertissement gcc qui ne sont pas disponibles dans les anciennes versions de gcc (par exemple. -Wtype-limits).
Existe-t-il un moyen simple de vérifier la version de gcc et d'ajouter ces options supplémentaires uniquement si un gcc récent est utilisé?
Je ne dirais pas que c'est facile, mais vous pouvez utiliser la fonction Shell
de GNU make pour exécuter une commande Shell comme gcc --version
puis utilisez l'expression conditionnelle ifeq
pour vérifier le numéro de version et définir votre variable CFLAGS
de manière appropriée.
Voici un exemple rapide de makefile:
CC = gcc
GCCVERSION = $(Shell gcc --version | grep ^gcc | sed 's/^.* //g')
CFLAGS = -g
ifeq "$(GCCVERSION)" "4.4.3"
CFLAGS += -Wtype-limits
endif
all:
$(CC) $(CFLAGS) prog.c -o prog
Edit: Il n'y a pas de ifgt
. Cependant, vous pouvez utiliser la commande Shell expr
pour effectuer une comparaison supérieure à. Voici un exemple
CC = gcc
GCCVERSIONGTEQ4 := $(Shell expr `gcc -dumpversion | cut -f1 -d.` \>= 4)
CFLAGS = -g
ifeq "$(GCCVERSIONGTEQ4)" "1"
CFLAGS += -Wtype-limits
endif
all:
$(CC) $(CFLAGS) prog.c -o prog
Pour transformer la version complète de gcc en 3 parties (pas seulement le premier chiffre) en format numérique, approprié pour la comparaison (par exemple 40701
) utilisation
gcc -dumpversion | sed -e 's/\.\([0-9][0-9]\)/\1/g' -e 's/\.\([0-9]\)/0\1/g' -e 's/^[0-9]\{3,4\}$/&00/'
Qui aborde la possibilité de nombres à deux chiffres dans n'importe quelle partie de la version et la possibilité de manquer la 3ème partie de la version en sortie de gcc -dumpversion
(ce qui est le cas dans certaines versions antérieures de gcc).
Donc, pour tester la version dans makefile, utilisez quelque chose comme (note $$
dans la dernière commande sed)
GCC_GTEQ_472 := $(Shell expr `gcc -dumpversion | sed -e 's/\.\([0-9][0-9]\)/\1/g' -e 's/\.\([0-9]\)/0\1/g' -e 's/^[0-9]\{3,4\}$$/&00/'` \>= 40702)
ifeq "$(GCC_GTEQ_472)" "1"
...
endif
Je viens de rencontrer ce problème où je devais tester les deux premiers chiffres de gcc et je voulais une option plus lisible que le hackery sed intelligent ci-dessus. J'ai utilisé bc pour faire la comparaison car il prend en charge les virgules flottantes (expr traite les non-entiers comme des chaînes):
GCC_VER_GTE44 := $(Shell echo `gcc -dumpversion | cut -f1-2 -d.` \>= 4.4 | bc )
ifeq ($(GCC_VER_GTE44),1)
...
endif
S'ils libèrent gcc 4.10 après gcc 4.9, alors un peu de piratage sed est nécessaire, mais c'est toujours assez lisible:
GCC_VER_GTE44 := $(Shell echo `gcc -dumpversion | cut -f1-2 -d.` \>= 4.4 | sed -e 's/\./*100+/g' | bc )
ifeq ($(GCC_VER_GTE44),1)
...
endif
Utilisez-vous quelque chose comme autoconf?
Il peut être utile d'invoquer une compilation `` factice '' via gcc avec l'indicateur activé et si celui-ci échoue parce que le compilateur ne reconnaît pas l'indicateur, vous pouvez revenir à la ligne de commande qui n'utilise pas les options d'avertissement les plus récentes.
J'ai créé une macro IF_GCC prête à l'emploi, basée sur les réponses ci-dessus:
MY_GCC_VERSION=$(if $(GCC_VERSION),$(GCC_VERSION),$(GCC_DEFAULT_VER))
MY_GCC_TOINT=$(Shell echo $(1) | sed -e 's/\.\([0-9][0-9]\)/\1/g' -e 's/\.\([0-9]\)/0\1/g' -e 's/^[0-9]\{3,4\}$$//')
MY_IF_GCC=$(if $(Shell test $(call MY_GCC_TOINT, $(MY_GCC_VERSION)) -$(1) $(2) || echo 0),$(4),$(3))
GCC_DEFAULT_VER:=$(firstword $(Shell cc -V 2>&1 | grep default | sed -r 's/( *)([0-9.]+),(.*)/\2/g'))
Utilisation: $(call MY_IF_GCC,ge,30305,-fan_option_for_gcc_ge_3.3.5)
Comme deuxième argument, vous pouvez utiliser n'importe quel opérateur de ceux supportés par test (1): eq, gt, lt, ge, le etc.
Si cc -V ne fonctionne pas pour vous, remplacez-le par gcc -dumpversion ou tout ce qui convient
J'espère que cela pourra aider.
Suivre Chris, mais en utilisant awk
GCC_VER_GTE44 := $(Shell expr $$(gcc -dumpversion | awk -F. '{print $$3+100*($$2+100*$$1)}') \>= 40400)
remarque $
doit être échappé dans Makefile avec un autre $
.
Parfois, vous souhaitez afficher la version avec les informations supplémentaires.
GCCVER=$(gcc --version | awk '/gcc /{print $0;exit 0;}')
echo $GCCVER
gcc (Ubuntu 4.8.1-2ubuntu1 ~ 12.04) 4.8.1