2017-02-09 12 views
5

जीएनयू मेक -B विकल्प है जो मौजूदा लक्ष्यों को अनदेखा करने के लिए make को मजबूर करता है। यह एक लक्ष्य को पुनर्निर्माण करने की अनुमति देता है, लेकिन यह लक्ष्य के सभी निर्भरता पेड़ का पुनर्निर्माण भी करता है। मुझे आश्चर्य है कि अपनी निर्भरताओं के पुनर्निर्माण के बिना लक्ष्य को पुनर्निर्माण करने का कोई तरीका है (जीएनयू मेक विकल्प, मेकफ़ाइल में सेटिंग्स, संगत make-जैसे सॉफ़्टवेयर इत्यादि)? समस्या काक्या अपनी निर्भरताओं के पुनर्निर्माण के बिना लक्ष्य (मेक-बी) के पुनर्निर्माण को मजबूर करने का कोई तरीका है?

उदाहरण:

$ mkdir test; cd test 
$ unexpand -t4 >Makefile <<EOF 
huge: 
    @echo "rebuilding huge"; date >huge 
small: huge 
    @echo "rebuilding small"; sh -c 'cat huge; date' >small 
EOF 
$ make small 
rebuilding huge 
rebuilding small 
$ ls 
huge Makefile small 
$ make small 
make: 'small' is up to date. 
$ make -B small 
rebuilding huge # how to get rid of this line? 
rebuilding small 
$ make --version | head -n3 
GNU Make 4.0 
Built for x86_64-pc-linux-gnu 
Copyright (C) 1988-2013 Free Software Foundation, Inc. 
बेशक

एक rm small; make small कर सकते हैं, लेकिन वहाँ एक अंतर्निहित तरीका है?

-o FILE, --old-file=FILE, --assume-old=FILE 
     Consider FILE to be very old and don't remake it. 

संपादित

मुझे लगता है कि आप प्रलेखन ग़लत व्याख्या कर रहे हैं:

+0

करता है [इस सवाल] (http://stackoverflow.com/questions/12199237/बताते-से-अनदेखा-निर्भरता-जब-शीर्ष-लक्ष्य-निर्मित किया गया है) आपकी मदद करता है? – sycko

+0

धन्यवाद, लेकिन अधिक नहीं: जैसा कि मैंने 'ls' का उपयोग करके दिखाया है, 'विशाल' यहां संरक्षित है (बिना' सिकंदरी: 'लक्ष्य) और पुनर्निर्माण' -B' के कारण है। –

उत्तर

3

एक तरह से पुनर्निर्माण किया जा करने के लिए सभी लक्ष्यों को आप नहीं चाहते के लिए -o विकल्प का उपयोग करने के लिए है -B के लिए; यह कहते हैं:

-B, --always-make 
     Unconditionally make all targets. 

ध्यान दें, सभी लक्ष्यों यहाँ; huge निश्चित रूप से एक लक्ष्य है, और इसलिए यदि आप -B का उपयोग करते हैं तो इसे रीमेड किया जाएगा।

हालांकि, मैंने आपके प्रश्न को थोड़ा सा गलत भी बताया। मैं तुम्हें पुनर्निर्माण huge भले ही huge नया है बिना small के पुनर्निर्माण के लिए करना चाहता था सोचा, लेकिन आप प्राप्त करने के लिए small पुनर्निर्माण की भले ही huge, नहीं बदला है सही कोशिश कर रहे हैं?

आप निश्चित रूप से -B का उपयोग नहीं करना चाहते हैं। वह विकल्प वह नहीं है जो आप खोज रहे हैं।

rm -f small 
make small 

यह एक विकल्प है कि किसी भी लक्ष्य मजबूर निर्मित किया जाना है के लिए उपयोगी हो सकता है, लेकिन उस विकल्प मौजूद नहीं है:

आम तौर पर लोगों को कि small हटा कर करना होगा।

आप -W huge का उपयोग कर सकते हैं, लेकिन फिर इसका मतलब है कि आपको केवल उस लक्ष्य के नाम को जानने की आवश्यकता नहीं है जिसे आप बनाना चाहते हैं। बल्कि बुरा हैक तहत

+0

धन्यवाद, 'मेक-बी-बहुत बड़ा छोटा' वास्तव में काम करता है, लेकिन यह आदर्श नहीं है जब तक कि ऐसी निर्भरताओं को स्वचालित रूप से प्राप्त नहीं किया जा सकता ... –

+0

मैं मानता हूं कि यह आदर्श नहीं है, लेकिन आपने किसी भी विधि के लिए पूछे हैं :) – MadScientist

+0

हां, मैं क्यों उभरा (लेकिन जवाब को स्वीकार करने के लिए तैयार नहीं है)। असल में, अगर विकल्प ने स्वयं यह कहा है (लक्ष्य को बहुत पुराना मानें और इसलिए इसे अकेले नए रूप में अनदेखा करने के बजाय इसे पुनर्निर्मित करने के लिए मजबूर करें), तो जवाब आदर्श होगा। –

2

फ़ाइल:

huge: 
    @echo "rebuilding huge"; date >huge 

small: $(if $(filter just,${MAKECMDGOALS}),huge) 
    @echo "rebuilding small"; sh -c 'cat huge; date' >small 

.PHONY: just 
just: ; 

अब आप कर सकते हैं

$ make -B just small 
+0

यह वास्तव में बुरा है! –

+0

धन्यवाद, यह अब तक का सबसे अधिक "अमानवीय स्वचालित" है, लेकिन दुर्भाग्यवश यह नियमों में '$ <', '$ ^' आदि के साथ काम नहीं करेगा। –

3

क्या यह मदद:

touch huge; make small 

?

+0

धन्यवाद, यह काम करता है (और ऐसा करता है 'बहुत बड़ा बनाता है'), लेकिन यह तब तक आदर्श नहीं है जब तक ऐसी निर्भरताओं को स्वचालित रूप से प्राप्त नहीं किया जा सके ... –

0

ठीक है, अब तक मैं इस आंशिक समाधान का उपयोग कर रहा:

$ cat >~/bin/remake <<'EOF' 
#!/bin/sh 
# http://stackoverflow.com/questions/42139227 
for f in "[email protected]"; do 
    if [ -f "$f" ]; then 
    # Make the file very old; it's safer than removing. 
    touch [email protected] "$f" 
    fi 
done 
make "[email protected]" 
EOF 
$ chmod u+x ~/bin/remake 
$ # PATH="$HOME/bin:$PATH" in .bashrc 
$ remake --debug=b small 
GNU Make 4.0 
Built for x86_64-pc-linux-gnu 
Copyright (C) 1988-2013 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. 
Reading makefiles... 
Updating goal targets.... 
Prerequisite 'huge' is newer than target 'small'. 
Must remake target 'small'. 
rebuilding small 
संबंधित मुद्दे

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