Bu, Ubuntu Online, Fedora Online, Windows çevrimiçi emülatörü veya MAC OS çevrimiçi emülatörü gibi birden fazla ücretsiz çevrimiçi iş istasyonumuzdan birini kullanarak OnWorks ücretsiz barındırma sağlayıcısında çalıştırılabilen makepp_build_algorithm komutudur.
Program:
ADI
makepp_build_algorithm -- makepp bir makefile dosyasını nasıl çalıştırır
TANIM
Makepp'in içindekiler, standart Unix'in yapısından temel açılardan farklıdır. Bu sayfa
farklı felsefeyi ayrıntılı olarak açıklar.
Geri vs ileri sonuç
Makepp, standart Unix markasının tersi yönde çalışır. Geleneksel Unix yapımı
oluşturması için bir hedef verilir ve ardından içindeki karakterlerle eşleşen bir kural bulur.
hedef dosya adı. Hedef, kuralın bağımlılıklarından herhangi birinden daha eskiyse, o zaman
yeniden inşa edildi.
Örneğin, şu kalıp kuralını göz önünde bulundurun:
%.o: %.cxx
$(CXX) $(CXXFLAGS) -c $(girdi) -o $(çıktı)
make, "xyz.o" adında bir dosya yapması gerektiğini fark ettiğinde, kendi listesini arar.
"xyz.o" ifadesinin "%.o" kalıbıyla eşleştiğini görene kadar kalıp kuralları
bu kural.
Makepp ters yönde çalışır. İlk önce muhtemelen yapabileceği tüm dosyaları hesaplar.
bağımlılık dosya adlarındaki karakterlerle eşleşen kurallar uygulayarak oluşturun. Sonra ne zaman
bir dosya oluşturması gerekiyor, bildiği dosyalardan biri olup olmadığına bakıyor
nasıl inşa edilir. Bilinen dosyaların listesi, mutlak dosya adına göre saklanır.
makepp yukarıdaki kalıp kuralıyla karşılaştığında, dizindeki tüm dosyaları arar.
"%.cxx" kalıbıyla (yani, "*.cxx") eşleşen. Bu dosyaların her biri için, daha sonra hatırlar
karşılık gelen ".o" dosyasını üretebilir. Daha sonra makepp bunu keşfederse
mevcut olmayan başka bir ".cxx" dosyası oluşturabilir, bu kural da uygulanacaktır
ve ilgili ".o" dosyası işaretlenecektir.
Bu biraz verimsiz görünebilir, ancak çoğu durumda o kadar yavaş olmadığı ortaya çıkıyor,
ve oluşturulabilecek hemen hemen tüm dosyaların aslında oluşturulmuş olduğu genellikle doğrudur.
Ve oluşturulabilecek dosyaların tam listesini bilmenin çeşitli avantajları vardır:
· Joker karakterler, henüz var olmayan ancak oluşturulabilen dosyalarla eşleşebilir.
· Otomatik bağımlılık tarayıcı tarafından algılanan başlık dosyalarında
varolmaya; makepp nerede olacaklarını biliyor. (Bu soruna yönelik diğer çoğu çözüm
henüz mevcut olmayan herhangi bir başlığın geçerli dizinde olduğunu varsayalım.)
· Depoları uygulamak çok daha kolaydır çünkü makepp hangi dosyaları önceden bilir
yapabilir. (Ayrıntılar için makepp_repositories'e bakın.)
· Hangi dosyaların oluşturulabileceğini kolayca belirlemek mümkündür (bkz.
"$(only_targets )" işlevi.
· Makepp'in "$(infer_objects)" işlevi, nesnelerin ne olduğunu bilerek büyük ölçüde basitleştirilmiştir.
kullanılabilir.
dosyalar vs metinsel desen
Makepp, derleme komutlarını bir hedef dosyayla ilişkilendirir, bir metin kalıbıyla değil.
dosya adı. Bu nedenle aynı dosya için farklı isimlerle karıştırılmaz. Böylece, için
örneğin, makepp "./xyz" ve "xyz" dosyalarının aynı dosya olduğunu bilir, oysa diğer makepp
yardımcı programlar olmayabilir.
Bu özellikle önemlidir çünkü (standart markanın aksine) makepp makefile'leri yükler
farklı dizinlerden. Makefile dosyalarının nispeten bağımsız olması için,
üst düzey bir makefile özel bir konum verilmez, her makefile tüm dosyalara atıfta bulunur
kendi dizinine göre. Bu nedenle, alt dizinden bir makefile yüklerseniz
"other_stuff" ve bu makefile "../xyz" anlamına geliyorsa, makepp bunun bir kez daha farkına varacaktır.
yukarıda belirtilen aynı dosya. (Ayrıca yumuşak bağlantılı dizinle karıştırılmayacaktır.
isimler.)
Saklanan inşa etmek bilgi
Makepp, oluşturduğu her dosya hakkında yalnızca tarihin ötesinde çok daha fazla bilgi depolar.
damga (standartın umursadığı tek şey budur). Bu bilgiler şunları içerir:
· Bu dosyanın son derlemedeki imzası, bu nedenle dosyanın kendisinin olup olmadığını biliyoruz.
değişti.
· Dahil edilen dosyalar ve çıkarılan diğer dosyalar dahil olmak üzere her bir bağımlılık dosyasının adları
otomatik olarak. Bu liste değişirse makepp, yeniden oluşturulması gerektiğini varsayar.
· Her bağımlılığın imzası. Bu şekilde makepp, yalnızca
bağımlılıklar hedeften daha yenidir, ancak değiştiklerinde. Bu da yapar
yerine kriptografik sağlama toplamları gibi başka tür imzalar kullanmak mümkündür.
dosya tarihinden daha
· Tüm derleme komutu (ve cwd'si). Bu şekilde build komutunu değiştirirseniz
(örneğin, derleyici seçeneklerini değiştirin), makepp, dosyalar silinse bile yeniden oluşturmayı bilir.
kendileri değişmedi.
· Mimarlık. Programınızı Linux'ta derlediyseniz ve ardından
Solaris, makepp her şeyi yeniden derlemeyi otomatik olarak bilir.
Makepp, dokunduğu her dizinde ".makepp" adında bir alt dizin oluşturur. NS
bir dosya için bilgi oluşturma Dosya bir dizinde saklanır .makepp/dosya adı. Eğer
bu alt dizini siler veya dosyaları değiştirirseniz, makepp etkilenen tüm dosyaları yeniden oluşturacaktır.
üstü kapalı yükleme
makepp bir dizinde bir hedef oluşturmaya çalışıyorsa ve henüz bunun için bir kuralı yoksa,
veya bir dizindeki joker karakterle eşleşen dosyaları arıyorsa, buna bakacaktır.
makefile olup olmadığını görmek için dizin. Eğer öyleyse, makefile yüklenecek
otomatik olarak.
Bu, genellikle makepp'e nerede bulacağını açıkça söylemek zorunda olmadığınız anlamına gelir.
makefiles--tüm yapmanız gereken başka bir dizindeki bir dosyaya referans vermektir ve makepp
nasıl inşa edileceğini otomatik olarak bulur.
Örtülü yükleme, yalnızca dizin sizin için yazılabilirse gerçekleşir. Böylece isterseniz
makepp'in asla değişmeyecek bir sürü şey inşa etmeye çalışmasını önleyin, sadece
dizin salt okunur.
Bir ağacın altındaki bir ağaçtaysanız, örtük yükleme gerçekleşmez. RootMakepp dosyası(.mk) ve
diğer makefile o ağacın dışında. Bunu bir kez istersen, bir verebilirsin
"--do-build=/" seçeneği, ağacın dışındaki her şeyi oluşturulabilir kılmak için makepp'e. Eğer sen
her zaman bunu istiyorsanız, ağacın içinde bir yere bir "load_makefile" ifadesi koyabilirsiniz.
açıkça ağaca bağlayın.
Örtük yükleme yolunuza çıkarsa (yani, makepp çok fazla makefile yükler ve israf eder)
zaman, yoksa gerçekten onun, bölümde açıklanan tüm şeyleri yeniden oluşturmaya çalışmasını istemezsiniz.
makefiles), "--noimplicit_load" komutunu kullanarak tüm dizinler için kapatabilirsiniz.
satır seçeneği veya "no_implicit_load" kullanarak seçili dizinler için kapatabilirsiniz.
makefile'nizdeki ifade.
onworks.net hizmetlerini kullanarak makepp_build_algorithm çevrimiçi kullanın