2009-10-09 16 views
7

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

setup library1 
setup library2 
source some_other_setup_script.bash 
g++ blah.c 
# setup is a executable on my system that run some scripts 

मैं इसे पूरा करने वाले मेकफ़ाइल कैसे लिखूं? जहां तक ​​मैंने कोशिश की, एनवी परिवर्तनीय निर्यात ("वीएआर = याद; निर्यात $ VAR" काम नहीं करेगा)

उत्तर

5

यदि परिवर्तनीय निर्यात आपके कमांड लाइन पर जिस तरह से काम नहीं कर रहा है, तो यह सुझाव देता है कि मेक वैरिएबल को संभालने के लिए अलग वाक्यविन्यास के साथ अलग-अलग वाक्यविन्यास के साथ एक शेल चुन रहा है (export VAR=remember; echo $VAR मेरे लिए ठीक काम करता है)। डिफ़ॉल्ट रूप से /bin/sh का उपयोग करें, लेकिन आप इसे SHELL चर के साथ ओवरराइड कर सकते हैं, जो पर्यावरण से आयात करता है। मैं सुझाव देता हूं कि आप अपने पर्यावरण में जो कुछ भी उपयोग कर रहे हैं और export VAR=remember प्रयोग फिर से प्रयास कर रहे हैं, SHELL (मेकफ़ाइल में) को सेट करें।

+0

मैं भी महसूस करते हैं कि मैं $$ वीएआर का उपयोग करना चाहिए ताकि मेकअप में सोच भी नहीं होगा कि मैं एक मैक्रो के हवाले कर रहा हूँ ... – polyglot

+3

यह वास्तव में इसका मतलब यह नहीं है। जीएनयू मेकअप बस comand में प्रत्येक पंक्ति के लिए एक नया खोल चलाता है। (मुझे लगता है वह साथ दो आदेशों संयुक्त, संक्षिप्तता के लिए) http://www.gnu.org/software/make/manual/make.html#Execution "जब यह एक लक्ष्य को अद्यतन करने के आदेश पर अमल करने का समय है, वे प्रत्येक कमांड लाइन के लिए एक नया subshell लागू द्वारा क्रियान्वित कर रहे। " –

3

अंत में आपको चर को परिभाषित करने और एक खोल में कंपाइलर निष्पादित करने की आवश्यकता होगी make कमांड के बजाय सूची या यहां तक ​​कि एक स्क्रिप्ट भी। हालांकि, कुछ परिशोधन आप जोड़ सकते हैं। आप स्क्रिप्ट के बारे में बता सकते हैं make:

maintarget: script.sh blah.c 
    source script.sh; g++ blah.c 

script.sh: 
    setup include script here 

एक और बात सिर्फ एक ही खोल में वह सब सामान पर अमल करने

maintarget: blah.c 
    run this; run that; run the other thing; g++ blah.c 

मेरा मानना ​​है कि सभी make संस्करण एक ही खोल में एक ; सूची चलेंगे होगा , लेकिन आप हमेशा (list) के साथ एक सबहेल को मजबूर कर सकते हैं या विशेष रूप से एक शेल स्क्रिप्ट को संकलक कमांड रैपर के रूप में कॉल करके।

उचित लक्ष्य आपके स्क्रिप्ट पर निर्भर होने के लिए मत भूलना। बीटीडब्ल्यू, कुछ make संस्करण (pmake उर्फ ​​bsd make) एक मेक वैरिएबल को परिभाषित करते समय कमांड निष्पादित कर सकते हैं, और make के सभी संस्करणों को निर्यात करते हैं। लेकिन मुझे नहीं लगता कि gmake ऐसा कर सकता है।

1

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

Makefile:

all: 
    echo $(FOO) 

test.mk: test.sh 
    ./$< > [email protected] 

include test.mk 

test.sh

echo "FOO=1" 

रनिंग निर्देशिका इस Makefile युक्त "बनाने" का उत्पादन:

make: Entering directory `/home/luser/build/mktest' 
Makefile:7: test.mk: No such file or directory 
./test.sh > test.mk 
make: Leaving directory `/home/luser/build/mktest' 
make: Entering directory `/home/luser/build/mktest' 
echo 1 
1 
make: Leaving directory `/home/luser/build/mktest' 

मेकअप test.mk बनाता है खोल स्क्रिप्ट चलाकर, इसमें शामिल है। test.mk में test.sh का आउटपुट होता है, और इसे मेकफ़ाइल के रूप में पार्स किया जाता है। अधिक जानकारी के लिए http://www.gnu.org/software/make/manual/make.html#Include देखें।
हम मोज़िला के क्लाइंट में इसका एक संस्करण उपयोग करते हैं। http://mxr.mozilla.org/mozilla-central/source/client.mk#138

11

तुम भी जीएनयू की मशीनरी के साथ ठीक से वातावरण चर जोड़ सकते हैं, ताकि जैसे: mk आप एक "mozconfig" फ़ाइल में विकल्पों को परिभाषित करने देने के लिए

export TEST:="Something Good!" 
test: 
    echo $$TEST 

यह (मुझे लगता है कि) अलग है अर्थशास्त्र:

TEST2:="Something not quite so useful?" 
test2: 
    echo ${TEST2} 

जो (फिर, मुझे लगता है) खोल के साथ गुजरने से पहले प्रतिस्थापन करता है। ध्यान दें कि निर्यात आदेश लक्ष्य ब्लॉक के भीतर काम नहीं करता है, बस एक तुरंत निष्पादित आदेश के रूप में इंडेंट नहीं की गई।

0

Restatement: मैं एक मेकअप फ़ाइल में एक खोल चर कैसे मिलता है?

कुछ की तरह:

MYVAR := $(shell echo $(MYVAR)) <any_makefile_additions_here> 

तो, यह एक makefile अंदर myVar को परिभाषित करता है जब एक वातावरण चर नामित myVar भी स्थापित किया जाएगा।

0

यह रुचि का हो सकता है कि, एक मेकफ़ाइल में पहले से परिभाषित एक विकल्प को ओवरराइड करने के लिए, make समर्थन करता है (मैं जीएनयू मेक 3.82 का संदर्भ दे रहा हूं, लेकिन शायद अन्य संस्करण भी) विकल्प -e विकल्प। उदाहरण:

Makefile:

CC=gcc 
... 

रन बना:

CC=gcc-4.7 
make -e 

का उपयोग करेगा जीसीसी-4.7 के बजाय जीसीसी।

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