Yap (yazılım) - Make (software)

Yapmak
Paradigmamakro, beyan edici
Tarafından tasarlandıStuart Feldman
İlk ortaya çıktıNisan 1976; 44 yıl önce (1976-04)
Uygulama diliC
işletim sistemiUnix benzeri, Cehennem
Dosya formatlarıMakefile
Majör uygulamalar
BSD, GNU, nmake
Lehçeler
BSD yapımı, GNU yapımı, Microsoft nmake
Etkilenen
Karınca, Tırmık, MSBuild, ve diğerleri

İçinde yazılım geliştirme, Yapmak bir otomasyon inşa etmek otomatik olarak inşa çalıştırılabilir programlar ve kütüphaneler itibaren kaynak kodu okuyarak Dosyalar aranan Makefiles hedef programın nasıl türetileceğini belirtir. Rağmen entegre geliştirme ortamları ve dil -özel derleyici özellikler ayrıca bir derleme sürecini yönetmek için kullanılabilir, Make yaygın olarak kullanılmaktadır, özellikle Unix ve Unix benzeri işletim sistemleri.

Make, program oluşturmanın yanı sıra, bazı dosyaların diğerlerinden her değiştiğinde otomatik olarak güncellenmesi gereken herhangi bir projeyi yönetmek için kullanılabilir.

Menşei

Şu anda bir dizi bağımlılık izleme derleme aracı var, ancak Make en yaygın olanlardan biridir, öncelikle Unix ile başlayarak PWB / UNIX Yazılım geliştirme görevlerini hedefleyen çeşitli araçlar içeren 1.0.[1] Başlangıçta tarafından oluşturuldu Stuart Feldman Nisan 1976'da Bell Laboratuvarları.[2][3][1] Feldman 2003'ü aldı ACM Bu yaygın aracı yazdığı için Yazılım Sistemi Ödülü.[4]

Feldman, bir iş arkadaşının, çalıştırılabilir dosyanın yanlışlıkla değişikliklerle güncellenmediği bir programında boşuna hata ayıklama deneyiminden ilham aldı:

Steve Johnson'ın (yacc'nin yazarı, vb.) Bir ziyaretiyle, ofisime hücum ederek, bir sabah doğru bir programda hata ayıklamak için onu boşa harcamasına neden olan Kaderlere küfrederek (hata düzeltildi, dosya derlenmedi, cc * .o bu nedenle etkilenmedi). Önceki akşamın bir kısmını, üzerinde çalıştığım bir projede aynı felaketle başa çıkarak geçirdiğim için, onu çözmek için bir araç fikri ortaya çıktı. Ayrıntılı bir bağımlılık analizcisi fikriyle başladı, çok daha basit bir şeye indirgendi ve o hafta sonu Make'e dönüştü. Hala ıslak olan aletlerin kullanımı kültürün bir parçasıydı. Makefile'lar metin dosyalarıydı, sihirli bir şekilde kodlanmış ikili dosyalar değillerdi, çünkü bu Unix ethos'du: yazdırılabilir, hata ayıklanabilir, anlaşılabilir şeyler.

— Stuart Feldman, Unix Programlama Sanatı, Eric S. Raymond 2003

Make'in tanıtımından önce, Unix inşa sistemi en yaygın olarak şunlardan oluşuyordu: işletim sistemi program kaynağına eşlik eden bağımlı "make" ve "install" kabuk komut dosyaları. Farklı hedefler için komutları tek bir dosyada birleştirebilmek ve bağımlılık takibini ve arşiv işlemeyi soyutlayabilmek, modern yapı ortamları yönünde önemli bir adımdı.

Türevler

