İngilizceFransızcaİspanyolca

Ad


OnWorks favicon'u

eksileri - Bulutta Çevrimiçi

Ubuntu Online, Fedora Online, Windows çevrimiçi emülatörü veya MAC OS çevrimiçi emülatörü üzerinden OnWorks ücretsiz barındırma sağlayıcısında eksileri çalıştırın

Bu, Ubuntu Online, Fedora Online, Windows çevrimiçi öykünücüsü veya MAC OS çevrimiçi öykünücüsü gibi birden fazla ücretsiz çevrimiçi iş istasyonumuzdan birini kullanarak OnWorks ücretsiz barındırma sağlayıcısında çalıştırılabilen komut eksileridir.

Program:

ADI


Eksileri - Bir Yazılım Yapı Sistemi

TANIM


2.2.0 sürümü için bir kılavuz ve referans

Telif hakkı (c) 1996-2000 Özgür Yazılım Vakfı, Inc.

Bu program ücretsiz bir yazılımdır; yeniden dağıtabilir ve/veya şartlarına göre değiştirebilirsiniz.
Özgür Yazılım Vakfı tarafından yayınlanan GNU Genel Kamu Lisansı; herhangi biri
Lisansın 2. sürümü veya (isteğe bağlı olarak) daha sonraki herhangi bir sürüm.

Bu program faydalı olması ümidiyle dağıtılmaktadır, ancak HİÇBİR GARANTİ YOKTUR;
SATILABİLİRLİK veya BELİRLİ BİR AMACA UYGUNLUK zımni garantisi bile olmadan.
Daha fazla ayrıntı için GNU Genel Kamu Lisansına bakın.

Bu programla birlikte GNU Genel Kamu Lisansının bir kopyasını almış olmalısınız;
KOPYALAMA dosyasına bakın. Değilse, Free Software Foundation, Inc., 59 Temple'a yazın.
Yer - Süit 330, Boston, MA 02111-1307, ABD.

Giriş


Eksiler öncelikle yazılım oluşturmaya yönelik bir sistemdir, ancak yazılımdan oldukça farklıdır.
önceki yazılım yapım sistemleri. Eksileri, baştan başa başa çıkmak için tasarlandı
birden çok kaynak dizine yayılmış yazılım yapımı ile kolayca. Eksileri
basit, anlaşılır ve bakımı kolay derleme komut dosyaları oluşturmayı kolaylaştırır.
Eksileri, karmaşık yazılımın kolay ve doğru bir şekilde yeniden üretilebilir olmasını sağlar.

Eksileri, tüm bunları gerçekleştirmek için bir dizi teknik kullanır. İnşaat senaryoları sadece
Perl betikleri, onları hem anlaşılması kolay hem de çok esnek hale getirir. Küresel kapsam
değişkenler arasında bilgi paylaşımı için bir içe/dışa aktarma mekanizması ile değiştirilir.
komut dosyaları, her komut dosyasının okunabilirliğini ve sürdürülebilirliğini önemli ölçüde iyileştirir.
İnşaat ortamları tanıtılır: bunlar, aşağıdakileri yakalayan Perl nesneleridir.
oluşturma sürecini kontrol etmek için gerekli bilgiler. Çoklu ortamlar kullanılıyor
yapı ağacında ürünler üretmek için farklı anlambilim gerektiğinde. Eksileri
otomatik bağımlılık analizi uygular ve bunu global olarak tüm dizini sıralamak için kullanır
yapı. Varyant yapıları tek bir kaynak ağaçtan kolayca üretilir. Akıllı yapı
yerelleştirilmiş değişiklikler üzerinde çalışırken alt kümeleme mümkündür. Geçersiz kılmalar şu şekilde ayarlanabilir:
herhangi bir komut dosyasını değiştirmeden derleme talimatlarını kolayca geçersiz kılın. MD5 şifreleme
imza türetilmiş dosyalarla ilişkilendirilir ve doğru olup olmadığını belirlemek için kullanılır.
belirli bir dosyanın yeniden oluşturulması gerekiyor.

Yukarıdakilerin hepsini ve daha fazlasını sunarken, Eksileri basit ve kullanımı kolay kalır. Bu irade,
umarım, bu belgenin geri kalanını okurken netleşirsiniz.

Niye ya Eksileri? Niye ya değil Yapmak?


eksileri bir yapmak yenisiyle değiştirme. Aşağıdaki paragraflarda, bunlardan birkaçına bakıyoruz.
markanın istenmeyen özellikleri - ve markaya dayalı tipik yapı ortamları -
Cons'un gelişimini motive etti.

İnşa etmek karmaşıklık

Her boyuttaki geleneksel marka tabanlı sistemler oldukça karmaşık hale gelme eğilimindedir. orijinal marka
Fayda ve türevleri bu eğilime çeşitli şekillerde katkıda bulunmuştur. Yap
birden çok dizine yayılmış sistemlerle uğraşmakta iyi değil. Çeşitli iş-
bu zorluğun üstesinden gelmek için çevreler kullanılır; genel seçim make to çağırmak içindir
bir yapının her alt dizini için özyinelemeli olarak. Bu, karmaşık koda yol açar,
bir değişkenin nasıl ayarlandığı veya bir değişkenin ayarlanmasının ne gibi bir etkisi olduğu genellikle belirsizdir.
bir bütün olarak yapı üzerinde olacaktır. Make betik dili kademeli olarak genişletildi
daha fazla olanak sağlamak için, ancak bunlar büyük ölçüde zaten bir karmaşaya hizmet etti.
aşırı genişletilmiş dil. Çoğu zaman, derlemeler sağlamak için birden çok geçişte yapılır.
bir dizinden başka bir dizine uygun ürünler. Bu, daha fazlasını temsil eder
yapı karmaşıklığında artış.

İnşa etmek Yeniden üretilebilirlik

Tüm markaların zararı her zaman bağımlılıkların doğru şekilde ele alınması olmuştur. Çoğu zaman, bir
tek bir dizinde makul bir bağımlılık işi yapmaya çalışılır, ancak hayır
dizinler arası işi yapmak için ciddi girişimlerde bulunulur. Bağımlılıklar olduğunda bile
doğru çalışıp çalışmadığını belirlemek için basit bir zaman damgası karşılaştırmasına güvenin.
Bir dosyanın, bakmakla yükümlü olduğu kişiler açısından güncelliğini yitirmiş olması, genel olarak,
bir dosyanın ne zaman yeniden türetileceğini belirleme. Örneğin, harici bir kitaplık
yeniden oluşturulduktan ve sonra yerine ``yerleştirildikten'', yeni oluşturulan dosyalarındaki zaman damgaları
görünür hale gelmeden önce inşa edildiğinden, son yerel yapıdan daha erken olabilir.

Varyant inşa

Make, varyant yapılarını işlemek için yalnızca sınırlı olanaklar sağlar. çoğalma ile
donanım platformları ve hata ayıklanabilir ve optimize edilmiş kod ihtiyacı,
Bu varyantları kolayca oluşturmak esastır. Daha da önemlisi, varyantlar oluşturulursa,
varyantları ayırabilmek veya yeniden üretebilmek için önemlidir.
orijinal veya isteğe bağlı varyant. make ile yapıları birbirinden ayırmak çok zordur.
kaynaktan ayrı birden çok yapı dizini. Ve bu teknik kullanılmazsa,
ayrıca herhangi bir zamanda hangi varyantın mevcut olduğunu garanti etmek neredeyse imkansızdır.
ağaç, tam bir yeniden yapılanmaya başvurmadan.

Depoları

Make, bir dosyada bulunan koddan yazılım oluşturmak için yalnızca sınırlı destek sağlar.
merkezi depo dizin yapısı. GNU'nun VPATH özelliği (ve diğer bazı
make uygulamaları) bunu sağlamaya yöneliktir, ancak beklendiği gibi çalışmaz:
analizinde çok erken bir zamanda hedef dosyanın yolunu VPATH adına değiştirir ve bu nedenle
VPATH dizinindeki tüm bağımlılıkları arar. Doğru gelişmeyi sağlamak için
derlemeler, yerel bir derleme dizininde bir dosya oluşturabilmek ve sahip olmak önemlidir.
yerele bağlı olan bir kod deposundaki (make açısından bir VPATH dizini) herhangi bir dosya
dosya düzgün bir şekilde yeniden oluşturuldu. Bu, çok fazla kodlama yapmadan VPATH ile mümkün değildir.
karmaşık depo bilgisini doğrudan makefiles içine.

koruma it basit


Make ile ilgili bazı zorluklar yukarıda belirtilmiştir. Bunda ve sonrasında
bölümlerinde, Eksileri tanıtacağız ve bu sorunların nasıl ele alındığını göstereceğiz.

Perl scriptler

Eksileri Perl tabanlıdır. Yani, Cons komut dosyaları--askere çağırmak ve Kurmak dosyalar, eşdeğer
için Makefile or makefile--hepsi Perl ile yazılmıştır. Bu anında bir fayda sağlar:
Senaryo yazma dili tanıdık bir dildir. Perl olmasanız bile
programcı olarak, Perl'in temelde sadece basit bir bildirim dili olduğunu bilmek yardımcı olur,
iyi tanımlanmış bir kontrol akışı ve tanıdık semantik ile. davranan değişkenlere sahiptir.
temelde onlardan beklediğiniz şekilde, alt rutinler, kontrol akışı vb. Orası
Cons için tanıtılan özel bir sözdizimi yoktur. Perl'in betik dili olarak kullanımı
genellikle karmaşık olana uygun çözümü ifade etme görevini basitleştirir
bir yapının gereksinimleri.

Merhaba, Dünya!

Aşağıdaki tartışmayı temellendirmek için, Merhaba, Dünya! C
Eksileri ile uygulama:

$env = yeni eksiler();
Program $env 'merhaba', 'merhaba.c';

Bu betiği bir dizine kurarsanız, betiği adlandırın Kurmakve oluşturun
Merhaba C kaynak dosyası aynı dizindeyse, oluşturmak için 'cons merhaba' yazabilirsiniz.
Uygulama:

% eksileri merhaba
cc -c merhaba.c -o merhaba.o
cc -o merhaba merhaba.o

İnşaat ortamları

Eksilerin önemli bir basitleştirmesi, bir kas kütlesi inşasında ve çevre. bir inşaat
çevre bir nesne bir dizi anahtar/değer çifti ve bir dizi yöntemleri.
Cons'a bir şeyin nasıl inşa edileceğini söylemek için uygun yöntemi bir
uygun inşaat ortamı. Aşağıdaki örneği göz önünde bulundurun:

$env = yeni eksiler(
CC => 'gcc',
LIBS => 'libworld.a'
);

Program $env 'merhaba', 'merhaba.c';

Bu durumda, varsayılan inşaat ortamını olduğu gibi kullanmak yerine,
bunun yerine GNU C Derleyici eşdeğerinin kullanılması için 'CC' değerini geçersiz kılar. Dan beri
bu versiyonu Merhaba, Dünya! bir kitaplık gerektirir, libworld.a, belirttik ki herhangi
bu ortamda bağlanan program, o kitaplıkla bağlantılı olmalıdır. eğer kütüphane
zaten var, iyi ve güzel, ama değilse, o zaman şu ifadeyi de eklememiz gerekecek:

Kütüphane $env 'libworld', 'world.c';

