"./Configure" विकल्प "--build", "--host" और "--target" का अंतर क्या है?


121

स्क्रिप्ट ./configure3 विकल्प स्वीकार करती है --build, --hostऔर --target। मैं उनकी भूमिकाओं को भ्रमित कर रहा हूं। उनमें क्या अंतर और शब्दार्थ है?


ऑटोटूलस गलत टूलचैन का उपयोग क्रॉस-कंपाइल के लिए करेगा, यहां तक ​​कि उपयोग करके --hostऔर --build। मुझे दो C ++ प्रोजेक्ट्स मिले हैं और एंड्रॉइड के लिए बनाना असंभव है क्योंकि ऑटोटॉल्स इतना f ** k'd है। यह मेजबान के टूलचिन का उपयोग करके परीक्षण चलाने पर जोर देता है।
14

जवाबों:


109

जैसा कि इस ब्लॉग पोस्ट में उल्लेख किया गया है और जीसीसी कॉन्फिग कंफर्म टर्म्स में दिया गया है , --targetकेवल तब लागू होता है जब आप टूलकिन्स संकलन कर रहे होते हैं। जब आप किसी पुस्तकालय या बाइनरी के सामान्य क्रॉस-संकलन का उपयोग कर रहे होते हैं

--build=the architecture of the build machine
--host=the architecture that you want the file to run on

हालांकि, जब आप टूलचिन का निर्माण कर रहे होते हैं , तो चीजें अधिक जटिल हो सकती हैं। मुझे लगता है कि निम्नलिखित सही है (हालांकि मैं यह नहीं कह सकता कि मैंने कभी क्रॉस-डिबगर संकलित किया है):

कहते हैं कि आपके पास है:

  • एक powerpc निर्माण मशीन है कि आप पर सभी संकलन करने जा रहे हैं
  • कई एम्बेडेड डिवाइस, जिसमें mips प्रोसेसर होते हैं, जो आपका कोड चलने वाला होता है
  • एक x86 लैपटॉप जिसे आप इन उपकरणों को क्षेत्र में डीबग करने के लिए उपयोग करने जा रहे हैं

आप कॉन्फ़िगर करेंगे और अपने डीबगिंग सर्वर (जैसे gdbserver) को अपने एम्बेडेड डिवाइस पर चलाने के लिए बनाएंगे

./configure --build=powerpc --host=mips

ताकि आप अपने एम्बेडेड डिवाइस पर पोटीन लगा सकें और डिबगिंग शुरू करने और पोर्ट 1234 को सुनने के लिए "gdbserver: 1234 a.out" चलाएं।

फिर आप अपने डिबगिंग क्लाइंट (जो कि gdbserver से कनेक्ट और नियंत्रित करता है) का निर्माण करेंगे

./configure --build=powerpc --host=i686 --target=mips 

जिसे आप अपने x86 लैपटॉप में कॉपी कर लेंगे ताकि आप अपने a.out प्रोग्राम को डीबग करने के लिए "gdbclient एम्बेडेड .device: 1234" चला सकें।

यह सब कंपाइलर पर भी लागू होता है जिसके लिए आप ऊपर दिए गए जीसीसी लिंक या कनाडाई क्रॉस कंपाइल के बारे में इस सेक्शन को देखना चाहते हैं ।

यह भी ध्यान दें कि, व्यवहार में, आप ऑटोकॉन्फ़ मैनुअल पेज के अनुसार, बिल्ड, होस्ट या लक्ष्य को निर्दिष्ट नहीं देख सकते हैं , "config.guess के परिणाम के लिए होस्ट करने, निर्माण करने और होस्ट करने के लिए लक्ष्य डिफॉल्ट्स।"

एक शब्द में, कोड का निर्माण करें --build, इसे वास्तुकला वातावरण के --hostसाथ चलाएं --target


11
कैसे पता लगाएं कि "होस्ट" और "लक्ष्य" के लिए क्या रखा जाए?
ब्लैक

4
मुझे लगता है कि आप एक नए संकलक के निर्माण के बारे में बात कर रहे हैं, क्योंकि "--target" केवल संकलक के लिए प्रासंगिक है। * "होस्ट" वह जगह है जहां आपका नया संकलक चलना चाहिए। * "लक्ष्य" वह जगह है जहां आपके नए संकलक द्वारा निर्मित निष्पादनयोग्य चलने चाहिए।
user1735594

यह गलत जवाब के रूप में नहीं है, क्योंकि --host = i686 यहाँ मान्य नहीं है?
उल्लंघन किया

