Ho un progetto il cui makefile usa funzionalità esclusive di GNU Make. Purtroppo, ci sono piattaforme che dobbiamo supportare dove GNU make non è ancora il default quando si esegue make
.Rilevamento (non-) GNU Make quando qualcuno esegue `make`
Uno dei miei colleghi è stato morso da questo, quando un'implementazione non-GNU ha silenziosamente fallito la creazione del nostro codice correttamente (ha espanso una variabile automatica in una stringa vuota). Voglio evitare che ciò accada di nuovo, generando invece un messaggio di errore esplicito.
Cosa posso scrivere in un Makefile
per distinguere la marca GNU dalla marca non GNU, stampare un errore chiaro e uscire?
Ho già capito una soluzione a rinominare il mio vero makefile per GNUmakefile
, e mettendo un piccolo stub in Makefile
, ma preferirei qualcosa di più diretto.
Le risposte da Beta e Dan Moulding guardare veramente bello e semplice, ma su AIX 6.1, l'attuazione make non possono gestire una di esse:
$ cat testmake
foo:
touch foo
ifeq ($(shell $(MAKE) -v | grep GNU),)
$(error this is not GNU Make)
endif
ifeq "${MAKE_VERSION}" ""
$(info GNU Make not detected)
$(error ${MIN_MAKE_VER_MSG})
endif
$ /usr/bin/make -f testmake
"testmake", line 5: make: 1254-055 Dependency line needs colon or double colon operator.
"testmake", line 6: make: 1254-055 Dependency line needs colon or double colon operator.
"testmake", line 7: make: 1254-055 Dependency line needs colon or double colon operator.
"testmake", line 8: make: 1254-055 Dependency line needs colon or double colon operator.
"testmake", line 11: make: 1254-055 Dependency line needs colon or double colon operator.
"testmake", line 12: make: 1254-055 Dependency line needs colon or double colon operator.
"testmake", line 13: make: 1254-055 Dependency line needs colon or double colon operator.
make: 1254-058 Fatal errors encountered -- cannot continue.
mi imbatto in problemi simili su entrambi i arcaico e moderno versioni (Solaris 8 & 10) di marca Sun. Quello è meno critico, ma sarebbe bello da gestire.
Quale versione di GNU è in esecuzione? – bta
Sei corretto. L'approccio che avevo preso si basava troppo su GNUisms, quindi potrebbe non funzionare * affatto * con implementazioni non-GNU di make. Ora dubito che ci sia un modo portatile per raggiungere il tuo obiettivo usando solo un Makefile (cioè senza ricorrere a uno script di shell o ad altre risorse esterne). Ho annullato la mia risposta. –