Şimdi 'cons merhaba' yazarsanız, kitaplık program bağlanmadan önce oluşturulacaktır ve,
elbette, her iki modülü de derlemek için `gcc' kullanılacaktır:

% eksileri merhaba
gcc -c merhaba.c -o merhaba.o
gcc -c dünya.c -o dünya.o
ar r libworld.a world.o
ar: libworld.a oluşturma
ranlib libworld.a
gcc -o merhaba merhaba.o libworld.a

Otomatik ve tamamlamak bağımlılık analiz

Eksileri ile bağımlılıklar otomatik olarak işlenir. Önceki örneğe devam ederek, not
değiştirdiğimizde dünya.c, dünya. o yeniden derlenir, libworld.a yeniden yaratıldı ve merhaba
yeniden bağlandı:

% vi dünya.c
[DÜZENLEME]
% eksileri merhaba
gcc -c dünya.c -o dünya.o
ar r libworld.a world.o
ar: libworld.a oluşturma
ranlib libworld.a
gcc -o merhaba merhaba.o libworld.a

Bu nispeten basit bir örnektir: Eksileri `` bilir '' dünya. o bağlıdır dünya.cÇünkü,
bağımlılık açıkça 'Kütüphane' yöntemiyle ayarlanır. Bunu da biliyor libworld.a
bağlıdır dünya. o ve bu merhaba bağlıdır libworld.a, hepsi benzer nedenlerle.

Şimdi ortaya çıkıyor Merhaba C arayüz tanım dosyasını da içerir, dünya.h:

% emacs dünyası.h
[DÜZENLEME]
% eksileri merhaba
gcc -c merhaba.c -o merhaba.o
gcc -o merhaba merhaba.o libworld.a

Cons bunu nereden biliyor? Merhaba C içerir dünya.h, Ve merhaba.o bu nedenle olmalı
yeniden derlendi? olup olmadığını düşünürken şimdilik şunu söylemekle yetinelim. merhaba.o yukarı
bugüne kadar, Cons bağımlılığı için bir tarayıcı çağırır, Merhaba C. Bu tarayıcı şunları sıralar:
tarafından dahil edilen dosyalar Merhaba C bunların ötesinde, başka bağımlılıkların bir listesini çıkarmak için
Cons komut dosyası tarafından açıkça yapılmıştır. Bu işlem özyinelemelidir: tarafından dahil edilen tüm dosyalar
dahil edilen dosyalar da taranacaktır.

Bu pahalı değil mi? Cevap, duruma bağlı. Büyük bir sistemin tam kurulumunu yaparsanız,
tarama süresi önemsizdir. Büyük bir sistemin yeniden inşasını yaparsanız, Eksileri
hiçbir şeyin olmaması gerektiğine karar vermeden önce bunun hakkında düşünmek için oldukça fazla zaman harcayın.
yapılır (her ne kadar yapmaktan daha fazla zaman olmasa da!). İyi haber şu ki Cons bunu yapıyor
yerelleştirilmiş değişiklikler üzerinde çalışırken yapınızı akıllıca alt kümelere ayırmak çok kolaydır.

Otomatik global inşa etmek dizileme

Cons, tam ve doğru bağımlılık analizi yaptığından ve bunu küresel olarak yaptığından,
tüm yapı, Eksileri, bu bilgileri tam kontrol altına almak için kullanabilir. dizileme
yapının Bu sıralama, yukarıdaki örneklerde açıkça görülmektedir ve şuna eşdeğerdir:
tam bir bağımlılık seti göz önüne alındığında, make için beklersiniz. Eksileri ile, bu uzanır
önemsizden daha büyük, çok dizinli yapılara. Sonuç olarak, ilgili tüm karmaşıklık
bir yapının doğru bir şekilde organize edildiğinden emin olmak için - çok geçişli hiyerarşik dahil
oluşturur - ortadan kalkar. Bunu sonraki bölümlerde daha ayrıntılı tartışacağız.

bina büyük ağaçlar--hala sadece as basit


A hiyerarşi of inşa etmek scriptler

Eksiler'de daha büyük bir yapı, bir hiyerarşi oluşturularak düzenlenir. inşa etmek scriptler. Zirvede
ağacın adı bir komut dosyasıdır Kurmak. Komut dosyalarının geri kalanı, sözleşmeye göre, her biri
denilen askere çağırmak. Bu komut dosyaları, çok basit bir şekilde 'Yapı' ile birbirine bağlanır,
'Dışa Aktar' ve 'İçe Aktar' komutları.

The İnşa etmek komuta

'Oluştur' komutu aşağıdakilerin bir listesini alır: askere çağırmak dosya adları ve bunların olması için düzenler
yapıya dahildir. Örneğin:

qw'yi oluştur(
sürücüler/ekran/Conscript
sürücüler/fare/Askeri
ayrıştırıcı/Askeri
yardımcı programlar/Askeri
);

Bu, derleme komut dosyalarının iki seviyeli basit bir hiyerarşisidir: tüm yan askere çağırmak Dosyaları
üst düzeyde bahsedilir Kurmak dosya. Ağaçtaki tüm dizinlerin olmadığına dikkat edin.
mutlaka kendileriyle ilişkili derleme komut dosyalarına sahip olun.

Bu aynı zamanda çok seviyeli bir komut dosyası olarak da yazılabilir. Örneğin, Kurmak dosya olabilir
bu komutu içerir:

qw'yi oluştur(
ayrıştırıcı/Askeri
sürücüler/Askeri
yardımcı programlar/Askeri
);

ve askere çağırmak içindeki dosyayı sürücüler dizin bunu içerebilir:

qw'yi oluştur(
ekran/asker
fare/Askeri
);

Deneyimler, eski modelin anlaşılmasının biraz daha kolay olduğunu göstermiştir, çünkü
tüm inşaat ağacı en üst seviyede önünüze serilir. Hibrit şemalar
bu da mümkün. Bir sisteme dahil edilmesi gereken, ayrı olarak bakımı yapılan bir bileşen.
örneğin yapı ağacı, yapı ağacına tek bir yerden bağlanabilir, ancak kendi
inşaat hiyerarşisi.

Varsayılan olarak, Cons, çalışma dizinini bir dizini içeren dizine değiştirmez.
ikincil askere çağırmak içeren dosyadır. Bu davranış, bir yapı için etkinleştirilebilir:
belirterek, üst düzeyde Kurmak Dosya:

Conscript_chdir 1;

Etkinleştirildiğinde, Eksiler yan kuruluş olarak değişecektir askere çağırmak dosyanın bulunduğu dizin
bu dosyayı okurken ve ardından dosya bir kez üst düzey dizine geri dönün
işlendi.

Bu davranışın, Cons'un gelecekteki bazı sürümlerinde varsayılan olması beklenmektedir.
Bu geçişe hazırlanmak için, Eksilerin yapının en üstünde kalmasını bekleyen yapılar
bir yan kuruluşta okurken askere çağırmak file bu özelliği açıkça devre dışı bırakmalıdır.
aşağıdaki gibidir:

Conscript_chdir 0;

Akraba, üst akraba, ve kesin dosya isimleri

Oluştur komutunda belirtilen dosya adlarının şuna göre olduğunu fark etmiş olabilirsiniz.
çağrıldığı betiğin konumu. Bu genellikle diğer dosya adı için geçerlidir
diğer komutlara da argümanlar, ancak burada başlarsanız şunu da belirtebiliriz.
``#' olan bir dosya adı, daha sonra bu dosya en üste göre yorumlanır.
düzey dizini (burada Kurmak dosya bulunur). Ve, şaşırtıcı olmayan bir şekilde, başlarsanız
``/'' ile, mutlak bir yol adı olarak kabul edilir. Bu, sistemlerde bile geçerlidir
mutlak yolları adlandırmak için eğik çizgi yerine ters eğik çizgi kullanan.

kullanma modüller in inşa etmek scriptler

Modülleri her birine çekebilirsiniz. askere çağırmak normal Perl 'kullan' veya 'gerektir' kullanan dosya
ifadeleri:

İngilizce kullanın;
My::Module gerektirir;

Her "kullanım" veya "gerektirme" yalnızca birini etkiler. askere çağırmak göründüğü dosya. kullanmak için
modül çoklu askere çağırmak dosyaların her birine bir 'kullanım' veya 'gerekli' ifadesi koymalısınız.
modüle ihtiyacı olan biri.

kapsam of değişkenler

üst düzey Kurmak dosya ve hepsi askere çağırmak dosyalar ortak, ayrı bir Perl'de hayata başlar
paketi. Eksiler paket için sembol tablosunu kontrol eder, böylece sembol tablosu
dışında her komut dosyası boştur. Kurmak komut satırının bir kısmını alan dosya
argümanlar. Bu nedenle, ayarlanan veya kullanılan tüm değişkenler komut dosyası tarafından belirlenir.
kendisi - bazı harici komut dosyaları tarafından değil.

Değişkenler açıkça olabilir ithal üst komut dosyasından bir komut dosyası tarafından. içe aktarmak için
değişken olmalı ihraç ebeveyn tarafından başlatılır ve başlatılır (aksi takdirde bir hata
gerçekleşecek).

The Ihracat komuta

'Dışa Aktar' komutu aşağıdaki örnekte olduğu gibi kullanılır:

$env = yeni eksiler();
$INCLUDE = "#export/include";
$LIB = "#export/lib";
Dışa aktar qw( env LIB DAHİL);
qw (util/Conscript) oluşturun;

'Dışa Aktar' listesinde belirtilen basit değişkenlerin değerleri sincapla silinecektir.
sonraki herhangi bir 'Oluştur' komutuyla. 'Dışa Aktar' komutu yalnızca Perl'i dışa aktarır sayısal
değişkenler, yani adı `$' ile başlayan değişkenler. Diğer değişkenler, nesneler vb.
referans olarak dışa aktarılabilir - ancak tüm komut dosyaları aynı nesneye atıfta bulunur ve bu
nesne, yardımcı komut dosyaları ve orijinal tarafından salt okunur olarak kabul edilmelidir.
dışa aktarma komut dosyası. Ancak, dışa aktarılan skalere yeni bir değer atamak kabul edilebilir.
değişken - bu, başvurulan temel değişkeni değiştirmez. için bu sıra
örnek, tamam:

$env = yeni eksiler();
Dışa aktar qw( env LIB DAHİL);
qw (util/Conscript) oluşturun;
$env = yeni eksiler(CFLAGS => '-O');
qw (diğer/Conscript) oluşturun;

Değişkenin 'Dışa Aktar' komutundan önce mi sonra mı ayarlandığı önemli değildir. NS
önemli olan, 'Oluştur' komutunun yürütüldüğü andaki değişkenin değeridir.
Bu, sincapla uzaklaşan şeydir. Bu arada, sonraki 'Dışa Aktar' komutları,
ilkini geçersiz kıl: her birinde dışa aktarmak istediğiniz tüm değişkenlerden bahsetmelisiniz.
'Dışa Aktar' komutu.

The ithalat komuta

'Dışa Aktar' komutuyla dışa aktarılan değişkenler,
"İçe aktar" komutu. Yardımcı komut dosyası, değişkenleri her zaman doğrudan
üstün senaryo Bu örneği düşünün:

qw'yi içe aktar( env INCLUDE );

Bu, yalnızca ana komut dosyası hem "$env" hem de "$INCLUDE" dışa aktardıysa yasaldır. Ayrıca gerekir
bu değişkenlerin her birine değerler vermiştir. Yardımcı komut dosyasının yalnızca
dışa aktarılan değişkenlerin bir alt kümesini içe aktarın (bu örnekte, tarafından dışa aktarılan `$LIB'
önceki örnek, içe aktarılmaz).

Tüm içe aktarılan değişkenler otomatik olarak yeniden dışa aktarılır, bu nedenle sıra:

qw'yi içe aktar (env INCLUDE);
qw oluşturun (under-me/Conscript);

yardımcı dosyaya hem '$env' hem de '$INCLUDE' sağlayacaktır. Eğer sadece `$env' olacaksa
dışa aktarılırsa, aşağıdakiler yeterli olacaktır:

qw'yi içe aktar (env INCLUDE);
qw'yi dışa aktar (env);
qw oluşturun (under-me/Conscript);

Söylemeye gerek yok, değişkenler, üzerinde 'Oluştur' çağrılmadan önce yerel olarak değiştirilebilir.
yan komut dosyası.

İnşa etmek senaryo değerlendirme sipariş

Derleme komut dosyalarının sıralanmasındaki tek kısıtlama, üstün komut dosyalarının
aşağı senaryolarından önce değerlendirilir. üst düzey Kurmak dosya, örneğin,
önce değerlendirilir, ardından daha düşük komut dosyaları gelir. gerçekten bilmen gereken tek şey bu
değerlendirme sırası hakkında, çünkü sıralama genellikle önemsizdir. Aşağıdakileri göz önünde bulundur
'Oluştur' komutu:

qw'yi oluştur(
sürücüler/ekran/Conscript
sürücüler/fare/Askeri
ayrıştırıcı/Askeri
yardımcı programlar/Askeri
);

Senaryo adlarını alfabetik sıraya koymayı seçtik, çünkü bu en çok
bakım amaçları için uygundur. Sıralamayı değiştirmek,
inşa etmek.

A Model için paylaşımı Dosyaları


Bizi basit sözleşmeler

Herhangi bir karmaşık yazılım sisteminde, yapı ürünlerini paylaşmak için bir yöntemin olması gerekir.
kurulmuş. Birlikte uygulanması önemsiz olan basit bir dizi sözleşme öneriyoruz.
Eksileri, ancak çok etkili.

Temel kural, aralarında paylaşılması gereken tüm yapı ürünlerinin
dizinler bir ara dizin aracılığıyla paylaşılır. Biz tipik olarak bunu aradık
ihracat, ve bir C ortamında, bu dizinin geleneksel alt dizinlerini sağladı,
gibi dahil, lib, çöp kutusu, vb.

Bu dizinler üst düzey tarafından tanımlanır Kurmak dosya. Basit Kurmak Dosya için
a Merhaba, Dünya! birden çok dizin kullanılarak düzenlenen uygulama şöyle görünebilir:

# Merhaba, Dünya için dosya oluştur!

# Tüm paylaşılan ürünlerimizi nereye koyacağız.
$EXPORT = '#export';

Dışa Aktar qw( CONS INCLUDE LIB BIN );

# Ürünleri paylaşmak için standart dizinler.
$INCLUDE = "$İHRACAT/dahil";
$LIB = "$İHRACAT/lib";
$BIN = "$İHRACAT/bin";

# Standart bir inşaat ortamı.
$CONS = yeni eksiler (
CPPPATH => $INCLUDE, # C Derlemeleri için yolu dahil et
LIBPATH => $LIB, # Programları bağlamak için kitaplık yolu
LIBS => '-lworld', # Standart kitaplıkların listesi
);

qw'yi oluştur(
merhaba/asker
dünya/asker
);

The Dünya dizinin askere çağırmak dosya şöyle görünür:

# Dizin dünyası için zorunlu dosya
Import qw( EKSİLERİ LIB DAHİLDİR );

# Bu dizinin ürünlerini kurun
$CONS $LIB, 'libworld.a' yükleyin;
$CONS $INCLUDE, 'world.h' yükleyin;

# Dahili ürünler
Kütüphane $CONS 'libworld.a', 'world.c';

ve merhaba dizinin askere çağırmak dosya şöyle görünür:

# Merhaba dizini için zorunlu dosya
qw( CONS BIN );

# İhraç edilen ürünler
$CONS $BIN yükleyin, 'merhaba';

# Dahili ürünler
$CONS 'merhaba', 'merhaba.c' programı;

inşa etmek Merhaba, Dünya! bu dizin yapısıyla programlayın, en üst seviyeye gidin
dizin ve uygun argümanlarla 'eksileri' çağırın. Aşağıdaki örnekte, biz
eksilere dizini oluşturmasını söyle ihracat. Bir dizin oluşturmak için Cons yinelemeli olarak tümünü oluşturur
bu dizindeki bilinen ürünler (tabii ki yalnızca yeniden oluşturulması gerekiyorsa). eğer herhangi biri
bu ürünler diğer dizinlerdeki diğer ürünlere bağlıdır, daha sonra bunlar oluşturulacaktır,
çok.

% eksileri ihracat
world/world.h dosyasını export/include/world.h olarak yükleyin
cc -Iexport/include -c merhaba/merhaba.c -o merhaba/merhaba.o
cc -Iexport/include -c dünya/dünya.c -o dünya/dünya.o
ar world/libworld.a world/world.o
ar: world/libworld.a oluşturma
ranlib dünyası/libworld.a
world/libworld.a dosyasını export/lib/libworld.a olarak yükleyin
cc -o merhaba/merhaba merhaba/merhaba.o -Lexport/lib -lworld
merhaba/merhaba'yı dışa aktarma/bin/merhaba olarak yükleyin

Temiz, anlaşılır konumdan bağımsız scriptler

not edersiniz ki, ikisi askere çağırmak dosyalar çok temiz ve yerinde. onlar basitçe
dizinin ürünlerini ve bu ürünlerin nasıl oluşturulacağını belirtin. Yapı talimatları
minimaldir: hangi inşaat ortamının kullanılacağını, ürünün adını,
ve girişlerin adı. Ayrıca komut dosyalarının konumdan bağımsız olduğunu unutmayın:
kaynak ağacınızı yeniden düzenlemek isterseniz, bunu yapmakta özgürsünüz: sadece
Kurmak dosyanın (bu örnekte), yeni konumlarını belirtmek için askere çağırmak Dosyalar.
bir ihracat ağacının kullanılması bu hedefi kolaylaştırır.

Eksilerin sizin için küçük ayrıntılarla nasıl ilgilendiğine de dikkat edin. Hepsi ihracat dizinler, için
örneğin otomatik olarak yapılmıştır. Ve yüklenen dosyalar gerçekten sabit bağlantılıydı.
Yerden ve zamandan tasarruf etmek için ilgili ihracat dizinleri. Ayrıntılara gösterilen bu özen tasarruf sağlar
önemli ölçüde çalışır ve basit, bakımı yapılabilir komut dosyaları oluşturmayı daha da kolaylaştırır.

ayırma kaynak ve inşa etmek ağaçlar


