2010-01-26 10 views
20

में बिन के लिए बाइनरी उत्पन्न करना/मैंने इस प्रश्न का उत्तर खोजा लेकिन कोई अच्छा नहीं मिला। शायद वे बूढ़े हो गए हैं और कुछ बदल गया है, इसलिए मैं फिर से पूछता हूं।Automake bin/

मैं के रूप में एक निर्देशिका संरचना है:

my_project

  • src

  • बिन

मैं चाहता हूँ कि, जब मैं जड़ dir में कर सकता हूँ, द्विआधारी को ./src के बजाय ./bin में रखा जाता है। पर कैसे?

संपादित करें: मैं सी ++ का उपयोग कर रहा हूं। My Makefile.am में कुछ खास नहीं है। बस bin_PROGRAM और _SOURCES चर।

जब मैं दौड़ता हूं, उत्पन्न बाइनरी को ./src में डाल दिया जाता है। मैं बस उन्हें ./bin में चाहता हूँ।

+0

जो आपने किया है (अपनी मेकफ़ाइल) पोस्ट करें, ऊपर अपनी निर्देशिका संरचना को स्पष्ट करें, फिर यह मदद करना बहुत आसान होगा (साथ ही, प्रोग्रामिंग भाषा जो आप उपयोग कर रहे हैं वह प्रासंगिक हो सकती है) – KevinDTimm

+0

क्या आप पूर्ण ऑटोटूल स्टैक का उपयोग कर रहे हैं? यदि ऐसा है, जैसा कि @Braden ने उल्लेख किया है, तो Autoconf द्वारा उत्पन्न 'कॉन्फ़िगरेशन' खोल स्क्रिप्ट का उपयोग करें। – Plamen

+0

http: // stackoverflow।com/प्रश्न/1015700/autotools-पुस्तकालय और वस्तु-फ़ाइल-उत्पादन नियंत्रण –

उत्तर

29

आपको यहां गलत विचार है।

आपका निर्माण पेड़ जहां भी आप configure चलाते हैं। इस तरह ऑटोकॉन्फ को काम करने के लिए डिज़ाइन किया गया है। आपके पैकेज के उपयोगकर्ता (जो अपने स्रोत पेड़ को अव्यवस्थित नहीं करना चाहते हैं) इस तरह से काम करने की उम्मीद करेंगे।

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

18

यदि आप अपनी निर्देशिकाओं को अपेक्षाकृत अलग तरीके से सेट अप करने का प्रयास करते हैं तो ऑटोमैक बहुत अच्छी तरह से सामना नहीं करता है। आप जो चाहते हैं उसे द्विआधारी को ../bin पर संकलित करने के बाद अतिरिक्त नियम लिखना शामिल होगा, जो अनिवार्य रूप से जटिल है।

आप अपने स्रोत निर्देशिका को अस्त-व्यस्त करने के लिए नहीं करना चाहते हैं, इस प्रयास करें:

cd my_project 
mkdir build 
cd build 
../configure 
make 

बस इतना ही उत्पन्न फ़ाइलों डाल देंगे my_project/build की उपनिर्देशिका में (makefiles, बाइनरी, वस्तु फ़ाइलों की तरह)।

+0

यह काम करता है, लेकिन थोड़ा clusmy है। मैं यह कर सकता था, लेकिन अगर दूसरों ने मेरे सॉफ्टवेयर का उपयोग किया तो क्या होगा? वे अपने ./src cluttered होगा। शायद मैं इन आदेशों को मेकफ़ाइल के सभी नियमों में जोड़ सकता हूं? –

+1

