Bu, Ubuntu Online, Fedora Online, Windows çevrimiçi öykünücüsü veya MAC OS çevrimiçi öykünücüsü gibi birden çok ücretsiz çevrimiçi iş istasyonumuzdan biri kullanılarak OnWorks ücretsiz barındırma sağlayıcısında çalıştırılabilen makepp_statements komutudur.
Program:
ADI
makepp_statements -- Bir makefile içindeki çeşitli ifadeler
TANIM
A: otomatik yükleme, B: inşa_önbellek,
yapı_kontrol, D: "tanımlamak", E: ihracat, G: küresel, I: ifdef,
ifek,
ifmakeperl,
ifndef,
ifneq,
eğer,
gerçekse,
ifperl,
eğersys,
Eğer doğruysa,
-Dahil etmek,
Dahil etmek,
_Dahil etmek, L: load_make dosyası, M: Yapmak,
yapıcı,
makyaj, N: "no_implicit_load", P: perl,
"perl_begin",
önceden oluşturulmuş, R: Register_command_parser,
register_input_soneki,
kayıt_parser,
depo,
Çalışma süresi, S: imza,
"alt", V: v yolu
İfade, içinde ":" olmayan bir kelime ile başlayan herhangi bir satırdır. (Bir kolon
satırın bir kural olduğunu ima eder.) Örneğin, bunlar ifadelerdir:
extra_rules.mk'yi dahil et
load_makefile alt dizini
Makepp, ara sıra kullanmanız gerekebilecek bir dizi yerleşik ifadeye sahiptir.
Alt çizgi gördüğünüz her yerde kısa çizgi de kullanabileceğinizi unutmayın, çünkü makepp
deyim adlarında alt çizgi için kısa çizgiler.
Şartlılar
Koşullar, Makeppfile dosyasının hangi satırlarının olduğunu kontrol eden özel ifadelerdir.
aslında görüldü. En basit biçim ("ifxxx", herhangi bir koşullu
Aşağıda belgelenen ifadeler):
ifxxx...
ifade doğru olarak değerlendirilirse görülen satırlar
endif
ya da alışveriş sepetinize tıklayın:
ifxxx...
ifade doğru olarak değerlendirilirse görülen satırlar
başka
ifade yanlış olarak değerlendirilirse görülen satırlar
endif
Bunun gibi karmaşık kombinasyonlar yapma imkanı da vardır:
ifxxx...
ve ifxxx ...
ve ifxxx ...
veya ifxxx ...
ve ifxxx ...
birleştirilmiş ifadeler doğru olarak değerlendirilirse görülen satırlar
başka ifxxx ...
veya ifxxx ...
ve ifxxx ...
ilk kombinasyon yanlış olarak değerlendirilirse görülen çizgiler
ve bu birleşik ifadeler doğru olarak değerlendirilir
başka
yukarıdaki ifadeler yanlış olarak değerlendirilirse görülen satırlar
endif
Girinti tarafından önerildiği gibi, "ve" önceliğinden daha yüksek "veya". Diğer bir deyişle
an "veya" iki grup arasında seçim yapar "ve"`s. Herhangi bir sayıda "ve ifxxx" olabilir,
"veya ifxxx"ler ve "else ifxxx"ler.
"ifxxx" koşullu ifadeleri, kuralın ortasında oluşabilmeleri bakımından benzersizdir.
Yukarıdaki örnekte olduğu gibi, kuralı bozmadan eylemler.
ifeq dize1, string2
ifneq dize1, string2
ifeq ($(STR1),$(STR2))
true ise makefile satırları
başka
false ise makefile satırları
endif
İki dize tam olarak eşleşirse (öndeki veya sondaki boşluklar hariç), o zaman
ilk satır grubu kullanılır; aksi halde ikincisi kullanılır. else cümleciği ise
isteğe bağlı.
"ifeq" ve "ifneq" ifadeleri için kabul edilebilir iki sözdizimi daha vardır:
ifeq dize1, dize2
ifeq dize1 dize2
hangileri eşdeğerdir. Elbette dizeleri gerektiği gibi alıntılayabilirsiniz.
"ifeq" ve arkadaşları "ifneq", "ifdef", "ifndef", "ifperl", "ifmakeperl", "ifsys" ve
"iftrue", öncelikle birkaç farklı altında bir program oluşturmanız gerektiğinde kullanışlıdır.
koşullar. Örneğin,
BUILD_TYPE := hata ayıklama # "hata ayıklama" veya "üretim"
ifeq ($(BUILD_TYPE), hata ayıklama)
FLAGLAR := -g
başka
FLAGLAR := -O2
endif
programı : *.o
$(CC) $(CFLAGS) $(girdiler) -o $(çıktı) $(LIBS)
ifeq ($(BUILD_TYPE), üretim)
şerit $(çıktı)
endif
%.o : %.c
$(CC) $(CFLAGS) -c $(girdi) -o $(çıktı)
Bu bir üretim yapısıysa, tüm dosyalar yerine "-O2" seçeneğiyle derlenir.
"-g" seçeneği. Ayrıca, "şerit" programı, elde edilen ikili dosya üzerinde çalıştırılır (
hata ayıklama modunda derlenmiş bazı kitaplıklarla bağlantı kurmanız durumunda).
Bazen "$(if)" işlevini veya "$(Perl)" işlevini kullanmak daha kolaydır
"ifeq" ifadesi yerine.
Bir sembolün boş olup olmadığını görmek istiyorsanız, sadece bir sembolü sağlamanız yeterlidir.
tek argüman, şöyle:
ifneq $(EXE_SUFFIX)
# $(EXE_SUFFIX) boş değilse ne yapmalı
endif
ifdef DEĞİŞKEN Kendi ID’n ile mağazalarını oluştur
ifndef DEĞİŞKEN Kendi ID’n ile mağazalarını oluştur
Bu ifadeler, "ifeq" ve "ifneq" ifadelerine benzer şekilde çalışır, ancak bunun dışında
değişkenlerden herhangi birinin tanımlı olup olmadığını test ederler (yani hiçbiri tanımlanmamıştır).
tanımlı). Aşağıdaki durumlarda bir değişken tanımlanır:
· Makefile'de daha önce atama ile bir değer verildi. Görmek
Ayrıntılar için makepp_variables.
· Bir "perl_begin" bloğunda Perl değişkeni olarak bir değer verildi.
· Değişken ortamda mevcut.
· Değişken komut satırında bulunur, örneğin makefile'inizi çağırmak için
yazılan
makepp CFLAGS=-O2
Örneğin,
ifndef CFLAG'ları
FLAGLAR := -g
endif
Bu durumda, "CFLAGS", yalnızca önceden tanımlanmamışsa "-g" olarak ayarlanır. Bunu not et
bu ifade, "?=" ataması kullanılarak kolayca yazılabilirdi, örneğin
bu:
CFLAGS ?= -g
ifperl perl kodu
ifmakeperl perl kodu
Bu ifadeler, "ifeq" ve "ifneq" ifadelerine benzer şekilde çalışır, ancak bunun dışında
testler Perl'de. İlk varyant düz Perl kodudur, ikinci varyant ise
ilk önce ifadeyi Make-stili değişken genişletmeden geçirir.
VERSİYON := 3.0
# VERSION otomatik olarak bir Perl değişkenidir:
ifperl $VERSION <= 2
CPPFLAGS := -DNEW
endif
# tırnak işareti CFLAGS için gereklidir, çünkü Perl yalnızca değeri görür:
ifmakeperl benim $$x = '$(CFLAGS)'; $$x =~ /-g/
CFLAGS := -g -O2
endif
ifsys joker Kendi ID’n ile mağazalarını oluştur
ifnsys joker Kendi ID’n ile mağazalarını oluştur
Mevcut sistem makepp'inin joker karakterlerden herhangi biriyle eşleşip eşleşmediğini test eder
herhangi biri (yani hiçbiri).
ifsys i[3-6]86
ve ifsys Linux SunOS
... # Linux veya Solaris içeren bir Intel platformu
başka ifnsys sparc gücü*
... # Ne Sparc ne de PowerPC
endif
Eşleştirebileceğiniz en fazla altı farklı dizi var. gerçek dizeler şunlardır
standartlaştırılmamış. Bunlardan üçü Perl örneğinin ne için oluşturulduğunu yansıtır (değil
mutlaka çalıştığı yerle aynı) ve diğerleri sistemden geliyor ve
hepsi şekil olarak çılgınca değişir. Mevcut platformun eşleştiği her şeyi bulabilirsiniz.
Shell'e aşağıdaki komutu yazarak:
perl -MConfig -e'print "$^O @Config{qw(archname myarchname)} "'; uname -mps
Eğer doğruysa ifade
gerçekse ifade
İfadenin sıfır dışında bir değer veya boş dize olarak değerlendirilip değerlendirilmediğini test eder.
Diğer Çok satırlı Tablolar
Koşullar, çok satırlı bir ifadenin tamamını kontrol edebilir, ancak böyle bir ifadenin içinde olamazlar.
ifadesi.
tanımlamak
{dışa aktar|küresel|geçersiz kıl}* tanımla
DEĞİŞKEN [atama operatörü] tanımla
değişken değer satırı 1
değişken değer satırı 2
Endef
$(VARIABLE)'ın değerini, "define" ifadesi ile ifade arasındaki tüm satırlar olarak tanımlar.
"endef" ifadesi. Çok satırlı değişkenlere bakın. "Dışa aktarma" ve "küresel" anahtar sözcükleri
aynı anda verilmez.
perl_begin
Bu, "Perl" ile aynıdır, ancak GNU make style deyimi sözdizimi kullanmaktır. Bu açıklama
perl tarafından kelimesi kelimesine yorumlanan bir kod bloğu sunar. faydalı olabilir
işlevleri tanımlamak için, ancak bunu "sub" ifadesiyle daha kısa bir şekilde yapabilirsiniz.
Makefile'nizdeki bir Perl kodu bloğu, daha kolay eylemleri gerçekleştirmek için yararlı olabilir.
Perl'de makepp işlevleri ve kurallarından daha fazla.
"Perl_begin" ifadesini izleyen satırın geri kalanı yoksayılır. Tüm metin
sol kenarda "perl_end" ile başlayan bir satır kelimesi kelimesine gönderilene kadar
perl yorumlayıcısı. "Perl_end"den önce boşluk olamaz.
Bunu kullandığım bir örnek, mutlaka gerekmeyebilecek dizinler oluşturmaktır.
mevcut. Tüm .o dosyalarını bir alt dizine (örn.
bir isim ile dizin i386ya da sparcveya makine tipine bağlı olan bir şey).
Ama ya dizin henüz mevcut değilse? Her bir .o dosyasını aşağıdakilere bağlı hale getirebilirsiniz:
alt dizini oluşturun ve alt dizini oluşturmak için bir kural koyun. Ama sadece çok daha kolay
Bunu yapmak için:
OBJDIR := $(ARCH) # .o dosyalarını koyduğumuz yer.
perl_begin
-d $OBJDIR veya mkdir $OBJDIR; # Dizinin var olduğundan emin olun.
perl_end
Bu şekilde, makefile her çalıştırıldığında, çalıştırılırsa alt dizin oluşturulacaktır.
yok.
Bazı işlemler makepp'lerden daha düzenli ifadelerle daha iyi ifade edilir.
metin işlevleri. Örneğin,
perl_begin
if ($ARCH =~ /^i[56]86/) { # Bunu şununla yapabilirsiniz: ifsys i[56]86
$CFLAGS = '-O6 -malign-double'; # Intel makinelerinde > 486, orada
# önemli bir hız cezasıdır
# dört kelime olmayan çiftler için
# hizalı.
} Else {
$CFLAGS = '-O6';
}
perl_end
%.o: %.c
$(CC) $(CFLAGS) -c $(girdi) -o $(çıktı)
Herhangi bir make değişkenine doğrudan bir Perl skaleri olarak erişilebilir. Bu durumda, ayarladık
"CFLAGS" değeri, normal ifade eşleşmesine göre farklı şekilde
mimari bayraklar.
Son bir örnek olarak, bazı bilgilere doğrudan Perl'den erişmek daha kolaydır.
makepp'ten daha fazla. Örneğin, tüm yapılandırma bilgilerine erişebilirsiniz.
bu perl, paylaşılan kitaplıkların nasıl oluşturulacağı vb. dahil olmak üzere sisteminiz hakkında bilgi sahibidir.
(Perl'in sahip olduğu yapılandırma bilgilerini görmek istiyorsanız "perldoc Config" yazın.
mevcut.)
perl_begin
Config'i kullanın;
$ARCH = $Config{'archname'}; # Perl'in mimari bilgisini kullanın.
$CC = $Yapılandırma{'cc'}; # Perl ile aynı C derleyicisini kullanın.
$SHARED_OBJ_CFLAGS = $Yapılandırma{'cccdlflags'};
# Nesneleri derlemek için gerekli bayraklar
# paylaşılan bir kitaplığa gidin.
$SHARED_OBJ_LDFLAGS = $Config{'ccdlflags'} . " " . $Config{'lddflags'};
# Paylaşılan bir kitaplık oluşturmak için bağlayıcı bayrakları.
$SHARED_CC_LINK = $Yapılandırma{'ld'}; # Paylaşılan kitaplıkları oluşturma komutu.
$SHARED_EXTENSION = $Yapılandırma{'dlext'}; # Paylaşılan kitaplıkların uzantısı.
perl_end
%.o: %.c
$(CC) $(CFLAGS) $(SHARED_OBJ_CFLAGS) -c $(girdi) -o $(çıktı)
libmylib.$(DLEXT): *.o
$(SHARED_CC_LINK) $(girdiler) -o $(çıktı) $(SHARED_OBJ_LDFLAGS)
Perl bloğunda bir grup değişkeni nasıl tanımladığımıza ve sonra bunları kullandığımıza dikkat edin.
daha sonra makefile'ın geri kalanında. Perl'in tüm gücünü kullanabilirsiniz
değişkenlerinizi keyfi olarak karmaşık şekillerde ayarlamak için yorumlayıcı. Shell'i çalıştırabilirsiniz
Perl kodunuzdan komutlar, bir veritabanına erişin veya ne istersen.
perl perl kodu
yapıcı perl kodu
Bu, "perl_begin" ile aynıdır, ancak Perl tarzı ayraçlar kullanır. İlk varyant
düz Perl kodu, ikinci değişken ise ifadeyi ilk önce Make-
stil değişken genişletme. Perl'in kaşlı ayraçlarını ayrıştırmanın zorluğunun
aşağıdaki basit buluşsal yönteme:
· Aynı veya sonraki satırda çift açılımlı ayraç bulunursa, çift kapamalı
parantez bloğu sonlandıracaktır. Bir satırın başında olmalıdır, ancak
boşluktan önce gelir.
· Aksi takdirde, kapatma ayracı "Perl" satırının en sonundaysa bu birdir.
astar.
· Aksi takdirde kapatma ayracı bir sonraki satırın en başında olmalıdır,
yani başında boşluk yok.
Perl betiklerini çağırmanın etkili bir yolu için "çalıştır" konusuna bakın. "$(Perl)" işlevinden farklı olarak,
bu bloğun dönüş değeri yok sayılır.
perl { print "makefile'de bu noktayı geçti\n" }
perl
{
print "ve bu da\n";
}
ifdef GÜRÜLTÜ
{{
"ve bunun yanı sıra\n" yazdır
}}
endif
Gömülü kodunuz için Perl hata ayıklayıcısını, makepp'in kendisini
hata ayıklayıcı, nerede ... argümanlar, varsa, normalde ilettiğiniz:
perl -d -S mpp ...
Yüklenmemiş Perl kodunda kesme noktaları ayarlamak zordur. Çalışabilirsin
bu satırı gömülü Perl'inize, istediğiniz yerden hemen önce koyarak bunun etrafında
kırmak:
$DB::tek = 1;
Ardından, o noktaya kadar devam etmek için hata ayıklayıcının istemine "c" yazabilirsiniz.
alt
makyaj
Bu ifade, makefile içinde bir Perl alt yordamı tanımlamanın bir yolunu sağlar. NS
ilk değişken düz Perl kodudur, ikinci değişken ilk önce ifadeyi geçer
Make tarzı değişken genişletme yoluyla. Sözdizimi Perl'inkiyle aynıdır
alt ifade, prototiplerin anlamsız olması dışında.
Vücudun diş tellerini takmanın üç olasılığı için, aşağıdaki açıklamaya bakın.
"perl" ifadesi.
Bir ifade görüldüğünde veya aşağıdaki gibi bir ifade olduğunda bir Perl alt yordamı çağrılır.
"$(isim kelimeleri)" görülür. Örneğin, herhangi bir nedenle yüklemeniz gerektiğini varsayalım.
bir dosyanın içeriğini bir make değişkenine dönüştürün. (Bunu söyleyerek yapabilirsin
"$(kabuk kedisi dosya adı)" ancak bunu kabuğu çağırmadan yapmak mümkündür.)
Bu, aşağıdakileri makefile'inize yerleştirerek yapılabilir:
alt f_file_contents {
benim ($dosya) = @_; # Argümanı adlandırın.
$fh, $file dosyamı aç veya öl "$file: $!\n";
yerel $/ = tanımsız; # Slurp dosyası bir okumada.
<$fh>;
}
ifdef HABERLER
makesub f_VAR2
{{
$(VAR) * 2;
}}
endif
makesub f_VAR1 { $(VAR) + 1 }
Şimdi, bu fonksiyon tanımlıyken yazabilirsiniz.
X = $(file_contents dosya adı) # yerleşik $(&cat dosya adı) ile eşdeğer
ve "$(X)" değişkeni, her aldığında verilen dosyanın içeriğini getirecektir.
genişletilmiş. Bunu tam olarak bir kez yapmak için ":=" kullanın veya bunu en fazla bir kez yapmak için ";=" kullanın.
Daha fazla ayrıntı ve örnek için makepp_extending'e bakın.
Basit Tablolar
özdevinimli_yükle Dosya Kendi ID’n ile mağazalarını oluştur
içindeki bir dosya için bir kural bulma girişiminde bulunulması durumunda yüklenecek bir veya daha fazla makefile belirtir.
bu dizin aksi halde başarısız olur. Bu, makefile'ın aşağıdaki kurallara sahip olduğu durumlarda kullanışlıdır.
tanımlar (muhtemelen dolaylı olarak) bağlı olan başka bir dizindeki bir dosyaya bağlıdır.
(muhtemelen dolaylı olarak) bu dizindeki diğer dosyalarda (bunu yapan kurallar tarafından oluşturulmuş) değil
diğer dizindeki dosyaya bağlıdır).
örneğin, senin makepp dosyası şöyle görünebilir:
kurallar-inşa-dosyaları-bu-diğerdir/x-bağlıdır
more_rules.makepp dosyası: diğerdir/x
action-to-build-more_rules.makepp dosyası
more_rules.makepp dosyasını otomatik yükle
Burada "otomatik yüklemeyi" güvenilir bir şekilde "include" ile değiştiremeyeceğimizi unutmayın, çünkü eğer
kuralından başka bir şey more_rules.makepp dosyası inşa etmeye çalışır diğerdir/x
önce, sonra more_rules.makepp dosyası muhtemelen başarısız olacak çünkü diğerdir/x var olmayacak
henüz, çünkü onu inşa etmek için zaten bir girişim var. makepp dosyası is
adına dolaylı olarak yüklenmiştir.
UYARI: Otomatik olarak yüklenen bir makefile dosyasında değişiklik yapan şeyleri yaparken çok dikkatli olun.
dizinin diğer makefile(ler)indeki kuralların davranışı, çünkü bu
önceden oluşturulmuş bir hedefin makefiles'e neden olup olmadığına bağlı olarak davranış
otomatik olarak yüklenebilir.
build_cache /path/to/build/önbellek
[küresel] build_cache /path/to/build/önbellek
Derleme önbelleğine giden yolu belirtir. Ayrıntılar için makepp_build_cache bakın. yapı
önbellek zaten mevcut olmalıdır; için makepp_build_cache içinde "Bir derleme önbelleği nasıl yönetilir" konusuna bakın
ilk etapta nasıl yapılır. Makefile içindeki bir "build_cache" ifadesi geçersiz kılınır
makefile'deki kurallar için "--build-cache" komut satırı seçeneği, ancak
":build_cache" kural değiştiricisi tarafından kural bazında geçersiz kılınır.
"Global" anahtar sözcüğü, komutla aynı etkiyle bu ifadeden önce gelebilir.
satır seçeneği, yani derleme önbelleği her makefile içinde geçerlidir. En iyisi bu olmalı
verilen bir RootMakepp dosyası yeterince erken görüldüğünden emin olmak için.
Derleme önbelleğini devre dışı bırakmak istiyorsanız, bir dizine giden yol yerine "hiçbiri" belirtin
bu makefile içindeki tüm kurallar için.
inşa_kontrol et build_check_method
[küresel] build_check build_check_method
Bu makefile içindeki tüm kurallar için varsayılan derleme denetimi yöntemini belirtir. Görmek
ayrıntılar için makepp_build_check. "build_check" ifadesi,
makefile içindeki tüm kurallar için "--build-check-method" komut satırı seçeneği, ancak
":build_check" değiştiricisi tarafından kural bazında geçersiz kılınır.
"Global" anahtar sözcüğü, komutla aynı etkiyle bu ifadeden önce gelebilir.
satır seçeneği, yani derleme kontrol yöntemi, olmayan her makefile için geçerlidir.
kendi belirtin. Bu en iyi şekilde verilmelidir. RootMakepp dosyası olduğundan emin olmak için
yeterince erken görüldü.
Varsayılana dönmek istiyorsanız, bir ad yerine "build_check varsayılanı" belirtin.
"Global" anahtar sözcüğü ile bu, "exact_match" yöntemi anlamına gelir, aksi takdirde bu,
geçerli makefile kendi özel yöntemine sahip değil.
ihracat VAR Kendi ID’n ile mağazalarını oluştur
ihracat atama
YOLU dışa aktar := $(PWD):$(YOL)
Alt süreçlere dışa aktarma için verilen değişkenleri işaretler. Değişkenleri ayarlama konusuna bakın.
global VAR Kendi ID’n ile mağazalarını oluştur
global atama
global MYPROJECT.INFO = tüm makefile'lerde görülecek bilgi
Verilen değişkenleri tüm makefile'ler için global olarak işaretler. Değişkenleri ayarlama konusuna bakın.
dahil makefile
Bu, başka bir makefile içeriğini geçerli makefile'e ekler. Olabilir
bir dizi kural veya değişken içeren ortak dosya dosyalarınız varsa ve her biri
dizinin sadece birkaç değişiklik yapması gerekiyor. "include" ifadesi de kullanıldı
otomatik içerme dosyası ile birlikte geleneksel yapımlarda yaygın olarak kullanılacak
tarayıcılar, ancak bu artık makepp ile gerekli değildir.
"include" önce geçerli dizini, ardından geçerli dizinin ebeveynini dikkate alır.
dizin, ardından üst öğesi vb. Dizinlere ulaştığında dizinleri dikkate almayı bırakır.
dosya sisteminin kökü veya dosya sistemi aygıt kimliği değiştiğinde. (Bunun anlamı şudur ki
diğer NFS bağlantılarında bulunan dosyaları bulamaz. Bu, sorunları önlemek için
ağ dosya sistemleri veya otomatik bağlayıcılar ve ölü sunucular.) Bir dosya bulamazsa
araması durdurulduğunda verilen ad, ardından makepp verilerine bakar
dizin (/usr/yerel/paylaş/makepp içine makepp yüklediyseniz / Yerel / usr) biri için
makepp ile birlikte gelen include dosyaları.
Tüm dizindeki her makefile bir şablon dosyası eklemek istiyorsanız
hiyerarşi, makefile şablonunuzu en üst dizine yerleştirebilirsiniz. makefiles
hiyerarşide tam olarak nerede olduklarını bilmek zorunda değiller; her makefile içerebilir
şöyle bir satır:
standard_definitions.mk'yi dahil et
bunun gibi daha karmaşık bir şey yerine:
include ../../../standard_definitions.mk # Bu, ..'nin doğru sayısı mı?
İstediğiniz kadar dosya belirtebilirsiniz ve değişkenlere izin verilir:
dahil dosya1 dosya2 dosya3 $(other_include_files)
Hem GNU make hem de makepp ile çalışması gereken bir yapı üzerinde çalışıyorsanız,
bazen tamamen aynı makefile'lere sahip olmak uygundur, ancak farklı bir içerik
dosya. Örneğin, tüm makefile dosyalarınız şunun gibi bir satır içerebilir:
$(TOPDIR)/standard_rules.mk dahil
ve sen istiyorsun standart_rules.mk GNU make ve makepp için farklı olmak. kolaylaştırmak
bu, "include" ifadesi ilk sonekine sahip bir dosya arar .makepp önce
istediğiniz dosyayı arıyorum. Bu durumda, önce bir dosya arardı.
denilen standard_rules.mk.makepp, ve eğer varsa, onun yerine onu yüklerdi.
standart_rules.mk. Bu şekilde makefile'ı GNU make ile çalıştırdığınızda,
standart_rules.mk, ancak makepp ile yükler standard_rules.mk.makepp.
Çünkü birçok eski dosya, dahil etme dosyasından sonra bir içerme dosyası oluşturmak için kuralı koyar.
açıklama, makepp, mevcut olmayan veya eski içerikler hakkındaki kararları sonuna kadar erteleyecektir.
makefile yükleme. Yani, "--rm-stale" ile çağrılmadığı sürece. kadar çok
durum o zamana kadar düzeldiği için (bir kural ortaya çıktığı için) makepp
makefile dosyasını yeniden yükleyin; bu, bu tür kuralların tekrar görünmesini sağlayabilir. bu açıkçası
makefile yüklemek için verimsiz bir yol, bu yüzden bundan kaçınmaya çalışın. Daha da kötüsü, eğer makefile
yüklemenin yan etkileri vardır (genel bir değişkene veya benzeri bir satıra ekleme gibi
"do_it_now := $(kabuk kedi a >>b)" veya makepp eşdeğeri "&cat a -o>>b")
makefile'ın yüklenmesi gerektiği kadar çok kez olur, bu yüzden tekrar, bundan kaçınmaya çalışın!
_Dahil etmek makefile
-Dahil etmek makefile
"Include" öğesinin küçük bir varyantı olan "_include" ifadesi, varsa dosyayı içerir
ancak yapmazsa önemli bir hata oluşturmaz. için kullanılan "_include" ifadesi
GNU make ile dosya taramayı dahil etmek için önemli olabilir, ancak makepp için daha az kullanışlıdır.
load_makefile /bazı/dizin/bir yerde/Makefile
load_makefile alt dizin
load_makefile VAR1=değer1 VAR2=değer2 alt dizin
Bu ifade, makepp'in makefile dosyasını içeren dizine cd göndermesine ve yüklenmesine neden olur.
kurallarını makepp'in dahili veritabanına aktarır. Bunun yerine yalnızca bir dizin belirtirseniz
bir makefile, "load_makefile", içinde "Makeppfile", "makefile" veya "Makefile" arar
dizin.
"VAR=değer" (veya "VAR="değer1 değer2"") sözdizimi ile belirttiğiniz tüm değişkenler,
yüklenen makefiles'e iletilir. Bu makefilelerdeki tüm ayarları geçersiz kılarlar, sadece
sanki komut satırına yazmışsınız gibi.
"load_makefile" kullanmak komuttan farklıdır
dir/makefile dahil
iki şekilde. İlk olarak, "load_makefile" üstten herhangi bir değişken aktarmaz.
makefile'i alt makefile'e seviyelendirin; her makefile kendi içinde var olur
ad alanı. Asttaki makefile, üst düzeydeki değişkenleri etkileyemez.
herhangi bir şekilde makefile.
İkinci olarak, her derleme komutu, geldiği makefile dizini ile etiketlenir.
itibaren. makepp farklı bir makefile'den bir kural çalıştırdığında, önce cd'ler
komutu çalıştırmadan önce bu makefile dosyasını içeren dizin. Makefiles olan
"include" ifadesi ile görülenler aslında makefile'ın bir parçası olarak kabul edilir.
onları içerir ve bu nedenle kuralları farklı bir dizinle etiketlenmez.
Alışılmadık bir isme sahip olmadıkça, genellikle bir makefile açıkça yüklemeniz gerekmez.
veya makefile ile aynı dizinde yer almayan hedeflere sahip
veya örtük makefile yüklemesini devre dışı bıraktınız. Varsayılan olarak, eğer makepp
bir dosya oluşturmaya çalışıyor ve onu oluşturmak için bir kuralı yoksa veya bir dosyayı değerlendiriyorsa
bir dizindeki joker dosya adı, otomatik olarak bir makefile yüklemeye çalışır
bu dizinden. Bilgi için makepp_cookbook'ta "Birden çok dizin için ipuçları" bölümüne bakın
birden çok dizinle oluşturma hakkında.
Aynı dosya için geçerli olan birkaç makefile yüklemek için "load_makefile" kullanamazsınız.
dizin. Aynı dosya için geçerli olan birkaç makefile parçası için "include" kullanın.
dizin ve farklı dizinlere uygulanan makefile'ler için "load_makefile".
no_implicit_load
Bu ifade, makefile dosyalarının bir dizi dizinden örtük olarak yüklenmesini kapatır.
Bu, makefile dosyalarını çoğu dizinden otomatik olarak yüklemek istiyorsanız yararlı olabilir.
ancak çeşitli nedenlerle makepp'in yüklenmesini istemediğiniz bazı dizinler vardır.
güncellemeye çalışın. (Örneğin, dizinde başka bir sürüm için bir makefile olabilir.
makepp'in anlamadığı make.) Örneğin,
no_implicit_load dizin1 dizin2/*
Yukarıdaki ifade, "dir1" içindeki makefiles için örtük yüklemeyi kapatacaktır. ve herşey of
onun alt dizinleri. Ayrıca, herkes için örtük makefile yüklemesini de açacaktır.
"dir2"nin alt dizinleri (ve bunların tüm alt dizinleri), ancak "dir2"nin kendisi için değil.
Açıklamada joker karakterler kullanabilirsiniz. Joker karakterle eşleşen dizin dışı dosyalar
göz ardı edilir. Ayrıca, belirlediğiniz dizinleri daha fazla belirtmek için işlevleri kullanabilirsiniz.
ilgileniyorlar, örneğin,
no_implicit_load $(filtre çıkışı dir1 dir2, *)
dışındaki tüm alt dizinler için örtük yüklemeyi kapatacak dir1 ve dir2 ve onların
alt dizinler.
önceden oluşturulmuş hedef
yapmak hedef
Argümanlar (Make tarzı değişken genişletmeden geçen) hemen oluşturulur.
Bu, Makefile'ın oluşturabileceği hedeflerin listesi bir
başka bir dizinde oluşturulan dosya.
Şu anda, aralarında bir bağımlılık döngüsü varsa, sessizce hedefler oluşturmada başarısız olacaktır.
önceden oluşturulmuş hedefler ve bunları oluşturmak için yüklenmesi gereken Makefiles, ancak
bir hata olarak ele alınmalıdır.
Register_command_parser komut_kelime ayrıştırıcı
kayıt_parser komut_kelime ayrıştırıcı
Kural eylemlerini sözcüksel olarak analiz ederken, şunu kullanın: ayrıştırıcı için komut_kelime, hangisi olabilir
tam yol veya yalnızca temel ad. Temel ad genellikle yeterlidir çünkü lexer
ikisini de dener.
The ayrıştırıcı önde gelen veya olmayan bir sınıf adı olabilir
"Mpp::CommandParser::". Böyle bir sınıfın "fabrika" adında bir üye işlevi olmalıdır.
bu, o sınıfın bir nesnesini döndürür. Sınıf adı iki nokta üst üste içeriyorsa,
alıntı, bu satırı bir kural gibi göstermemek için.
Veya, bu sınıf genellikle henüz yüklenmediği için, bunun yerine fabrika işlevi
Makefile ad alanında bulunur. Bu işlevlerin bir "p_" öneki vardır, bu
verilmez. Yerleşik ayrıştırıcıların durumu budur.
Etki, ":parser" kural seçeneğiyle karşılaştırılabilir. Ancak çok komutlu kurallar için
bu daha iyi bir yol.
Register_input_suffix komut_kelime sonek Kendi ID’n ile mağazalarını oluştur
Bir eylem sırasında tanınan girdi dosyası son ekleri listesine "sonek" ekleyin ...
"command_word" ile başlayan ayrıştırılır. Ayrıştırıcı normalde bunu aracılığıyla alırdı
Mpp::CommandParser::input_filename_regexp, ancak bunun yerine bunu tamamen görmezden gelebilir.
Ayrıştırıcılar, normalde seçenek olarak tanınmayan tüm argümanları almaz,
çünkü tanınmayan seçeneklerin argümanları olabilirler. (Örneğin, i386v is değil
"gcc -b i386v foo.c" komutunun bir girdi dosyası.) Bunun yerine, yalnızca alırlar
girdi dosya adlarına benzeyen konumsal bağımsız değişkenler.
Siteye özgü standart olmayan soneklerle standart araçları kullanmak alışılmadık bir durum değildir.
bu dosyaların farklı komutlar gibi özel işlem gerektirdiğini belirtmek için
seçenekler ve/veya son işleme adımları. Örneğin:
Register_input_suffix cpp .vpp
%.v: %.vpp
cpp $< > $@
Depo rehber
Depo hedef dizin=srcdir
Bir veya daha fazla depo dizini belirtir. Belirtilen ilk depoda
aynı dosya birden fazla havuzda mevcutsa ve oradaysa diğerlerine göre öncelik
bunun için bir build komutu yok. hakkında daha fazla ayrıntı için makepp_repositories bakın
depoları.
"Depo"dan sonra sadece bir dizin belirtirseniz, içeriği
geçerli dizin. İçeriğini dosyadaki herhangi bir rastgele yere bağlayabilirsiniz.
sistem, eşittir işaretinden önceki konumu belirterek, örn.
depo altdizini1/altdizini2=/users/joe/joes_nifty_library
Herhangi bir işlemden önce, depo ifadesini makefile dosyanızın en üstüne yakın bir yere koymalısınız.
kullanması gerekebilecek kurallar.
runtime program, kitaplık
"Kitaplığı", "program"ın çalışma zamanı bağımlılığı olarak saklayın. Hem "program" hem de "kütüphane"
birden fazla kelime içerebilir, bu durumda "kütüphane"deki her bir kelime bir
"program" içindeki her kelimenin çalışma zamanı bağımlılığı. "Program" otomatik olarak eklendiğinde
"Mpp::CommandParser" temel sınıfı tarafından bir komutun yürütülebilir bağımlılığı olarak, onun
çalışma zamanı bağımlılıkları (varsa) da eklenir. Bunun gerçekleşmesi için,
"program" kuralda bir dizin bileşeniyle ve herhangi bir şey olmadan belirtilmelidir.
kabuk meta karakterleri. Bu ifadenin amacı, bağımlılıkları yakalamaktır.
sahip olmadan, genellikle program tarafından yüklenen kitaplıklar ve diğer yürütülebilir dosyalar
bunları "program"ı çağıran her kuralın bağımlılıkları olarak açıkça belirtmek veya
bu bağımlılıkları belirlemek için "programı" tarayın (bu
zor.)
Çalışma zamanı bağımlılıkları özyinelemeli olarak geçilir, bu nedenle "a"nın çalışma zamanı bağımlılığı varsa
"b" ve "b", "c"ye çalışma zamanı bağımlılığına sahipse, "./a" kullanan herhangi bir kuralın
hem "b" hem de "c" üzerindeki örtük bağımlılıklar (özel bir
Bu davranışı geçersiz kılan "Mpp::CommandParser" sınıfı).
Bu ifadeyi ekledikten sonra eksik bağımlılıkların mutlaka eklenmeyeceğini unutmayın.
kural yeniden taranmadıkça bir makefile'e. "--force-rescan" komut satırını kullanın
Bunun olmasını sağlamak için seçenek.
imza isim
[global] [geçersiz kıl] imza isim
imza md5
imza C
imza c_compilation_md5
imza xml
imza xml alanı
imza varsayılanı
"imza" ifadesini izleyen tüm kurallar için imza yöntemini ayarlar;
hiçbir komut ayrıştırıcı bir yöntem seçmez. ile bireysel kurallar için bunu geçersiz kılabilirsiniz.
":signature" kural değiştiricisi.
"Geçersiz kıl" anahtar sözcüğünü eklerseniz, bu yöntem seçimi bile geçersiz kılar.
komut ayrıştırıcıları tarafından yapılır, ancak ":signature" kural değiştiricisiyle belirtilenler değil.
"Global" anahtar sözcüğünü eklerseniz, etki henüz okunmamış tüm kurallar için geçerlidir,
makefile ayrıca kendi "imza" ifadesine sahip değilse. Bu eşdeğerdir
"--signature" komut satırı seçeneği, herhangi bir kural okunmadan önce verilmişse, örneğin
RootMakepp dosyası yeterince erken görüldüğünden emin olmak için. Aynı şekilde "küresel
override" bu ifade için "--override-signature" komut satırına eşdeğerdir.
seçeneği.
Varsayılana dönmek istiyorsanız, bir ad yerine "imza varsayılanı" belirtin.
"Global" anahtar sözcüğü ile bu, basit değişiklik zamanı ve dosya boyutu anlamına gelir.
yöntem. Aksi takdirde, bu, mevcut makefile'yi kendi özel yöntemine sahip olmayacak şekilde geri döndürür,
ayarlanmışsa global bir yöntem kullanarak.
İmza yöntemleri hakkında daha fazla bilgi için bkz. makepp_signatures.
v yolu model rehber Kendi ID’n ile mağazalarını oluştur
Verilen her dizinden desenle eşleşen tüm dosyaları getirin. Desen içerebilir
çoğu bir "%" joker karakteri. Bu, şeffaf depo mekanizmasını kullanır (gmake'den farklı olarak
dosya adlarını yeniden yazar), ancak alt dizinlere tekrarlanmaz.
Komutları
Tüm yerleşik ve kendinden tanımlı komutlar (yerleşik komutlara ve makepp'in genişletilmesine bakın)
harici olarak temiz programlanmış Perl betikleri deyimler gibi kullanılabilir. Bu durumda
makepp ve herhangi bir girdi ile aynı süreçte çalıştıkları için kural eylemlerinden farklıdırlar.
veya çıktı dosyaları bağımlılık olarak veya makepp tarafından oluşturulmuş olarak kaydedilmez.
Tüm ifadelerde olduğu gibi, ifadelerden daha az girintili iseler, bu ifadeler olarak kabul edilirler.
varsa, önceki kuralın eylemleri.
Bu, makefile okunurken çıktı alınacak mesajlar için kullanılabilir:
&echo $$(VAR) değeri $(VAR)
Veya birçok kuralın her birini bir dizin oluşturma kuralına bağlı hale getirmek yerine, basitçe şunları yapabilirsiniz:
anında oluşturun. Dosya oluşturan komutların her seferinde yeniden işlendiğini unutmayın.
makefile okunduğu zaman., Bu yüzden bunu bir testle koruyoruz - yine de bu
bu komut tekrarlandığında hiçbir zarar vermeyeceğinden, gerekli olmayacak özel durum:
ifperl !-d 'dahil'
&mkdir -p dahil # Yalnızca mevcut değilse oluştur
endif
onworks.net hizmetlerini kullanarak makepp_statements çevrimiçi kullanın