2012-06-07 12 views
8

क्या लिंकर स्क्रिप्ट के लिए मेकफ़ाइल/शैल चर का उपयोग करना और कहा गया चर के आधार पर निर्णय लेना संभव है?लिंकर स्क्रिप्ट में मेक या शैल वैरिएबल

उदाहरण के लिए, मान लीजिए कि मैं एक अलग लिंकर स्क्रिप्ट का उपयोग किये बिना नीचे रैम क्षेत्र की शुरुआत को बदलना चाहता हूं, क्या ऐसा करने के लिए मेक वैरिएबल का उपयोग करना संभव होगा?

MEMORY 
{ 
ifeq ($(SOME_VAR),0) 
RAM (wx) : ORIGIN = 0x100000, LENGTH = 128K 
else 
RAM (wx) : ORIGIN = 0x200000, LENGTH = 128K 
endif 
} 

उत्तर

0

मुझे शक है हालांकि यह आपके द्वारा उपयोग किए जा रहे लिंकर पर निर्भर करेगा। लिंकर के लिए कुछ निर्यात किए गए चर को पढ़ने से संभव हो सकता है लेकिन जैसा कि मैंने कहा था कि यह सब विशिष्ट लिंकर कार्यक्षमता पर निर्भर होगा। एक और विचार तब तक हो सकता है जब तक कि लिंकर फ़ाइल बहुत जटिल नहीं होगी, एक विकल्प वास्तव में इसे आपके मेकफ़ाइल का उपयोग करके उत्पन्न करना होगा। मेकफ़ाइल हेडर फ़ाइलों को उत्पन्न करने के बारे में कई उदाहरण हैं जिन पर आप एक लिंकर फ़ाइल उत्पन्न करने के लिए उसी पथ का अनुसरण कर सकते हैं।

+0

मैं ld उपयोग कर रहा हूँ (जीसीसी से करने के लिए olset)। मैंने स्क्रिप्ट उत्पन्न करने के बारे में सोचा लेकिन मैं उम्मीद कर रहा था कि आस-पास के बुनियादी ढांचे को बहुत ज्यादा संशोधित न करें। वैसे भी, मैंने बस एक और लिंकर स्क्रिप्ट प्राप्त करने का निर्णय लिया और एक मेक वैरिएबल के आधार पर लिंक चरण के दौरान एक या दूसरे को चुन लिया। यह स्क्रिप्ट उत्पन्न करने से एक आसान समाधान था। यद्यपि आपके उत्तर के लिए धन्यवाद। – jkayca

0

यदि मेकफ़ाइल के भीतर निर्णय लेने का समाधान जो कि कई लिंकर स्क्रिप्ट्स में से एक पर्याप्त नहीं है, तो स्क्रिप्ट के भीतर स्क्रिप्ट उत्पन्न करना एक व्यवहार्य विकल्प हो सकता है।

यह समाधान जीएनयू मेक के वर्बैटिम चर पर निर्भर करता है, जो पर्यावरण चर में निर्यात किया जाता है और $$ के साथ संदर्भित किया जाता है। मैं एक पथ चर को परिभाषित करने के लिए इस का उपयोग कर रहा है ताकि तरह एक और लिंकर लिपि में एक लिंकर स्क्रिप्ट शामिल करने के लिए प्रयोग की जाने वाली:

define LDSCRIPT_DEF 
/* Include the original libopencm3 linker script */ 
INCLUDE $(OPENCM3_DIR)/lib/stm32/f4/stm32f405x6.ld 

/* Do custom stuff */ 
endef 
export LDSCRIPT_DEF 

$(LDSCRIPT): 
    @echo "$$LDSCRIPT_DEF" > $(LDSCRIPT) 

स्पष्टीकरण: इस makefile का एक हिस्सा है और तभी काम करता है makefiles $ (का उपयोग एलडीएससीआरआईपीटी) सभी प्रासंगिक नियमों में एक शर्त के रूप में।

2

एलडी पर्यावरण से किसी भी चर आयात नहीं करता है, इसलिए यह सीधे उनका उपयोग नहीं कर सकता है।

makefile:

foo: 
    echo SOMEVAR=$(SOMEVAR) > environment_linker_script 
    ld ... 

enviroment_linker_script:

यह करने के लिए सबसे अच्छा तरीका वातावरण चर आप निर्यात करना चाहते के साथ अपने स्वयं लिंकर स्क्रिप्ट बनाने, और मूल लिंकर स्क्रिप्ट इतनी के रूप में इसे शामिल करने के लिए है
SOMEVAR=xxx 

master_linker_script:

include environment_linker_script 

ifeq ($(SOME_VAR),0) ... 
संबंधित मुद्दे