Derlemeden türetilmiş dosyaların tamamen ayrı tutulması genellikle arzu edilir.
kaynak dosyaları. Bu, bir kaynak dosyanın ne olduğunu takip etmeyi çok daha kolaylaştırır ve
ayrıca işlemeyi kolaylaştırır varyant derlemeler, özellikle de varyant derlemelerini istiyorsanız
birlikte var olmak.

ayırma inşa etmek ve kaynak dizinleri kullanma the Link komuta

Eksileri, tüm bu gereksinimleri karşılayan basit bir mekanizma sağlar. 'Bağlantı'
komut bu örnekte olduğu gibi çağrılır:

Bağlantı 'build' => 'src';

Belirtilen dizinler, belirtilen kaynak dizine ``bağlıdır'. Varsayalım
bir kaynak dizin kurduğunuzu, src, alt dizinleri ile Dünya ve merhaba altında,
önceki örnekte olduğu gibi. Daha sonra orijinal yapı satırlarını değiştirebilirsiniz.
Aşağıdaki:

qw'yi oluştur(
inşa/dünya/Askeri
inşa/merhaba/Askeri
);

tedavi ettiğinize dikkat edin. askere çağırmak dosya, derleme dizininde varmış gibi. Şimdi eğer
öncekiyle aynı komutu yazarsanız, aşağıdaki sonuçları alırsınız:

% eksileri ihracat
build/world/world.h dosyasını export/include/world.h olarak yükleyin
cc -Iexport/include -c build/merhaba/hello.c -o build/merhaba/merhaba.o
cc -Iexport/include -c build/world/world.c -o build/world/world.o
ar build/world/libworld.a build/world/world.o
ar: build/world/libworld.a oluşturma
ranlib build/world/libworld.a
build/world/libworld.a dosyasını export/lib/libworld.a olarak yükleyin
cc -o build/merhaba/merhaba build/merhaba/merhaba.o -Lexport/lib -lworld
build/hello/hello'yu dışa aktarma/bin/merhaba olarak yükleyin

Yine Cons, detayları sizin için halletti. Özellikle fark edeceksiniz ki tüm
derlemeler, derleme dizinindeki kaynak dosyalar ve nesne dosyaları kullanılarak yapılır. İçin
örnek, inşa/dünya/dünya.o derlenmiştir inşa/dünya/dünya.c, ve
dışa aktarma/include/world.h şuradan yüklenir yapı/dünya/dünya.h. Bu, çoğu üzerinde gerçekleştirilir
sistemleri, her kaynaktan gerekli dosyaları birbirine bağlayan "zor" basit yöntemiyle
dizini uygun yapı dizinine yerleştirin.

Kaynak dizine ne yaparsanız yapın, bağlantılar Cons tarafından doğru bir şekilde korunur.
Bir kaynak dosyayı değiştirirseniz, editörünüz bunu ``yerinde'' yapabilir veya yeniden adlandırabilir.
önce ve yeni bir dosya oluşturun. İkinci durumda, herhangi bir sabit bağlantı kaybolacaktır. eksileri
kaynak dosyaya bir daha ihtiyaç duyulduğunda bu durumu algılar ve onu yeniden bağlar
uygun şekilde.

Bu arada şunu da fark edeceksiniz. yok hayır altta yatan değişiklikler gerekliydi askere çağırmak
Dosyalar. Ve bir sonraki bölümde göreceğimiz gibi daha da ileri gidebiliriz.

Varyant inşa


Merhaba, Dünya! için muz ve şeftali işletim sistemleri

Varyant derlemeleri, yalnızca başka bir basit uzantı gerektirir. Bir örnek olarak alalım
hem baNaNa hem de peAcH işletim sistemleri için yapılara izin verme gereksinimi. Bu durumda,
belirli bir sisteme erişmek için NFS gibi dağıtılmış bir dosya sistemi kullanıyoruz ve
verilen herhangi bir çağrı için sistemlerden yalnızca biri veya diğeri derlenmelidir.
eksileri. İşte Kurmak bizim için dosya Merhaba, Dünya!
Uygulama:

# Merhaba, Dünya için dosya oluştur!

die qq(OS belirtilmelidir) $OS = $ARG{OS};
die qq(OS "şeftali" veya "muz" olmalıdır)
eğer $OS ne "şeftali" && $OS ne "muz";

# Tüm paylaşılan ürünlerimizi nereye koyacağız.
$EXPORT = "#export/$OS";

Dışa Aktar qw( CONS INCLUDE LIB BIN );

# Ürünleri paylaşmak için standart dizinler.
$INCLUDE = "$İHRACAT/dahil";
$LIB = "$İHRACAT/lib";
$BIN = "$İHRACAT/bin";

# Standart bir inşaat ortamı.
$CONS = yeni eksiler (
CPPPATH => $INCLUDE, # C Derlemeleri için yolu dahil et
LIBPATH => $LIB, # Programları bağlamak için kitaplık yolu
LIBS => '-lworld', # Standart kitaplıkların listesi
);

# $BUILD, her şeyi elde edeceğimiz yerdir.
$BUILD = "#build/$OS";

# Eksilere $BUILD için kaynak dosyalarının nerede olduğunu söyleyin.
Bağlantı $BUILD => 'src';

Yapı (
"$ YAPI/merhaba/Asker",
"$ YAPI/dünya/Askeri",
);

Şimdi bir peAcH sistemine giriş yaparsak, Merhaba, Dünya! bunun için başvuru
platformu:

% eksilerini dışa aktarma işletim sistemi=şeftali
build/peach/world/world.h dosyasını export/peach/include/world.h olarak yükleyin
cc -Iexport/peach/include -c build/peach/merhaba/hello.c -o build/peach/merhaba/merhaba.o
cc -Iexport/peach/include -c build/peach/world/world.c -o build/peach/world/world.o
ar build/peach/world/libworld.a build/peach/world/world.o
ar: build/peach/world/libworld.a oluşturma
ranlib build/peach/world/libworld.a
build/peach/world/libworld.a dosyasını export/peach/lib/libworld.a olarak yükleyin
cc -o build/peach/merhaba/merhaba build/peach/merhaba/hello.o -Lexport/peach/lib -lworld
build/peach/hello/hello'yu export/peach/bin/hello olarak kurun

Varyasyonlar on a tema

Bu modelin başka varyasyonları da mümkündür. Örneğin, istediğinize karar verebilirsiniz.
içerme dosyalarınızı platforma bağlı ve platformdan bağımsız dosyalara ayırmak için.
Bu durumda, platforma bağlı olarak "$INCLUDE" yerine bir alternatif tanımlamanız gerekir.
Dosyalar. Çoğu askere çağırmak tamamen platformdan bağımsız içerme dosyaları oluşturan dosyalar,
değiştirmek zorunda değil.

Ayrıca tüm sisteminizi hata ayıklama veya profil oluşturma ile derleyebilmek isteyebilirsiniz,
örneğin, etkinleştirildi. Bunu, aşağıdaki gibi uygun komut satırı seçenekleriyle yapabilirsiniz.
'DEBUG=açık'. Bu daha sonra uygun platforma özel olarak çevrilecektir.
hata ayıklamayı etkinleştirmek için gereksinimler (bu, optimizasyonun kapatılmasını içerebilir,
örnek). Bu farklı sistem türleri için isteğe bağlı olarak ad alanını değiştirebilirsiniz,
ama bir sonraki bölümde göreceğimiz gibi, öyle değil gerekli Bunu yapmak için, Eksileri güzel olduğundan
seçenekleri değiştirdiğinizde bir şeyleri yeniden inşa etme konusunda akıllıdır.

İmzalar


MD5 kriptografik imza

Cons türetilmiş bir dosya oluşturduğunda, bir imza o dosya için. İmza
dizin başına bir tane olmak üzere ayrı bir dosyada saklanır. Önceki örnek derlendikten sonra,
the .teslim içindeki dosyayı inşa/şeftali/dünya dizin şöyle görünüyordu:

world.o:834179303 23844c0b102ecdc0b4548d1cd1cbd8c6
libworld.a:834179304 9bf6587fa06ec49d864811a105222c00

İlk sayı bir zaman damgasıdır - UNIX sistemleri için bu tipik olarak
1 Ocak 1970'den beri saniye. İkinci değer bir MD5 sağlama toplamıdır. NS Mesaj özet
Algoritma bir girdi dizgisi verildiğinde, güçlü bir kriptografik hesaplayan bir algoritmadır.
bu dize için imza. Depolanan MD5 sağlama toplamı .teslim dosya, aslında, bir
Belirtilen dosya için tüm bağımlılık bilgilerinin özeti. Yani, örneğin, için
dünya. o dosya, bu en azından içerir dünya.c dosyası ve ayrıca Eksileri olan herhangi bir başlık dosyası
tarafından doğrudan veya dolaylı olarak dahil edildiğini bilir. dünya.c. Sadece bu değil, aynı zamanda
oluşturmak için kullanılan gerçek komut satırı dünya. o ayrıca hesaplamaya dahil edilir
imza. Benzer şekilde, libworld.a tümünü “içeren” bir imza alır.
bileşenlerinin imzaları (ve dolayısıyla geçişli olarak ve bazı Asya
bileşenleri) ve dosyayı oluşturan komut satırı.

Türetilmemiş bir dosyanın imzası, varsayılan olarak geçerli
dosyanın değiştirilme zamanı ve dosyanın giriş adı (bir
akım .teslim bu dosya için giriş, bu durumda bu imza kullanılır).

Türetilmiş bir dosyanın belirli bir şeye bağlı olmasına gerek olmadığına dikkat edin. Kurmak or
askere çağırmak dosya--bu dosyalarda yapılan değişiklikler söz konusu dosyayı etkiliyorsa, bu
komut satırının ilgili bölümleri olduğundan, imzasına otomatik olarak yansıtılır.
imzaya dahildir. İlişkisiz değişikliklerin hiçbir etkisi olmayacaktır.

Cons, belirli bir dosyayı türetip türemeyeceğini düşündüğünde, önce
dosyanın beklenen imzası. Daha sonra dosyanın son değişiklik zamanını ile karşılaştırır.
içinde kaydedilen zaman .teslim giriş, varsa. Bu zamanlar eşleşirse, o zaman
içinde saklanan imza .teslim dosyanın doğru olduğu kabul edilir. Eğer dosya önceki
imza yeni, beklenen imzayla eşleşmiyorsa, dosyanın yeniden türetilmesi gerekir.

Bağımlı bir dosyayla ilgili herhangi bir şey değiştiğinde bir dosyanın yeniden türetileceğine dikkat edin. İçinde
özellikle, dikkat edin herhangi bir bağımlının değişiklik zamanına değişiklik (ileri veya
zamanda geriye doğru) türetilmiş dosyanın yeniden derlenmesini zorlar.

Bu imzaların kullanımı son derece basit, verimli ve etkili bir yöntemdir.
bir sistemin yeniden üretilebilirliğini -- çarpıcı biçimde -- iyileştirmek.

Bunu basit bir örnekle göstereceğiz:

# Basit "Merhaba, Dünya!" dosya oluştur
$CFLAGS = '-g' eğer $ARG{DEBUG} eq 'açık' ise;
$CONS = yeni eksiler(CFLAGS => $CFLAGS);
$CONS 'merhaba', 'merhaba.c' programı;

Cons'un uygun zamanlarda nasıl yeniden derlendiğine dikkat edin:

% eksileri merhaba
cc -c merhaba.c -o merhaba.o
cc -o merhaba merhaba.o
% eksileri merhaba
eksileri: "merhaba" güncel.
% eksileri DEBUG=merhaba
cc -g -c merhaba.c -o merhaba.o
cc -o merhaba merhaba.o
% eksileri DEBUG=merhaba
eksileri: "merhaba" güncel.
% eksileri merhaba
cc -c merhaba.c -o merhaba.o
cc -o merhaba merhaba.o

Kod Depoları


Birçok yazılım geliştirme kuruluşunun bir veya daha fazla merkezi depo dizini olacaktır.
Bir veya daha fazla proje için geçerli kaynak kodunu ve ayrıca türetilmiş
nesne dosyaları, kitaplıklar ve yürütülebilir dosyalar. Gereksiz yeniden derlemeyi azaltmak için,
geliştirme yazılımı oluşturmak için depodaki dosyaları kullanmak yararlıdır - varsayarsak,
Tabii ki, yerel yapı ağacında daha yeni bir bağımlılık dosyası yok.

depo

Eksileri, aranacak kod depolarının bir listesini belirtmek için bir mekanizma sağlar,
yerel derleme dizin ağacında bulunmayan kaynak dosyalar ve türetilmiş dosyalar için sırayla.

Aşağıdaki satırlar bir Kurmak file, Cons'a önce
/usr/deney/depo dizini ve ardından altında /usr/ürün/depo dizin:

depo qw (
/usr/deney/depo
/usr/ürün/depo
);

Belirtilen depo dizinleri kaynak dosyaları, türetilmiş dosyaları (nesneler,
kitaplıklar ve yürütülebilir dosyalar) veya her ikisi. Altında yerel dosya (kaynak veya türetilmiş) yoksa
Cons'un yürütüldüğü dizin, ardından aynı adlı dosyanın ilk kopyası bulundu
bir depo dizini altında herhangi bir yerel türetilmiş dosya oluşturmak için kullanılacaktır.

Cons, bir global depo dizinleri listesini tutar. Eksileri ortadan kaldıracak
geçerli dizini ve var olmayan dizinleri listeden.

Bulma the Kurmak dosya in a depo

Eksileri de arayacak Kurmak ve askere çağırmak depo ağacındaki veya ağaçlardaki dosyalar.
Bu, bir tavuk-yumurta durumuna yol açsa da: Bir depo ağacında nasıl görünüyorsunuz?
Bir için Kurmak dosya eğer Kurmak file, deponun nerede olduğunu söyler mi? Almak için
bunun etrafında, depolar komut satırındaki `-R' seçenekleriyle belirtilebilir:

% cons -R /usr/experiment/depo -R /usr/product/depo .

içinde belirtilen herhangi bir depo dizini Kurmak or askere çağırmak dosyalar eklenecek
komut satırı `-R' seçenekleri tarafından belirtilen depo dizinlerine.

depo kaynak Dosyaları

Kaynak kodu ise ( askere çağırmak dosya) kütüphane sürümü için Merhaba,
Dünya! C uygulaması bir depoda (türetilmiş dosyalar olmadan), Eksileri
yerel nesne dosyalarını ve yürütülebilir dosyayı oluşturmak için depo kaynak dosyaları:

% cons -R /usr/src_only/depo merhaba
gcc -c /usr/src_only/repository/hello.c -o merhaba.o
gcc -c /usr/src_only/repository/world.c -o dünya.o
ar r libworld.a world.o
ar: libworld.a oluşturma
ranlib libworld.a
gcc -o merhaba merhaba.o libworld.a

