Những lợi thế của việc sử dụng `make` cho các dự án nhỏ là gì? [đóng cửa]


8

Tôi đã thấy rằng makenó hữu ích cho các dự án lớn, đặc biệt là với các phụ thuộc khó hiểu được mô tả trong một Makefile, và cũng giúp cho quy trình làm việc. Tôi chưa nghe thấy bất kỳ lợi thế nào khi sử dụng makecho các dự án nhỏ. Có ai không


2
Lạc quan cho tăng trưởng? :) thói quen tốt? Điều này có thể đi lạc vào lãnh thổ ý kiến.
Jeff Schaller

makeđể khám phá câu trả lời. tạo một khuôn mẫu đẹp Makefile và chỉ cần chỉnh sửa biến tệp nguồn của nó. không cần phải gõ tất cả những gì jazz.
dùng2497

Chúng là một cơn ác mộng đối với các dự án lớn, vì vậy thành thật mà nói, chúng chỉ nói rằng chúng chỉ tốt cho các dự án nhỏ;)
Eevee

Tôi có thể sử dụng makefiles, nhưng tôi thì không. Tôi đã chia mã nguồn cho dự án (cá nhân) lớn nhất của mình thành 10 tệp, biên dịch lại tệp đầu tiên và tệp đầu tiên có #incoles cho chín tệp còn lại. Với tốc độ biên dịch lại, nó không thành vấn đề với tôi nếu tất cả được biên dịch lại mỗi lần.
Jennifer

1
Lười biếng :-) makelà một lệnh để nhập nhanh hơn hầu hết các lệnh khác, ngay cả khi bạn không tạo Makefile thông minh để xử lý các phụ thuộc một cách sạch sẽ :-)
Stephen Harris

Câu trả lời:


11

Trái ngược với những gì?

Giả sử bạn có một chương trình mà bạn đã chia thành hai tệp, mà bạn có tên file1.cvà  trí tưởng tượng file2.c. Bạn có thể biên dịch chương trình bằng cách chạy

cc file1.c file2.c -o yourprogram

Nhưng điều này đòi hỏi phải biên dịch lại cả hai tập tin mỗi lần, ngay cả khi chỉ có một thay đổi. Bạn có thể phân tách các bước biên dịch thành

cc -c file1.c
cc -c file2.c
cc    file1.o file2.o -o yourprogram

và sau đó, khi bạn chỉnh sửa một trong các tệp, chỉ biên dịch lại tệp đó (và thực hiện bước liên kết bất kể bạn đã thay đổi điều gì). Nhưng điều gì sẽ xảy ra nếu bạn chỉnh sửa một tệp, rồi tệp kia và bạn quên rằng bạn đã chỉnh sửa cả hai tệp và vô tình biên dịch lại chỉ một tệp?

Ngoài ra, ngay cả đối với chỉ hai tệp, bạn đã có các lệnh trị giá khoảng 60 ký tự ở đó. Điều đó nhanh chóng trở nên tẻ nhạt để gõ. OK, chắc chắn, bạn có thể đặt chúng vào một tập lệnh, nhưng sau đó bạn quay lại biên dịch lại mỗi lần. Hoặc bạn có thể viết một tập lệnh thực sự phức tạp, lạ mắt để kiểm tra tập tin nào đã được sửa đổi và chỉ thực hiện các phần tổng hợp cần thiết. Bạn có thấy tôi đang đi đâu với điều này không?


Đối với các dự án rất nhỏ, gcc -O3 -march=native -fwhole-program *.c về cơ bản là tốt cho chu trình chỉnh sửa / biên dịch / hồ sơ. Nhưng bạn vẫn muốn một Makefile cho người khác sử dụng. Có thể sử dụng -fwhole-programlà một lợi thế thú vị của việc tổng hợp mọi thứ lại với nhau, nhưng -fltothông thường mang lại cho bạn khá nhiều tối ưu hóa giống nhau.
Peter Cordes

2
Khi tôi bắt đầu thêm các công tắc vào dòng lệnh của trình biên dịch (ngay cả đối với một tệp nguồn), tôi thấy việc nhớ chúng lần sau sẽ rất khó khăn. Thỉnh thoảng tôi sẽ chỉ đưa ra một nhận xét trong tệp nguồn, nhưng tại thời điểm đó tôi chỉ nên sử dụng một Makefile ...
Roger Lipscombe

@ger Lipscombe: Và nếu bạn cần biên dịch cho các môi trường khác nhau, thì đơn giản như xác định một vài macro trong tệp tạo tệp của bạn. Và với một chút sáng tạo, bạn có thể nối lệnh make vào phím chức năng chỉnh sửa, nắm bắt đầu ra trong một tệp và sử dụng một phím khác để đặt bạn vào vị trí của bất kỳ lỗi nào ...
jamesqf

15

Rất nhiều người khác đang đi vào chi tiết của các makefile phức tạp hơn và rất nhiều sự phức tạp đi kèm với chúng. Tôi thường sử dụng tệp tạo tệp vì một lý do hoàn toàn khác:

