46 votes

Vérification de la version de gcc dans un Makefile?

Je voudrais utiliser gcc avertissement switchs qui ne sont pas disponibles dans les anciennes versions de gcc (eg. -Wtype-limites).

Est-il un moyen facile de vérifier la version de gcc et seulement ajouter ces options supplémentaires si une version récente de gcc est utilisé ?

50voto

srgerg Points 8142

Je ne dirais pas que c'est simple, mais vous pouvez utiliser l' shell fonction de GNU make pour exécuter une commande shell comme gcc --version , puis utiliser l' ifeq expression conditionnelle pour vérifier le numéro de version et de définir votre CFLAGS variable de façon appropriée.

Voici un rapide exemple 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 d' ifgt. Toutefois, vous pouvez utiliser le shell expr de la commande pour faire un plus grand que la comparaison. 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

18voto

myurkin Points 51

Pour transformer complète en 3 partie version de gcc (pas seulement les premiers chiffres) en format numérique, adapté à des fins de 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 traite de la possibilité de nombres à deux chiffres dans tous de la version de la partie, et la possibilité de manquer 3 ème partie de la version en sortie de gcc -dumpversion (ce qui est le cas dans certains précédentes versions de gcc).

Afin de tester la version dans le makefile, utilisez quelque chose comme (note $$ à l'intérieur de 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

8voto

Chris Points 11

J'ai juste rencontré ce problème lorsque j'avais besoin de tester les deux premiers chiffres de la gcc et je voulais un plus lisible option que l'habile sed hackery ci-dessus. J'ai utilisé de la colombie-britannique pour faire la comparaison, car il prend en charge à virgule flottante (expr traite des nombres non entiers comme des chaînes de caractères):

GCC_VER_GTE44 := $(shell echo `gcc -dumpversion | cut -f1-2 -d.` \>= 4.4 | bc )
ifeq ($(GCC_VER_GTE44),1)
...
endif

Si ils version de gcc 4.10 après gcc 4.9, puis un peu de sed piratage est nécessaire, mais c'est encore 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

2voto

Timo Geusch Points 16952

Êtes-vous d'utiliser quelque chose comme autoconf?

Il pourrait être utile d'invoquer un "crétin" compiler via gcc avec l'option est activée et si l'on échoue, car le compilateur ne reconnaît pas le drapeau, vous pouvez revenir à la ligne de commande qui n'utilise pas les nouvelles options d'alerte.

2voto

Yury Rumega Points 3

J'ai fait un prêt-à-utiliser IF_GCC macro, sur la base des 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)

En tant que deuxième argument, vous pouvez utiliser n'importe quel opérateur de ceux pris en charge par le test(1): eq, gt, lt, ge, le etc.

Si cc -V ne fonctionne pas pour vous, remplacer avec gcc -dumpversion ou que ce soit adapté

Espérons que cela aide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X