2012-03-09 34 views
26

Tôi có ngăn xếp phần mềm tạo một số tệp trung gian như một phần của quá trình xây dựng. Có một số vấn đề nảy sinh và sự phá vỡ xây dựng. Tôi muốn xem các tệp được tạo trung gian đó. Để tôi ngạc nhiên những tập tin đang bị xóa như là một phần của quá trình xây dựng.Cách hoàn tác xóa tệp trung gian

Removing intermediate files... 
rm fact_test_without_proxies.c fact_test_main.c fact_test_without_proxies.o 

Tôi đã trải qua Makefiles Tôi không thấy bất kỳ quy tắc rõ ràng nào xóa chúng. Có thể có bất kỳ quy tắc tiềm ẩn nào để xóa các tệp trung gian. Nếu có, tôi làm cách nào để vô hiệu hóa các quy tắc tiềm ẩn đó?

Tôi chỉ thấy bản in Removing intermediate files... chỉ khi thực hiện được thực hiện với tùy chọn --debug.

[email protected]:~/coding/factorial/ut$ make --debug 
GNU Make 3.81 
Copyright (C) 2006 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. 
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A 
PARTICULAR PURPOSE. 

This program built for x86_64-pc-linux-gnu 
Reading makefiles... 
Updating goal targets.... 
File `check' does not exist. 
    File `test_dept_run' does not exist. 
    File `fact_test' does not exist. 
     File `fact_using_proxies.o' does not exist. 
      File `fact_test_without_proxies' does not exist. 
      File `fact_test_without_proxies.o' does not exist. 
      File `fact_test_without_proxies.c' does not exist. 
       File `fact_test_main.c' does not exist. 
      Must remake target `fact_test_main.c'. 
nm -p fact_test.o | build_main_from_symbols >fact_test_main.c 
      Successfully remade target file `fact_test_main.c'. 
      Must remake target `fact_test_without_proxies.c'. 
cp fact_test_main.c fact_test_without_proxies.c 
      Successfully remade target file `fact_test_without_proxies.c'. 
      Must remake target `fact_test_without_proxies.o'. 
gcc -I../src -c -o fact_test_without_proxies.o fact_test_without_proxies.c 
      Successfully remade target file `fact_test_without_proxies.o'. 
      Must remake target `fact_test_without_proxies'. 
gcc fact_test_without_proxies.o fact.o fact_test.o -o fact_test_without_proxies 
fact.o: In function `unknown': 
fact.c:(.text+0x67): undefined reference to `do_update' 
collect2: ld returned 1 exit status 
make: *** [fact_test_without_proxies] Error 1 
Removing intermediate files... 
rm fact_test_without_proxies.c fact_test_main.c fact_test_without_proxies.o 

Trả lời

29

Nếu bạn đang sử dụng gnumake, bạn có thể sử dụng các mục tiêu đặc biệt .PRECIOUS:

.PRECIOUS: fact_test_without_proxies.c fact_test_main.c fact_test_without_proxies.o 

hoặc chỉ

.PRECIOUS: %.c %.o 

hiệu lực duy nhất của nó là những tập tin này sẽ không bị xóa nếu Thực hiện là bị giết hoặc bị gián đoạn.

+0

Cảm ơn bạn thực sự đã giúp :) – Kamath

+5

Không chỉ vậy, sử dụng. PRECIOUS có nghĩa là những tệp này sẽ không bị xóa ngay cả khi Thực hiện thành công thành công (nghĩa là, không bị giết hoặc bị gián đoạn). "Ngoài ra, nếu mục tiêu là một tập tin trung gian, nó sẽ không bị xóa sau khi nó không còn cần thiết, như thường được thực hiện. [...] Trong trường hợp này, nó trùng lặp với mục tiêu đặc biệt .SECONDARY." - https://www.gnu.org/software/make/manual/make.html – PonyEars

+2

+1: không giống như '.SECONDARY', đây là POSIX: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/ make.html –

35

Bạn cũng có thể sử dụng .SECONDARY, sẽ giữ lại các tệp được chỉ định ngay cả khi bản dựng không bị hỏng.

ví dụ:

.SECONDARY: 
+0

Cảm ơn. Chỉ cần thêm vào đó,. PRECIOUS "trùng lặp với mục tiêu đặc biệt .SECONDARY." liên quan đến việc bảo quản các tệp được chỉ định ngay cả khi bản dựng không bị ngắt (trích dẫn từ https://www.gnu.org/software/make/manual/make.html) – PonyEars

+4

Bạn nên liệt kê các đối số thành '.SECONDARY'. Nếu không có điều kiện tiên quyết, nó sẽ khiến tất cả * các tệp trung gian được giữ lại, không nhất thiết phải là những gì bạn muốn. – Kaz

+0

Cảm ơn bạn!Rất tiếc, các mục tiêu liệt kê trong '.SECONDARY' dường như bị hỏng đối với các tiện ích mở rộng khác với' .o'. Cụ thể các tập tin phụ thuộc '.d' bị xóa không có vấn đề gì. Giải pháp này, trong khi không ý tưởng, ít nhất là công trình :) – foges

3

Có một hạn chế về việc sử dụng các chỉ tiêu, trong đó ảnh hưởng đến hành vi của .PRECIOUS:

tôi có mục tiêu A /% foo:. Và foo /% B:., Vì vậy tôi đã thiết :

.PRECIOUS: %.foo 

và điều này không có tác dụng; Tôi không hiểu tại sao, nhưng việc mở rộng không hoạt động theo cách này; Tôi đã phải explicitely liệt kê các mục tiêu chính xác như chúng được viết:

.PRECIOUS: A/%.foo B/%.foo 

Nhưng ngay cả sau khi đọc https://www.gnu.org/software/make/manual/html_node/Special-Targets.html Tôi không hiểu sự khác biệt giữa .PRECIOUS: và .SECONDARY:.

Được chấp nhận để sử dụng các mục tiêu đặc biệt đó mà không phụ thuộc, nhưng tôi nghĩ điều này sẽ rất bẩn và có thể xảy ra tác dụng phụ. Một số người chỉ cần đặt. PRECIOUS: hoặc .SECONDARY: không có dep, và sau đó, họ phàn nàn họ phải chạy sạch sẽ sau khi xây dựng bị hỏng ...

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