2010-11-08 35 views
42

我想從make文件中將-r and -R options傳遞給GNU make來禁用內置規則和變量。其他解決方案也允許我隱式和透明地實現這一點,這也是值得歡迎的。從make文件中禁用make內建規則和變量

我發現several references使用MAKEFLAGS,並有類似的問題。

+2

你沒有將一個cthulhoid構建系統,你是木匠? – 2010-11-08 23:33:07

+0

許多人中的一員,這次它會生成自由並行的make文件。轉換爲C++已將我的構建時間增加了十倍,這是不可接受的。 – 2010-11-09 06:56:18

+4

「轉換爲C++ ...是不可接受的。」 - Matt Joiner。 ;-) – 2010-11-09 23:57:23

回答

29

禁用內置的規則是由writing an empty rule for .SUFFIXES完成:

.SUFFIXES: 

已經抹去了內置的規則,我不知道該擦除內置變量可以幫助你的不僅僅是記住要更設置他們自己或不使用他們,但你可以使用像

$(foreach V 
    $(shell make -p -f/dev/null 2>/dev/null | sed -n '/^[^:#= ]* *=/s/ .*//p'), 
    $(if $(findstring default,$(origin $V)),$(eval $V=))) 

......這是無可爭議的相當瘋狂。如果有辦法從make中獲得定義變量的列表(而不是退出到另一個make),它將是可行的。因爲它是,它不是真的比

CC= 
CXX= 
# etc, for each likely built-in variable 
+0

這很好,但有點太hacky。 – 2011-03-19 01:56:58

+2