Yerel bir kaynak dosya oluşturmak, Cons'un uygun türetilmiş dosyayı yeniden oluşturmasına veya
dosyaları:

% pico dünyası.c
[DÜZENLEME]
% cons -R /usr/src_only/depo merhaba
gcc -c dünya.c -o dünya.o
ar r libworld.a world.o
ar: libworld.a oluşturma
ranlib libworld.a
gcc -o merhaba merhaba.o libworld.a

Ve yerel kaynak dosyayı kaldırmak, Cons'un türetilmiş dosyayı oluşturmaya geri dönmesine neden olur.
depo kaynağından dosyalar:

% rm dünya.c
% cons -R /usr/src_only/depo merhaba
gcc -c /usr/src_only/repository/world.c -o dünya.o
ar r libworld.a world.o
ar: libworld.a oluşturma
ranlib libworld.a
gcc -o merhaba merhaba.o libworld.a

depo türetilmiş Dosyaları

Bir havuz ağacı türetilmiş dosyalar içeriyorsa (genellikle nesne dosyaları, kitaplıklar veya
yürütülebilir dosyalar), Eksileri, normal imza hesaplamasını gerçekleştirerek,
depo dosyası günceldir veya yerel olarak türetilmiş bir dosya oluşturulmalıdır. Bunun anlamı şudur ki,
Doğru imza hesaplamasını sağlamak için, bir havuz ağacı ayrıca şunları da içermelidir.
.teslim türetilmiş dosyalar oluşturulurken Cons tarafından oluşturulan dosyalar.

Bu genellikle yazılımı depoda (veya,
alternatif olarak, bir derleme dizininde ve ardından sonucu depoya kopyalamak):

% cd /usr/all/depo
% eksileri merhaba
gcc -c merhaba.c -o merhaba.o
gcc -c dünya.c -o dünya.o
ar r libworld.a world.o
ar: libworld.a oluşturma
ranlib libworld.a
gcc -o merhaba merhaba.o libworld.a

(Bu güvenlidir, Kurmak dosya listeler /usr/all/depo dizin bir
`Depo' komutu çünkü Eksiler geçerli dizini havuzdan kaldıracak
liste.)

Şimdi uygulamanın bir kopyasını kendimiz oluşturmak istiyorsak Merhaba C dosya, sadece ihtiyacımız var
gerekli bir kaynak dosyayı oluşturmak için ve Eksilerin diğerlerini kullanması için `-R' seçeneğini kullanın.
depodaki dosyalar:

% mkdir $HOME/build1
% cd $HOME/derleme1
% ed merhaba.c
[DÜZENLEME]
% cons -R /usr/all/depo merhaba
gcc -c merhaba.c -o merhaba.o
gcc -o merhaba merhaba.o /usr/all/repository/libworld.a

Cons'un yerel bir yeniden oluşturma zahmetine girmediğine dikkat edin. libworld.a kitaplığı (veya yeniden derleyin)
dünya. o modül), ancak bunun yerine depodan önceden derlenmiş sürümü kullanır.

Çünkü Cons'un koyduğu MD5 imzaları .teslim dosya için zaman damgaları içerir
türetilmiş dosyalar, imza zaman damgaları, bir imza için dosya zaman damgalarıyla eşleşmelidir.
geçerli sayılabilir.

Bazı yazılım sistemleri, depo dosyalarındaki zaman damgalarını değiştirebilir (bunları kopyalayarak,
örneğin), bu durumda Cons, varsayılan olarak, depo imzalarının geçersiz olduğunu varsayacaktır.
ve gereksiz yere dosyaları yeniden oluşturun. Bu davranış aşağıdakiler belirtilerek değiştirilebilir:

Repository_Sig_Times_OK 0;

Bu, Cons'a bir imzanın geçerli olup olmadığına karar verirken zaman damgalarını yok saymasını söyler. (Not
bu akıl sağlığı kontrolünden kaçınmanın, depo üzerinde uygun kontrolün olması gerektiği anlamına geldiğini
türetilmiş dosyaların güncellenmeden değiştirilemeyeceğinden emin olmak için ağaç .teslim
imza.)

Yerel kopyalar of Dosyaları

Depo ağacı bir derlemenin tüm sonuçlarını içeriyorsa ve
yerel ağacımızda herhangi bir dosya olmayan depo, orta derecede şaşırtıcı bir şey
olur:

% mkdir $HOME/build2
% cd $HOME/derleme2
% cons -R /usr/all/depo merhaba
eksileri: "merhaba" güncel.

Eksiler neden diyor ki merhaba olmadığında program günceldir. merhaba programda
yerel yapı dizini? Depo (yerel dizin değil) içerdiğinden
aktüel merhaba programı ve Eksileri doğru bir şekilde hiçbir şey yapılması gerekmediğini belirler.
dosyanın bu güncel kopyasını yeniden oluşturun.

Bununla birlikte, yerel bir kopyasının sağlanmasının uygun olduğu birçok durum vardır.
dosya her zaman vardır. Örneğin, bir paketleme veya test komut dosyası, belirli
oluşturulan dosyalar yerel olarak bulunur. Bu yardımcı komut dosyalarının farkında olmak yerine
depo dizininde, 'Yerel' komutu bir dizine eklenebilir. Kurmak or askere çağırmak dosyasını
yerel derleme dizininde belirli bir dosya veya dosyaların görünmesi gerektiğini belirtin:

yerel qw(
merhaba
);

Ardından, aynı komutu yeniden çalıştırırsak, Cons, programın yerel bir kopyasını
depo kopyası (bunu yaptığını söyleyerek):

% cons -R /usr/all/depo merhaba
/usr/all/repository/hello'dan merhaba'nın yerel kopyası
eksileri: "merhaba" güncel.

Dikkat edin, yerel kopya yapma eylemi, yerel kopyanın bir "yapısı" olarak kabul edilmez.
merhaba dosya, Cons hala güncel olduğunu bildiriyor.

Yerel kopyalar oluşturmak, en çok bir bilgisayara yüklenmekte olan dosyalar için kullanışlıdır.
ara dizin (diğer dizinlerle paylaşmak için) 'Yükle' komutuyla.
Eşlik eden bir 'Yerel' komutu olan bir dosya için 'Yükle' komutuna eşlik etmek çok
Cons'un her ikisini de yapmanın uygun bir yolu olarak bir 'Install_Local' komutu sağlaması ortaktır:

Install_Local $env, '#export', 'merhaba';

tam olarak şuna eşdeğerdir:

$env '#export', 'merhaba' yükleyin;
Yerel '#export/merhaba';

Hem 'Local' hem de 'Install_Local' komutları yerel .teslim ile dosya
uygun dosya imzaları, böylece gelecekteki derlemeler doğru şekilde gerçekleştirilir.

depo bağımlılık analiz

Yerleşik taraması nedeniyle, Cons, belirtilen depo ağaçlarını dahil edilenler için arayacaktır.
.h Dosyalar. Derleyici aynı zamanda depo ağaçlarını da bilmiyorsa,
bulunamadı .h yalnızca bir depoda bulunan dosyalar. Örneğin, Merhaba C
dosya şunları içerir: Merhaba H geçerli dizindeki dosya:

% cons -R /usr/all/depo merhaba
gcc -c /usr/all/depo/merhaba.c -o merhaba.o
/usr/all/repository/hello.c:1: merhaba.h: Böyle bir dosya veya dizin yok

Bu sorunun çözülmesi, bazı gereksinimleri inşaat ortamlarının şekline zorlar.
tanımlı ve dosyaları dahil etmek için C `#include' önişlemci yönergesinin nasıl kullanıldığı hakkında.

Derleyiciyi depo ağaçları hakkında bilgilendirmek için Cons, uygun `-I' ekleyecektir.
derleme komutlarına bayraklar. Bu, 'CPPPATH' değişkeninin
yapı ortamı, aranacak tüm alt dizinleri açıkça belirtmelidir
geçerli dizin de dahil olmak üzere dahil edilen dosyalar için. Sonuç olarak, yukarıdakileri düzeltebiliriz
örneğin, ortam oluşturmayı değiştirerek Kurmak aşağıdaki gibi dosya:

$env = yeni eksiler(
CC => 'gcc',
CPPPATH => '.',
LIBS => 'libworld.a',
);

`CPPPATH' değişkeninin tanımı nedeniyle, bu, yeniden çalıştırdığımızda sonuç verir.
komut:

% cons -R /usr/all/depo merhaba
gcc -c -I. -I/usr/all/depo /usr/all/depo/merhaba.c -o merhaba.o
gcc -o merhaba merhaba.o /usr/all/repository/libworld.a

"-I" işaretlerinin sırası, C önişlemcisi için aynı depoyu kopyalar.
Cons'un kendi bağımlılık analizi için kullandığı dizin arama yolu. Eğer varsa
birden çok depo ve birden çok `CPPPATH' dizini, Eksiler depoyu ekler
her `CPPPATH' dizininin başına dizinler, sayıyı hızla çarparak
"-I" bayrakları. Aşırı bir örnek olarak, bir Kurmak içeren dosya:

depo qw(
/u1
/u2
);

$env = yeni eksiler(
CPPPATH => 'a:b:c',
);

Bir derleme komutu verir:

cc -Ia -I/u1/a -I/u2/a -Ib -I/u1/b -I/u2/b -Ic -I/u1/c -I/u2/c -c merhaba.c -o merhaba. o

Çünkü Cons, sırayı iletmek için derleyicinin `-I' bayraklarına güvenir.
depo dizinleri aranmalıdır, Eksilerin depo dizinlerini ele alması
C'nizdeki '#include' yönergelerinde çift tırnak kullanmakla temelde uyumsuz
kaynak kodu:

#include "file.h" /* BU GİBİ ÇİFT TEKLİF KULLANMAYIN */

Bunun nedeni, çoğu C önişlemcisinin böyle bir yönergeyle karşı karşıya kaldıklarında her zaman önce
kaynak dosyayı içeren dizini arayın. Bu, ayrıntılı '-I'yi baltalar.
Cons'un önişlemciyi tercih ettiği aramaya uygun hale getirmek için oluşturduğu seçenekler
yolu.

Sonuç olarak, Cons'ta depo ağaçlarını kullanırken, her zaman dahil olanlar için köşeli parantez kullanın
dosyaları:

#Dahil etmek /* YERİNE AÇI KOLLARI KULLAN */

Depo_Listesi

Eksileri, tüm depo dizinlerinin bir listesini döndürmek için bir 'Repository_List' komutu sağlar
mevcut arama sırasına göre. Bu, hata ayıklamak veya daha karmaşık Perl yapmak için kullanılabilir.
şey:

@list = Depo_Listesi;
print join(' ', @list), "\n";

depo etkileşim ile diğer Eksiler Özellikler

Eksilerin depo ağaçlarını işlemesi, diğer Eksi özellikleriyle doğru bir şekilde etkileşime girer.
söylemek gerekirse, genellikle beklediğiniz şeyi yapar.

En önemlisi, depo ağaçları 'Link' ile doğru ve oldukça güçlü bir şekilde etkileşime girer.
emretmek. Bir havuz ağacı, sürüm oluşturma için bir veya daha fazla alt dizin içerebilir.
bir kaynak alt dizine 'Bağlantı' yoluyla kurulmuştur. Eksileri, türetilmiş dosyaları arayacaktır
depo ağacının altındaki uygun derleme alt dizinleri.

Varsayılan hedefler


Şimdiye kadar, aşağıdakileri oluşturmak için açık bir hedefle Eksileri çağırmayı gösterdik:

% eksileri merhaba

Normalde Cons, bir hedef belirtilmedikçe, ancak '.' belirtilmedikçe hiçbir şey oluşturmaz.
(geçerli dizin) her şeyi oluşturacak:

% eksileri # hiçbir şey oluşturmaz

% Eksileri . # her şeyi üst düzey dizinin altında oluşturur

Herhangi birine 'Varsayılan' yöntemi ekleme Kurmak or askere çağırmak dosya belirtilenleri ekleyecektir
varsayılan hedefler listesine hedefler. Varsa, eksiler bu varsayılanları oluşturacaktır.
komut satırında belirtilen hedefler. Bu yüzden aşağıdaki satırı en üst seviyeye ekleyerek
Kurmak file, Make'in varsayılan olarak her şeyi oluşturma davranışını taklit eder:

Varsayılan '.';

Aşağıdakiler ekleyecektir merhaba ve Güle güle komutları (aynı dizinde
Kurmak or askere çağırmak dosya) varsayılan listeye:

Varsayılan qw(
merhaba
Güle güle
);

Varsayılan listeye hedefler eklemek için 'Varsayılan' yöntemi birden fazla kullanılabilir.

Seçici inşa


Eksileri, verilen yapının boyutunu küçültmek için iki yöntem sağlar. Birincisi belirterek
komut satırındaki hedefler ve ikincisi, yapı ağacını budamak için bir yöntemdir. İyi
önce hedef spesifikasyonu düşünün.

Seçici hedefleme

Make gibi, Cons da komut satırında "hedefler"in belirtilmesine izin verir. Eksileri hedefler
dosyalar veya dizinler olabilir. Bir dizin belirtildiğinde, bu sadece kısa bir
Belirtilen her türetilebilir ürün için - Cons'un bildiği - el gösterimi
dizin ve altında. Örneğin:

% eksileri inşa/merhaba/merhaba.o

inşa etmek demektir merhaba.o ve her şey merhaba.o ihtiyaç olabilir. Bu bir öncekinden
sürümü Merhaba, Dünya! hangi program merhaba.o Bağlı
dışa aktarma/include/world.h. Bu dosya güncel değilse (birisi değiştirdiği için)
kaynak/dünya/dünya.h), uzak bir dizinde olmasına rağmen yeniden oluşturulacaktır.
inşa/merhaba.

Bu örnekte:

oluşturma yüzdesi

İçindeki her şey inşa etmek Gerekirse dizin oluşturulur. Yine, bu daha fazla dosyaya neden olabilir
inşa edilecek. Özellikle, her ikisi de dışa aktarma/include/world.h ve dışa aktarma/lib/libworld.a vardır
tarafından gerekli inşa/merhaba dizin ve böylece güncel değillerse oluşturulacaklar.

Bunun yerine yaparsak:

% eksileri ihracat

eğer öyleyse, yalnızca dışa aktarma dizinine yüklenmesi gereken dosyalar yeniden oluşturulacaktır.
gerekli ve daha sonra oraya yüklendi. 'eksileri derleme'nin, 'eksileri oluşturan' dosyalar oluşturabileceğini unutmayın.
export' oluşturmaz ve bunun tersi de geçerlidir.

Yok hayır ''özel'' hedefler