Tôi không muốn nhớ bất cứ điều gì.

Ngay cả khi dự án của bạn thực sự nhàm chán và đơn giản, và bạn không sử dụng makefiles "chính xác":

all:
    gcc main.c -o project

Tôi không cần phải suy nghĩ về nó hoặc đối xử với nó khác với một dự án phức tạp hơn:

all:
    gcc libA.c libB.c main.c -o project2

Hoặc nếu tôi chỉ định cờ (ví dụ -O2) tôi không cần nhớ chúng là gì.

Ngoài ra, nếu bạn bắt đầu với một tệp thực hiện đơn giản và bạn cần hợp nhất / cấu trúc lại những thứ sau này, bạn không cần phải nhớ xây dựng mỗi dự án khác nhau.


Tôi sử dụng makefiles ngay cả trong các dự án không biên dịch. Tôi tạo các quy tắc 'giả mạo' chạy các lệnh phức tạp có liên quan cho chỉ thư mục liên quan. Ví dụ: dọn dẹp, cài đặt đúng vị trí, cài đặt hình ảnh docker. Nó chỉ làm cho nó dễ dàng hơn.
anthony

5

Ngay cả với dự án nhỏ, nó có thể hữu ích trong việc kiểm soát logic phụ thuộc và xây dựng tự động. Tôi cũng đã sử dụng nó để kích hoạt cài đặt và hủy cài đặt, vì vậy nó là một công tắc chính đặt lại giai đoạn.


3

Nếu bạn liên kết ứng dụng của mình từ 2 nguồn ( .ctệp), bạn không cần biên dịch lại từng tệp mà chỉ cần thay đổi tệp nếu bạn đang sử dụng make.

Ngoài ra, tôi sẽ cho bạn ví dụ từ thế giới BSD. Họ có khuôn khổ của Makefiles dựa trên hệ thống. Họ cung cấp cho bạn đường dẫn đến thư mục hệ thống và có mục tiêu để cài đặt phần mềm và trang thủ công của bạn.

Ví dụ, bạn chỉ cần viết beer.cứng dụng và hướng dẫn cho nó được gọi beer.6. Bạn tạo Makefile:

PROG=   beer
MAN=    beer.6

.include <bsd.prog.mk>

..và gọi make install. Nó tự động biên dịch và cài đặt ứng dụng của bạn /usr/binvà biên dịch và cài đặt trang người đàn ông của bạn đến nơi mancó thể tìm thấy nó. Bạn chỉ cần cài đặt ứng dụng của bạn với một lệnh đơn giản!

Rất thuận tiện và hoàn toàn minh bạch cho bất cứ ai quen thuộc với BSD. Tốt hơn nhiều so với kịch bản thủ công.


1

Ví dụ Makefilecho dự án rất nhỏ của tôi:getPixelColor

Nó thực hiện chính xác những gì tên của nó nói, lấy hai đối số tùy chọn, tọa độ.

Tôi đặc biệt thích cách mọi thứ trở nên phụ thuộc ở đó.

COORDS ?= 0 0

CXX := g++-8
CXXFLAGS := -std=c++17 -Wall -Wextra -Werror -Wpedantic -pedantic-errors
LDLIBS := -lX11
RM := rm -f

BIN := getPixelColor
SRC := $(BIN).cpp

$(BIN): $(SRC)
    $(CXX) $(CXXFLAGS) $(SRC) -o $(BIN) $(LDLIBS)

.PHONY: clean
clean:
    $(RM) $(BIN)

.PHONY: run
run: $(BIN)
    ./$(BIN) $(COORDS)

Như bạn có thể thấy, nó có thể làm tất cả những gì bạn cần, mà không cần gõ thêm bất cứ điều gì:


Sử dụng

Bạn có thể chạy nó theo những cách sau:

  1. Dọn dẹp nhị phân cũ:

    make clean
  2. Biên dịch một nhị phân mới:

    make
  3. Chạy chương trình thực thi theo 2 cách:

    • tọa độ mặc định [0,0]

      make run     # equals COORDS='0 0'
    • bất kỳ tọa độ đã cho

      COORDS='5 6' make run

Makefiles có thể cực kỳ hữu ích đôi khi. Dự án càng lớn, lợi ích càng lớn. Nhưng ngay cả với dự án C ++ nhỏ nhất của tôi, như bạn có thể thấy trên các ví dụ giúp bạn tiết kiệm rất nhiều vấn đề đau đầu.


0

makelà khá đáng tin cậy có sẵn. Nếu bạn phân phối dự án của mình với một makefile, người dùng sẽ có một tài liệu tham khảo đơn giản về cách đạt được các nhiệm vụ giống như cách bạn làm. Có makefilethể cho nhiều hơn là chỉ biên dịch.

Lấy một dự án không yêu cầu biên dịch, ví dụ. Tôi nhớ lại làm việc trên một dự án Python có lệnh make để xóa tất cả các .pyctệp, lệnh make để chạy thử nghiệm, một để tải xuống một bản sao của dữ liệu tĩnh từ máy chủ phát triển, v.v.

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.