Tại sao sử dụng make over a script script?


128

Làm cho tôi chỉ đơn giản là một tập lệnh shell với việc xử lý các đối số dòng lệnh dễ dàng hơn một chút.

Tại sao nó là tiêu chuẩn để chạy make thay vì ./make.sh


cho câu hỏi ngược lại: tại sao sử dụng shell script trên làm (vì việc xử lý dễ dàng hơn rõ ràng của đối số dòng lệnh), đặc biệt là cho các nhiệm vụ quản trị hệ thống, đọc ở đây: unix.stackexchange.com/a/497601/1170
lesmana

Câu trả lời:


125

Ý tưởng chung là makehỗ trợ (hợp lý) xây dựng lại tối thiểu - nghĩa là bạn nói với nó những phần nào trong chương trình của bạn phụ thuộc vào những phần khác. Khi bạn cập nhật một số phần của chương trình, nó chỉ xây dựng lại các phần phụ thuộc vào đó. Mặc dù bạn có thể làm điều này với tập lệnh shell, nhưng nó sẽ tốn nhiều công sức hơn (kiểm tra rõ ràng ngày sửa đổi lần cuối trên tất cả các tệp, v.v.) Thay thế rõ ràng duy nhất với tập lệnh shell là xây dựng lại mọi thứ mọi lúc. Đối với các dự án nhỏ, đây là một cách tiếp cận hoàn toàn hợp lý, nhưng đối với một dự án lớn, việc xây dựng lại hoàn chỉnh có thể dễ dàng mất một giờ hoặc hơn - sử dụng make, bạn có thể dễ dàng thực hiện điều tương tự trong một hoặc hai phút ...

Tôi có lẽ cũng nên thêm rằng có khá nhiều lựa chọn thay thế để làm cho nó có ít nhất khả năng tương tự rộng rãi. Đặc biệt trong trường hợp chỉ có một vài tệp trong một dự án lớn đang được xây dựng lại, một số trong số chúng (ví dụ: Ninja ) thường nhanh hơn đáng kể so với thực hiện.


66

Make là một hệ chuyên gia

Có nhiều thứ khác nhau rất khó thực hiện với shell script ...

  • Tất nhiên, nó kiểm tra xem những gì đã lỗi thời, để chỉ xây dựng những gì nó cần để xây dựng
  • Nó thực hiện một loại cấu trúc liên kết hoặc một số loại phân tích cây khác để xác định cái gì phụ thuộc vào thứ gì và thứ tự nào để xây dựng những thứ lỗi thời sao cho mọi điều kiện tiên quyết được xây dựng trước mỗi phụ thuộc và chỉ được xây dựng một lần.
  • Đó là một ngôn ngữ để lập trình khai báo . Các yếu tố mới có thể được thêm vào mà không cần phải hợp nhất chúng thành một luồng điều khiển bắt buộc.
  • Nó chứa một công cụ suy luận để xử lý các quy tắc, mẫu và ngày, và điều này, khi được kết hợp với các quy tắc trong Makefile cụ thể của bạn, là thứ biến thành một hệ thống chuyên gia .
  • Nó có một bộ xử lý macro.
  • Xem thêm: một bản tóm tắt trước đó của thực hiện .

2
Mặc dù vậy, nó khá hạn chế như một hệ thống chuyên gia. Ví dụ, mỗi suy luận có thể sử dụng cùng một quy tắc một lần.
Revierpost

1
Chỉ cần giải thích ở điểm 2) theo các thuật ngữ kỹ thuật giáo dân hơn, một tập lệnh shell thực thi một trật tự tuyến tính, trong khi đó một tệp thực hiện giống như cây. Nó loại bỏ các phụ thuộc theo thời gian không cần thiết (mặc dù trong thực tế, quá trình tạo sẽ được thực hiện tuyến tính).
Sridhar Sarnobat

