Seorang karyawan Red Hat mempresentasikan sistem perakitan Goals. Rilis GNU Make 4.2

Richard WM Jones, penulis libguestfs, bekerja di Red Hat, diperkenalkan utilitas perakitan baru Anda, bertujuan untuk menghilangkan kekurangan dan masalah dalam kegunaan make sambil menjaga kesederhanaan dan pemahaman skrip secara keseluruhan. Utilitas make dirancang pada tahun 1976 dan memiliki sejumlah kekurangan konseptual. Tujuan berencana untuk menghilangkan kekurangan ini tanpa mengubah konsep umum.
Kode sumber tujuan didistribusikan oleh berlisensi di bawah GPLv2+.

Masalah yang bisa dipecahkan:

  • Dukungan hanya untuk satu taktik resolusi ketergantungan - “instruksi perakitan dijalankan jika file target hilang atau lebih tua dari salah satu dependensi.” Sasaran berencana menerapkan taktik lain, seperti memeriksa keberadaan URL, membandingkan waktu modifikasi dengan file apa pun, mengevaluasi paket bawaan koji, perbandingan checksum, menjalankan kasus uji dengan melewatkan tes secara selektif.
  • Saat memproses target build, make tidak memisahkan file dan nama aturan, dan akibatnya, tidak ada pemeriksaan bahwa saat menjalankan aturan, file yang diklaim dibuat akan benar-benar dibuat. Misalnya, jika Anda memiliki aturan bernama "test" yang menjalankan skrip dengan pengujian, file bernama "test" dibuat secara tidak sengaja, maka pengujian tidak akan dipanggil lagi, karena make akan menganggap bahwa target telah dibuat dan tidak memerlukan tindakan apa pun (untuk mengatasi masalah yang sedang dibuat, Anda dapat menentukan direktif “.PHONY: test”). Sasaran secara eksplisit memisahkan file dan nama aturan.

    Seorang karyawan Red Hat mempresentasikan sistem perakitan Goals. Rilis GNU Make 4.2

  • Masalah dengan hanya menyediakan satu parameter untuk instruksi perakitan.

    Seorang karyawan Red Hat mempresentasikan sistem perakitan Goals. Rilis GNU Make 4.2

    Sasaran memungkinkan Anda menggunakan sejumlah parameter bernama. Misalnya, Anda dapat mengekstrak secara terpisah tanda file debug dari nama:

    Seorang karyawan Red Hat mempresentasikan sistem perakitan Goals. Rilis GNU Make 4.2

  • Masalah saat berinteraksi dengan juru bahasa shell. Misalnya, kebutuhan untuk mengontrol keluarnya spasi pada nama file dan direktori, pemborosan sumber daya untuk meluncurkan penerjemah shell terpisah saat menjalankan setiap perintah, interpretasi ganda dari karakter “$” (digunakan pada shell dan make), dengan mempertimbangkan lekukan.

    Masalah-masalah ini diselesaikan di Goals dengan menggunakan simbol “%” alih-alih “$” untuk variabel perakitan (“$” tetap hanya untuk shell), menggunakan parser LALR(1), yang mengharuskan Anda mengapit jalur dan nama file dengan tanda kutip dan menyorot blok kode dengan kurung kurawal. Seluruh blok perintah diluncurkan dalam satu contoh shell perintah, dan di dalam blok tersebut, pemformatan kode arbitrer diperbolehkan, tanpa mengacu pada spasi khusus.

    Dulu:
    target: foo.o bar.o
    ${CC} ${CFLAGS} $< -o $@

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

Fitur lain dari Sasaran:

  • Dukungan opsional untuk menentukan nama dan parameter arbitrer:

    sasaran semua = : "target"

    tautan tujuan =
    "target" : "foo.o", "bar.o" { ... }

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

  • Dua mode peluncuran: mode make untuk mencocokkan target build dengan nama file (misalnya, file "foo.o" cocok dengan target "%name.o"), dan mode kompilasi langsung:

    tujuan semua = : tautan

    tautan tujuan =
    "target" : "foo.o", kompilasi ("bar") { ... }

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

  • Taktik perakitan ditentukan oleh aturan khusus yang dapat digunakan untuk menentukan perlunya merakit kembali target perakitan. Jika tautan dibuat ke keberadaan suatu file, maka ini ditentukan secara eksplisit melalui tanda yang sesuai (“target” untuk nama aturan dan *file (“target”) untuk memeriksa file).

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

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

  • Pengembang dapat menentukan atribut sewenang-wenang dari taktik perakitan. Flag "*file" didefinisikan secara default (@{...} menunjukkan penekanan output, dan "exit 99" menandakan perlunya pembangunan kembali):

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

    Sumber: opennet.ru

Tambah komentar