Eksileri ile, make-style ``` özel '' hedefler gerekli değildir. Eksileri olan en basit analog
özel kullanmaktır ihracat bunun yerine dizinler. Diyelim ki, örneğin, bir
kodunuzla ilişkili tüm birim testleri serisi. Testler şurada yaşıyor:
kodun yanında kaynak dizin. Ancak normalde bu testleri oluşturmak istemezsiniz.
Çözümlerden biri, testleri oluşturmak için tüm derleme yönergelerini sağlamak ve ardından
Testleri ağacın ayrı bir bölümüne kurun. Testleri en üst düzeyde kurarsak
dizin aradı testleri, sonra:

% eksileri testleri

tüm testleri oluşturacak.

% eksileri ihracat

sistemin üretim versiyonunu oluşturacak (ancak testleri değil) ve:

oluşturma yüzdesi

muhtemelen kaçınılmalıdır (çünkü testleri gereksiz yere derleyecektir).

Yalnızca tek bir test oluşturmak istiyorsanız, testi açıkça adlandırabilirsiniz (içinde
ya testleri dizin veya inşa etmek dizin). Ayrıca testleri toplayabilirsiniz
testler dizini içinde uygun bir hiyerarşiye dönüştürün. Bu hiyerarşiye gerek yok
içerme hiyerarşisiyle aynı şekilde, kaynak hiyerarşiyle mutlaka eşleşmelidir.
muhtemelen kaynak hiyerarşiyle eşleşmiyor (içerme hiyerarşisinin daha fazla olması muhtemel değildir
C programları için iki seviyeden daha derin).

Ağaçta kesinlikle her şeyi inşa etmek istiyorsanız (seçenekler ne olursa olsun)
seçin), şunları kullanabilirsiniz:

% Eksileri .

Bu, özellikle verimli değildir, çünkü tüm ağaçları fazladan yürüyecektir.
kaynak ağacı dahil. Kaynak ağaç, elbette, içinde oluşturulabilir nesnelere sahip olabilir.
o--normalde ayrı bir yapı oluştursanız bile, hiçbir şey sizi bunu yapmaktan alıkoyamaz
ağaç.

İnşa etmek Budama


Hedef seçimi ile birlikte, inşa etmek budama kapsamını azaltmak için kullanılabilir.
yapı. Önceki peAcH ve baNaNa örneğinde, komut dosyasıyla nasıl yönlendirildiğini zaten gördük.
yapı budaması, herhangi bir veri için potansiyel yapının yalnızca yarısını kullanılabilir hale getirmek için kullanılabilir.
"eksilerin" çağrılması. Dezavantajları ayrıca kolaylık sağlamak için bir komut satırı kuralı sağlar.
hangisi olduğunu belirlemenizi sağlar askere çağırmak dosyalar aslında ``yerleşik'' olur - yani birleştirilmiş
yapı ağacına. Örneğin:

% eksileri inşa + dünya

'+' argümanı bir Perl düzenli ifadesi sunar. Bu, elbette, alıntılanmalıdır
ifade içinde herhangi bir kabuk meta karakteri varsa, kabuk düzeyi. NS
ifade her birine karşı eşleştirilir askere çağırmak Bir 'Yapı' bölümünde belirtilen dosya
deyimi ve yalnızca eşleşen adlara sahip komut dosyaları fiilen
ağaç inşa et. Bu tür birden çok argümana izin verilir, bu durumda bunlardan herhangi birine karşı bir eşleşme
bir komut dosyasının eklenmesine neden olmak için yeterlidir.

Yukarıdaki örnekte, merhaba Program oluşturulmayacak, çünkü Eksileri hiçbir
senaryo bilgisi merhaba/asker. libworld.a arşiv oluşturulacak, ancak
olmak gerekir.

Komut satırı aracılığıyla yapı budaması için birkaç kullanım vardır. Belki de en faydalısı
yerel değişiklikler yapma yeteneği ve daha sonra yeterli bilgi birikimine sahip olmaktır.
bu değişikliklerin sonuçları, hızlandırmak için yapı ağacının boyutunu sınırlayın.
yeniden inşa zamanı. Derleme budamasının ikinci bir kullanımı, yeniden derlemeyi aktif olarak önlemektir.
Örneğin, değiştirilmiş bir başlık dosyası nedeniyle yeniden derleneceğini bildiğiniz bazı dosyalar.
Başlık dosyasındaki değişikliklerin önemsiz olduğunu veya
değişiklikler, test amacıyla ağacın çoğu için güvenli bir şekilde yoksayılabilir. Eksileri ile,
bakış açısı, bu tür davranışları kabul etmenin pragmatik olduğudur.
bir sonraki tam yapıda yeniden inşa edilmesi gereken her şey olacak. eşdeğeri yok
dosyaları kalıcı olarak güncel olarak işaretlemek için bir ``dokunma yap'' komutuna. Yani herhangi bir risk
yapı budama tarafından maruz kalınan hafifletilir. Serbest bırakma kalitesi çalışması için, açıkçası, öneririz
yapı budamasını kullanmadığınızı (ancak entegrasyon sırasında kullanmakta hiçbir sorun yok)
derlemeyi kontrol etmek için, vb. Sadece taahhütte bulunmadan önce sınırlandırılmamış bir derleme yaptığınızdan emin olun.
entegrasyon).

geçici geçersiz kılmaları


Eksileri, bir yapının özelliklerini geçersiz kılmak için çok basit bir mekanizma sağlar. özü
bir veya daha fazla "Geçersiz Kılma" komutu içeren bir geçersiz kılma dosyası yazdığınızı ve
'cons' komutunu çalıştırdığınızda bunu komut satırında belirtin:

% eksileri -o dışa aktarma üzerinden

inşa edecek ihracat mevcut geçersiz kılmalara tabi tüm türetilmiş dosyalar ile dizin
içinde tekrar dosya. `-o' seçeneğini dışarıda bırakırsanız, kaldırmak için gereken her şey
tüm geçersiz kılmalar yeniden oluşturulacak.

ağır basan çevre değişkenler

Geçersiz kılma dosyası iki tür geçersiz kılma içerebilir. Birincisi gelen ortam
değişkenler. Bunlara normalde şu kişiler tarafından erişilebilir: Kurmak `%ENV' karmasından dosya
değişken. Bunlar, geçersiz kılma dosyasında
uygun `%ENV' öğeleri (bunlar kullanıcının ortamında da geçersiz kılınabilir,
tabii ki).

The Geçersiz Kıl komuta

İkinci tip geçersiz kılma, şuna benzeyen 'Override' komutuyla gerçekleştirilir:
bu:

geçersiz kıl , => , => , ...;

normal ifade regexp aday olan her türetilmiş dosyayla eşleştirilir
yapı için. Türetilmiş dosya eşleşirse, değişken/değer çiftleri şu şekilde kullanılır:
türetilmiş dosyayla ilişkili inşaat ortamındaki değerleri geçersiz kılar.

Diyelim ki şöyle bir inşaat ortamımız var:

$CONS = yeni eksiler(
KOPT => '',
CDBG => '-g',
CFLAGS => '%COPT %CDBG',
);

O zaman bir geçersiz kılma dosyamız varsa tekrar bu komutu içeren:

'\.o$' geçersiz kıl, COPT => '-O', CDBG => '';

daha sonra, oluşturan '-o over' ile herhangi bir 'eksileri' çağırma .o dosyalar bu ortam aracılığıyla
`-O 'ile ve `-g' olmadan derlenmelerine neden olur. Geçersiz kılma, elbette, olabilir
bir düzenli ifadenin uygun seçimiyle tek bir dizinle sınırlandırılmıştır.

İşte Hello, World'ün orijinal versiyonu! program, bu ortamla oluşturulmuş.
Geçersiz kılma uygulandığında veya kaldırıldığında Cons'un uygun parçaları yeniden oluşturduğunu unutmayın:

% eksileri merhaba
cc -g -c merhaba.c -o merhaba.o
cc -o merhaba merhaba.o
merhaba üzerinden % eksileri -o
cc -O -c merhaba.c -o merhaba.o
cc -o merhaba merhaba.o
merhaba üzerinden % eksileri -o
eksileri: "merhaba" güncel.
% eksileri merhaba
cc -g -c merhaba.c -o merhaba.o
cc -o merhaba merhaba.o

'Override' komutunun yalnızca geçici olarak, anında kullanılması önemlidir.
geçersiz kılmalar platformdan bağımsız olmadığından ve geliştirme için gerekli geçersiz kılmalar
çünkü senaryoların işleyişine dair samimi bilgilere çok fazla güveniyorlar. İçin
geçici kullanım, ancak, bunlar tam olarak istediğiniz şeydir.

Tamamen optimize edilmiş bir sistem oluşturma yeteneği sağlamanın hala yararlı olduğunu unutmayın.
üretim kullanımı için bir sistemin versiyonu - Kurmak ve askere çağırmak Dosyalar. Bu yoldan
optimize edilmiş sistemi platforma uyarlayabilirsiniz. Optimize edici değiş tokuşlarının olması gereken yer
yapılmış (örneğin belirli dosyalar tam optimizasyonla derlenmemiş olabilir), ardından
bunlar gelecek nesiller (ve tekrarlanabilirlik) için doğrudan komut dosyalarına kaydedilebilir.

Daha on kas kütlesi inşasında ve ortamları


Varsayılan kas kütlesi inşasında ve değişkenler

kavramından bahsettik ve kullandık. kas kütlesi inşasında ve çevre, birçok kez
önceki sayfalar. Şimdi bunu biraz daha somut hale getirmenin zamanı geldi. Takip ederek
Beyan:

$env = yeni eksiler();

yeni, varsayılan bir inşaat ortamına referans oluşturulur. Bu bir sayı içerir
yapı değişkenleri ve bazı yöntemler. Mevcut yazıda, varsayılan liste
yapı değişkenleri şu şekilde tanımlanır:

CC => 'cc',
CFLAGS => '',
CCCOM => '%CC %CFLAGS %_IFLAGS -c %< -o %>',
INCDIRPREFIX => '-I',
CXX => '%CC',
CXXFLAGS => '%CFLAGS',
CXXCOM => '%CXX %CXXFLAGS %_IFLAGS -c %< -o %>',
BAĞLANTI => '%CXX',
LINKCOM => '%LINK %LDFLAGS -o %> %< %_LDIRS %LIBS',
LINKMODULECOM => '%LD -r -o %> %<',
LIBDIRPREFIX => '-L',
AR => 'ar',
ARFLAGLAR => 'r',
ARCOM => "%AR %ARFLAGS %> %<\n%RANLIB %>",
RANLIB => 'ranlib',
AS => 'olarak',
ASFLAGLAR => '',
ASCOM => '%ASFLAGS %< -o %>',
LD => 'ld',
LDFLAGS => '',
PREFLIB => 'lib',
SUFLIB => '.a',
SUFLIBS => '.so:.a',
SUFOBJ => '.o',
ENV => { 'YOL' => '/çöp Kutusu:/ Usr / bin' },

Win32 sistemlerinde (Windows NT), aşağıdaki yapı değişkenleri
Varsayılan:

CC => 'cl',
CFLAGS => '/nologo',
CCCOM => '%CC %CFLAGS %_IFLAGS /c %< /Fo%>',
CXXCOM => '%CXX %CXXFLAGS %_IFLAGS /c %< /Fo%>',
INCDIRPREFIX => '/I',
BAĞLANTI => 'bağlantı',
LINKCOM => '%LINK %LDFLAGS /out:%> %< %_LDIRS %LIBS',
LINKMODULECOM => '%LD /r /o %> %<',
LIBDIRPREFIX => '/LIBPATH:',
AR => 'lib',
ARFLAGS => '/nologo',
ARCOM => "%AR %ARFLAGS /out:%> %<",
RANLIB => '',
LD => 'bağlantı',
LDFLAGS => '/nologo',
PREFLIB => '',
SUFEXE => '.exe',
SUFLIB => '.lib',
SUFLIBS => '.dll:.lib',
SUFOBJ => '.obj',

Bu değişkenler, ortamla ilişkili çeşitli yöntemler tarafından kullanılır.
özellikle nihai olarak harici bir komutu çağıran herhangi bir yöntem, bunların yerine geçecektir.
değişkenleri uygun şekilde son komuta ekleyin. Örneğin, "Nesneler" yöntemi,
bir dizi kaynak dosya ve gerekirse ilgili nesneyi türetmek için düzenler
Dosyalar. Örneğin:

Nesneler $env 'foo.c', 'bar.c';

Bu, gerekirse üretmek için ayarlayacaktır, foo.o ve bar.o. Çağrılan komut basitçe
Değiştirme yoluyla genişleyen `%CCCOM', gereken uygun harici komuta
her nesneyi oluşturmak için. 'Komut' altında ikame kurallarını daha ayrıntılı olarak inceleyeceğiz.
yöntemi, aşağıda.

Yapı değişkenleri başka amaçlar için de kullanılır. Örneğin, "CPPPATH"
içerme dizinlerinin iki nokta üst üste ayrılmış yolunu belirtmek için kullanılır. Bunlar amaçlanan
C önişlemcisine iletilir ve ayrıca C-dosya tarama makineleri tarafından da kullanılır.
C Derlemesinde yer alan bağımlılıkları belirleyin. ile başlayan değişkenler
alt çizgi, çeşitli yöntemlerle oluşturulur ve normalde “iç” olarak kabul edilmelidir.
değişkenler. Örneğin, bir nesnenin oluşturulmasını gerektiren bir yöntem çağrıldığında
bir C kaynağından, '_IFLAGS' değişkeni oluşturulur: bu, '-I' anahtarlarına karşılık gelir
C derleyicisi tarafından "CPPPATH" tarafından belirtilen dizinleri temsil etmesi gerekir.

Herhangi bir özel ortam için bir değişkenin değerinin bir kez ayarlandığını ve ardından
asla sıfırlama (bir değişkeni değiştirmek için yeni bir ortam oluşturmalısınız. Yöntemler sağlanmıştır
bu amaçla mevcut ortamları kopyalamak için). gibi bazı dahili değişkenler
'_IFLAGS' isteğe bağlı olarak oluşturulur, ancak bir kez ayarlandığında, kullanım ömrü boyunca sabit kalırlar.
ortamı.

'CFLAGS', 'LDFLAGS' ve 'ARFLAGS' değişkenlerinin tümü, seçeneklere geçiş için bir yer sağlar.
sırasıyla derleyici, yükleyici ve arşivleyici. Daha az açık bir şekilde, 'INCDIRPREFIX'
değişken, her içermenin başına eklenecek seçenek dizesini belirtir
derleyicinin nerede bulacağını bilmesi için dizin .h Dosyalar. Benzer şekilde,
'LIBDIRPREFIX' değişkeni, başına eklenecek seçenek dizesini belirtir.
bağlayıcının kitaplıkları araması gereken her dizin.

Yürütme sırasında sistem ortamını belirlemek için başka bir değişken olan `ENV' kullanılır.
harici bir komutun Varsayılan olarak, ayarlanan tek ortam değişkeni `PATH'dir,
UNIX komutunun yürütme yolu budur. En üst düzeyde tekrarlanabilirlik için,
gerçekten kendi yürütme yolunuzu ayarlamak için en üst seviyenizde Kurmak dosya (veya
belki Perl 'use' komutuyla uygun bir yapı paketini içe aktararak). NS
varsayılan değişkenler sizi yerden kaldırmayı amaçlar.

enterpolasyon kas kütlesi inşasında ve değişkenler

Kaynak ve hedef dosya adlarında inşaat ortamı değişkenleri enterpolasyonlu olabilir
yapı değişkeni adının önüne `%' koyarak.

