2010-05-06 8 views
6

Dies ist entweder trivial oder läuft gegen die Philosophie, wie make verwendet werden sollte, aber ich hätte gerne eine Befehlszeile, die liest wie "make debug" anstatt "make DEBUG = 1 ". Ich habe versucht, ein falsches Ziel namens debug zu erstellen, das nichts außer der DEBUG-Variable gesetzt hat, aber dann gab es einen Unterschied zwischen "make debug build" und "make build debug" - nämlich, dass die Variable in einem Fall nach dem Build gesetzt wurde passiert.Verwenden von Makefile-Zielen, um Build-Optionen zu setzen

Gibt es eine Möglichkeit, bestimmten Zielen Vorrang einzuräumen?

Danke für Ihre Hilfe.

Antwort

3

können Sie es auch tun, indem Sie auf der Suche MAKECMDGOALS Variable

ifneq "$(findstring debug, $(MAKECMDGOALS))" "" 
DEBUG = 1 
endif 

build: 
    @echo build and DEBUG is [$(DEBUG)] 

debug: 

Dies ist, was passiert, wenn man es so nennen:

$ make build 
build and DEBUG is [] 
$ make build debug 
build and DEBUG is [1] 
make: Nothing to be done for `debug'. 
$ make debug build 
make: Nothing to be done for `debug'. 
build and DEBUG is [1] 
0

Wenn Ihr Debug nur mit dem Build-Ziel verwendet werden, dann kann man auch Debug-Aufruf Build machen, so können Sie einfach make debug eingeben oder make build, wo make build nicht-Debug wären.

Aber wie für Ihre eigentliche Frage, ich bin nicht genug vertraut mit Makefiles, um es zu beantworten.

.PHONY: debug 
debug: 
     $(MAKE) -$(MAKEFLAGS) build DEBUG=1 

build: 
     echo makeflags='$(MAKEFLAGS)' debug=${DEBUG} 

Dies wird zumindest mit GNU Make, BSD Make und Interix Fabrikat:

1

können Sie die folgende schreiben. Ich habe nicht alle anderen Implementierungen getestet.

+0

Portabilität auf Kosten der rekursiven Auswertung der make-Datei. – dmckee

5

Siehe 'Zielspezifische Variablenwerte' in this page.

+9

Es ist nicht schlimm, wenn man nur "target: DEBUG = 1" für ein Ziel nennt, anstatt auf die Dokumentation zu zeigen ... oder? – dlamotte

+0

Löst das nicht das Problem, dass "make build debug" nicht äquivalent zu "make debug build" ist? Dieses spezielle Feature ist genau das, was ich ausprobiert habe. – leoger

+1

Rückblickend kann ich sehen, wie das zu deiner Frage passt, aber du hast es nicht klargestellt. Mache Ziele immer * geordnet *, also denke ich, du bist auf einer unmöglichen Mission. – bmargulies

0

Ein Ansatz besteht darin, die Abhängigkeiten und Buildregeln sowohl in den Build- als auch in den Debug-Zielen einzurichten, aber die Debugging-Optionen zum Debug-Ziel hinzuzufügen. Ein einfaches Beispiel:

Makefile

program:  program.c 
       gcc -o program program.c 
debug:   program.c 
       gcc -D DEBUG -o program program.c 

programm.c

#include <stdio.h> 
int main(void) { 
#ifdef DEBUG 
    printf("DEBUG on!\n"); 
#endif 
    printf("in the program\n"); 
    return 0; 
} 
1

Eine Sache, die Sie mit gnumake tun können, ist die Verwendung von Makros, die Regeln mit dem foreach builtin erweitern. Etwas wie:

TARGETS := build all foo bar baz 

define DEBUG_TARGET_RULE 
$(1).debug: 
     $$(MAKE) DEBUG=1 $(1) 
debug.$(1): 
     $$(MAKE) DEBUG=1 $(1) 
endef 

$(foreach target,$(TARGETS),$(eval $(call DEBUG_TARGET_RULE,$(target)))) 

Dies ermöglicht es Ihnen make debug.foo oder make foo.debug zu geben und es wird sich automatisch in make DEBUG=1 foo, und es funktioniert für jedes Ziel Sie setzen $(TARGETS)

+0

Nicht genau, was ich suchte, aber coole Workaround, die auch eine nützliche Funktion von make zeigt. – leoger

Verwandte Themen