दूसरे मेकफाइल से मेकफाइल को कैसे कॉल करें?


125

मुझे कुछ अप्रत्याशित परिणाम मिल रहे हैं जो एक से दूसरे मेकफाइल कह रहे हैं। मेरे पास दो मेकफाइल्स हैं, एक कॉल /path/to/project/makefileऔर एक कॉल /path/to/project/gtest-1.4.0/make/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 gmake है।


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

जवाबों:


112

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

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

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


67
दिर के cdलिए मैन्युअल रूप से आईएनजी के बजाय gtest-1.4.0, आपको -Cविकल्प का उपयोग करना चाहिए make
तदुपरांत

29
या बहुत कम से कम, आपको निश्चित रूप &&से सीडी के बीच उपयोग करना चाहिए और कमांड बनाना चाहिए । वरना अगर cd फेल हो गया तो भी चलेगा make clean... गलत डायरेक्टरी में !! इसके अलावा, आपको हमेशा केवल उपयोग करना चाहिए $(MAKE), कभी भी नंगेपन का उपयोग नहीं करना चाहिए make। तो कुछ इस तरह है: cd gtest-1.4.0 && $(MAKE) clean
MadScientist

3
@ टेडर: युक्ति-C में नहीं है
जानूस ट्रॉल्सन

1
ग्नू-मेक के बारे में यह सवाल और -Cकल्पना में है: gnu.org/software/make/manual/make.html#Recursion
Cas

123

के बजाय -fका makeउपयोग करना चाहते हैं हो सकता है -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

1
यह तरीका सबसे अच्छा लगता है। अन्य उत्तरों के आते हैं जो cdटर्मिनल का उपयोग अनंत लूप में लाने के लिए करते हैं।
gbmhunter

$ (MAKE) -C gtest-1.4.0 / स्वच्छ बनाना मेरे लिए काम नहीं करता है। मुझे लगता है कि यह $ (MAKE) -C gtest-1.4.0 साफ-सुथरा होना चाहिए
Arigion


1

यह स्पष्ट लगता है कि $(TESTS)खाली है इसलिए आपका 1.4.0 मेकफिल प्रभावी है

all: 

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

वास्तव में, सभी को कुछ नहीं करना है। और साफ वही करता है जो यह कहता हैrm -f gtest.a ...


$ (TESTS) को ए wildcardऔर ए के साथ परिभाषित किया गया है patsubst, हालांकि ये मुख्य मेकफाइल से खाली लौट रहे हैं, क्योंकि निर्देशिका को प्रभावी रूप से नहीं बदला गया है। अच्छी नज़र।
क्रिस टोंकिंसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.