2010-02-05 17 views
83

मुझे कुछ अप्रत्याशित परिणाम मिल रहे हैं जो एक मेकफ़ाइल को दूसरे से कॉल करते हैं। मेरे पास दो मेकफ़ाइल हैं, जिन्हें /path/to/project/makefile कहा जाता है और जिसे /path/to/project/gtest-1.4.0/make/Makefile कहा जाता है। मैं बाद वाले को कॉल करने का प्रयास कर रहा हूं। में/path/to/परियोजना/makefile, मैंमेकफ़ाइल को मेकफ़ाइल से कैसे कॉल करें?

dev: $(OBJ_FILES) 
    $(CPPC) $(LIBS) $(FLAGS_DEV) $(OBJ_FILES) -o $(BIN_DIR)/$(PROJECT) 
    $(MAKE) -f ./gtest-1.4.0/make/Makefile 

clean: 
    rm -f ./*~ ./gmon.out ./core $(SRC_DIR)/*~ $(OBJ_DIR)/*.o 
    rm -f ../svn-commit.tmp~ 
    rm -f $(BIN_DIR)/$(PROJECT) 
    make -f gtest-1.4.0/make/Makefile clean 

है और /path/to/project/gtest-1.4.0/make/Makefile में मैं

all: $(TESTS) 

clean: 
    rm -f $(TESTS) gtest.a gtest_main.a *.o 

जारी करने वाले निम्नलिखित है:

cd /path/to/project 
make 

आउटपुट:

make -f ./gtest-1.4.0/make/Makefile 
make[1]: Entering directory `/path/to/project' 
make[1]: Nothing to be done for `all'. 
make[1]: Leaving directory `/path/to/project' 

हालांकि, जब मैं इन्हें जारी करता हूं आदेश:

cd /path/to/project 
make clean 

मैं देख रहा हूँ:

make -f gtest-1.4.0/make/Makefile clean 
make[1]: Entering directory `/path/to/project' 
rm -f gtest.a gtest_main.a *.o 
make[1]: Leaving directory `/path/to/project' 

मुझे समझ नहीं आता: दोनों मामलों में, /path/to/project/makefile कह रहा है कि यह वर्तमान कार्यशील निर्देशिका में प्रवेश कर रहा है। पहले मामले में, ऐसा नहीं लगता कि यह करने के लिए काम करता है (जब यह करता है) और दूसरे मामले में, यह उपयुक्त निर्देश (जब आउटपुट मुझे गलत निर्देशिका में देख रहा है) ढूंढने में सक्षम है) फिर भी यह कोशिश करता है rm/path/to/project में /path/to/makefile/gtest-1.4.0/make/ के बजाय चलाने के लिए।

क्या मुझे एक दूसरे से मेकफ़ाइल कॉल करने के लिए कुछ मौलिक याद आ रही है? क्या मैंने एक आक्रामक वैचारिक गलती की है, या एक आम गड़बड़ी मारा है? मैं निर्देशिकाओं को प्रभावी रूप से कैसे बदलूं और पहले मेकफ़ाइल को पहले से कैसे कॉल करूं? मेरी समझ यह थी कि बस make -f <name> पर कॉल करना पर्याप्त होगा।

यह बैश में 3.81 बना/बना देता है।

+3

मुझे लगता है, बजाय 'बनाने की -f gtest-1.4.0/बनाने/मेकफ़ाइल क्लीन 'आप बेहतर कहते हैं' $ (मेक) -सी gtest-1.4.0/साफ करें '। आपने फोनी लक्ष्यों को परिभाषित क्यों नहीं किया है? –

+0

http://stackoverflow.com/questions/3494999/subdirectories-and-makefiles –

उत्तर

81

मैं वास्तव में बहुत स्पष्ट नहीं हूं कि आप क्या पूछ रहे हैं, लेकिन -f कमांड लाइन विकल्प का उपयोग करके केवल एक फ़ाइल निर्दिष्ट करता है - यह निर्देशिकाओं को बदलने के लिए नहीं बताता है। यदि आप किसी अन्य निर्देशिका में काम करने के लिए चाहते हैं, आप निर्देशिका के लिए cd की जरूरत है:

clean: 
    cd gtest-1.4.0 && $(MAKE) clean 

ध्यान दें कि एक अलग खोल में Makefile रन में प्रत्येक पंक्ति, इसलिए निर्देशिका वापस बदलने के लिए कोई जरूरत नहीं है।

+0

सिर पर नाखून मारा - धन्यवाद! –

+49

'gtest-1.4.0' dir को मैन्युअल रूप से 'cd'' करने के बजाय, आपको' make' के '-C' विकल्प का उपयोग करना चाहिए। – Tader

+22

या कम से कम, आपको निश्चित रूप से सीडी के बीच '&&' का उपयोग करना चाहिए और कमांड बनाना चाहिए। अन्यथा यदि सीडी विफल रहता है तो यह अभी भी गलत निर्देशिका में 'साफ करें' चलाएगा !! इसके अलावा आपको हमेशा '$ (मेक)' का उपयोग करना चाहिए, कभी भी शब्दकोष 'मेक' नहीं करना चाहिए, जब रिकर्सिंग हो। तो कुछ ऐसा है: 'सीडी gtest-1.4.0 और& $ (मेक) साफ करें – MadScientist

1

यह स्पष्ट लगता है कि $(TESTS) रिक्त है तो अपने 1.4.0 makefile प्रभावी रूप से

all: 

clean: 
    rm -f gtest.a gtest_main.a *.o 

दरअसल, सभी लेना देना नहीं है। और साफ बिल्कुल वही करती है क्या कहते हैं rm -f gtest.a ...

+0

$ (टेस्ट) को 'वाइल्डकार्ड' और 'पट्सबस्ट' के साथ परिभाषित किया गया है, हालांकि ये मुख्य मेकफ़ाइल से खाली लौट रहे हैं, क्योंकि निर्देशिका प्रभावी ढंग से परिवर्तित नहीं हो रही है। अच्छी नज़र। –

89
make की -f आप -C <path> विकल्प का उपयोग करना चाह सकते हैं के बजाय

। यह पहले '<path>' पथ में बदल जाता है, और उसके बाद make पर कॉल करता है।

उदाहरण:

clean: 
    rm -f ./*~ ./gmon.out ./core $(SRC_DIR)/*~ $(OBJ_DIR)/*.o 
    rm -f ../svn-commit.tmp~ 
    rm -f $(BIN_DIR)/$(PROJECT) 
    $(MAKE) -C gtest-1.4.0/make clean 
+0

इस तरह से सबसे अच्छा लगता है। अन्य उत्तरों का उपयोग करें जो 'cd' का उपयोग टर्मिनल को अनंत लूप में ले जाने का कारण बनते हैं। – gbmhunter