Một nhân viên của Red Hat trình bày hệ thống lắp ráp Mục tiêu. Phát hành GNU Make 4.2

Richard WM Jones, tác giả libguestfs, làm việc tại Red Hat, giới thiệu tiện ích lắp ráp mới Các mục tiêu, nhằm mục đích loại bỏ những thiếu sót và vấn đề trong tiện ích của make trong khi vẫn duy trì tính đơn giản và dễ hiểu tổng thể của tập lệnh. Tiện ích này được thiết kế vào năm 1976 và có một số thiếu sót về mặt khái niệm; Mục tiêu có kế hoạch loại bỏ những thiếu sót này mà không thay đổi khái niệm chung.
Mã nguồn mục tiêu phân phối bởi được cấp phép theo GPLv2+.

Giải quyết vấn đề:

  • Chỉ hỗ trợ một chiến thuật giải quyết phần phụ thuộc - "lệnh lắp ráp được chạy nếu tệp đích bị thiếu hoặc cũ hơn một trong các phần phụ thuộc." Mục tiêu có kế hoạch triển khai các chiến thuật khác, chẳng hạn như kiểm tra sự hiện diện của URL, so sánh thời gian sửa đổi với bất kỳ tệp nào, đánh giá bản dựng gói Cái nào, so sánh tổng kiểm tra, chạy các trường hợp kiểm thử với việc bỏ qua kiểm thử có chọn lọc.
  • Khi xử lý mục tiêu xây dựng, make không phân tách các tệp và tên quy tắc và kết quả là không có sự kiểm tra nào khi chạy quy tắc, tệp mà nó tuyên bố là đã tạo sẽ thực sự được tạo. Ví dụ: nếu bạn có một quy tắc tên là "kiểm tra" chạy các tập lệnh có kiểm tra, một tệp có tên "kiểm tra" vô tình được tạo, thì các kiểm tra sẽ không còn được gọi nữa, vì make sẽ coi rằng mục tiêu đã được xây dựng và không yêu cầu bất kỳ hành động nào (để giải quyết vấn đề đang xảy ra, bạn có thể chỉ định lệnh “.PHONY: test”). Mục tiêu phân tách rõ ràng các tệp và tên quy tắc.

    Một nhân viên của Red Hat trình bày hệ thống lắp ráp Mục tiêu. Phát hành GNU Make 4.2

  • Sự cố khi chỉ cung cấp một tham số cho hướng dẫn lắp ráp.

    Một nhân viên của Red Hat trình bày hệ thống lắp ráp Mục tiêu. Phát hành GNU Make 4.2

    Mục tiêu cho phép bạn sử dụng số lượng tham số được đặt tên tùy ý. Ví dụ: bạn có thể trích xuất riêng dấu hiệu của tệp gỡ lỗi từ tên:

    Một nhân viên của Red Hat trình bày hệ thống lắp ráp Mục tiêu. Phát hành GNU Make 4.2

  • Sự cố khi tương tác với trình thông dịch shell. Ví dụ: nhu cầu kiểm soát việc thoát khoảng trắng trong tên tệp và thư mục, lãng phí tài nguyên khi khởi chạy trình thông dịch shell riêng khi thực thi từng lệnh, diễn giải kép của ký tự “$” (được sử dụng trong cả shell và make), có tính đến các vết lõm.

    Những vấn đề này được giải quyết trong Mục tiêu bằng cách sử dụng ký hiệu “%” thay vì “$” cho các biến tập hợp (“$” chỉ còn lại cho shell), sử dụng trình phân tích cú pháp LALR(1), yêu cầu bạn bao quanh các đường dẫn và tên tệp bằng dấu ngoặc kép và đánh dấu các khối mã bằng dấu ngoặc nhọn. Toàn bộ khối lệnh được khởi chạy trong một phiên bản của shell lệnh và trong khối, cho phép định dạng mã tùy ý mà không cần tham chiếu đến các khoảng trắng đặc biệt.

    Đó là:
    mục tiêu: foo.o bar.o
    ${CC} ${CFLAGS} $< -o $@

    Nó đã trở thành:
    "mục tiêu": "foo.o", "bar.o" {
    %CC %CFLAGS %< -o %@
    }

Các tính năng khác của Mục tiêu:

  • Hỗ trợ tùy chọn để chỉ định tên và tham số tùy ý:

    mục tiêu tất cả = : "mục tiêu"

    liên kết mục tiêu =
    "mục tiêu" : "foo.o", "bar.o" { ... }

    biên dịch mục tiêu (tên) =
    "%name.o" : "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • Hai chế độ khởi chạy: chế độ tạo để khớp mục tiêu xây dựng với tên tệp (ví dụ: tệp "foo.o" khớp với mục tiêu "%name.o") và chế độ biên dịch trực tiếp:

    mục tiêu tất cả = : liên kết

    liên kết mục tiêu =
    "target" : "foo.o", biên dịch ("bar") { ... }

    biên dịch mục tiêu (tên) =
    "%name.o" : "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • Chiến thuật lắp ráp được xác định bằng các quy tắc đặc biệt có thể được sử dụng để xác định nhu cầu lắp ráp lại mục tiêu lắp ráp. Nếu một liên kết được tạo đến sự hiện diện của một tệp thì điều này được xác định rõ ràng thông qua dấu hiệu tương ứng (“mục tiêu” cho tên quy tắc và *file (“mục tiêu”) để kiểm tra tệp).

    "mục tiêu" : "foo.o", "bar.o" { ... }

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

  • Nhà phát triển có thể xác định các thuộc tính tùy ý của chiến thuật lắp ráp. Cờ "*file" được xác định theo mặc định (@{...} biểu thị việc ngăn chặn đầu ra và "exit 99" báo hiệu nhu cầu xây dựng lại):

    chiến thuật *tệp (tên tệp) = @{
    kiểm tra -f %tên tệp || lối ra 99
    cho f tính bằng %

    Nguồn: opennet.ru

Thêm một lời nhận xét