2
... Tôi nghĩ rằng rắc rối với Makefiles qua shell script tương tự như rắc rối với CSS qua javascript. Không rõ ràng thứ tự thời gian mà mỗi nút được thực thi. Mặc dù ít nhất với Makefiles bạn vẫn có thể thấy lệnh shell thực tế. Với CSS, điều đó thậm chí còn được trừu tượng hóa.
Sridhar Sarnobat

Tôi có một vài ý kiến ​​tôi đánh giá cao nếu ai đó làm rõ chúng. 1 / không phải là điểm đầu tiên của bạn và hai điểm liên quan, theo nghĩa là loại cấu trúc liên kết đó là cách xây dựng gia tăng được thực hiện? 2 / bạn không thể thực hiện điểm số 3 bằng cách sử dụng thành phần chức năng. 3 / Tôi muốn hiểu thêm về các ưu điểm của 4 và 5 cho người dùng cuối MakeFile và tại sao những lợi thế này không thể được thực hiện bằng cách kết hợp các lệnh shell với nhau
Amine Hajyoussef

Đây là lần đầu tiên tôi bắt gặp Make được mô tả như một Hệ chuyên gia. Là một người đã xây dựng các hệ thống chuyên gia, đó không phải là điều mà tôi sẽ xem xét. Rõ ràng có một công cụ suy luận để suy luận cách xây dựng chương trình của bạn thông qua các quy tắc khai báo được chỉ định trong tệp tạo tệp, nhưng rõ ràng đó là một hệ thống dựa trên kiến ​​thức vì các quy tắc (lá) là các lệnh shell được thực thi thay vì thực tế. Và thuật ngữ "hệ thống chuyên gia" được sử dụng để chỉ một hệ thống đã nắm bắt thành công chuyên môn của một chuyên gia đẳng cấp thế giới, không phải vậy. Ban giám khảo vẫn ra cho tôi.
Dennis

9

Đảm bảo rằng chỉ các tệp được yêu cầu được biên dịch lại khi bạn thay đổi các tệp nguồn của mình.

Ví dụ:

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

Nếu tôi chỉ thay đổi tệp 2.hvà chạy make, nó sẽ thực thi cả 3 lệnh theo thứ tự ngược lại.

Nếu tôi chỉ thay đổi tệp 1.cvà chạy make, nó chỉ thực hiện 2 lệnh đầu tiên theo thứ tự ngược lại.

Cố gắng thực hiện điều đó với kịch bản shell của riêng bạn sẽ bao gồm rất nhiều if/elsekiểm tra.


hoặc sử dụng một cái gì đó như thế này rsync -r -c -I $SOURCE $DEST_DIRtrong vỏ.
Spartacus9

9

Cũng như ở trên, Make là một ngôn ngữ lập trình song song khai báo (-ish).

Giả sử bạn có 4.000 tệp đồ họa để chuyển đổi và 4 CPU. Hãy thử viết một kịch bản shell 10 dòng (tôi đang hào phóng ở đây) sẽ làm điều đó một cách đáng tin cậy trong khi bão hòa CPU của bạn.

Có lẽ câu hỏi thực sự là tại sao mọi người bận tâm viết kịch bản shell.


1
Có, bạn đang nới lỏng tổng số thứ tự tuyến tính thành một thứ tự giống như cây hơn.
Sridhar Sarnobat

4

thực hiện xử lý phụ thuộc: makefile mô tả chúng: nhị phân phụ thuộc vào tệp đối tượng, mỗi tệp đối tượng phụ thuộc vào tệp nguồn và tiêu đề ... khi chạy được thực hiện, ngày của tệp được so sánh để xác định những gì cần được biên dịch lại .

Người ta có thể gọi trực tiếp một mục tiêu không xây dựng mọi thứ được mô tả trong Makefile.

Ngoài ra, cú pháp tạo cung cấp thay thế, vpath

Tất cả điều này có thể được viết bằng shell script, với việc bạn đã có nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.