2013-08-22 10 views
5

मैं साझा स्रोत कोड का उपयोग कर लिनक्स कर्नेल मॉड्यूल का एक सेट बना रहा हूं। जो मैं समझता हूं, मेकफ़ाइल को "मेकफ़ाइल" नाम दिया जाना चाहिए, इसलिए मुझे दो अलग-अलग मॉड्यूल बनाने के लिए उसी मेकफ़ाइल का उपयोग करना होगा। मैं एक ही स्रोत कोड के साथ, एक ही मेकफ़ाइल के भीतर दो अलग-अलग मॉड्यूल कैसे बना सकता हूं, लेकिन दो अलग-अलग बिल्ड विकल्पों के साथ?पेड़ कर्नेल मॉड्यूल से बाहर: एकाधिक मॉड्यूल, एकल मेकफ़ाइल, एक ही स्रोत फ़ाइल, विभिन्न बिल्ड विकल्प

उदाहरण के लिए, मेरे मॉड्यूल को मॉड्यूल 1 और मॉड्यूल 2 कहा जाता है। इसलिए मैं उन्हें परिभाषित करने के लिए निम्न पंक्ति है:

obj-m := module1.o module2.o 

अन्य फ़ाइलों के अलावा, दोनों module1 और module2 एक ही स्रोत फ़ाइल code.c उपयोग करने की आवश्यकता है, लेकिन विभिन्न निर्माण विकल्पों के साथ बनाया। तो कहते हैं कि उदाहरण के लिए, Makefile निम्नलिखित लाइनों में शामिल हैं:

module1-objs = module1_code.o other_code.o 
module2-objs = module2_code.o other_code.o 

मैं चाहता हूँ module1_code.o और module2_code.o code.c से बनाया जा सकता है, लेकिन विभिन्न विकल्पों के साथ। विशेष रूप से, मैं मैक्रो के बिना निर्मित मैक्रो परिभाषित -DPREPROCEFFOR_FLAG=1, और module2_code.o के साथ एक module1_code.o चाहता हूं।

जो मैं समझता हूं, लिनक्स में प्रयुक्त मेकफ़ाइल की प्रणाली स्पष्ट रूप से अनुमान लगाती है कि "code.o" नामक ऑब्जेक्ट फ़ाइल के लिए, स्रोत फ़ाइल को "code.c" कहा जाता है, तो मैं इसे कैसे प्राप्त करूं? क्या संभव है? क्या ऐसा करने के लिए इससे अच्छा तरीका है?

+0

आप अपनी मेकफ़ाइल को जो कुछ भी चाहते हैं उसका नाम दे सकते हैं। हालांकि डिफ़ॉल्ट रूप से केवल [कुछ फ़ाइल नाम] (http://www.gnu.org/software/make/manual/make.html#Makefile-Arguments) की तलाश करेंगे। किसी भी अन्य नाम के लिए आपको '-f' तर्क का उपयोग करने की आवश्यकता है। –

+0

यदि आप प्रासंगिक ऑब्जेक्ट फ़ाइल की पूर्व शर्त के साथ अपनी ऑब्जेक्ट फ़ाइल के लिए एक विशिष्ट नियम देते हैं और लक्ष्य बनाने के नियमों का उपयोग आपके द्वारा वर्णित डिफ़ॉल्ट नियम के बजाय किया जाएगा। तो 'module1_code.o: code.c; <बनाने के लिए कमांड> '। –

उत्तर

5

आप क्योंकि आप स्पष्ट रूप से code.c है अलग ढंग से तैयार की जा रही है जब -DPREPROCEFFOR_FLAG=1 परिभाषित किया गया है, यहाँ एक समस्या है, लेकिन एक बार यह code.o में संकलित किया गया है, पूर्वप्रक्रमक झंडे या जो कुछ भी है, क्योंकि code.o तारीख तक पहले से ही हो जाएगा के बारे में परवाह नहीं होगा।

आपको अलग-अलग सी झंडे वाली विभिन्न ऑब्जेक्ट फ़ाइलों में code.c बनाने का एक तरीका चाहिए। शायद यह करने के लिए एक साफ रास्ता है (पेड़ मॉड्यूल से बाहर के लिए O= साथ कोई मौका नहीं था), लेकिन यहाँ मेरी innelegant अभी तक पल के लिए प्रभावी समाधान है:

my_modules: 
    cp code.c code_noflags.c 
    cp code.c code_withflags.c 
    make -C $$KDIR M=$$PWD modules 
    rm code_noflags.c code_withflags.c 

# module objects 
obj-m := module1.o module2.o 

# module1 specifics 
module1-y := code_withflags.o 
CFLAGS_code_withflags.o := -DPREPROCEFFOR_FLAG=1 

# module2 specifics 
module2-y := code_noflags.o 

बस फोन:

$ make KDIR=/path/to/kernel 

आप पूर्वप्रक्रमक झंडा सत्यापित कर सकते हैं के साथ सही ऑब्जेक्ट के लिए स्रोत फ़ाइल के लिए पारित कर दिया है:

$ make KDIR=/path/to/kernel V=1 | grep PREPRO 

तुम भी, प्रत्येक मॉड्यूल के लिए दो अलग-अलग निर्देशिका हो सकता था अगर यह possi है खून, और एक वास्तविक लिंक code.c है जो प्रत्येक वास्तविक वास्तविक code.c पर इंगित करता है। हालांकि, यह अभी भी हैकिश है और सही महसूस नहीं करता है।

+1

ए (संभावित रूप से बस सुरुचिपूर्ण) समाधान कोड.c, यानी कोड-लिंक.c के लिए सिम-लिंक बनाना होगा, और उसके बाद लिंक फ़ाइल को वैकल्पिक ध्वज को संकलित करें। –

2

एक सरल उपाय है, अपने Makefile

obj-m := module1.o module2.o 

module1-objs = module1_code.o other_code.o 
module2-objs = module2_code.o other_code.o 

से जारी दो और स्रोत फ़ाइलें, module1_code.c और module2_code.c जोड़ने के लिए है।

फिर module1_code.c बस लगता है कि:

#define PREPROCEFFOR_FLAG 1 
#include "code.c" 

और module2_code।ग है:

#include "code.c" 

या अगर आप चाहें, तो Makefile में नाम और स्रोत फ़ाइलों को बदलते हैं ताकि दूसरे में शामिल किए बिना एक परिभाषित आवश्यक नहीं है। यदि आप चाहें तो कंपाइलर को -D... विकल्प जोड़ने के लिए आप दो स्रोत फ़ाइलों को कुछ भी नहीं बना सकते हैं और CFLAGS_module1_code.o वैरिएबल का उपयोग कर सकते हैं।

यह वही है arch/x86/boot/video-vesa.c और arch/x86/realmode/rm/video-vesa.c आदि, जहां realmode फ़ाइल सिर्फ होता है के साथ नदी के ऊपर गिरी में क्या होता है के समान है:

#include "../../boot/video-vesa.c" 

और वीडियो-vesa.c कोड समाप्त होता है विभिन्न साथ दो बार संकलित हो रही कंपाइलर झंडे।

स्रोत फ़ाइलों की प्रतिलिपि बनाना बेहतर लगता है, क्योंकि यदि आप एक स्वच्छ स्रोत पेड़ रखने और एक अलग ऑब्जेक्ट पेड़ में बनाने के लिए कर्नेल निर्माण के लिए O=... विकल्प का उपयोग करना चाहते हैं तो आप वहां एक गड़बड़ी के साथ समाप्त हो जाते हैं।

संबंधित मुद्दे