Neden bir kabuk komut dosyası üzerinden make kullanmalı?


129

Make bana, komut satırı argümanlarının biraz daha kolay işlendiği bir kabuk betiği gibi görünüyor.

./Make.sh yerine make çalıştırmak neden standart?


ters soru için: neden kabuk betiğini over make kullanmalısınız (komut satırı argümanlarının görünürde daha kolay işlenmesinden dolayı), özellikle sistem yöneticisi görevleri için burayı okuyun: unix.stackexchange.com/a/497601/1170
lesmana

Yanıtlar:


126

Genel fikir, make(makul olarak) minimum yeniden yapılandırmaları desteklemektir - yani, programınızın hangi bölümlerinin diğer bölümlere bağlı olduğunu söylersiniz. Programın bir bölümünü güncellediğinizde, yalnızca buna bağlı olan parçaları yeniden oluşturur. Bunu bir kabuk betiği ile yapabilseniz de, çok daha fazla iş olacaktır (tüm dosyalardaki son değiştirilmiş tarihleri ​​açıkça kontrol etmek, vb.) Bir kabuk betiğinin tek bariz alternatifi, her seferinde her şeyi yeniden oluşturmaktır. Küçük projeler için bu tamamen makul bir yaklaşımdır, ancak büyük bir proje için tam bir yeniden inşa işlemi kolayca bir saat veya daha fazla sürebilir - kullanarak make, aynı şeyi bir veya iki dakika içinde kolayca başarabilirsiniz ...

Muhtemelen, en azından genel olarak benzer yeteneklere sahip olan birkaç alternatif olduğunu da eklemeliyim. Özellikle büyük bir projede yalnızca birkaç dosyanın yeniden oluşturulduğu durumlarda, bazıları (örneğin Ninja ) genellikle yapmaktan çok daha hızlıdır.


67

Make uzman bir sistemdir

Kabuk komut dosyalarıyla yapılması zor olan çeşitli şeyler vardır ...

  • Tabii ki, sadece inşa etmesi gerekenleri inşa etmek için neyin güncel olmadığını kontrol eder.
  • Bu bir gerçekleştirir topolojik sıralama veya her önkoşul her bağımlılık önce inşa edilmiş ve sadece bir kez inşa edilmiştir, öyle ki dışarı güncel şeyler inşa ne ve hangi sırayla bağlıdır belirler ağaç analizinin diğer bazı tür.
  • Bildirimsel programlama için bir dildir . Yeni öğeler, zorunlu bir kontrol akışında birleştirilmelerine gerek kalmadan eklenebilir.
  • Kuralları, kalıpları ve tarihleri ​​işlemek için bir çıkarım motoru içerir ve bu, kendi Makefile dosyanızdaki kurallarla birleştirildiğinde, uzman bir sisteme dönüşen şeydir .
  • Makro işlemciye sahiptir.
  • Ayrıca bakınız: make'in daha önceki bir özeti .

2
Yine de uzman bir sistem olarak oldukça sınırlıdır. Örneğin, her çıkarım aynı kuralı yalnızca bir kez kullanabilir.
reinierpost

1
2. maddeyi daha meslekten olmayan mühendislik terimleriyle detaylandırmak gerekirse, bir kabuk betiği doğrusal bir sıralama uygularken, bir makefile ağaç gibidir. Gereksiz kronolojik bağımlılıkları ortadan kaldırır (pratikte make işlemi doğrusal olarak yürütülecek olsa da).
Sridhar Sarnobat

2
... Kabuk betikleri üzerinde Makefiles ile ilgili sorunun javascript üzerinden CSS sorununa benzer olduğunu düşünüyorum. Her bir düğümün hangi kronolojik sırada çalıştırılacağı neredeyse açık değil. En azından Makefiles ile gerçek kabuk komutunu görmeye devam edeceksiniz. CSS ile bu bile soyutlanmıştır.
Sridhar Sarnobat

Biri onları açıklığa kavuşturursa takdir ettiğim birkaç yorumum var. 1 / Topolojik sıralama artımlı yapının nasıl uygulandığı anlamında, ilk ve iki noktanız birbiriyle ilişkili değil mi? 2 / İşlev kompozisyonu kullanılarak uygulanan 3 numarayı da işaret edemez misiniz? 3 / MakeFile son kullanıcısı için 4 ve 5'in avantajları ve bu avantajların neden birlikte kabuk komutları oluşturarak uygulanamayacağı hakkında daha fazla bilgi edinmek istiyorum
Amine Hajyoussef

Bir Uzman Sistem olarak tanımlanan Make ile ilk kez karşılaşıyorum. Uzman sistemler kuran biri olarak, bu düşündüğüm bir şey değil. Make açıkça, makefile'da belirtilen bildirimsel kurallar aracılığıyla programınızı nasıl inşa edeceğinizi anlamak için bir çıkarım motoruna sahiptir, ancak (yaprak) kuralları gerçeklerden ziyade yürütülecek kabuk komutları olduğundan, bunun bilgi tabanlı bir sistem olduğu daha az açıktır. Ve "uzman sistem" terimi, dünya çapında bir uzmanın uzmanlığını başarıyla yakalayan bir sistemi ifade etmek için kullanılır, ki durum böyle değil. Jüri hala benim için dışarıda.
Dennis

9

Make, kaynak dosyalarınızda değişiklik yaptığınızda yalnızca gerekli dosyaların yeniden derlenmesini sağlar.

Örneğin:

final : 1.o 2.o
    gcc -o final 1.o 2.o

1.o : 1.c 2.h
    gcc -c 1.c

2.o : 2.c 2.h
    gcc -c 2.c

2.hYalnızca dosyayı değiştirir ve çalıştırırsam make, 3 komutu da ters sırada yürütür.

1.cYalnızca dosyayı değiştirir ve çalıştırırsam make, yalnızca ilk 2 komutu ters sırada yürütür.

Bunu kendi kabuk betiğinizle başarmaya çalışmak çok fazla if/elsekontrol gerektirecektir .


veya bunun gibi bir şeyi rsync -r -c -I $SOURCE $DEST_DIRkabukta kullanın.
Spartacus9

9

Yukarıdakilerin yanı sıra, Make bildirim temelli (-ish) bir paralel programlama dilidir.

Diyelim ki dönüştürülecek 4.000 grafik dosyanız ve 4 CPU'nuz var. CPU'larınızı doyururken güvenilir bir şekilde yapacak 10 satırlık bir kabuk betiği yazmayı deneyin (burada cömert davranıyorum).

Belki de asıl soru, insanların neden kabuk komut dosyaları yazmakla uğraştıklarıdır.


1
Evet, toplam doğrusal sıralamayı daha ağaç benzeri bir sıralamaya doğru gevşetiyorsunuz.
Sridhar Sarnobat

4

tutamaç bağımlılıkları yap: makefile bunları açıklar: ikili dosya, nesne dosyalarına bağlıdır, her nesne dosyası bir kaynak dosyaya ve başlıklara bağlıdır ... make çalıştırıldığında, nelerin yeniden derlenmesi gerektiğini belirlemek için dosyaların tarihi karşılaştırılır .

Makefile'da açıklanan her şeyi oluşturmamak için doğrudan bir hedef çağırılabilir.

Üstelik make sözdizimi ikame sağlar, vpath

Bunların hepsi, zaten sahip olduğunuz make ile kabuk betiklerinde yazılabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.