मैं जीएनयू मेकफ़ाइल के लिए अपेक्षाकृत नया हूं और वर्तमान में मेरी नौकरी के लिए, मुझे ड्राइवरों के समूह को संकलित करने के लिए एक परियोजना के लिए मेकफ़ाइल में एक लक्ष्य बनाना आवश्यक है। प्रत्येक ड्राइवर के पास पहले से ही अपनी स्वयं की बिल्ड निर्देशिका में बनाई गई अपनी मेकफ़ाइल होती है और प्रत्येक ड्राइवर के लिए जिन लक्ष्यों को कॉल करने की आवश्यकता होती है वे समान होते हैं। अर्थात। ड्राइवर A और ड्राइवर B दोनों के लिए, "मेक शेयर्ड" कहा जाना चाहिए।

मेरा वर्तमान विचार मुख्य मेकफ़ाइल में प्रत्येक ड्राइवर के पथ को परिभाषित करना है:

DRIVER_A = $(CURR_DIR)/<path_to_a>/driver
DRIVER_B = $(CURR_DIR)/<path_to_b>/driver
DRIVER_C = $(CURR_DIR)/<path_to_c>/driver

यहां से, मैं वास्तव में क्या करना चाहता हूं, प्रत्येक DRIVER_A, DRIVER_B और DRIVER_C के लिए समान प्रक्रिया को कॉल करें अर्थात:

        source <some_compiler>; \
        cp -r <some_folder> DRIVER_A/source/; \
        cd DRIVER_A/build; \
        make shared <some_flags>; \
        make so_test <some_flags>

और इसलिए इसे पूरा करने के लिए, मैंने DRIVER_A, DRIVER_B और DRIVER_C को एक ऑब्जेक्ट में डालने का प्रयास किया जैसे

DRIVER_SOURCES := \
        DRIVER_A\
        DRIVER_B \
        DRIVER_C

और फिर लक्ष्य को DRIVER_SOURCES पर कॉल करें

drivers_sw: ${DRIVER_SOURCES}
        source <some_compiler>; \
        cp -r <some_folder> $@/source/; \
        cd $@/build; \
        make shared <some_flags>; \
        make so_test <some_flags>

लेकिन यह काम नहीं करता है क्योंकि DRIVER_A, DRIVER_B और DRIVER_C के लिए लक्ष्य बनाने का कोई नियम नहीं है, जो मुझे पिछली दृष्टि से समझ में आता है, हालांकि मैं जो हासिल करने की कोशिश कर रहा हूं उसे पूरा करने का कोई वैकल्पिक तरीका नहीं जानता।

मैं प्रत्येक ड्राइवर के लिए मेक को कॉल करने के बेहतर तरीके के लिए भी खुला हूं, इसकी निर्देशिका में सीडी करने और कॉल करने के लिए, मुझे यकीन है कि एक क्लीनर तरीका है लेकिन मैं बस बल्ले से काम के लिए जा रहा था।

कोई मदद बहुत अच्छी होगी, अगर कोई और जानकारी जरूरी है तो मुझे बताएं, अगर मुझे कुछ याद आया तो मैं क्षमा चाहता हूं, मैं स्टैक ओवरफ़्लो पर पोस्ट करने के लिए बिल्कुल नया हूं।

संपादित करें: मैंने चौथे कोड ब्लॉक में एक टाइपो बनाया, "DRIVER_A" को $@ से बदल दिया

0
djdrng 26 मार्च 2020, 18:30

1 उत्तर

सबसे बढ़िया उत्तर

आइए पहले कच्चा और सरल तरीका करें। आपके पास पहले से ही ड्राइवर A के लिए एक नुस्खा है:

DRIVER_A = $(CURR_DIR)/<path_to_a>/driver
build_DRIVER_A:
    source <some_compiler>; \
    cp -r <some_folder> DRIVER_A/source/; \
    cd DRIVER_A/build; \
    make shared <some_flags>; \
    make so_test <some_flags>

यदि आप पुष्टि करते हैं कि यह काम करता है, तो आप आसानी से बी और सी के नियम लिख सकते हैं।

एक बार जब वे सभी काम कर रहे हों, तो आपके पास तीनों को बनाने के लिए एक नियम हो सकता है:

build_all_drivers: build_DRIVER_A build_DRIVER_B build_DRIVER_C

और मत भूलना:

.PHONY: build_all_drivers build_DRIVER_A build_DRIVER_B build_DRIVER_C

एक बार यह सब काम कर रहा है, तो आप पूरे डिजाइन को और अधिक सुरुचिपूर्ण बनाने के लिए देख सकते हैं, लेकिन यह जानना मुश्किल है कि परियोजना के विवरण को जाने बिना इसे कैसे किया जाए। मैं नहीं क्या उदा। source <some compiler> करता है, इसलिए मुझे नहीं पता कि इसे कैसे हटाया जाए। मुझे नहीं पता कि विभिन्न <some folders> में क्या है, इसलिए मुझे नहीं पता कि उन स्रोत फ़ाइलों को उनके ड्राइवरों के लिए पूर्वापेक्षाएँ बनाना कितना आसान होगा। लेकिन मैं निश्चित रूप से अलग-अलग ड्राइवर निर्देशिकाओं में मेकफ़ाइल को देखूंगा, और देखूंगा कि क्या वे इस बोझ को कुछ हद तक उठा सकते हैं-आखिरकार, वे अपने संबंधित ड्राइवरों के निर्माण के लिए जिम्मेदार हैं।

1
Beta 26 मार्च 2020, 17:23