1
प्रदान किए गए उत्तर का उल्लेख संकलन MIPS लक्ष्य के लिए किया गया था और यह बिल्ड है, और होस्ट MIPS मशीन के लिए डीबगर है। इसका मतलब यह है कि पॉवरबग द्वारा डीबगर / कंपाइलर भी बनाया गया था? यह एक टिप्पणी है जो मुझे किसी अन्य उपयोगकर्ता (नेड) से मिली: बिल्ड = जहां मैं कंपाइलर का संकलन कर रहा हूं, मेजबान = जहां कंपाइलर चलेगा, लक्ष्य = कंपाइलर किस कोड का उत्पादन करेगा। संदर्भ: stackoverflow.com/questions/7088576/…
supmethods

नेड के अनुसार, इसका मतलब यह नहीं होगा कि पावरपीसी बिल्ड / होस्ट दोनों है, x86 मशीन डिबगर का एक लक्ष्य है, और MIPS सिस्टम के रूप में लक्ष्य है। क्या आप अधिक बता सकते हैं कि "किसके लिए बिल्डिंग" और "बिल्डिंग ऑन" है? मैं gcc.gnu.org/oniltocs/gccint/Configure-Terms.html का संदर्भ ले रहा हूं
सुपरमैथोड्स

75

नोट: तर्क --targetकेवल तभी समझ में आता है जब संकलक (जैसे जीसीसी) का निर्माण होता है। configureजीसीसी के निर्माण से पहले चलने पर :

  • --build: आप जिस मशीन पर निर्माण कर रहे हैं
  • --host: जिस मशीन के लिए आप निर्माण कर रहे हैं
  • --target: मशीन जो GCC के लिए बाइनरी का उत्पादन करेगी

से जीसीसी प्रलेखन ( मेजबान / लक्ष्य विशिष्ट स्थापना नोट्स ):

यदि निर्माण, मेजबान और लक्ष्य सभी समान हैं, तो इसे मूल निवासी कहा जाता है। यदि बिल्ड और होस्ट समान हैं, लेकिन लक्ष्य अलग है, तो इसे क्रॉस कहा जाता है। अगर बिल्ड, होस्ट और टारगेट सभी अलग-अलग हैं, तो इसे कनाडा कहा जाता है (अस्पष्ट कारणों से कनाडा की राजनीतिक पार्टी और उस समय बिल्ड पर काम करने वाले व्यक्ति की पृष्ठभूमि के साथ काम करना)। यदि होस्ट और लक्ष्य समान हैं, लेकिन बिल्ड अलग है, तो आप एक क्रॉस-कंपाइलर का उपयोग एक अलग सिस्टम के लिए एक देशी बनाने के लिए कर रहे हैं। कुछ लोग इसे होस्ट-एक्स-होस्ट कहते हैं, जो पार किया हुआ देशी या क्रॉस-निर्मित देशी है। यदि निर्माण और लक्ष्य समान हैं, लेकिन होस्ट अलग है, तो आप क्रॉस कंपाइलर बनाने के लिए एक क्रॉस कंपाइलर का उपयोग कर रहे हैं जो आपके द्वारा बनाई जा रही मशीन के लिए कोड का उत्पादन करता है। यह दुर्लभ है, इसलिए इसका वर्णन करने का कोई सामान्य तरीका नहीं है। इसे क्रॉसबैक कहने का प्रस्ताव है।


2
जाहिरा तौर पर इसका मतलब --targetकिसी भी परियोजना के लिए प्रासंगिक नहीं है, जो स्वयं संकलक नहीं है। तो यह एक मानक कॉन्फ़िगर विकल्प क्यों है? भ्रामक।
dhardy

1
@ दही: configureबिल्कुल अच्छे और साफ डिजाइन का शिखर नहीं है; मुझे लगता है कि यह केवल एप्लिकेशन-विशिष्ट सुविधा रेंगना का एक परिणाम है।
टिम Timस

यदि मैं एक gcc प्राप्त करना चाहता हूं, उदाहरण के लिए "./configure --build = powerpc --host = i686 --target = mips", तो आउटपुट निष्पादन योग्य अपंग है? आमतौर पर, जीसीसी एक शक्तिशाली उपकरण है जो सी कोड बना सकता है, फिर कई प्लेटफ़ॉर्म के लिए कई तरह के परिणाम का उत्पादन कर सकता है। यहां अगर मैं '--target = mips' का उपयोग करता हूं, तो क्या निर्दिष्ट gcc क्षमता खो गई है?
gfan

क्या यह भी हो सकता है काम .. config.guess और config.sub फ़ाइलों का अद्यतन करने के लिए है, तो संकलक अधिक लक्ष्य प्लेटफार्मों जानता है आप उन्हें यहां प्राप्त कर सकते हैं: gnu.org/software/gettext/manual/html_node/config_002eguess.html
wirtsi
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.