Make bir dizi geçti yeniden yazıyor, aynı dosya biçimini ve temel algoritmik ilkeleri kullanan ve aynı zamanda kendi standart dışı geliştirmelerinden bazılarını sağlayan sıfırdan bir dizi varyant dahil. Onlardan bazıları:

  • Sun DevPro Make, 1986 yılında SunOS-3.2 ile ortaya çıktı. SunOS-3.2 ile isteğe bağlı program olarak teslim edildi; SunOS-4.0 ile SunPro Make, varsayılan Make programı yapıldı.[5][daha iyi kaynak gerekli ] Aralık 2006'da Sun DevPro Make, açık kaynak geliştirme çabalarının bir parçası olarak açık kaynaklı hale getirildi Solaris.[6][7]
  • dmake veya Sun Solaris Studio ile birlikte varsayılan Marka olarak gelen, ancak Solaris İşletim Sisteminde (SunOS) varsayılan Marka değil. Başlangıçta OpenOffice'i kurmak gerekiyordu, ancak 2009'da[8] derleme sistemi GNU Make kullanmak için yeniden yazıldı. Süre Apache OpenOffice yine de her iki yapı sisteminin bir karışımını içerir,[9] çok daha aktif olarak geliştirilmiş LibreOffice şimdi sadece modernize edilmiş "gbuild" kullanıyor.[8]
  • BSD Yapmak (pmake,[10] Bmake[11] veya fmake[12]), Adam de Boor'un bir Make sürümü üzerinde hedefler oluşturabilen çalışmasından türetilmiştir. paralel ve çeşitli derecelerde modifikasyonla hayatta kalır. FreeBSD,[11] NetBSD[13] ve OpenBSD.[14] Ayırt edici bir şekilde, ayrıştırma aşamasında uygulanan koşullu ve yinelemeli döngülere sahiptir ve makefile'ı koşullu ve programlı bir şekilde oluşturmak için kullanılabilir.[15]çalışma zamanında hedeflerin oluşturulması dahil.[kaynak belirtilmeli ]
  • GNU Yap (kısa gmake), Make for Linux ve macOS'un standart uygulamasıdır.[16] Koşullar gibi orijinal Marka üzerinde birkaç uzantı sağlar. Ayrıca makefile kurallarında kabuk komut dosyası oluşturma ihtiyacını ortadan kaldırmanın yanı sıra makefile'da ayarlanmış ve kullanılan değişkenleri işlemek için kullanılabilecek birçok yerleşik işlev sağlar.[17] Örneğin, her biri için işlev, belirli bir dizindeki tüm dosyaların listesine bir değişken ayarlar.[18] GNU Make, aşağıdakiler dahil birçok yazılım sistemi oluşturmak için gereklidir: GCC (3.4 sürümünden beri[19]), Linux çekirdeği,[20][21] Apache OpenOffice,[9] LibreOffice,[8] ve Mozilla Firefox.[22]
  • Rocky Bernstein'ın Yeniden Yapılması[23] GNU Make'in bir çatalı ve GNU Make üzerinde daha iyi konum ve hata konumu raporlama, yürütme izleme, yürütme profili oluşturma gibi çeşitli uzantılar sağlar ve bir hata ayıklayıcı içerir.
  • Glenn Fowler nmake[24] aynı adlı Microsoft programıyla ilgisi yoktur. Girişi Make'e benzer, ancak uyumlu değildir. Bu program kısayollar ve yerleşik özellikler sağlar ve geliştiricilerine göre makefile boyutunu 10 kat azaltır.
  • Microsoft nmake, normalde bir parçası olan bir komut satırı aracı Görsel stüdyo.[25] Komut satırında veya makefiles içinde ayarlanan değişkenleri kullanan include ve koşullu ifadeler gibi önişlemci yönergelerini destekler.[26][27] Çıkarım kuralları Make'den farklıdır; örneğin arama yollarını içerebilirler.[28] Yapma aracı ile birlikte verilen Embarcadero ürünlerinde "MAKE'in Microsoft'un NMAKE'ini taklit etmesine neden olan" bir komut satırı seçeneği vardır.[29]
  • Mk Değiştirildi Araştırma Unix, sürüm 9'dan başlayarak.[30] Bell Labs programcısı Andrew G. Hume tarafından orijinal aracın yeniden tasarımı, farklı bir sözdizimi içeriyor. Mk, standart yapım aracı oldu Plan 9 Bell Labs'ın Unix için amaçlanan halefi.[31]
  • Kati Google'ın GNU Make yerine geçmesidir. Android işletim sistemi oluşturur. Makefile'ı şu dile çevirir: ninja daha hızlı artımlı derlemeler için.[32]

POSIX Make yardımcı programının temel özelliklerinin ve çalışmasının standardizasyonunu içerir ve Make'in Unix tabanlı sürümlerinde değişen derecelerde bütünlükle uygulanır. Genel olarak, Make'in çeşitli sürümleri arasında makul bir başarıyla basit makefile'lar kullanılabilir. GNU Make, Makepp ve BSD'nin bazı sürümleri "GNUmakefile" adlı dosyalar için ilk aramayı varsayılan yapın,[33] "Makeppfile"[34] ve "BSDmakefile"[35] sırasıyla, uygulama tanımlı davranışı kullanan makefile dosyalarını ayrı konumlara koymaya izin verir.

Davranış

Marka genellikle inşa etmek kaynak koddan çalıştırılabilir programlar ve kitaplıklar. Genel olarak Make, bir kaynak dosyayı hedef sonuca dönüştürmek için rastgele komutların çalıştırılmasını içeren herhangi bir işlem için geçerlidir. Örneğin, Make bir görüntü dosyasına (kaynak) yapılan bir değişikliği algılamak için kullanılabilir ve dönüştürme eylemleri dosyayı belirli bir biçime dönüştürmek, sonucu bir içerik yönetim sistemine kopyalamak ve ardından e-posta göndermek olabilir. Yukarıdaki eylemlerin gerçekleştirildiğini belirten önceden tanımlanmış bir kullanıcı grubuna.

