2013-02-14 56 views
7

के बीच साझा चर मेरे पास एक निर्देशिका संरचना है जहां मैं अपने मुख्य फ़ोल्डर में एक मुख्य मेकफ़ाइल चाहता हूं, और फिर मेरे परीक्षण और src फ़ोल्डर दोनों में एक और मेकफ़ाइल चाहता हूं।मेकफ़ाइल

मेरे मुख्य मेकफ़ाइल में, मेरे पास व्यक्तिगत परीक्षण मेकफ़ाइल कॉल करने वाले सभी परीक्षण/सभी के लिए निर्देश हैं। मैं अपने मुख्य मेकफ़ाइल में चर घोषित करने की कोशिश कर रहा हूं और उन्हें उन अन्य फ़ोल्डर्स तक पहुंच योग्य बना रहा हूं।

अपने मुख्य Makefile में

उदाहरण के लिए

PACKAGES = jansson mysql .... 

all: 
    do something here 

test: 

    cd test 
    make test 

और फिर अपने परीक्षण/Makefile में मैं चर पिछले संकुल का उपयोग और यह पर यह makefile की व्यक्तिगत निर्भरता को जोड़ने में सक्षम होना चाहता हूँ।

परीक्षण में/Makefile

PACKAGES += googletest googlemock 

test 
    do something here 

किसी को भी मुझे इस समस्या को हल करने में मदद कर सकता है? है कि यह अन्य रास्ता तय करना है, हालांकि आसपास संभव नहीं है

test: 
    make -C test PACKAGES="$(PACKAGES)" 

नोट:

धन्यवाद

उत्तर

8

आप किसी अन्य फ़ाइल बना सकते हैं, इंस्टान के लिए ce Makefile.variable जहां उन साझा चर परिभाषित और अधिक जानकारी

+1

हां, यही वह है जो मैं मूल रूप से करने के बारे में सोच रहा था लेकिन यह सुनिश्चित नहीं था कि यह अच्छा अभ्यास था या नहीं। सब कुछ काम किया, धन्यवाद – JonMorehouse

6

आप कमांड लाइन पर चर पारित कर सकते हैं। यदि test/Makefile एक चर बदलता है, तो ये परिवर्तन कॉलिंग मेकफ़ाइल पर वापस नहीं आ सकते हैं।


आप मुख्य makefile में PACKAGES चर में जोड़ना चाहते हैं, तो आप अपने निर्माण प्रणाली refactor करने के बजाय उप makefiles शामिल करना होगा। तो मुख्य मेकफ़ाइल सबकुछ सेट करता है, फिर इसमें शामिल हैं (include निर्देशों का उपयोग अधिकांश कार्यान्वयन में उपलब्ध है) उप-मेकफ़ाइल जो उनके लिए विशिष्ट विशिष्ट लक्ष्य जोड़ता है, साथ ही परिवर्तनीय/जोड़ता है।

उदाहरण के लिए, मान लीजिए कि आपने दो परीक्षण निर्देशिका, test_foo और test_bar, आप एक चर परीक्षण लक्ष्य युक्त हो सकता था है, की सुविधा देता है यह TEST_TARGETS कहते हैं। test_* फ़ोल्डर में प्रत्येक मेकफ़ाइल वैश्विक चर के लिए अपना स्थानीय और अद्वितीय लक्ष्य जोड़ता है और मुख्य मेकफ़ाइल उन्हें चला सकता है।

कुछ इस तरह:

मुख्य makefile:

# Start empty 
TEST_TARGETS = 

include test_foo/Makefile 
include test_bar/Makefile 

test: 
    for target in "$(TEST_TARGETS)"; do \ 
     $(MAKE) $(target); \ 
    done 

test_foo/Makefile:

TEST_TARGETS += test_foo 

test_foo: 
    # Do some foo testing 

test_bar/Makefile:

TEST_TARGETS += test_bar 

test_bar: 
    # Do some bar testing 
+0

समस्या मैं पिछले दृष्टिकोण के साथ देखने के लिए include manual पर

include $(PATHTOSHAREDMAKEFILE)/Makefile.variable 

देखो का उपयोग कर फ़ाइल को शामिल कर रहे हैं कि $ (बनाने) है $ (लक्ष्य) कहा जाता है शीर्ष-स्तर मेकफ़ाइल निर्देशिका के पथ के साथ।मुझे लगता है कि पथ मेकफ़ाइल के साथ फ़ोल्डर में होना चाहिए जिसमें उचित रूप से काम करने के लिए रुचि का लक्ष्य शामिल है। –