2010-11-08 10 views
42

Yapı dosyasının içinden, -r and -R options GNU yapımına geçirme sırasına göre yerleşik kural ve değişkenleri devre dışı bırakmak istiyorum. Bunu örtülü ve şeffaf bir şekilde yapmamı sağlayan diğer çözümler de memnuniyetle karşılanmaktadır.Yapı dosyasındaki yerleşik kurallar ve değişkenleri devre dışı bırakma

MAKEFLAGS kullanmak için several references buldum ve benzer sorunları vardı. Yerleşik kuralları devre dışı bırakılması

+2

Bir cthulhoid inşa sistemi yapım değil mi Joiner şunlardır: Örneğin, şu assembler çalıştırır kuralı iptal olur? –

+0

Birçoğu arasında, bu kez, ücretsiz paralellik için dosyaları oluşturur. C++ 'ya dönüştürme yapılamama sürelerini on kat arttırdı ki bu kabul edilemez. –

+4

"C++ 'ya dönüştürme ... kabul edilemez." - Matt Joiner. ;-) –

cevap

29

writing an empty rule for .SUFFIXES yapılır:

.SUFFIXES: 

yerleşik kuralları sildim sonra, emin değilim o silme Yerleşik değişkenler size sadece hatırlamak çok daha fazla yardımcı olur Bunları kendiniz ayarlayın veya kullanmayın, ancak kabul edilebilecek kadar çılgın olan

gibi bir şeyi kullanabilirsiniz. Eğer tanımlanmış değişkenlerin bir listeden yapılabilmesi için bir yol var ise (başka bir marka haline getirmek yerine), bu geçerli olacaktır.

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

Bu irade: Olduğu gibi insanların doğrudan make kullanmaya kalkmayın böylece farklı bir şey bir #! ile Makefile başlayıp diyebiliriz gerçekten çok daha iyi

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

Bu güzel, ama biraz da hacky. Bunu sanmıyorum –

+2

yerleşik [şey kurallara uyan] (http://www.gnu.org/software/make/manual/make.html#Match_002dAnything-Rules) –

+1

[görünüyor] kolları (https: //savannah.gnu.org/bugs/?20501) GNU bazı sürümlerinde olun, takas '.SUFFIXES' yerleşik devre dışı bırakır _suffix rules_ ancak _pattern rules_() Brandon'ın cevaba bakınız. Yine de GNU Make (3.81) '.SUFFIXES 'versiyonumda yeterli görünüyor. –

1

daha değil GNU yapmak sistem make ise, korkunç sorunlara neden. Belki bir sarmalayıcı senaryosu?

$(MAKEFLAGS)'u da okuyabilir ve gerekli bayrakların bulunduğundan emin olabilirsiniz.

+3

Bence sizce #!/Usr/bin/env make -rRf'? Oh, şimdi ne demek istediğini görüyorum. –

+0

'/ usr/bin/env' muhtemelen daha iyi. –

+0

Bu çalışma ve verim '/ usr/bin/env olmaz: '-rRf yapmak': (örn Linux gibi) birçok sistemlerde Böyle bir dosya veya directory' olarak yalnızca tek bir isteğe bağlı argüman shebang hattı üzerinde desteklenir ve hiçbir komut bölme işlemi yapılmaz. Bakınız [burada] (https://en.wikipedia.org/wiki/Shebang_ (Unix) #Portability). –

4

Bu benim için çalışıyor:

# 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: 

her makefile bunu bir dosya adında disable_implicit_rules.mk koy ve include.

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

Bu değişken atamasının neden iç içe geçtiğinden emin değilim .... –

20

@Hseldon doğru fikre sahiptir çünkü .SUFFIXES, eşleşmeyen yerleşik örtük kuralları kapsar. Ancak, onun sözdizimi tam olarak doğru olduğunu düşünmüyorum. Yerleşik kurallardır -

MAKEFLAGS += --no-builtin-rules 

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

biri daha sonra önceden bilinen son ekleri eklemek için başka .SUFFIXES kural yazıyor eğer çalışmaz http://www.gnu.org/software/make/manual/make.html#Match_002dAnything-Rules ve .SUFFIXES için boş bir kural yazarak yerleşik kuralların http://www.gnu.org/software/make/manual/make.html#index-g_t_002eSUFFIXES-998

+0

Bu benim için yapmıyor. Benim bir kuralım var. %: foo.o bar ve yürütme işlemi "rm foo.o bar.o" yapar. Bu senin önerilen bayrak ayarıyla gitmiyor. –

+2

@VictorEijkhout: Yani yerleşik kurallar nedeniyle, ancak [kurallar zincirleme] tarafından değil (https://www.gnu.org/software/make/manual/html_node/Chained-Rules.html). Otomatik kaldırmayı önlemek için '.SECONDARY' kullanın. –

5

Devre Dışı Bırakmayı gör yeniden sağladı. Örnek: Biri .c.i ve .i.o için kuralları tanımlamak ve .c.o yerleşik kuralını devre dışı bırakmak istiyor.

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

Yazma çalışmıyor - bu uygulanıyor gelen yerleşik kural .c.o engellemez.(Eğer kendinizi tanımladığınız veya bir)

Sen yerleşik bir örtük kuralı geçersiz kılabilir tarafından:

çözüm manuel GNU make Marc Eaddy tarafından istihdam ve belgelenmiş bir, 10.5.6 Canceling Implicit Rules olduğunu Aynı hedef ve önkoşulları ile yeni bir model kuralı tanımlamak, ancak farklı bir tarif. Yeni kural tanımlandığında, yerleşik olan değiştirilir. Yeni kuralı, örtülü kuralların sırasındaki konumu, yeni kuralı yazdığınız yere göre belirlenir. Aynı hedef ve önkoşullar ile bir desen kuralı tanımlayarak yerleşik bir kuralı iptal edebilirsiniz, ancak hiçbir reçete yoktur.

%.o : %.s 
İlgili konular