Make, oluşturulacak hedef dosya adları listesiyle çağrılır. komut satırı argümanları:

Yapmak [HEDEF ...]

Make, argümanlar olmadan, makefile'da görünen ilk hedefi oluşturur; bu, geleneksel olarak adlandırılmış sembolik "sahte" bir hedeftir. herşey.

Make, dosya değiştirme zamanlarını karşılaştırarak bir hedefin yeniden oluşturulması gerekip gerekmediğine karar verir.[36] Bu, halihazırda güncel olan dosyaların oluşturulmasından kaçınma sorununu çözer, ancak bir dosya değiştiğinde ancak değişiklik süresi geçmişte kaldığında başarısız olur. Bu tür değişiklikler, bir kaynak dosyanın daha eski bir sürümünün geri yüklenmesinden veya ağ dosya sistemi bir dosya kaynağıdır ve saati veya saat dilimi, Make çalıştıran makine ile senkronize değildir. Kullanıcı bu durumu tam bir derlemeye zorlayarak halletmelidir. Tersine, eğer bir kaynak dosyanın değişiklik zamanı gelecekte ise, gereksiz yeniden oluşturmayı tetikler ve bu da kullanıcıları rahatsız edebilir.


Makefile'lar geleneksel olarak kod derlemek için kullanılır (* .c, * .cc, * .C, vb.), Ancak bunlar aynı zamanda ortak görevleri otomatikleştirmek için komutlar sağlamak için de kullanılabilir. Böyle bir makefile komut satırından çağrılır:

Yapmak # Bağımsız değişken olmadan ilk TARGET çalıştırılırYapmak Yardım                   # Kullanılabilir HEDEFLERİ gösteruzaklaşmak # Geçerli dizinden bir yayın arşivi oluşturun

Makefile

Makefile için geçerli dizini arar, ör. GNU Şunlardan biri adlı bir dosya için dosyaları arar: GNUmakefile, makefileveya Makefile ve sonra belirtilen (veya varsayılan) hedefleri (yalnızca) o dosyadan çalıştırır.

Makefile dili şuna benzer: bildirim temelli programlama.[37][38][39] Gerekli son koşulların açıklandığı ancak eylemlerin hangi sırayla yapılacağının önemli olmadığı bu dil sınıfı, bazen alışkın olan programcılar için kafa karıştırıcı olabilir. zorunlu programlama.

Bir problem otomasyon inşa etmek bir derleme sürecinin belirli bir yapıya göre uyarlanmasıdır. platform. Örneğin, bir platformda kullanılan derleyici, diğerinde kullanılanla aynı seçenekleri kabul etmeyebilir. Bu, Make tarafından iyi idare edilmiyor. Bu sorun genellikle, daha sonra Make tarafından işlenen platforma özgü derleme yönergeleri oluşturularak ele alınır. Bu işlem için ortak araçlar Autoconf, CMake veya GYP (veya daha gelişmiş NG ).

Kurallar

Makefile şunlardan oluşur: kurallar. Her kural bir metinle başlar bağımlılık çizgisi hangisini tanımlar hedef ardından iki nokta üst üste (:) ve isteğe bağlı olarak hedefin bağlı olduğu bileşenlerin (dosyalar veya diğer hedefler) bir listesi. Bağımlılık çizgisi, hedef (kolonun sol eli) bileşenlere (kolonun sağ eli) bağlı olacak şekilde düzenlenmiştir. Bileşenlere hedefin ön koşulları olarak atıfta bulunmak yaygındır.

hedef [hedef ...]: [bileşen ...]Sekme ↹[komut 1]. . .Sekme ↹[komut n]

Genellikle her kuralın birden çok hedef yerine tek bir benzersiz hedefi vardır.

Örneğin, bir C .o nesne dosyası .c dosyalarından oluşturulur, bu nedenle .c dosyaları önce gelir (ör. belirli nesne dosyası hedef bir C kaynak dosyasına bağlıdır ve başlık dosyaları ). Make'in kendisi farklı dosya türlerini anlamadığından, tanımadığından veya ayırt etmediğinden, bu insan hatası olasılığını ortaya çıkarır. Unutulmuş veya fazladan bir bağımlılık hemen belli olmayabilir ve oluşturulan yazılımda küçük hatalara neden olabilir. Üçüncü taraf araçları ve bazı makefile oluşturucuları çağırarak bu bağımlılıkları oluşturan makefile yazmak mümkündür. Otomobil yapımı tarafından sağlanan araç zinciri GNU Projesi, bunu otomatik olarak yapabilir.

