2010-07-22 23 views
5

Ý tưởng là một dự án có một tệp với __DATE____TIME__ trong đó. Nó có thể được mát mẻ để có nó biên dịch lại mà không thay đổi rõ ràng ngày sửa đổi của nó.Làm cách nào để bạn có thể buộc biên dịch lại một tệp trong một tệp Makefile?

chỉnh sửa: $ (shell touch -c ..) có thể là giải pháp tốt nếu chỉ vụng về.

+1

Đây có thể là giải pháp sai cho vấn đề của bạn. Một số công cụ phiên bản có thể giải thích chi tiết về phiên bản nguồn của bạn. Một chút kịch bản hackery trong quá trình xây dựng của bạn và những chi tiết đó được tích hợp vào mã của bạn. Không quan trọng nếu bạn phải kiểm tra nguồn và xây dựng lại trong thời gian mười năm - thông tin phiên bản của bạn sẽ vẫn phản ánh chi tiết cho thẻ đó. – Steve314

+0

@ Steve314: nhiều khả năng anh ấy muốn một hộp về đề cập đến số xây dựng và ngày xây dựng. –

+0

@Ken - nếu có, mẹo công cụ phiên bản là đúng cách. Không có lý do tại sao các tập lệnh hackery không thể đặt các chi tiết phiên bản vào mã (hoặc tập tin tài nguyên) cho một hộp về, và nhận được một số xây dựng vào một hộp về có lẽ cần dễ dàng quên mất can thiệp thủ công khác. Không thực hiện, trình biên dịch, cũng không phải hệ thống tập tin biết số bản dựng của bạn. – Steve314

Trả lời

8

Các thành ngữ tiêu chuẩn là phải có các tập tin đối tượng (không phải là nguồn tập tin!) Phụ thuộc vào một mục tiêu mà không tồn tại và không có quy tắc hoặc phụ thuộc (mục tiêu này thông thường được gọi là FORCE), như thế này

always-recompile.o: FORCE 
FORCE: 

Điều này sẽ vi phạm nếu tệp có tên "FORCE" được tạo bằng cách nào đó. Với GNU làm cho bạn thay vì có thể sử dụng .PHONY mục tiêu đặc biệt, mà không có hạn chế này, nhưng không yêu cầu bạn phải có một quy tắc rõ ràng để xây dựng lại tập tin đó:

always-recompile.o: 
     $(CC) $(CFLAGS) -c -o always-recompile.o always-recompile.c 

.PHONY: always-recompile.o 

Xem http://www.gnu.org/software/make/manual/html_node/Phony-Targets.html để biết thêm chi tiết.

+1

Bạn nên làm ".PHONY: FORCE" bởi vì luôn luôn biên dịch lại.o không phải là một mục tiêu giả mạo. Với ".PHONY: FORCE", nó không quan trọng nếu một tập tin gọi là FORCE được tạo ra. – camh

+0

Điều đó có thực sự hoạt động không? GNU làm cho các âm thanh thủ công giống như các mục tiêu giả tạo không hoạt động như phụ thuộc của các mục tiêu thực sự. – zwol

1

Một cách để thực hiện việc này là xóa tệp đối tượng tương ứng (.o hoặc .obj) trước khi chạy make. Điều này sẽ kích hoạt một biên dịch lại (và relink) mà không thay đổi ngày sửa đổi tệp nguồn.

Các vấn đề liên quan