'कॉन्फ़िगरेशन' मेकफ़ाइल उत्पन्न करता है, इसलिए आप उस कमांड को मेकफ़ाइल में नहीं डाल सकते हैं। मैं सुरक्षित रूप से कह सकते हैं कि ज्यादातर लोगों को, उनके ./src अव्यवस्थित होने के बारे में परवाह नहीं है क्योंकि Automake हमेशा उस तरह से काम करता है। यह उन लोगों के लिए मानक समाधान है जो देखभाल करते हैं। और क्या होगा यदि वे एक ही निर्देशिका में द्विआधारी होने पसंद करते हैं? आप अभी भी इसे अपने तरीके से सेट अप करना चाहते हैं, मैं वहाँ ऐसा करने के लिए कि Automake देने के बिना (हालांकि आपको अभी Autoconf उपयोग कर सकते हैं।) – ptomato

+2

इसके अलावा, यदि अन्य लोगों को अपने सॉफ्टवेयर का उपयोग और देखें कि यह है कि किसी भी तरह से है नहीं लगता है autoconf/automake का उपयोग करता है, वे इसे एक अलग निर्देशिका में सामान का निर्माण करने के (जब तक कि वे elsewere कॉन्फ़िगर के रूप में दिखाया गया है ptomato चलाकर इसके लिए व्यवस्था) की उम्मीद नहीं होंगे। यह केवल जीएनयू बिल्ड सिस्टम का दर्शन है, और ऑटोकॉन्फ़/ऑटोमेक जीएनयू बिल्ड सिस्टम को लागू करने के लिए उपकरण हैं और कुछ और नहीं। आप जीएनयू प्रणाली का निर्माण के उपयोगकर्ता ठेठ उपयोग के मामलों के लिए Automake की परिचयात्मक अध्याय को देखने के लिए चाहते हो सकता है: http://sources.redhat.com/automake/automake.html#Use-Cases – adl

14

एक निश्चित निर्देशिका में द्विआधारी बनाने के लिए ऑटोमैक को बताने का एक तरीका यह है कि इस निर्देशिका को "bin_PROGRAMS" चर में नाम में सही तरीके से जोड़ना है।

निम्नलिखित src/Makefile.am पर विचार करें:

bin_PROGRAMS = foo 
foo_SOURCES = ... 
foo_CPPFLAGS = ... 
foo_LDFLAGS = ... 

यह एक बाइनरी "src/foo" बनाता है, लेकिन आप src में स्रोतों का उपयोग करने के लिए एक द्विआधारी "बिन/foo" बनाने के लिए Automake बता सकते हैं :

bin_PROGRAMS = $(top_builddir)/bin/foo 
__top_builddir__bin_foo_SOURCES = ... 
__top_builddir__bin_foo_CPPFLAGS = ... 
__top_builddir__bin_foo_LDFLAGS = ... 

मैंने इसे कुछ पैकेजों के साथ करने की कोशिश की और यहां तक ​​कि "डिस्टचेक" भी इसे निगलता है। हालांकि यह एक हैक नहीं हो सकता है ...

+0

यह सबसे अच्छा समाधान है, मुझे लगता है। सही नहीं है, क्योंकि संकलन प्रक्रिया द्वारा बनाई गई सभी .o और फ़ाइलें अभी भी src में हैं, लेकिन ... –

+1

क्या सबकुछ * सबकुल्डर से संबंधित निर्माण को स्थानांतरित करने के लिए वैसे भी है जैसे बिल्ड/(ऑब्जेक्ट फाइलों सहित, जेनरेट की गई टेक्स्ट फाइलें , .desktop फ़ाइलें, इत्यादि), उदाहरण के लिए जावा दुनिया में जो कुछ भी आम है, उदाहरण के लिए मेवेन। – lanoxx

+2

आप किसी अन्य फ़ोल्डर से कॉन्फ़िगर स्क्रिप्ट निष्पादित करने का प्रयास कर सकते हैं; उदाहरण के लिए, आप "बिल्ड" उपफोल्डर बना सकते हैं, "सीडी बिल्ड; ../configure; निष्पादित करें" निष्पादित करें। यह "बिल्ड" के बाहर सबकुछ छोड़ देगा और ऑब्जेक्ट्स और बाइनरी समेत "बिल्ड" के अंदर सभी फाइलें उत्पन्न करेगा। –

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