Her bağımlılık satırının ardından, bileşenlerin (genellikle kaynak dosyaları) hedefe (genellikle "çıktı") nasıl dönüştürüleceğini tanımlayan bir dizi TAB girintili komut satırı gelebilir. Ön koşullardan herhangi biri hedeften daha yeni bir değişiklik zamanına sahipse, komut satırları çalıştırılır. GNU Make belgeleri, bir "tarif" olarak bir kuralla ilişkilendirilen komutları ifade eder.

İlk komut, ön koşullardan sonra aynı satırda noktalı virgülle ayrılmış olarak görünebilir,

hedefler : ön koşullar ; komut

Örneğin,

Merhaba: ; @Eko "Merhaba"

Make, nereden başlayacağına karar verebilir topolojik sıralama.

Her komut satırı bir ile başlamalıdır sekme karakteri bir komut olarak tanınmak. Sekme bir Beyaz boşluk karakter, ama boşluk karakteri aynı özel anlama sahip değil. Bu sorunludur, çünkü bir sekme ve bir dizi boşluk karakteri arasında görsel bir fark olmayabilir. Makefiles sözdiziminin bu yönü genellikle eleştiriye tabidir; tarafından tanımlanmıştır Eric S. Raymond "Unix tarihindeki en kötü tasarım hatalarından biri" olarak[40] ve Unix-Haters El Kitabı "sözdiziminin bir parçası olarak sekmeleri kullanmak, şu pungee stick tuzaklarından biri gibi Yeşil Bereliler ". Feldman, seçimin bir geçici çözüm bir istekle korunan erken bir uygulama zorluğu için geriye dönük uyumluluk ilk kullanıcılarla:

Neden 1. sütundaki sekme? Yacc yeniydi Lex yepyeni oldu. Ben de denemedim, bu yüzden bunun öğrenmek için iyi bir bahane olacağını düşündüm. Lex'e ilk bıçağımla kendimi hırpaladıktan sonra, yeni satır sekmesi ile basit bir şey yaptım. Çalıştı, kaldı. Ve birkaç hafta sonra, çoğu arkadaş olan yaklaşık bir düzine kullanıcı nüfusum vardı ve gömülü tabanımı mahvetmek istemedim. Gerisi ne yazık ki tarih.

— Stuart Feldman[40]

Bununla birlikte, 3.82 sürümünden beri GNU Make, .RECIPEPREFIX özel değişkenini kullanarak herhangi bir sembolü (bir karakter) reçete öneki olarak seçmeye izin verir, örneğin:

.RECIPEPREFIX := :herşey::@Eko "yemek tarifi önek simgesi '$ (. RECIPEPREFIX)' olarak ayarlandı"

Her komut ayrı bir kabuk veya komut satırı yorumlayıcısı örnek. İşletim sistemleri farklı komut satırı yorumlayıcıları kullandığından, bu, taşınamayan makefile'lere yol açabilir. Örneğin, GNU Make (tüm POSIX Yaparları) varsayılan olarak komutları şu şekilde çalıştırır: / bin / sh, nerede Unix gibi komutlar cp normalde kullanılır. Bunun aksine, Microsoft'un nmake cmd.exe ile komutları çalıştırır, burada parti gibi komutlar kopya mevcuttur, ancak cp.

Bir kuralın tanımlanmış komut satırı olmayabilir. Bağımlılık satırı yalnızca hedeflere atıfta bulunan bileşenlerden oluşabilir, örneğin:

Realclean: temiz distclean

Bir kuralın komut satırları genellikle hedefi oluşturacak şekilde düzenlenir. Bir örnek: eğer file.html daha yenidir, metne dönüştürülür. Makefile içeriği:

file.txt: dosya.htmllynx -dump file.html> file.txt

Yukarıdaki kural "file.txt" güncelleme yapıldığında tetiklenecektir. Aşağıdaki çağrıda, Make genellikle bu kuralı "file.html" daha yeniyse "file.txt" hedefini güncellemek için kullanır.

file.txt yap

Komut satırlarında aşağıdaki üç önekten biri veya daha fazlası olabilir:

  • a tire-eksi (-), hataların göz ardı edildiğini belirtir
  • bir işaretini (@), komutun çalıştırılmadan önce standart çıktıya yazdırılmayacağını belirtir
  • a artı işareti (+), komut "yürütme" modunda Make çağrılsa bile yürütülür

Hataları göz ardı etmek ve yankıyı susturmak, alternatif olarak ".IGNORE" ve ".SILENT" özel hedefleri aracılığıyla elde edilebilir.[41]

Microsoft'un NMAKE'sinin bu makefile dosyalarından çıkarılabilecek önceden tanımlanmış kuralları vardır, ör. "c.obj $ (CC) $ (CFLAGS)".

Makrolar