$env = yeni eksiler(
DESTDIR => 'programlar',
SRCDIR => 'kaynak',
);
Program $env '%DESTDIR/hello', '%SRCDIR/hello.c';

Yapı değişkenlerinin genişletilmesi özyinelemelidir - yani, dosya isim(ler) yeniden olacak
daha fazla ikame yapılamayana kadar genişletilir. Bir inşaat değişkeni değilse
ortamda tanımlanmışsa, boş dize değiştirilecektir.

Varsayılan kas kütlesi inşasında ve yöntemleri


Varsayılan inşaat yöntemleri listesi aşağıdakileri içerir:

The 'yeni' inşaatçı

'new' yöntemi bir Perl nesne oluşturucusudur. Yani, bir referans yoluyla çağrılmaz
mevcut bir inşaat ortamına referans, ancak, oldukça statik olarak, adı kullanarak
Perl'in paket yapıcının tanımlandığı yer. Yöntem şu şekilde çağrılır:

$env = yeni eksiler( );

Geri döndüğünüz ortam, 'eksileri' paketine kutsanmıştır, bu da şu anlama gelir:
aşağıda açıklanan varsayılan yöntemleri onunla ilişkilendirdi. Bireysel yapı
geçersiz kılma listesinde ad/değer çiftleri sağlanarak değişkenler geçersiz kılınabilir. Bunu not et
herhangi bir komut ortamı değişkenini (yani `ENV' altındaki herhangi bir şeyi) geçersiz kılmak için
hepsini geçersiz kıl. Bir bilgisayarda 'kopyala' yöntemini kullanarak bu zorluğun üstesinden gelebilirsiniz.
mevcut inşaat ortamı.

The "klon" yöntem

'Klon' yöntemi, mevcut bir inşaat ortamının bir klonunu yaratır ve
aşağıdaki örnekte olduğu gibi çağrılır:

$env2 = $env1->klon( );

Farklı bir ortam oluşturmak için olağan şekilde geçersiz kılmalar sağlayabilirsiniz.
orijinal. Aynı ortam için yalnızca yeni bir ad istiyorsanız (bu,
ortamları mevcut bileşenlere dışa aktarma), yalnızca basit atamayı kullanabilirsiniz.

The "kopya" yöntem

'kopyala' yöntemi, harici olarak tanımlanmış yapı değişkenlerini bir
ortam ve bunları bir ad/değer çiftleri listesi olarak döndürür. Geçersiz kılmalar da olabilir
sağlanır, bu durumda geçersiz kılınan değerler uygun şekilde döndürülür. NS
döndürülen liste, aşağıdaki prototipte gösterildiği gibi bir karmaya atanabilir, ancak aynı zamanda
başka şekillerde manipüle edilebilir:

%env = $env1->kopya( );

Kendisi bir hash olan 'ENV'nin değeri de yeni bir hash'e kopyalanır, yani bu şöyle olabilir:
orijinal ortamı etkileme korkusu olmadan değiştirildi. Yani, örneğin, eğer gerçekten
varsayılan ortamda yalnızca `PATH' değişkenini geçersiz kılmak istiyorsanız,
Aşağıdaki:

%cons = yeni eksiler()->kopya();
$cons{ENV}{YOL} = " ";
$cons = yeni eksiler(%cons);

Bu, varsayılan yürütme ortamında olabilecek başka bir şey bırakacaktır.
rahatsız edilmemiş.

The "Yükle" yöntem

'Yükleme' yöntemi, belirtilen dosyaların belirtilen programa yüklenmesini düzenler.
dizin. Kurulum optimize edilmiştir: dosya bağlanabiliyorsa kopyalanmaz. Eğer
bu istenen davranış değil, yüklemek için farklı bir yöntem kullanmanız gerekecek.
dosya. Aşağıdaki gibi denir:

$env'yi yükle , ;

Yüklenecek dosyalar keyfi olarak adlandırılabilse de, yalnızca son
her adın bileşeni, kurulu hedef adı için kullanılır. Yani, örneğin, eğer
yüklemek için düzenlemek foo/çubuk in baz, bu bir bar içindeki dosyayı baz dizin (değil
foo/çubuk).

The 'InstallAs' yöntem

`InstallAs' yöntemi, belirtilen kaynak için düzenler dosya(ler) olarak kurulacak
belirtilen hedef dosya(s). Dosya listesi olarak birden fazla dosya belirtilmelidir. NS
kurulum optimize edilmiştir: dosya bağlanabiliyorsa kopyalanmaz. bu değilse
istenen davranış, dosyayı yüklemek için farklı bir yöntem kullanmanız gerekecektir. Bu
şöyle denir:

`InstallAs' iki şekilde çalışır:

Tek dosya kurulumu:

InstallAs $env TgtFile, SrcFile;

Çoklu dosya kurulumu:

InstallAs $env ['tgt1', 'tgt2'], ['src1', 'src2'];

Veya şu şekilde bile:

@srcs = qw(src1 kaynak2 kaynak3);
@tgts = qw(tgt1 tgt2 tgt3);
InstallAs $env [@tgts], [@srcs];

Hem hedef hem de kaynak listeleri aynı uzunlukta olmalıdır.

The 'Değerli' yöntem

'Değerli' yöntemi, eksilerden belirtilen dosyayı veya dosya listesini daha önce silmemesini ister.
onları yeniden inşa etmek. Şu şekilde çağrılır:

Değerli ;

Bu, özellikle kitaplıklarda artımlı güncellemelere veya hata ayıklamaya izin vermek için kullanışlıdır.
her seferinde yeniden oluşturmak yerine güncellenen bilgi dosyaları. Eksileri yine de
`-r' bayrağı belirtildiğinde dosyaları silin.

The "Komut" yöntem

"Komut" yöntemi, herhangi bir harici öğeyi düzenlemek için kullanılabilen bir toplama yöntemidir.
hedefi güncellemek için çağrılacak komut. Bu komut için bir hedef dosya ve
girişler sağlanır. Ek olarak, bir inşaat komut satırı veya satırları, bir komut satırı olarak sağlanır.
dize (bu dizenin içine gömülü, yeni ile ayrılmış birden çok komut olabilir
çizgiler). 'Komut' şu şekilde adlandırılır:

Komut $env , , ;

Hedef, belirtilen girdi dosyaları listesine bağlıdır ve girdilerin
başarıyla oluşturulabilir veya Eksileri hedefi oluşturmaya çalışmaz.

İnşaat komutu içinde, inşaat ortamından herhangi bir değişken olabilir.
yapı değişkeninin adının önüne `%' getirilerek tanıtılır. Bu özyinelemeli:
komut, daha fazla değişiklik yapılamayana kadar genişletilir. eğer bir inşaat
değişken ortamda tanımlanmadıysa, boş dize değiştirilir. A
çift ​​`%%', inşaat komutunda tek bir `%' ile değiştirilecektir.

Ayrıca genişletilecek birkaç sözde değişken vardır:

%> Hedef dosya adı (bir çoklu hedef komutunda, bu her zaman ilk hedeftir)
adı geçen).

%0 `%>' ile aynı.

%1, %2, ..., %9
Bunlar sırasıyla birinci ila dokuzuncu girdi dosyasına atıfta bulunur.

%< Girişlerin tamamı. Bunlardan herhangi biri başka bir yerde kullanılmışsa
geçerli komut satırı (`%1', `%2' vb. aracılığıyla), daha sonra bunlar komut satırından silinecektir.
`%<' tarafından sağlanan liste. Bir içinde bulunan aşağıdaki komutu göz önünde bulundurun askere çağırmak dosya
içinde test dizin:

Komut $env 'tgt', qw(foo bar baz), qq(
yankı %< -i %1 > %>
yankı %< -i %2 >> %>
yankı %< -i %3 >> %>
);

If tgt güncellenmesi gerekiyorsa, bu, uygulamanın yürütülmesine neden olur.
için herhangi bir yeniden eşlemenin kurulmadığı varsayılarak aşağıdaki komutlar test
dizin:

yankı testi/bar testi/baz -i testi/foo > test/tgt
yankı testi/foo testi/baz -i testi/bar >> test/tgt
yankı testi/foo testi/bar -i testi/baz >> test/tgt

Yukarıdaki sözde değişkenlerden herhangi birini hemen aşağıdakilerden biri takip edebilir.
genişletilmiş yol adının bir bölümünü seçmek için son ekler:

:a dosya adının mutlak yolu
:b dizin artı herhangi bir son ekten arındırılmış dosya adı
:d dizin
:f dosya adı
:s dosya adı soneki
:F herhangi bir son ekten arındırılmış dosya adı

Yukarıdaki örnekle devam edersek, '%<:f', 'foo bar baz' olarak genişler ve '%':d>
'test' için genişletin.

Bir kısmını içine alarak komutun bir kısmını programlı olarak yeniden yazmak mümkündür.
`%[' ve `%]' arasında. Bu, ilk kelime olarak adlandırılan yapı değişkenini çağıracaktır.
Perl kodu referansı olarak parantez içine alınmıştır; bu çağrının sonuçları kullanılacak
komut satırındaki parantezlerin içeriğini değiştirmek için. Örneğin, verilen bir
adlı mevcut girdi dosyası tgt.in:

@keywords = qw(foo bar baz);
$env = yeni eksiler(X_COMMA => alt { join(",", @_) });
Komut $env 'tgt', 'tgt.in', qq(
echo '# Anahtar Sözcükler: %[X_COMMA @keywords %]' > %>
kedi %< >> %>
);

Bu yürütülecek:

echo '# Anahtar Kelimeler: foo,bar,baz' > tgt
kedi tgt.in >> tgt

Değiştirme gerçekleştikten sonra, beyaz boşluk dizileri tek boşluklara dönüştürülür ve
öndeki ve sondaki beyaz boşluk ortadan kaldırılır. Bu nedenle tanıtmak mümkün değildir.
bazılarına başvurmadan bir komuta geçirilen dizelerdeki değişken uzunluktaki beyaz boşluk
bir tür kabuk alıntısı.

Çok satırlı bir komut dizisi sağlanmışsa, komutlar sırayla yürütülür. Varsa
komutlardan biri başarısız olursa, geri kalanların hiçbiri yürütülmez ve hedef olarak işaretlenmez.
güncellenir, yani hedef için yeni bir imza saklanmaz.

Normalde, tüm komutlar başarılı olursa ve sıfır durumu döndürürse (veya herhangi bir platform-
belirli bir başarı göstergesi gereklidir), daha sonra yeni bir imza depolanır.
hedef. Bir komut, bir başarısızlıktan sonra bile hatalı bir şekilde başarıyı bildirirse, Eksiler
bu komut tarafından oluşturulan hedef dosyanın doğru ve güncel olduğunu varsayalım.

Genişletmeden sonra her komut dizesinin ilk sözcüğü yürütülebilir bir dosya olarak kabul edilir.
komutu 'PATH' ortam değişkenini aradı (sırasıyla,
'ENV' yapı değişkeni). Bu komut yolda bulunursa, hedef
buna bağlıdır: bu nedenle komut, gerektiğinde otomatik olarak oluşturulacaktır. Onun
bazı kabuklara noktalı virgülle ayrılmış çok parçalı komutlar yazmak mümkündür. Sadece
Bununla birlikte, ilk komut kelimesine bağlı olacaktır, bu nedenle komut dizelerinizi yazarsanız
bu şekilde, ya açıkça bir bağımlılık kurmalısınız ("Depends" yöntemiyle) veya
kullandığınız komutun olması beklenen bir sistem komutu olduğundan emin olun.
mevcut. Mevcut değilse, elbette bir hata alırsınız.

Herhangi bir komut (çok satırlı bir komut içinde bile olsa) `[Perl]' ile başlıyorsa, kalan
komut satırı tarafından çatallanmak yerine çalışan Perl tarafından değerlendirilecektir.
kabuk. Perl ayrıştırılırken bir hata oluşursa veya Perl ifadesi 0 veya
undef, komutun başarısız olduğu kabul edilecektir. Örneğin, burada basit
doğrudan Perl'den bir 'foo' dosyası oluşturan komut:

$env = yeni eksiler();
$env 'foo' komutu,
qq([perl] open(FOO,'>foo');yazdır FOO "hi\\n"; kapat(FOO); 1);

Komut yürütüldüğünde, aynı pakette olduğunuzu unutmayın. Kurmak
or askere çağırmak dosya okundu, böylece tanımladığınız Perl işlevlerini aynı
Kurmak or askere çağırmak 'Komut'un göründüğü dosya:

$env = yeni eksiler();
alt create_file {
benim $dosyam = vardiya;
open(DOSYA, ">$dosya");
DOSYA "merhaba\n" yazdır;
dosyayı kapat);
1 dönmek;
}
Komut $env 'foo', "[perl] &create_file('%>')";

Perl dizesi, türetilmiş dosyanın imzasını oluşturmak için kullanılacaktır;
dizeyi değiştirin, dosya yeniden oluşturulacak. Aradığınız tüm alt programların içeriği,
ancak, imzanın bir parçası değildir, bu nedenle aşağıdaki gibi çağrılan bir alt yordamı değiştirirseniz
yukarıdaki 'create_file', hedef değil yeniden inşa edilecek. Kullanıcıyı uyar.

Cons normalde bir komutu çalıştırmadan önce yazdırır. Bu davranış, aşağıdaki durumlarda bastırılır:
komutun ilk karakteri `@'. '@' karakterini aşağıdakilerden ayırmanız gerekebileceğini unutmayın.
Perl alıntısına `@cmd'nin bir dizi gibi görünmesini önlemek için komut adı veya ondan kaçış
enterpolasyon yapan operatörler:

# İlk komut satırı yanlış,
# çünkü "@cp" bir diziye benziyor
# Perl qq// işlevine.
# Bunun yerine ikinci formu kullanın.
Komut $env 'foo', 'foo.in', qq(
@cp %< geçici dosya
@ cp geçici dosyası %>
);

Genişletilmiş komut satırının herhangi bir yerinde "<" gibi kabuk meta karakterleri varsa,
`>', tırnak işaretleri veya noktalı virgül, ardından komut aslında bir
kabuk. Bu, aşağıdaki gibi bir komutun olduğu anlamına gelir:

cd foo

yol üzerinde 'cd' komutu olmadığından, tek başına genellikle başarısız olur. Ama komut
dize:

cd$<:d; tar cf $>:f $<:f

genişletildiğinde, kabuk meta karakteri noktalı virgül içerecek ve bir kabuk
komutu yorumlamak için çağrılır. 'cd' bu alt kabuk tarafından yorumlandığından, komut
beklendiği gibi yürütülecektir.

Birden çok hedefi olan bir komut belirtmek için, bir listeye referans belirtebilirsiniz.
hedefler. Perl'de, bir liste köşeli parantez içine alınarak bir liste referansı oluşturulabilir.
Dolayısıyla aşağıdaki komut:

$env ['foo.h', 'foo.c'], 'foo.template', q(
%1 kuşağı
);

'gen' komutunun iki dosya oluşturduğu durumlarda kullanılabilir. foo.h ve foo.c.

The "nesneler" yöntem

'Nesneler' yöntemi, belirtilen nesneye karşılık gelen nesne dosyalarını yaratmayı düzenler.
kaynak dosyaları. Aşağıda gösterildiği gibi çağrılır:

@files = Nesneler $env ;

Unix altında, ile biten kaynak dosyalar .s ve .c şu anda destekleniyor ve derlenecek
ile biten aynı dosyanın bir adına .o. Varsayılan olarak, tüm dosyalar çağrılarak oluşturulur.
'CCCOM' yapı değişkeninin genişletilmesinden kaynaklanan harici komut,
`%<' ve `%>' sırasıyla kaynak ve nesne dosyalarına ayarlanır (bkz. 'Komut' yöntemi
genişletme ayrıntıları için). "CPPPATH" değişkeni, kaynak dosyalar taranırken de kullanılır
bağımlılıklar için. Bu, iki nokta üst üste ayrılmış yol adları listesidir ve ayrıca
-`I'nin uygun listesini içerecek olan `_IFLAGS' yapım değişkeni
derleme seçenekleri. "CPPPATH" içindeki tüm göreli yol adları göreli olarak yorumlanır
ilişkili inşaat ortamının oluşturulduğu dizine (mutlak
ve akraba isimleri de kullanılabilir). Bu değişken 'CCCOM' tarafından kullanılır. Davranış
Bu komutun değeri, enterpolasyon yapılan değişkenlerden herhangi biri değiştirilerek değiştirilebilir.
'CC', 'CFLAGS' ve dolaylı olarak 'CPPPATH' gibi 'CCCOM'a. Ayrıca
'CCCOM' değerinin kendisini değiştirin. Bir kolaylık olarak, bu dosya aşağıdakilerin listesini döndürür:
nesne dosya adları.