我不認爲這處理內置的[匹配任何規則](http://www.gnu.org/software/make/manual/make.html#Match_002dAnything-規則) – 2012-01-12 00:31:43

+1

[看來](https: //savannah.gnu.org/bugs/?20501)在GNU Make的某些版本中,清除'.SUFFIXES'將禁用內置的_suffix rules_而不是_pattern rules_(請參閱Brandon的回答)。儘管如此,在我的GNU Make版本(3.81)中,'.SUFFIXES'似乎已經足夠了。 – 2014-07-11 15:18:18

1

更好的你可以用#!啓動Makefile並調用它不同的東西讓人們不要試圖直接使用make

#!/usr/bin/make -rRf 
# ... 

這將如果GNU make不是系統make會導致可怕的問題。也許是一個包裝腳本?

您還可以閱讀$(MAKEFLAGS)並確保所需的標誌存在。

+3

我想你想要'#!/ usr/bin/env make -rRf'?哦,我明白你的意思了。 – 2010-11-09 06:57:13

+0

'/ usr/bin/env'可能會更好。 – 2010-11-09 11:33:05

+0

這將不起作用併產生'/ usr/bin/env:'make -rRf':在許多系統上(例如Linux)沒有這樣的文件或目錄',因爲shebang行只支持一個可選參數,沒有命令分裂完成。見[這裏](https://en.wikipedia.org/wiki/Shebang_(Unix)#Portability)。 – 2016-09-05 06:50:29

4

這個工作對我來說:

# Disable implicit rules to speedup build 
.SUFFIXES: 
SUFFIXES := 
%.out: 
%.a: 
%.ln: 
%.o: 
%: %.o 
%.c: 
%: %.c 
%.ln: %.c 
%.o: %.c 
%.cc: 
%: %.cc 
%.o: %.cc 
%.C: 
%: %.C 
%.o: %.C 
%.cpp: 
%: %.cpp 
%.o: %.cpp 
%.p: 
%: %.p 
%.o: %.p 
%.f: 
%: %.f 
%.o: %.f 
%.F: 
%: %.F 
%.o: %.F 
%.f: %.F 
%.r: 
%: %.r 
%.o: %.r 
%.f: %.r 
%.y: 
%.ln: %.y 
%.c: %.y 
%.l: 
%.ln: %.l 
%.c: %.l 
%.r: %.l 
%.s: 
%: %.s 
%.o: %.s 
%.S: 
%: %.S 
%.o: %.S 
%.s: %.S 
%.mod: 
%: %.mod 
%.o: %.mod 
%.sym: 
%.def: 
%.sym: %.def 
%.h: 
%.info: 
%.dvi: 
%.tex: 
%.dvi: %.tex 
%.texinfo: 
%.info: %.texinfo 
%.dvi: %.texinfo 
%.texi: 
%.info: %.texi 
%.dvi: %.texi 
%.txinfo: 
%.info: %.txinfo 
%.dvi: %.txinfo 
%.w: 
%.c: %.w 
%.tex: %.w 
%.ch: 
%.web: 
%.p: %.web 
%.tex: %.web 
%.sh: 
%: %.sh 
%.elc: 
%.el: 
(%): % 
%.out: % 
%.c: %.w %.ch 
%.tex: %.w %.ch 
%: %,v 
%: RCS/%,v 
%: RCS/% 
%: s.% 
%: SCCS/s.% 
.web.p: 
.l.r: 
.dvi: 
.F.o: 
.l: 
.y.ln: 
.o: 
.y: 
.def.sym: 
.p.o: 
.p: 
.txinfo.dvi: 
.a: 
.l.ln: 
.w.c: 
.texi.dvi: 
.sh: 
.cc: 
.cc.o: 
.def: 
.c.o: 
.r.o: 
.r: 
.info: 
.elc: 
.l.c: 
.out: 
.C: 
.r.f: 
.S: 
.texinfo.info: 
.c: 
.w.tex: 
.c.ln: 
.s.o: 
.s: 
.texinfo.dvi: 
.el: 
.texinfo: 
.y.c: 
.web.tex: 
.texi.info: 
.DEFAULT: 
.h: 
.tex.dvi: 
.cpp.o: 
.cpp: 
.C.o: 
.ln: 
.texi: 
.txinfo: 
.tex: 
.txinfo.info: 
.ch: 
.S.s: 
.mod: 
.mod.o: 
.F.f: 
.w: 
.S.o: 
.F: 
.web: 
.sym: 
.f: 
.f.o: 

在一個名爲disable_implicit_rules.mk文件中的每個makefile文件將這個和include它。

4
################################################################ 
# DISABLE BUILT-IN RULES 
# 
.SUFFIXES: 
    MAKEFLAGS += -r 
+4

我不確定爲什麼這個變量賦值是嵌套的...... – 2012-01-12 00:33:10

20

@hseldon有正確的想法,因爲.SUFFIXES不包括match-everything內置的隱式規則。但是,我不認爲他的語法完全正確。

MAKEFLAGS += --no-builtin-rules 

.SUFFIXES: 
.SUFFIXES: .you .own .here 

http://www.gnu.org/software/make/manual/make.html#Match_002dAnything-Rules和寫.SUFFIXES空規則http://www.gnu.org/software/make/manual/make.html#index-g_t_002eSUFFIXES-998

+0

這並不適合我。我有一個規則。 %:foo.o bar.o 並且在執行時會做「rm foo.o bar.o」。這與您提議的標誌設置不會消失。 – 2013-09-10 16:30:34

+2

@VictorEijkhout:這不是由內置規則引起的,而是由[規則鏈接](https://www.gnu.org/software/make/manual/html_node/Chained-Rules.html)引起的。使用'.SECONDARY'來防止自動刪除。 – 2014-07-11 15:23:34

5

禁用內置的規則,如果一個然後把另一個.SUFFIXES規則添加先前已知的後綴不工作 - 內置規則重新啓用。例如:想要爲.c.i.i.o定義規則,並禁用內置規則.c.o。書寫

.SUFFIXES: 
.SUFFIXES: .o .i .c 

不起作用 - 它不會阻止應用內置規則.c.o

的解決方案是由Marc Eaddy使用和記錄在GNU使手動之一,10.5.6 Canceling Implicit Rules:由(你自己定義 或一個)

您可以覆蓋內置隱含規則使用相同的目標和 先決條件定義新的模式規則,但使用不同的配方。當新規則被定義時, 內置的一個被替換。新規則在隱式規則的序列 中的位置取決於您編寫新規則的位置。

您可以通過定義具有相同目標和先決條件但沒有配方的模式規則 來取消內置隱式規則。例如, 下面將取消運行彙編程序規則:

%.o : %.s