Makefile makroların tanımlarını içerebilir. Makrolar genellikle şu şekilde anılır: değişkenler "CC = clang" gibi basit dize tanımları tuttuklarında. Makefiles içindeki makrolar, komut satırı argümanları Make yardımcı programına geçti. Ortam Değişkenleri makrolar olarak da mevcuttur.

Makrolar, kullanıcıların oluşturma işlemi sırasında başlatılan programları ve diğer özel davranışları belirlemesine olanak tanır. Örneğin, "CC" makrosu, makefiles içinde bir dosyanın konumuna atıfta bulunmak için sıklıkla kullanılır. C derleyici ve kullanıcı kullanmak için belirli bir derleyici belirtmek isteyebilir.

Yeni makrolar (veya basit "değişkenler") geleneksel olarak büyük harflerle tanımlanır:

MAKRO = tanım

Bir makro genişletilerek kullanılır. Geleneksel olarak bu, adını içine alarak yapılır. $(). (Parantezlerin çıkarılması, yazının ardından sonraki harfin yorumlanmasına yol açar. $ tüm değişken adı olarak.) Eşdeğer bir formda parantez yerine küme parantezi kullanılır, yani ${}, hangi stil kullanılır BSD'ler.

NEW_MACRO = $(MAKRO)-$(MAKRO2)

