web-dev-qa-db-fra.com

Vérifier la version gcc dans un Makefile?

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é?

43
Gene Vincent

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
47
srgerg

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
17
myurkin

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
7
Chris

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.

2
Timo Geusch

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.

2
Yury Rumega

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 $.

1
parker9

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

0
rickfoosusa