Bir Red Hat çalışanı, Hedefler montaj sistemini tanıttı. GNU Make 4.2'nin Sürümü

Richard WM Jones, yazar libguestfsRed Hat'ta çalışıyor gönderilen yeni montaj yardımcı programı Goller, komut dosyalarının genel basitliğini ve anlaşılırlığını korurken, markanın kullanışlılığındaki eksiklikleri ve sorunları ortadan kaldırmayı amaçladı. Make yardımcı programı 1976 yılında tasarlandı ve bir takım kavramsal eksikliklere sahip; Goals, genel konsepti değiştirmeden bu eksiklikleri gidermeyi planlıyor.
Hedeflerin kaynak kodu tarafından dağıtıldı GPLv2+ kapsamında lisanslanmıştır.

Çözülmesi gereken sorunlar:

  • Yalnızca bir bağımlılık çözümleme taktiği desteği - "hedef dosya eksikse veya bağımlılıklardan birinden daha eskiyse derleme talimatı çalıştırılır." Goals, bir URL'nin varlığını kontrol etmek, değişiklik zamanlarını herhangi bir dosyayla karşılaştırmak, paket yapısını değerlendirmek gibi diğer taktikleri uygulamayı planlıyor Koji, sağlama toplamlarının karşılaştırılması, test senaryolarının seçici olarak test atlanmasıyla çalıştırılması.
  • Derleme hedeflerini işlerken make, dosyaları ve kural adlarını ayırmaz ve sonuç olarak, bir kural çalıştırılırken oluşturulduğunu iddia ettiği dosyanın gerçekten oluşturulup oluşturulmayacağına dair bir kontrol yoktur. Örneğin, testlerle birlikte komut dosyaları çalıştıran "test" adlı bir kuralınız varsa, yanlışlıkla "test" adlı bir dosya oluşturulursa make, hedefin oluşturulduğunu ve test gerektirmediğini dikkate alacağından testler artık çağrılmaz. herhangi bir eylem (make'deki sorunu çözmek için “.PHONY: test” yönergesini belirtebilirsiniz). Hedefler, dosyaları ve kural adlarını açıkça ayırır.

    Bir Red Hat çalışanı, Hedefler montaj sistemini tanıttı. GNU Make 4.2'nin Sürümü

  • Montaj talimatları için yalnızca bir parametre sağlama sorunu.

    Bir Red Hat çalışanı, Hedefler montaj sistemini tanıttı. GNU Make 4.2'nin Sürümü

    Hedefler, isteğe bağlı sayıda adlandırılmış parametre kullanmanıza olanak tanır. Örneğin, bir hata ayıklama dosyasının işaretini addan ayrı olarak çıkarabilirsiniz:

    Bir Red Hat çalışanı, Hedefler montaj sistemini tanıttı. GNU Make 4.2'nin Sürümü

  • Kabuk yorumlayıcısıyla etkileşimde sorunlar. Örneğin, dosya ve dizin adlarındaki boşlukların kontrol edilmesi ihtiyacı, her komut çalıştırılırken ayrı bir kabuk yorumlayıcısının başlatılmasıyla kaynak israfı, "$" karakterinin çift yorumlanması (hem kabukta hem de make'de kullanılır), girintileri dikkate alarak.

    Bu sorunlar, Hedefler'de, derleme değişkenleri için "$" yerine "%" simgesinin kullanılmasıyla ("$" yalnızca kabuk için kalır), bir ayrıştırıcı kullanılarak çözülür. LALR(1)yolları ve dosya adlarını tırnak işaretleri içine almanızı ve kod bloklarını küme parantezleriyle vurgulamanızı gerektirir. Komut bloğunun tamamı, komut kabuğunun bir örneğinde başlatılır ve blok içinde, özel boşluklara atıfta bulunulmadan isteğe bağlı kod biçimlendirmesine izin verilir.

    Oldu:
    hedef: foo.o bar.o
    ${CC} ${CFLAGS} $< -o $@

    Sonra:
    "hedef": "foo.o", "bar.o" {
    %CC %CFLAGS %< -o %@
    }

Hedeflerin diğer özellikleri:

  • İsteğe bağlı ad ve parametrelerin belirlenmesi için isteğe bağlı destek:

    tüm hedefler = : "hedef"

    hedef bağlantısı =
    "hedef" : "foo.o", "bar.o" { ... }

    hedef derlemesi (isim) =
    "%name.o" : "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • İki başlatma modu: derleme hedeflerini dosya adlarıyla eşleştirmek için yapma modu (örneğin, "foo.o" dosyası "%name.o" hedefiyle eşleşir) ve doğrudan derleme modu:

    tüm hedef = : bağlantı

    hedef bağlantısı =
    "hedef" : "foo.o", derleme ("bar") { ... }

    hedef derlemesi (isim) =
    "%name.o" : "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • Montaj taktikleri, bir toplanma hedefinin yeniden bir araya getirilmesi ihtiyacını belirlemek için kullanılabilecek özel kurallarla belirlenir. Bir dosyanın varlığına bir bağlantı yapılırsa, bu, ilgili işaret (kural adı için "hedef") ve dosyayı kontrol etmek için *dosya ("hedef") aracılığıyla açıkça belirlenir.

    "hedef" : "foo.o", "bar.o" { ... }

    *file("hedef") : *file("foo.o"), *file("bar.o") { ... }

  • Geliştirici montaj taktiklerinin keyfi niteliklerini tanımlayabilir. "*file" bayrağı varsayılan olarak tanımlanır (@{...} çıktının bastırıldığını belirtir ve "exit 99" yeniden oluşturma ihtiyacını belirtir):

    taktik *dosya (dosya adı) = @{
    test -f %dosyaadı || çıkış 99
    % olarak f için

    Kaynak: opennet.ru

Yorum ekle