2012-07-11 10 views
6

यह केवल मेकफ़ाइल का एक सेगमेंट है। मुझे समझ में नहीं आता कि क्या हो रहा है।एकाधिक कॉलन और मेकफ़ाइल में बराबर चिह्न (स्पष्टीकरण की आवश्यकता है)

OBJS = $(SRCS:$(SRC)/%.cpp=$(OBJ)/%.o) 
$(OBJS):$(OBJ)/%.o: $(SRC)/%.cpp | print-opts 
    $(cc-command) 

सभी मैं समझता हूँ कि इन पंक्तियों, ओ में फ़ाइलों सीपीपी संकलन 'cc-आदेश' के साथ 'प्रिंट opts' के बाद, है। लेकिन मैं अर्थशास्त्र समझ में नहीं आता।

अगर मैं 'OBJS' की मैक्रो का विस्तार, इस लाइन किया जाना चाहिए:

$(SRCS:$(SRC)/%.cpp=$(OBJ)/%.o) : $(OBJ)/%.o: $(SRC)/%.cpp | print-opts 
    $(cc-command) 
मेरे लिए

, यह $ में की तरह दिखता है (SRCS:। $ (एसआरसी) /% सीपीपी = $ (OBJ) /%। ओ) ', यह दावा करता है कि $ (एसआरसी) में सभी .cpp $ (ओबीजे) में आते हैं, लेकिन यह $ (ओबीजे) /% पर निर्भर करेगा। ओ, जो $ (एसआरसी) पर निर्भर करता है /%.cpp। यह समझ में नहीं आता है ...

मुझे समझ में नहीं आता कि यहां बराबर चिह्न का अर्थ क्या है, और एकाधिक कॉलन का क्या अर्थ है।

उत्तर

14

मान लीजिए आप इन तीन चर परिभाषित किया है (और यदि आप नहीं है, नियम बहुत अच्छी तरह से काम नहीं करेगा):

SRC = source_dir 
OBJ = object_dir 
SRCS = source_dir/foo.cpp source_dir/bar.cpp 

अब काम

OBJS = $(SRCS:$(SRC)/%.cpp=$(OBJ)/%.o) 

यह वह जगह है पर विचार एक substitution reference; यह कहता है "$(SRCS) में कुछ भी जिसके लिए फॉर्म $(SRC)/%.cpp है, इसे $(OBJ)/%.o पर बदलें"। तो OBJSobject_dir/foo.o object_dir/bar.o का मूल्यांकन करेगा।

नियम अब:

$(OBJS):$(OBJ)/%.o: $(SRC)/%.cpp | print-opts 
    $(cc-command) 

Thuis एक static pattern rule है। यह लक्ष्य की एक सूची निर्दिष्ट करता है ($(OBJS)), एक लक्ष्य पैटर्न ($(OBJ)/%.o) और एक पूर्व शर्त पैटर्न ($(SRC)/%.cpp)। लक्ष्य पैटर्न के लिए एक लक्ष्य बनाओ, और पूर्व शर्त नाम बनाने के लिए इसका उपयोग करता है। तो अगर object_dir/foo.o बनाने के लिए इस नियम का उपयोग करें, तो स्टेम foo होगा और पूर्वापेक्षा source_dir/foo.cpp होगी।

(आप | print-opts के बारे में पूछना नहीं था, इसलिए मुझे लगता है कि यह पहले से ही स्पष्ट है।)

+0

आपको बहुत बहुत धन्यवाद। Gnu 'make' मैनुअल के संदर्भ भी बहुत उपयोगी हैं। (मैंने पहले उस मैनुअल को देखा था, लेकिन मुझे आवश्यक जानकारी का पता नहीं लगा सका) – qinsoon

+0

प्रतिस्थापन संदर्भ द्वारा उलझन में टैड। इसलिए यदि मेरे पास 'main.c' है, तो यह इसे ऑब्जेक्ट फाइल निर्देशिका में चिपकाएगा और केवल फ़ाइल एक्सटेंशन को '.o' में बदल देगा। यह फ़ाइल की सामग्री को संरक्षित करता है, और केवल एक्सटेंशन को बदलता है। यह उन सभी ऑब्जेक्ट फ़ाइलों के नाम सेट करता है जिनके साथ हम समाप्त होंगे। फिर हम नामों की सूची को लक्ष्य के रूप में उपयोग करते हैं और फ़ाइलों को ऑब्जेक्ट करने के लिए संकलित करते हैं, और नई ऑब्जेक्ट फ़ाइल के साथ फ़ाइलों को ओवरराइट करते हैं जिन्हें हमने अभी संकलित किया है। सही बात? – Ungeheuer

+0

@Ugegeheuer: नहीं, प्रतिस्थापन संदर्भ फाइलों पर कुछ भी नहीं करता है, यह केवल चर बदलता है। यह "source_dir/main.cpp" को "object_dir/main.o" में बदल देता है; वे * फ़ाइल नाम * हैं, नहीं * फ़ाइलें *। एक बार हमारे पास "object_dir/main.o" स्ट्रिंग हो जाने के बाद, हम इसे पैटर्न नियम में पास कर सकते हैं, जो जानता है कि उस नाम की फ़ाइल कैसे बनाएं। – Beta