The "Program" yöntem

'Program' yöntemi, belirtilen programı belirtilen nesneye bağlamayı düzenler.
Dosyalar. Aşağıdaki şekilde çağrılır:

Program $env , ;

Program adı, eklenen `SUFEXE' yapı değişkeninin değerine sahip olacaktır (
varsayılan, Win32 sistemlerinde `.exe', Unix sistemlerinde hiçbir şey yok) son ek zaten değilse
mevcut.

Kaynak dosyalar, nesne dosyaları yerine belirtilebilir; "Nesneler" yöntemi
tüm dosyaların nesne dosyalarına dönüştürülmesini düzenlemek için çağrılır ve dolayısıyla tüm
Yukarıdaki "Nesneler" yöntemiyle ilgili gözlemler bu yöntem için de geçerlidir.

Programın gerçek bağlantısı, harici bir komutla işlenecektir.
'LINKCOM' yapı değişkenini, '%<' nesne dosyalarına ayarlı olarak genişletmekten
bağlanacak (sunulan sırayla) ve `%>' hedefe ayarlanacak (`Komut' yöntemine bakın)
genişletme ayrıntıları için). Kullanıcı, yapıda ek değişkenler ayarlayabilir
Bağlama için hangi programın kullanılacağını tanımlamak için 'LINK' dahil ortam, 'LIBPATH', bir
kütüphane spesifikasyonları ile kullanım için iki nokta üst üste ile ayrılmış kütüphane arama yolları listesi
Airdrop Formu -llib, ve 'LIBS', bağlantı kurulacak kitaplıkların listesini belirtir (her ikisinde de -llib
form veya sadece yol adları olarak. Hem "LIBPATH" hem de "LIBS" içindeki göreli yol adları yorumlanır
ilişkili inşaat ortamının oluşturulduğu dizine göre
(mutlak ve üst akraba adları da kullanılabilir). Eksileri otomatik olarak kurulur
'LIBS'de belirtilen herhangi bir kitaplığa bağımlılıklar: bu kitaplıklar daha önce oluşturulacak
komut bağlantılıdır.

The 'Kütüphane' yöntem

'Kütüphane' yöntemi, belirtilen nesneden belirtilen kitaplığı oluşturmayı düzenler.
Dosyalar. Aşağıdaki gibi çağrılır:

Kütüphane $env , ;

Kitaplık adı, eklenen 'SUFLIB' yapı değişkeninin değerine sahip olacaktır (
varsayılan, Win32 sistemlerinde `.lib', Unix sistemlerinde `.a') son ek henüz değilse
mevcut.

Kaynak dosyalar, nesne dosyaları yerine belirtilebilir; "Nesneler" yöntemi
tüm dosyaların nesne dosyalarına dönüştürülmesini düzenlemek için çağrılır ve dolayısıyla tüm
Yukarıdaki "Nesneler" yöntemiyle ilgili gözlemler bu yöntem için de geçerlidir.

Kütüphanenin fiili olarak oluşturulması, harici bir komutla işlenecektir.
'ARCOM' yapı değişkenini, '%<' kütüphane üyelerine ayarlanmış olarak genişletmekten (içinde
sunulan sıra) ve oluşturulacak kitaplığa `%>' (için `Komut' yöntemine bakın)
genişletme ayrıntıları). Kullanıcı, inşaat ortamındaki değişkenleri ayarlayabilir.
komutun çalışmasını etkiler. Bunlara, kullanılacak arşiv programı olan 'AR' dahildir.
'AR' tarafından belirtilen programa verilen bayrakları değiştirmek için kullanılabilen 'ARFLAGS',
ve gerekirse bir arşiv indeksi oluşturma programının adı olan 'RANLIB' (belirli bir
ihtiyaç, ikinci işlevselliği gerektirmez, o zaman 'ARCOM', olmayacak şekilde yeniden tanımlanmalıdır.
referans 'RANLIB').

'Kütüphane' yöntemi, aynı kitaplığın birden çok yöntemde belirtilmesine izin verir.
çağrılar. Tüm çağrılardan katkıda bulunan nesnelerin tümü (bunlar
farklı dizinler) tek bir arşiv komutuyla birleştirilir ve oluşturulur. Not,
ancak, bir yapıyı, bir kitaplığın yalnızca bir bölümünün belirtileceği şekilde budarsanız, yalnızca
kütüphanenin o kısmı oluşturulacak (gerisi kaybolacak!).

The "Modül" yöntem

'Modül' yöntemi, 'Program' ve 'Komut' yöntemlerinin bir birleşimidir. Ziyade
doğrudan yürütülebilir bir program oluşturan bu komut, kendi programınızı belirlemenizi sağlar.
aslında bir modül oluşturmak için komut. Yöntem şu şekilde çağrılır:

Modül $env , , ;

Bu komut, örneğin dinamik olarak oluşturmak istediğiniz durumlarda kullanışlıdır.
yüklü modüller veya statik olarak bağlantılı kod kitaplıkları.

The 'bağlıdır' yöntem

'Depends' yöntemi, bir hedef için ek bağımlılıklar belirlemenize olanak tanır. Bu
şu şekilde çağrılır:

$env'ye bağlıdır , ;

Bu, özellikle tarayıcının bulunmadığı (veya tarayıcının mevcut olmadığı) durumlarda bazen yararlı olabilir.
yazılabilir) belirli dosya türleri için. Normalde, bağımlılıklar hesaplanır
yöntem tarafından kurulan açık bağımlılıkların bir kombinasyonundan otomatik olarak
çağırma veya kaynak dosyaları tarayarak.

Birden çok hedef için bir dizi özdeş bağımlılık, bir referans kullanılarak belirtilebilir.
hedeflerin bir listesi. Perl'de, bir listeyi kare içine alarak bir liste referansı oluşturulabilir.
parantez. Dolayısıyla aşağıdaki komut:

$env ['foo', 'bar'], 'input_file_1', 'input_file_2';

her ikisinin de olduğunu belirtir foo ve bar dosyalar, listelenen girdi dosyalarına bağlıdır.

The "Yoksay" yöntem

'Ignore' yöntemi, Cons'un kendi sonuçlarından çıkardığı bağımlılıkları açıkça yok saymanıza izin verir.
sahip olmak. Aşağıdaki gibi çağrılır:

Göz ardı etmek ;

Bu, sistem başlık dosyalarındaki değişiklikler nedeniyle yeniden derlemeleri önlemek için kullanılabilir veya
oluşturulan hedefleri etkilemediği bilinen yardımcı programlar.

Örneğin, bir program birden çok sistemde NFS'ye bağlı bir dizinde yerleşikse,
farklı kopyaları var stdio.h, farklılıklar hepsinin imzalarını etkileyecek
`#include içeren kaynak dosyalardan oluşturulmuş türetilmiş hedefler '. Bu hepsine neden olacak
Bu hedefler, sistemler değiştirilirken yeniden oluşturulacak. Bu arzu edilen bir davranış değilse,
daha sonra aşağıdaki satır bağımlılıkları kaldıracaktır. stdio.h Dosya:

'^/usr/include/stdio\.h$' öğesini yoksay;

'Yoksay' yönteminin argümanlarının normal ifadeler olduğuna dikkat edin, bu nedenle özel
karakterlerden kaçılmalıdır ve karakterin başlangıcını veya sonunu sabitlemek isteyebilirsiniz.
'^' veya '$' karakterleriyle ifade.

The 'Tuz' yöntem

'Tuz' yöntemi, türetilen her tür için imza hesaplamasına sabit bir değer ekler.
dosya. Aşağıdaki gibi çağrılır:

Tuz $string;

Salt değerini değiştirmek, türetilmiş her dosyanın tam olarak yeniden oluşturulmasını zorlar. Bu olabilir
belirli istenen koşullarda yeniden oluşturmaya zorlamak için kullanılır. Örneğin,

Tuz 'uname -s';

İşletim sistemi açık olduğunda, türetilmiş her dosyanın tam olarak yeniden oluşturulmasını zorlar.
derlemenin gerçekleştirildiği ("uname -s" tarafından bildirildiği gibi) değişir.

The "Önbelleği Kullan" yöntem

'UseCache' yöntemi, Cons'a, paylaşılacak, türetilmiş dosyaların bir önbelleğini tutmasını söyler.
aynı projenin ayrı yapı ağaçları arasında.

UseCache("önbellek/ ") ⎪⎪ warn("önbellek dizini bulunamadı");

The 'KaynakYol' yöntem

'SourcePath' matematiği, bir dosyanın gerçek kaynak yol adını,
bir yapı dizini içindeki yol adı. Aşağıdaki gibi çağrılır:

$yol = KaynakYol ;

The "EksiklerYol" yöntem

Sağlanan yol türetilebilir bir dosyaysa 'ConsPath' yöntemi true değerini döndürür ve
undef (yanlış) aksi halde. Aşağıdaki gibi çağrılır:

$sonuç = ConsPath ;

The 'BölünmüşYol' yöntem

'SplitPath' yöntemi, varsayılan olarak ayrılmış bir dizede birden çok yol adını arar
işletim sistemi için yol ayırıcı (UNIX sistemlerinde ':', Windows NT'de ';') ve
tam nitelikli adları döndürür. Aşağıdaki gibi çağrılır:

@paths = BölünmüşYol ;

'SplitPath' yöntemi, '#' ön ekli adları uygun üst düzey yapıya dönüştürür
('#' olmadan) ve göreli adları üst düzey adlara dönüştürür.

The "DirPath" yöntem

'DirPath' yöntemi, derleme yolunu döndürür isim(ler) bir dizinin veya dizin listesinin.
Aşağıdaki gibi çağrılır:

$cwd = Yön Yolu ;

'DirPath' yönteminin en yaygın kullanımı şudur:

$cwd = DirPath '.';

bir yan kuruluşun mevcut dizinine giden yolu getirmek için askere çağırmak dosyası.

The "Dosya Yolu" yöntem

'FilePath' yöntemi, derleme yolunu döndürür isim(ler) bir dosyanın veya dosya listesinin. Bu
şu şekilde çağrılır:

$dosya = DosyaYolu ;

The 'yardım' yöntem

'Yardım' yöntemi, kullanıcı 'eksileri' çağırdığında görüntülenecek yardım metnini belirtir.
-H'. Bu, belirli hedeflere, değerlere, yapıya ilişkin belgeler sağlamak için kullanılabilir.
yapı ağacı için seçenekler vb. Aşağıdaki gibi çağrılır:

Yardım ;

'Yardım' yöntemi yalnızca bir kez çağrılabilir ve genellikle en üstte belirtilmelidir.
seviye Kurmak dosyası.

uzatma Eksiler


ağır basan kas kütlesi inşasında ve değişkenler

Zorluk derecesine göre değişen Eksileri genişletmenin birkaç yolu vardır. En basit
yöntem, varsayılan ortama dayalı olarak kendi inşaat ortamınızı tanımlamaktır,
ancak özel ihtiyaçlarınızı yansıtacak şekilde modifiye edilmiştir. Bu genellikle C-tabanlı için yeterli olacaktır.
uygulamalar. Bunun için "yeni" kurucuyu ve "klonlama" ve "kopyalama" yöntemlerini kullanabilirsiniz.
hibrit ortamlar oluşturun. Bu değişiklikler, altta yatan temel için tamamen şeffaf olabilir.
askere çağırmak dosyaları.

Ekleme yeni yöntemleri

Biraz daha zorlu değişiklikler için, "eksiler"e yeni yöntemler eklemek isteyebilirsiniz.
paket. Burada çok basit bir eklenti olan `InstallScript' örneği verilmiştir.
tcl komut dosyasını istenen bir konuma yerleştirir, ancak önce komut dosyasını bir platformu yansıtacak şekilde düzenler.
komut dosyasına yüklenmesi gereken bağımlı yol:

# cons::InstallScript - Bir kabuğun platforma bağlı sürümünü oluşturun
# komut dosyası "#!buradaki-yolunuz" dizesini platforma özel ile değiştirerek
# yol $BIN_DIR.

alt eksileri::InstallScript {
benim ($env, $dst, $src) = @_;
Komut $env $dst, $src, qq(
sed s+yolunuz-burası+$BIN_DIR+ %< > %>
chmod oug+x %>
);
}

