Seorang pekerja Red Hat membentangkan sistem pemasangan Matlamat. Keluaran GNU Make 4.2

Richard WM Jones, pengarang libguestfs, bekerja di Red Hat, diperkenalkan utiliti pemasangan baru Anda, bertujuan untuk menghapuskan kekurangan dan masalah dalam utiliti pembuatan sambil mengekalkan kesederhanaan dan kefahaman keseluruhan skrip. Utiliti make telah direka pada tahun 1976 dan mempunyai beberapa kelemahan konseptual Matlamat merancang untuk menghapuskan kekurangan ini tanpa mengubah konsep umum.
Kod sumber matlamat diedarkan oleh dilesenkan di bawah GPLv2+.

Masalah yang boleh diselesaikan:

  • Sokongan untuk hanya satu taktik penyelesaian pergantungan - "arahan pemasangan dijalankan jika fail sasaran hilang atau lebih tua daripada salah satu kebergantungan." Matlamat merancang untuk melaksanakan taktik lain, seperti menyemak kehadiran URL, membandingkan masa pengubahsuaian dengan mana-mana fail, menilai pakej binaan kōji, perbandingan jumlah semak, menjalankan kes ujian dengan melangkau ujian terpilih.
  • Apabila memproses sasaran binaan, buat tidak memisahkan fail dan nama peraturan, dan akibatnya, tiada semakan bahawa semasa menjalankan peraturan, fail yang didakwa dicipta akan benar-benar dibuat. Sebagai contoh, jika anda mempunyai peraturan yang dipanggil "ujian" yang menjalankan skrip dengan ujian, fail bernama "ujian" dibuat secara tidak sengaja, maka ujian tidak akan dipanggil lagi, kerana make akan menganggap bahawa sasaran telah dibina dan tidak memerlukan sebarang tindakan (untuk mengatasi masalah dalam make, anda boleh menentukan arahan ".PHONY: test"). Matlamat memisahkan fail dan nama peraturan secara eksplisit.

    Seorang pekerja Red Hat membentangkan sistem pemasangan Matlamat. Keluaran GNU Make 4.2

  • Masalah dengan menyediakan hanya satu parameter untuk arahan pemasangan.

    Seorang pekerja Red Hat membentangkan sistem pemasangan Matlamat. Keluaran GNU Make 4.2

    Matlamat membolehkan anda menggunakan bilangan parameter yang dinamakan sewenang-wenangnya. Sebagai contoh, anda boleh mengekstrak secara berasingan tanda fail nyahpepijat daripada nama:

    Seorang pekerja Red Hat membentangkan sistem pemasangan Matlamat. Keluaran GNU Make 4.2

  • Masalah berinteraksi dengan penterjemah shell. Sebagai contoh, keperluan untuk mengawal pelepasan ruang dalam nama fail dan direktori, pembaziran sumber untuk melancarkan penterjemah shell berasingan apabila melaksanakan setiap arahan, tafsiran berganda bagi aksara "$" (digunakan dalam kedua-dua shell dan make), mengambil kira lekukan.

    Masalah ini diselesaikan dalam Matlamat dengan menggunakan simbol "%" dan bukannya "$" untuk pembolehubah pemasangan ("$" kekal hanya untuk cangkerang), menggunakan penghurai LALR(1), yang memerlukan anda mengelilingi laluan dan nama fail dengan petikan dan menyerlahkan blok kod dengan pendakap kerinting. Seluruh blok arahan dilancarkan dalam satu contoh shell arahan, dan dalam blok, pemformatan kod sewenang-wenangnya dibenarkan, tanpa merujuk kepada ruang khas.

    Adakah:
    sasaran: foo.o bar.o
    ${CC} ${CFLAGS} $< -o $@

    menjadi:
    "target": "foo.o", "bar.o" {
    %CC %CFLAGS %< -o %@
    }

Ciri-ciri lain Matlamat:

  • Sokongan pilihan untuk menentukan nama dan parameter sewenang-wenangnya:

    matlamat semua = : "sasaran"

    pautan matlamat =
    "target" : "foo.o", "bar.o" { ... }

    penyusunan matlamat (nama) =
    "%name.o" : "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • Dua mod pelancaran: buat mod untuk memadankan sasaran binaan dengan nama fail (contohnya, fail "foo.o" sepadan dengan sasaran "%name.o") dan mod kompilasi langsung:

    matlamat semua = : pautan

    pautan matlamat =
    "target" : "foo.o", susun ("bar") { ... }

    penyusunan matlamat (nama) =
    "%name.o" : "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • Taktik perhimpunan ditentukan oleh peraturan khas yang boleh digunakan untuk menentukan keperluan untuk memasang semula sasaran perhimpunan. Jika pautan dibuat kepada kehadiran fail, maka ini ditentukan secara jelas melalui tanda yang sepadan (β€œsasaran” untuk nama peraturan dan *fail (β€œsasaran”) untuk menyemak fail).

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

    *fail("sasaran") : *fail("foo.o"), *fail("bar.o") { ... }

  • Pembangun boleh menentukan atribut arbitrari taktik pemasangan. Bendera "*fail" ditakrifkan secara lalai (@{...} menunjukkan penindasan output dan "keluar 99" menandakan keperluan untuk membina semula):

    taktik *fail (nama fail) = @{
    ujian -f %nama fail || keluar 99
    untuk f dalam %

    Sumber: opennet.ru

Tambah komen