2010-05-06 54 views
6

這或者是微不足道的,或者與make應該如何使用的哲學背道而馳,但是我希望有一個命令行讀作「make debug」而不是「make DEBUG = 1" 。我試圖創建一個名爲debug的假目標,除了設置DEBUG變量之外什麼也沒做,但是之後「make debug build」和「make build debug」有區別 - 即在一種情況下,變量在構建之後被設置發生了。使用makefile目標來設置構建選項

有沒有辦法讓某些目標優先?

感謝您的幫助。

回答

3

任何目標,您還可以通過查看去做MAKECMDGOALS可變

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

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

debug: 

這是發生了什麼,當你把它叫做:

$ 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

如果你的調試只能與構建目標使用,你還不如讓調試呼叫建立,所以你可以只輸入make debugmake build,其中make build將非調試。

但至於你的實際問題,我不熟悉makefile來回答它。

1

,你可以寫:

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

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

這將至少是GNU工作做,BSD製作和製作的Interix。我沒有嘗試所有其他的實現。

+0

可移植性以make文件的遞歸評估爲代價。 – dmckee 2010-05-06 21:58:55

5

請參閱this page中的「特定於目標的變量值」。

+9

沒有什麼傷害提到你只需要爲target指定'target:DEBUG = 1'而不是指向他的文檔......對吧? – dlamotte 2010-05-06 22:23:05

+0

這不解決「make build debug」不等於「make debug build」的問題嗎?這個特殊的功能正是我所嘗試的。 – leoger 2010-05-07 02:27:20

+1

回想起來,我可以看到這與你的問題相符,但你沒有說清楚。使目標*總是*有序,所以我認爲你是一個不可能完成的任務。 – bmargulies 2010-05-07 10:53:46

0

一種方法是在構建和調試目標中設置依賴關係和構建規則,但將調試選項添加到調試目標。一個簡單的例子:

的Makefile

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

Program.c你可以用gnumake的做

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

一件事是,擴大與foreach內置規則使用宏。喜歡的東西:

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

這將允許您鍵入make debug.foomake foo.debug,它會自動變成make DEBUG=1 foo,它爲你的作品放在$(TARGETS)

+0

不完全是我正在尋找的,但很酷的解決方法,也演示了一個有用的功能。 – leoger 2010-05-11 20:58:58