Trên thực tế, bạn đã đúng: nó chạy một phiên bản khác của make. Một giải pháp khả thi sẽ là:
.PHONY : clearscr fresh clean all
all :
compile executable
clean :
rm -f *.o $(EXEC)
fresh : clean clearscr all
clearscr:
clear
Bằng cách gọi điện, make fresh
bạn nhận được clean
mục tiêu đầu tiên , sau đó là mục tiêu clearscreen
chạy clear
và cuối cùng là mục tiêu all
thực hiện công việc.
CHỈNH SỬA 4 tháng 8
Điều gì xảy ra trong trường hợp xây dựng song song với -j
tùy chọn của make ? Có một cách để sửa đơn hàng. Từ hướng dẫn làm, phần 4.2:
Tuy nhiên, đôi khi, bạn gặp trường hợp muốn áp đặt một thứ tự cụ thể cho các quy tắc được gọi mà không buộc cập nhật mục tiêu nếu một trong các quy tắc đó được thực thi. Trong trường hợp đó, bạn muốn xác định điều kiện tiên quyết chỉ đặt hàng. Điều kiện tiên quyết chỉ đặt hàng có thể được chỉ định bằng cách đặt một ký hiệu ống (|) trong danh sách điều kiện tiên quyết: mọi điều kiện tiên quyết ở bên trái của ký hiệu ống là bình thường; bất kỳ điều kiện tiên quyết nào ở bên phải là điều kiện chỉ theo đơn đặt hàng: target: normal-Preferences | điều kiện tiên quyết chỉ đặt hàng
Tất nhiên, phần điều kiện tiên quyết thông thường có thể để trống. Ngoài ra, bạn vẫn có thể khai báo nhiều dòng điều kiện tiên quyết cho cùng một mục tiêu: chúng được nối một cách thích hợp. Lưu ý rằng nếu bạn khai báo cùng một tệp vừa là điều kiện tiên quyết bình thường vừa là điều kiện tiên quyết chỉ đơn đặt hàng, thì điều kiện tiên quyết thông thường sẽ được ưu tiên (vì chúng là tập hợp chính xác của hành vi của điều kiện tiên quyết chỉ đặt hàng).
Do đó, makefile trở thành
.PHONY : clearscr fresh clean all
all :
compile executable
clean :
rm -f *.o $(EXEC)
fresh : | clean clearscr all
clearscr:
clear
CHỈNH SỬA ngày 5 tháng 12
Không phải là vấn đề lớn nếu chạy nhiều hơn một phiên bản makefile vì mỗi lệnh bên trong nhiệm vụ sẽ là một sub-shell . Nhưng bạn có thể có các phương thức có thể sử dụng lại bằng cách sử dụng hàm gọi .
log_success = (echo "\x1B[32m>> $1\x1B[39m")
log_error = (>&2 echo "\x1B[31m>> $1\x1B[39m" && exit 1)
install:
@[ "$(AWS_PROFILE)" ] || $(call log_error, "AWS_PROFILE not set!")
command1 # this line will be a subshell
command2 # this line will be another subshell
@command3 # Use `@` to hide the command line
$(call log_error, "It works, yey!")
uninstall:
@[ "$(AWS_PROFILE)" ] || $(call log_error, "AWS_PROFILE not set!")
....
$(call log_error, "Nuked!")
.PHONY :
được coi như một số từ khóa luôn được thực thi, trong khi các mục tiêu không phải giả mạo được dự định là tệp.