Makrolar kullanılarak kabuk komutlarından oluşabilir. komut ikamesi operatör, ile gösterilir ters vuruşlar (`).

YYYYAAGG  = ` tarih `

Tanımın içeriği "olduğu gibi" saklanır. Tembel değerlendirme kullanılır, yani makrolar normalde yalnızca genişletmeleri gerçekten gerekli olduğunda, örneğin bir kuralın komut satırlarında kullanıldığında genişletilir. Genişletilmiş bir örnek:

PAKET   = paketSÜRÜM   = ` tarih +"% Y.% m% d" `ARŞİV   = $(AMBALAJ)-$(SÜRÜM)uzak:# Kabuğun yorumlaması için yalnızca makroların genişletildiğine dikkat edin:# tar -cf paket-`tarih + "% Y% m% d" ".tartar -cf $(ARŞİV).katran .

Komut satırında makroları geçersiz kılmak için genel sözdizimi şöyledir:

Yapmak MAKRO="değer" [MAKRO="değer" ...] HEDEF [HEDEF ...]

Makefile'lar önceden tanımlanmış bir dizi dosyaya erişebilir. dahili makrolar, ile '?' ve "@" en yaygın olanıdır.

hedef: bileşen1 bileşen2# dikkat edilmesi gereken bileşenleri içerir (yani mevcut HEDEFLERDEN DAHA KÜÇÜKLER).	Eko $? #, iki nokta üst üste sol olanlar arasından geçerli HEDEF adı olarak değerlendirilir.	Eko $@

Biraz yaygın bir sözdizimi genişletmesi, +=, ?=, ve != eşittir işareti yerine. BSD üzerinde çalışır ve GNU benzer yapar.[42]

Son ek kuralları

Sonek kurallarının, formda adları olan "hedefleri" vardır .FROM.TO ve dosya uzantısına göre eylemleri başlatmak için kullanılır. Sonek kurallarının komut satırlarında, POSIX şunu belirtir:[43] iç makro $< ilk ön koşulu ifade eder ve $@ hedefi ifade eder. Herhangi bir HTML dosyasını metne dönüştüren bu örnekte, kabuk yeniden yönlendirme simgesi > komut satırının bir parçasıdır, oysa $< HTML dosyasına başvuran bir makrodur:

.SUFFIXES: .Txt .html# .Html'den .txt'ye.html.txt:vaşak -dump $ <> $@

Komut satırından çağrıldığında yukarıdaki örnek genişler.

$ make -n file.txtlynx -dump file.html> file.txt

Desen kuralları

Sonek kurallarının kendilerine ait herhangi bir ön koşulu olamaz.[44] Eğer varsa, sonek kuralları olarak değil, alışılmadık adlara sahip normal dosyalar olarak kabul edilirler. GNU Make, eski makefiles ile uyumluluk için sonek kurallarını destekler, ancak aksi takdirde desen kuralları.[45]

Bir kalıp kuralı, hedefinin tam olarak bir '%' karakteri içermesi dışında sıradan bir kurala benzer. Hedef, eşleşen dosya adları için bir kalıp olarak kabul edilir: '%', sıfır veya daha fazla karakterden oluşan herhangi bir alt dizeyle eşleşebilir,[46] diğer karakterler yalnızca kendileriyle eşleşir. Önkoşullar aynı şekilde adlarının hedef adla nasıl ilişkili olduğunu göstermek için '%' kullanır.

Yukarıdaki son ek kuralı örneği aşağıdaki kalıp kuralı gibi görünecektir:

#% .Html'den% .txt'ye%.Txt : %.html vaşak -dump $ <> $@

Diğer unsurlar

Tek çizgi yorumlar ile başladı karma simgesi (#).

Makefiles içindeki bazı yönergeler, Dahil etmek diğer makefiles.

Hat devamı ters eğik çizgi ile gösterilir \ satırın sonundaki karakter.

   hedef: bileşen  bileşen Sekme ↹komut;  Sekme ↹komut |  Sekme ↹borulu komut


Örnek makefiles

Makefile:

AMBALAJ	 = paketSÜRÜM	 = ` tarih "+% ​​Y.% m% d%" `RELEASE_DIR  = ..RELEASE_FILE = $(AMBALAJ)-$(SÜRÜM)# LOGNAME değişkeninin ortamdan geldiğine dikkat edin# POSIX kabukları.## hedef: tümü - Varsayılan hedef. Hiç birşey yapmıyor.herşey:	Eko "Merhaba $(LOGNAME), varsayılan olarak yapılacak bir şey yok "# bazen: echo "Merhaba $ {LOGNAME}, varsayılan olarak yapılacak bir şey yok"	Eko "Yardım edin" i deneyin "# target: help - Çağrılabilir hedefleri görüntüleyin.Yardım:egrep "^ # hedef:" [Mm]akefile# target: list - Kaynak dosyaları listelerliste:# Çalışmayacak. Her komut ayrı bir kabuktadır	CD src ls# Doğru, aynı kabuğun devamı	CD src; \ls# target: dist - Yayın yapın.uzak:tar -cf $(RELEASE_DIR)/$(RELEASE_FILE) && \gzip -9 $(RELEASE_DIR)/$(RELEASE_FILE).katran

Aşağıda, varsayılan olarak ("tümü" kuralı ilk sırada listelenmiştir) sistemin C derleyicisini kullanarak "helloworld.c" adlı bir kaynak dosyası derleyen ve ayrıca kullanıcının oluşturduğu dosyaları kaldırmak için "temiz" bir hedef sağlayan çok basit bir makefile bulunmaktadır. yeniden başlamak istiyor. $@ ve $< iki sözde dahili makrolardır (otomatik değişkenler olarak da bilinir) ve sırasıyla hedef adı ve "örtük" kaynağı temsil eder. Aşağıdaki örnekte, $^ ön koşulların boşlukla sınırlandırılmış bir listesine genişler. Bir dizi başka dahili makro vardır.[43][47]

CFLAGS ?= -gherşey: Selam DünyaSelam Dünya: Selam Dünya.Ö# Komutlar boşluklarla değil TAB ile başlar	$(CC) $(LDFLAGS)$@ $^helloworld.o: Selam Dünya.c	$(CC) $(CFLAGS) -c -o $@ $<temiz: FRCrm -f helloworld helloworld.o# Bu sözde hedef, FRC'ye bağlı tüm hedeflere neden olur# hedefin adını taşıyan bir dosya olması durumunda bile yeniden oluşturulacak.# Bu, aşağıdaki varsayım altında herhangi bir make uygulamasıyla çalışır:# geçerli dizinde FRC dosyası yok.FRC:

Çoğu sistem, dosya sonekine göre derleme gibi ortak görevleri belirtmek için önceden tanımlanmış Yap kuralları ve makrolarla birlikte gelir. Bu, kullanıcıların hedefin kaynak (lar) dan nasıl oluşturulacağına dair gerçek (genellikle taşınamayan) talimatları atlamasını sağlar. Böyle bir sistemde yukarıdaki makefile aşağıdaki gibi değiştirilebilir:

herşey: Selam DünyaSelam Dünya: Selam Dünya.Ö	$(CC) $(CFLAGS) $(LDFLAGS)$@ $^temiz: FRCrm -f helloworld helloworld.o# Bu, açık bir sonek kuralıdır. Sistemlerde ihmal edilebilir# bunun gibi basit kuralları otomatik olarak işleyen..c.o:	$(CC) $(CFLAGS) -c $ <FRC:.SUFFIXES: .c


Bu "helloworld.o", "helloworld.c" ye bağlıdır, artık Make tarafından otomatik olarak ele alınmaktadır. Burada gösterilen gibi basit bir örnekte bunun pek önemi yoktur, ancak sonek kurallarının gerçek gücü, bir yazılım projesindeki kaynak dosyaların sayısı artmaya başladığında ortaya çıkar. Birinin yalnızca bağlama adımı için bir kural yazması ve nesne dosyalarını önkoşul olarak bildirmesi gerekir. Make daha sonra tüm nesne dosyalarının nasıl yapılacağını ve tüm kaynak dosyalardaki değişiklikleri nasıl arayacağını dolaylı olarak belirleyecektir.

Basit sonek kuralları, kaynak dosyalar birbirine ve başlık dosyaları gibi diğer dosyalara bağlı olmadığı sürece iyi çalışır. Derleme sürecini basitleştirmenin başka bir yolu, derleyici destekli bağımlılık oluşturma ile birleştirilebilen sözde kalıp eşleştirme kurallarını kullanmaktır. Gcc derleyicisini ve GNU Make'i gerektiren son bir örnek olarak, burada bir klasördeki tüm C dosyalarını ilgili nesne dosyalarına derleyen ve ardından bunları son yürütülebilir dosyaya bağlayan genel bir makefile var. Derleme gerçekleşmeden önce, bağımlılıklar makefile-dostu formatta ".depend" gizli bir dosyada toplanır ve daha sonra makefile'a eklenir. Taşınabilir programlar aşağıda kullanılan yapılardan kaçınmalıdır.

# Genel GNUMakefile# Diğer make (1) komutları altında çalışmayı durdurmak için sadece bir pasaj# bu satırları anlamayanifneq (,)Bu makefile gerektirir GNU Yapmak.endifPROGRAM = fooC_FILES := $(joker karakter * .c)OBJS := $(patsubst% .c,% .o, $(C_FILES))CC = ccCFLAGS = -Duvar -pedantikLDFLAGS =LDLIBS = -lmherşey: $(PROGRAM)$ (PROGRAM): .bağımlı $(OBJS)	$(CC) $(CFLAGS) $(OBJS) $(LDFLAGS)$(PROGRAM) $(LDLIBS)bağımlı: .bağımlı.bağımlı: cmd = gcc -MM -MF bağımlı $(var); kedi bağımlı >> .bağımlı;.bağımlı:@Eko "Bağımlılıklar oluşturuluyor ..."	@$(foreach var, $(C_FILES), $(cmd))@rm -f bağlıdır-include .depend# Bunlar desen eşleştirme kurallarıdır. Otomatiğe ek olarakBurada kullanılan # değişken,% ne anlama geliyorsa onunla eşleşen $ * değişkeni# özel durumlarda yararlı olabilir.%.Ö: %.c	$(CC) $(CFLAGS) -c $ <-o $@%: %.Ö	$(CC) $(CFLAGS)$@ $<temiz:rm -f .depend $(OBJS).SAHTE: temiz bağımlı

Ayrıca bakınız

Referanslar

  1. ^ a b Thompson, T. J. (Kasım 1980). "Tasarımcının Tezgahı: Bir Üretim Ortamı Sağlamak". Bell Sistemi Teknik Dergisi. 59 (9): 1811–1825. doi:10.1002 / j.1538-7305.1980.tb03063.x. S2CID  27213583. DWB'nin genel bakımında, Kaynak Kod Kontrol Sistemini kullandık ve PWB / UNIX * etkileşimli işletim sistemi tarafından sağlanan yardımcı programı yaptık.
  2. ^ "V7 / usr / src / cmd / make / ident.c". tuhs.org. 1 Eylül 2013. Arşivlenen orijinal 1 Eylül 2013 tarihinde. Alındı 18 Mart 2018.
  3. ^ Feldman, S. I. (Nisan 1979). "Bilgisayar Programlarının Bakımını Yapmak İçin Bir Program Yapın". Yazılım: Uygulama ve Deneyim. 9 (4): 255–265. CiteSeerX  10.1.1.39.7058. doi:10.1002 / spe.4380090402.
  4. ^ Matthew Doar (2005). Pratik Geliştirme Ortamları. O'Reilly Media. s. 94. ISBN  978-0-596-00796-6.
  5. ^ "Google Toplulukları". arquivo.pt. 22 Ocak 2011 tarihinde kaynağından arşivlendi. Alındı 18 Mart 2018.CS1 bakimi: BOT: orijinal url durumu bilinmiyor (bağlantı)
  6. ^ "İki'de OpenSolaris (Jim Grisanzio)". 12 Aralık 2013. Arşivlenen orijinal 12 Aralık 2013 tarihinde. Alındı 18 Mart 2018.
  7. ^ Grisanzio, Jim. OpenSolaris Hikayesi.
  8. ^ a b c "Geliştirme / Gbuild - Belge Vakfı Wiki". wiki.documentfoundation.org. Alındı 18 Mart 2018.
  9. ^ a b "Apache OpenOffice Yapı Kılavuzu - Apache OpenOffice Wiki". wiki.openoffice.org. Alındı 18 Mart 2018.
  10. ^ FreeBSD 2.0.5 Kaynak Kodu Yap, 1993
  11. ^ a b https://www.freebsd.org/cgi/man.cgi?query=bmake&sektion=1
  12. ^ https://manpages.debian.org/jessie/freebsd-buildutils/fmake.1
  13. ^ "Yapmak". NetBSD Kılavuz Sayfaları. Alındı 9 Temmuz 2020.
  14. ^ "make (1) - OpenBSD kılavuz sayfaları". man.openbsd.org. Alındı 18 Mart 2018.
  15. ^ "Yapmak". FreeBSD. Alındı 9 Temmuz 2020. Makefile dahil etme, koşullu yapılar ve C programlama dilini andıran döngüler make'de sağlanmıştır.
  16. ^ Arnold Robbins (2005), Özetle Unix, Dördüncü Baskı, O'Reilly
  17. ^ "8. Metni Dönüştürme İşlevleri", GNU yapımı, Özgür Yazılım Vakfı, 2013
  18. ^ "8.5 foreach İşlevi", GNU yapımı, Özgür Yazılım Vakfı, 2013
  19. ^ "GCC 3.4 Sürüm Serisi Değişiklikleri, Yeni Özellikler ve Düzeltmeler". Özgür Yazılım Vakfı. 2006.
  20. ^ Javier Martinez Canillas (26 Aralık 2012). "Kbuild: Linux Kernel Build System". Linux Journal.
  21. ^ Greg Kroah-Hartman (2006), Özetle Linux Kernel, O'Reilly
  22. ^ "Derleme Talimatları".
  23. ^ Rocky Bernstein. "Yeniden Yap - Anlaşılır izleme ve hata ayıklayıcı ile GNU Make".
  24. ^ Glenn Fowler (4 Ocak 2012). "nmake Genel Bakış". Bilgi ve Yazılım Sistemleri Araştırması, AT&T Labs Research. Arşivlenen orijinal 2 Eylül 2015. Alındı 26 Mayıs 2014.
  25. ^ "NMAKE Başvurusu Visual Studio 2015". Microsoft. 2015.
  26. ^ "Makefile Preprocessing Direktifleri". 2014.
  27. ^ "Makefile Önişleme Operatörleri". Microsoft. 2014.
  28. ^ "Kurallarda Arama Yolları". Microsoft. 2014.
  29. ^ "YAPMAK". CodeGear (TM). 2008.
  30. ^ McIlroy, M. D. (1987). Bir Araştırma Unix okuyucusu: Programcı El Kitabı, 1971–1986'dan açıklamalı alıntılar (PDF) (Teknik rapor). Bell Laboratuvarları. CSTR 139.
  31. ^ Hume, Andrew G .; Flandrena Bob (2002). "Mk ile Plan 9'daki dosyaların bakımı". Plan 9 Programcı Kılavuzu. AT&T Bell Laboratuvarları. Arşivlendi 11 Temmuz 2015 tarihinde orjinalinden.
  32. ^ "google / kati: Deneysel bir GNU yapımı klonu". GitHub. 30 Kasım 2020.
  33. ^ "GNU 'make'". Özgür Yazılım Vakfı.
  34. ^ "Makepp".
  35. ^ "Ücretsiz BSD yapımı".
  36. ^ Linux ls komut dosyası çıktısı nasıl sıralanır Arşivlendi 13 Eylül 2016, Wayback Makinesi
  37. ^ dsls'ye genel bakış Arşivlendi 23 Ekim 2007, Wayback Makinesi, 2007/02/27, phoenix wiki
  38. ^ Re: Koreografi ve REST Arşivlendi 12 Eylül 2016, Wayback Makinesi, Christopher B Ferris'ten 2002-08-09'da
  39. ^ Junior Makefiles'ı Hedefle Arşivlendi 7 Ocak 2010, Wayback Makinesi, Andrew W. Fitzgibbon ve William A. Hoffman
  40. ^ a b "Bölüm 15. Araçlar: Yap: Tariflerinizi Otomatik Hale Getirme", Unix Programlama Sanatı, Eric S. Raymond 2003
  41. ^ Yapmak - Komutlar ve Yardımcı Programlar Referansı, Tek UNIX Spesifikasyonu, Sayı 7 Açık Grup
  42. ^ yapmak (1) – FreeBSD Genel Komutlar Manuel
  43. ^ a b "Yapmak". www.opengroup.org. Alındı 18 Mart 2018.
  44. ^ "GNU make manual: sonek kuralları". Özgür Yazılım Vakfı.
  45. ^ "GNU make manual: şablon kuralları". Özgür Yazılım Vakfı.
  46. ^ Bölüme bakın Desen Eşleştirme Kuralları SunPro kılavuz sayfasında Arşivlendi 29 Mayıs 2014, Wayback Makinesi
  47. ^ Otomatik Değişkenler Arşivlendi 25 Nisan 2016, Wayback Makinesi GNU "make"

Dış bağlantılar