Đây là một phiên bản thu gọn của Makefile của tôi:phụ thuộc Makefile không làm việc cho mục tiêu giả mạo
.PHONY: all
all: src/server.coffee
mkdir -p bin
./node_modules/.bin/coffee -c -o bin src/server.coffee
Tôi muốn chạy make
và chỉ có nó biên dịch lại khi src/server.coffee
đã thay đổi. Tuy nhiên, nó recompiles mỗi khi tôi chạy make
:
$ make
mkdir -p bin
./node_modules/.bin/coffee -c -o bin src/server.coffee
$ make
mkdir -p bin
./node_modules/.bin/coffee -c -o bin src/server.coffee
Nếu tôi thay đổi Makefile của tôi không sử dụng một đối tượng giả mạo, nó hoạt động như mong đợi. New Makefile:
bin/server.js: src/server.coffee
mkdir -p bin
./node_modules/.bin/coffee -c -o bin src/server.coffee
Kết quả:
$ make
mkdir -p bin
./node_modules/.bin/coffee -c -o bin src/server.coffee
$ make
make: `bin/server.js' is up to date.
Tại sao sẽ không tôn trọng nó phụ thuộc của tôi với một mục tiêu giả mạo? Lý do tôi hỏi là bởi vì trong thực tế, tôi sẽ không chỉ biên dịch một tệp đơn lẻ thành một tệp khác, vì vậy tôi không muốn phải theo dõi tên của tất cả các tệp đầu ra để sử dụng làm mục tiêu.
Chỉ cần rõ ràng, một mục tiêu ** trống ** phải là một tệp và thực sự chỉ được sử dụng cho dấu thời gian của nó? Có loại nào khác của '.PHONY' cho phép quy tắc đích có một phần tử công thức (với các lệnh được thực thi) * và * chỉ chạy khi các phụ thuộc có cần cập nhật không? Nó có vẻ khá vỡ vì nó có '. PHONY' làm những thứ khác nhau tùy thuộc vào việc nó có một cơ thể công thức hay không. – jozxyqk