Bu yöntemin doğrudan 'cons' paketinde tanımlandığına dikkat edin (adın önüne ekleyerek).
'eksileri::' ile). Bu şekilde yapılan bir değişiklik tüm ortamlarda global olarak görünür olacak,
ve aşağıdaki örnekte olduğu gibi çağrılabilir:

InstallScript $env "$BIN/foo", "foo.tcl";

Genellikte küçük bir gelişme için, 'BINDIR' değişkeni bir değişken olarak geçirilebilir.
argüman veya inşaat ortamından alınmış -- `%BINDIR' olarak.

ağır basan yöntemleri

Yöntemi 'cons' ad alanına eklemek yerine yeni bir paket tanımlayabilirsiniz.
'cons' paketinden mevcut yöntemleri devralır ve diğerlerini geçersiz kılar veya ekler. Bu
Perl'in kalıtım mekanizmaları kullanılarak yapılabilir.

Aşağıdaki örnek, standardı geçersiz kılan yeni bir "cons::switch" paketini tanımlar.
'Kütüphane' yöntemi. Geçersiz kılınan yöntem, kitaplık yerine bağlantılı kitaplık modülleri oluşturur
arşivler. Yeni bir kurucu sağlanır. Bu kurucu ile oluşturulan ortamlar
yeni kütüphane yöntemine sahip olun; diğerleri olmaz.

paket eksileri::switch;
BAŞLA {@ISA = 'eksileri'}

alt yeni {
vardiya;
yeni eksileri kutsa(@_);
}

alt Kitaplık {
benim($env) = vardiya;
benim($lib) = vardiya;
my(@objs) = Nesneler $env @_;
Komut $env $lib, @objs, q(
%LD -r %LDFLAGS %< -o %>
);
}

Bu işlevsellik aşağıdaki örnekte olduğu gibi çağrılabilir:

$env = yeni eksiler::switch(@overrides);
...
Kütüphane $env 'lib.o', 'foo.c', 'bar.c';

çağıran Eksiler


'cons' komutu genellikle yapı ağacının kökünden çağrılır. A Kurmak dosya
bu dizinde bulunmalıdır. '-f' argümanı kullanılırsa, alternatif bir Kurmak
dosya kullanılabilir (ve muhtemelen alternatif bir kök, çünkü "eksileri" Kurmak
dosyanın bulunduğu dizin).

Eğer 'cons', yapı ağacının kökünün bir alt öğesinden '-t' argümanıyla çağrılırsa,
arayan dizin hiyerarşisinde yukarı çıkacak Kurmak dosya. (Alternatif bir ad
hala `-f' ile belirtilebilir.) Komut satırında sağlanan hedefler değiştirilecektir.
keşfedilen ile ilgili olmak Kurmak dosya. Örneğin, içeren bir dizinden
bir üst düzey Kurmak dosya, aşağıdaki çağrı:

% cd libfoo/alt dizini
% eksileri -t hedef

tam olarak şuna eşdeğerdir:

% eksileri libfoo/alt dizin/hedef

Dizin hiyerarşisinde belirtilen herhangi bir 'Varsayılan' hedef varsa Kurmak or
askere çağırmak dosyalar, yalnızca "cons -t"nin bulunduğu dizindeki veya altındaki varsayılan hedefler
çağrıldı inşa edilecek.

Komut aşağıdaki gibi çağrılır:

Eksileri --

nerede argümanlar herhangi bir sırayla aşağıdakilerden herhangi biri olabilir:

hedef Belirtilen hedefi oluşturun. Eğer hedef bir dizindir, ardından özyinelemeli olarak oluşturun
bu dizindeki her şey.

+desen Sınırlamak askere çağırmak sadece eşleşen dosyalar olarak kabul edilen dosyalar model, Olduğu bir
bir Perl düzenli ifadesi. Çoklu '+' argümanları kabul edilir.

isim=
Setleri isim değer vermek val 'ARG' karmasında en üst seviyeye geçti Kurmak dosyası.

`-cc' Önbellekten alınırken yürütülecek komutu göster. Numara
dosyanın alındığına dair gösterge verilir; bu işe yarar
gerçek derleme günlükleriyle karşılaştırılabilecek derleme günlükleri oluşturma.

`-cd' Tüm önbelleğe almayı devre dışı bırakır. Önbellekten almayın veya önbelleğe boşaltmayın.

`-cr' Bağımlılıkları rastgele sırada oluşturun. Bu, birden çok yapı oluştururken kullanışlıdır.
önbelleğe alma etkinleştirilmiş benzer ağaçlar.

`-cs' Güncel olduğu bulunan mevcut yapı hedeflerini önbellekle senkronize edin.
Bu, önbelleğe alma -cc ile devre dışı bırakıldıysa veya yakın zamanda etkinleştirildiyse yararlıdır
UseCache ile.

`-d' Bağımlılık hata ayıklamasını etkinleştir.

`-f'
Bunun yerine belirtilen dosyayı kullanın Kurmak (ancak önce içeren olarak değiştirin
dizini dosya).

`-h' Böyle bir tanımlıysa, mevcut yapı için yerel bir yardım mesajı gösterin ve çıkın.

`-k' Hatalardan sonra mümkün olduğunca ilerlemeye devam edin.

`-o'
Geçersiz kılma dosyasını oku dosya.

`-p' İnşaat ürünlerini belirtilen ağaçlarda göster. Herhangi bir inşa girişiminde bulunulmaz.

`-pa' İnşaat ürünlerini ve ilgili eylemleri göster. Herhangi bir inşa girişiminde bulunulmaz.

`-pw' Ürünleri ve nerede tanımlandıklarını göster. Herhangi bir inşa girişiminde bulunulmaz.

`-q' Hedefleri Yükleme ve Kaldırma konusunda ayrıntılı olmayın.

`-r' İle ilişkili yapı ürünlerini kaldır . Herhangi bir inşa girişiminde bulunulmaz.

`-R'
Dosyaları şurada arayın: repo. çoklu -R repo dizinler aranır
sipariş belirtildi.

`-t' Bir dizini aramak için dizin hiyerarşisinde gezinin. Kurmak dosya, yoksa
geçerli dizinde. Hedefler göreli olacak şekilde değiştirilecektir.
Kurmak dosyası.

`-v' Eksileri sürümünü göster ve işlemeye devam et.

`-V' `eksileri' versiyonunu göster ve çık.

`-wf'
Dikkate alınan tüm dosya adlarını yazın dosya.

`-x' Buna benzer bir yardım mesajı göster ve çık.

Ve yapı-args içinde işlemek istediğiniz herhangi bir argüman olabilir. Kurmak dosyası.
olması gerektiğini unutmayın. -- argümanları eksilere ve argümanları ayırmaya
içinde işlemek dileğiyle Kurmak dosyası.

İşleniyor yapı-args gibi herhangi bir standart paket ile yapılabilir Getopt ya da onun
varyantlar veya herhangi bir kullanıcı tanımlı paket. Cons içinde geçecek yapı-args as @ARGV ve
sonrasında hiçbir şeyi yorumlamaya çalışmayacaktır. --.

% cons -R /usr/local/depo -d os=solaris +sürücü -- -c testi -f DEBUG

aşağıdakileri eksilere iletirdi

-R /usr/local/depo -d os=solaris +sürücü

ve aşağıdakiler, en üst seviyeye Kurmak olarak dosya @ARGV

-c testi -f HATA AYIKLAMA

'cons -r' olduğuna dikkat edin. tam özyinelemeli "make clean" işlemine eşdeğerdir, ancak hiçbir
destek Kurmak dosya veya herhangi askere çağırmak Dosyalar. Bu, en çok işinize yarar
dosyaları kaynak dizinlerde derleme (eğer inşa etmek ve ihracat dizinler,
o zaman sadece dizinleri kaldırabilirsiniz).

'-p', '-pa' ve '-pw' seçenekleri, okumaya yardımcı olmak için son derece kullanışlıdır.
komut dosyaları veya hata ayıklama. Hangi komut dosyasının yüklendiğini bilmek istiyorsanız dışa aktar/dahil et/foo.h,
örneğin, şunu yazın:

% eksileri -pw dışa aktarma/içerme/foo.h

kullanma ve yazı yazıyor bağımlılık tarayıcılar


QuickScan, kaynak dosyalar için hedeften bağımsız basit tarayıcıların ayarlanmasına izin verir. Bir tek
bir QuickScan tarayıcı, herhangi bir kaynak dosya ve ortamla ilişkilendirilebilir.

QuickScan şu şekilde çağrılır:

QuickScan CONSENV CODEREF, DOSYA ADI [, YOL]

CODEREF tarafından başvurulan alt yordamın, dahil edilen dosya adlarının bir listesini döndürmesi beklenir.
doğrudan DOSYA tarafından. Bu dosya adları sırayla taranacaktır. İsteğe bağlı PATH bağımsız değişkeni
FILENAME ve/veya kullanıcı tarafından sağlanan dosyalar tarafından döndürülen dosyaları bulmak için bir arama yolu sağlar
alt program PATH, bir dizi arama dizini adına bir başvuru olabilir veya
sistemin ayırıcı karakteriyle (':' UNIX sistemlerinde, ';' on
Windows NT'de).

Altyordam dosyadaki her satır için bir kez çağrılır, $_ geçerli satıra ayarlanır.
Alt programın ek satırlara veya bu nedenle tüm dosyaya bakması gerekiyorsa,
daha sonra bunları SCAN kütük tanıtıcısından okuyabilir. Ayrıca, eğer döngüyü sonlandırabilir:
kütük tanıtıcısını kapatarak daha fazla içerme bilgisinin bulunmadığını bilir.

Bir arama yolu sağlanmış olsun ya da olmasın, QuickScan önce dosyayı aramaya çalışır.
geçerli dizine göre (doğrudan QuickScan'e sağlanan üst düzey dosya için),
veya dosyaya atıfta bulunan dosyayı içeren dizinden. bu çok değil
genel, ancak yeterince iyi görünüyor - özellikle de kendinizinkini yazma lüksünüz varsa
yardımcı programlar ve arama yolunun kullanımını standart bir şekilde kontrol edebilir. Son olarak,
arama yolu şu anda iki nokta üst üste ayrılmış durumda. Bu, NT kampını mutlu etmeyebilir.

İşte gerçek bir örnek, bir Kurmak dosya burada:

alt eksileri::SMFgen {
benim($env, @tables) = @_;
foreach $t (@tablolar) {
$env->QuickScan(sub { /\b\S*?\.smf\b/g }, "$t.smf",
$env->{SMF_INCLUDE_PATH});
$env->Komut(
["$t.smdb.cc","$t.smdb.h","$t.snmp.cc","$t.ami.cc", "$t.http.cc"],
"$t.smf",
q(
smfgen %( %SMF_INCLUDE_OPT %) %
)
);
}
}

[`$env->QuickScan ...' ve `$env->Command ...' biçiminin
gerekli, ancak bazı nedenlerden dolayı bu özel çağrı için gereklidir. Bu görünür
Perl'de bir hata veya benim açımdan bir yanlış anlama; bu çağrı tarzı değil
her zaman gerekli görünür.]

Bu, formun tüm adlarını bulur .smf dosyasında. İsimleri döndürecek olsa bile
yorumların içinde bulunurlar, ama sorun değil (mekanizma fazladan dosyaları bağışlıyor;
eksik dosyanın fark edileceği varsayımıyla görmezden gelinirler.
programı, bu örnekte, smfgen, aslında çağrılır).

Bir tarayıcı, yalnızca belirli bir kaynak dosya için, tarayıcıdaki bir hedef tarafından ihtiyaç duyulursa çağrılır.
ağaç. Belirli bir kaynak dosya için yalnızca bir kez çağrılır.

İşte aynı tarayıcıyı oluşturmanın başka bir yolu. Bu, açık bir kod referansı kullanır,
ve ayrıca (bu durumda gereksiz yere) tüm dosyanın kendisini okur:

alt myscan {
benim(@include);
yapmak {
push(@include, /\b\S*?\.smf\b/g);
} sırasında ;
@içerir
}

Döngünün sırasının, sonunda döngü testi ile tersine çevrildiğini unutmayın. Bu
çünkü ilk satır zaten sizin için okundu. Bu tarayıcı bir kaynağa eklenebilir
dosya:

QuickScan $env \myscan, "$_.smf";

DESTEK VE ÖNERİLER


Eksileri, kullanıcı topluluğu tarafından korunur. Abone olmak için mail atın tartışmak-
[e-posta korumalı] vücut ile abone ol.

Lütfen herhangi bir öneriyi [e-posta korumalı] posta listesi

onworks.net hizmetlerini kullanarak çevrimiçi eksileri kullanın


Ücretsiz Sunucular ve İş İstasyonları

Windows ve Linux uygulamalarını indirin

  • 1
    türkdevops
    türkdevops
    TurkDevOps a ?k kaynak yaz?l?m
    geli?tirici topluluklar? DevTurks-Ekibi
    Tarafından desteklenmektedir..
    Özellikler: https://github.com/turkdevopshttps://turkdevops.g...
    turkdevops'u indir
  • 2
    assammdf
    assammdf
    *asammdf* hızlı bir Python ayrıştırıcısıdır ve
    ASAM editörü (Association for
    Otomasyonun Standardizasyonu ve
    Ölçüm Sistemleri) MDF / MF4
    (Ölçüm Veri Formatı...
    asammdf'i indir
  • 3
    LAME (Lame Aint bir MP3 Encoder)
    LAME (Lame Aint bir MP3 Encoder)
    LAME, kullanılacak bir eğitim aracıdır.
    MP3 kodlamayı öğrenmek için. bu
    LAME projesinin amacı geliştirmektir
    psiko akustik, kalite ve hız
    Milletvekili...
    LAME'yi İndirin (Lame MP3 Kodlayıcı Değildir)
  • 4
    wxPython
    wxPython
    sağlayan bir dizi Python genişletme modülü
    platformlar arası GUI sınıflarını sarın
    wxWidgets.. Kitle: Geliştiriciler. kullanıcı
    arayüz: X Pencere Sistemi (X11), Win32 ...
    wxPython'u indirin
  • 5
    paket dosya yöneticisi
    paket dosya yöneticisi
    Bu, Total War paketi dosya yöneticisidir.
    proje, sürüm 1.7'den başlayarak. A
    Warscape'e kısa bir giriş
    modlama: ...
    packfilemanager'ı indirin
  • 6
    IPerf2
    IPerf2
    Ölçmek için bir ağ trafiği aracı
    Metriklerle TCP ve UDP performansı
    hem verim hem de gecikme süresi civarında. NS
    hedefler aktif bir şekilde sürdürmeyi içerir
    iperf kodu...
    IPerf2'yi indirin
  • Daha fazla »

Linux komutları

Ad