2012-03-09 15 views
26

मैं एक सॉफ्टवेयर ढेर है कि निर्माण प्रक्रिया के एक भाग के रूप में कुछ मध्यवर्ती फ़ाइलें बनाता है पूर्ववत कैसे करें। कुछ समस्या आती है और निर्माण टूट जाता है। मैं उन मध्यवर्ती जेनरेट की गई फाइलों पर एक नज़र रखना चाहता हूं। मेरी आश्चर्य के लिए उन फ़ाइलों को निर्माण प्रक्रिया के हिस्से के रूप में हटाया जा रहा है।मध्यवर्ती फ़ाइल हटाने की

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

मैं मेकफ़ाइल के माध्यम से गया, मुझे उन्हें हटाने के किसी भी स्पष्ट नियम नहीं दिख रहे हैं। मध्यवर्ती फ़ाइलों को हटाने के लिए कोई निहित नियम हो सकते हैं। यदि हां, तो मैं उन निहित नियमों को कैसे अक्षम कर सकता हूं?

मैं विकल्प के साथ निष्पादित होने पर केवल Removing intermediate files... प्रिंट देखता हूं।

[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 

उत्तर

29

आप GNUMake का उपयोग कर रहे हैं, तो आप विशेष लक्ष्य .PRECIOUS उपयोग कर सकते हैं:

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

या सिर्फ

.PRECIOUS: %.c %.o 

इसका एकमात्र प्रभाव है कि इन फ़ाइलों को यदि नहीं हटाए जाएंगे मारे गए या बाधित हो गया है।

+0

धन्यवाद यह वास्तव में मदद करता है :) – Kamath

+5

न केवल इसका उपयोग करके। PRREIOUS इसका अर्थ यह है कि इन फ़ाइलों को हटाया नहीं जाएगा भले ही सफलतापूर्वक पूर्ण हो (यानी, मारे गए या बाधित नहीं हैं)। "इसके अलावा, अगर लक्ष्य एक मध्यवर्ती फ़ाइल है, यह यह अब की जरूरत है के बाद, के रूप में सामान्य रूप से किया जाता है को हटाया नहीं जाएगा। [...] इस बाद सम्मान यह .SECONDARY विशेष लक्ष्य के साथ ओवरलैप हो में।" - https://www.gnu.org/software/make/manual/make.html – PonyEars

+2

+1: विपरीत '.SECONDARY', इस POSIX है: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/ make.html –

35

तुम भी .SECONDARY उपयोग कर सकते हैं, जो निर्दिष्ट फ़ाइलों को सुरक्षित करेगा, भले ही निर्माण को तोड़ने नहीं करता है।

उदा

.SECONDARY: 
+0

धन्यवाद। बस उसमें जोड़ने के लिए,। "सिक्योरिटी विशेष लक्ष्य के साथ ओवरलैप।" निर्दिष्ट फ़ाइलों को संरक्षित करने के संबंध में भले ही बिल्ड ब्रेक न हो (https://www.gnu.org/software/make/manual/make.html से उद्धरण) – PonyEars

+4

आपको 'SECONDARY'' पर तर्क सूचीबद्ध करना चाहिए। यह कोई आवश्यक शर्तें दिया जाता है, तो यह * का कारण बनता है सभी * मध्यवर्ती फाइल बनाए रखे जाने की है, जो जरूरी नहीं है कि आप क्या चाहते। – Kaz

+0

धन्यवाद!दुर्भाग्यवश '.COCONDARY' में सूचीबद्ध लक्ष्य' .o' के अलावा एक्सटेंशन के लिए टूटा हुआ प्रतीत होता है। विशेष रूप से '.d' निर्भरता फ़ाइलों को हटा दिया जाता है इससे कोई फर्क नहीं पड़ता। यह समाधान, विचार नहीं करते, कम से कम काम करता है :) – foges

3

जो .PRECIOUS के व्यवहार को प्रभावित लक्ष्यों के उपयोग पर प्रतिबंध, नहीं है:। और बी /% foo:।

मैं लक्ष्य ए /% foo है, तो मैं निर्धारित किया है :

.PRECIOUS: %.foo 

और यह काम नहीं किया; मुझे समझ में नहीं आता क्यों, लेकिन विस्तार इस तरह से काम नहीं करता है; मैं स्पष्ट रूप लक्ष्यों को सूचीबद्ध करने के लिए किया था बिल्कुल के रूप में वे लिखे गए हैं: और .SECONDARY:

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

लेकिन फिर भी https://www.gnu.org/software/make/manual/html_node/Special-Targets.html पढ़ने के बाद मैं .PRECIOUS के बीच का अंतर समझ में नहीं आता।

यह निर्भर करता है बिना उन विशेष लक्ष्य का उपयोग करने के स्वीकार कर लिया है, लेकिन मुझे लगता है कि यह बहुत ही गंदा कोडिंग हो सकता है और साइड इफेक्ट उम्मीद करेंगे। कुछ लोग बस डालते हैं। विशेष: या। सशर्त: बिना डिप्टी के, और बाद में, वे शिकायत करते हैं कि उन्हें टूटे हुए निर्माण के बाद साफ करना है ...

संबंधित मुद्दे