क्रॉस संकलन संकलित करें और छोटे बायनेरिज़ कैसे प्राप्त करें

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

मैं अपने बल्कि रस्ट-कौशल की कमी नहीं होने दूंगा या किसी अन्य भाषा के इस अद्भुत जानवर में जाने के लिए एक और ट्यूटोरियल प्रदान करने की कोशिश करूंगा। रुस्त को सीखने के लिए कई अन्य महान स्रोत हैं, जैसे। जंगलों या जंग की किताब।

जो मैं आपको दिखाना चाहता हूं वह रस्ट इकोसिस्टम का दूसरा पहलू है जो जीवन को इतना आसान बनाता है।

क्रॉस संकलन

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

मेरे मामले में मुझे एआरएम वी 7 पर लिनक्स के लिए कुछ अनुप्रयोगों को संकलित करने के लिए मैक ओएस एक्स का उपयोग करने की आवश्यकता है।

मैं क्रॉस संकलन से नफरत करता हूं

जिस ऑपरेटिंग सिस्टम पर आप काम कर रहे हैं, उसे बर्बाद करने के लाखों तरीके हैं और क्रॉस कंपाइलिंग उनमें से एक है। यह आम तौर पर निर्दोष विचार के साथ शुरू होता है कि एक बिल्ड चेन आपको एक छोटे से प्रोग्राम के लिए लिंकसीस WRT 1900 ACS (OpenWRT और ARMv7) पर चलने की आवश्यकता है।

अपने आस-पास खुदाई करने से Reddit पर कई अलग-अलग स्निपेट मिलते हैं या कुछ GitHub प्रोजेक्ट में एक समस्या होती है जहां एक यादृच्छिक व्यक्ति ने कुछ पंक्तियाँ पोस्ट कीं जो कि आपकी आवश्यक जानकारी के उस गुम हुए बिट की तरह ही दिखती हैं।

फिर बैश चलाना निम्न में से एक चीज़ का कारण बन सकता है:

  • एक कार्यशील निर्माण श्रृंखला बनाएँ (बहुत असंभावित)
  • एक बिल्ड चेन बनाएं जो आपके बिल्ड के 80% के बाद विफल हो जाए
  • एक स्थानीय बिटकॉइन माइनर जोड़ें, जबकि वास्तव में एक कार्यशील निर्माण श्रृंखला बनाने का दिखावा किया जाता है

थोड़ा और अधिक ज्ञानी (उर्फ बूढ़ा होने के नाते) मैं इन चीजों के बारे में थोड़ा सतर्क हूं। इसलिए मैं आम तौर पर अपने सभी प्रयोगों के लिए सर्वशक्तिमान हैशिकॉर्प द्वारा वैग्रेंट का उपयोग करता हूं।

मैंने अपनी ज़रूरत की बिल्ड चेन बनाने की प्रक्रिया में कई टन वज्रेंट-बॉक्स तोड़ दिए (मई उनकी आत्मा को शांति मिले)।

इसने 90 के दशक में जहां सी-कोडर के रूप में शुरुआत की, वहां से बहुत सारी बुरी यादें वापस ला दीं, इसने मुझे लगभग जेवीएम (ग्रेगल मूल छवि का उपयोग करके) या गो क्रॉस संकलन का उपयोग करने के लिए वापस कर दिया।

अगर मैं ट्रायल-एंड-एरर-मोड में जाने से पहले इतनी लंबी खोज कर लेता तो मैं खुद को इतनी निराशा से बचा सकता था।

मैं क्रॉस संकलन (और डॉकर) से प्यार करता हूँ

कई बार असफल होने के बाद मैं अंत में बैठ गया और थोड़ा शोध किया (यह मूल रूप से एक और खोज मैंने किया था ...) जिस पर रस्ट समुदाय को प्रस्ताव देना था।

और यह है कि कैसे मैंने क्रॉस पाया, डॉकर पर आधारित एक संकलन श्रृंखला प्रबंधन उपकरण। और ईमानदारी से: यह सब मैंने कभी चाहा है जब यह क्रॉस-संकलन के लिए आता है।

क्रॉस कमांड प्राप्त करने के लिए निम्नलिखित कमांड चलाएँ:

कार्गो स्थापित पार

अब से, एक और आर्किटेक्चर के लिए निर्माण निम्न कमांड में टाइप करना सरल है:

cross build --target = armv7-Unknown-linux-musleabihf

यह एक बाइनरी का उत्पादन करेगा जो OpenWRT आर्म v7 लक्ष्य प्लेटफॉर्म पर चल सकता है।

सफलता!

बैकग्राउंड में क्या होता है डॉकटर कंटेनर को खींचा जाता है जिसमें व्यक्तिगत निर्माण श्रृंखला होती है - जो लक्ष्य के रूप में निर्दिष्ट होती है। आपका कोड कंटेनर में रखा जाएगा जहां बाइनरी का निर्माण वास्तविक संकलन में होता है।

इस दृष्टिकोण के कई फायदे हैं:

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

अचानक मेरी बुरी सी-यादें दूर हो गईं और मैंने चारों ओर पड़े विभिन्न एआरएम-सॉक्स के लिए बिल्ड पाइपलाइनों के साथ खेलना शुरू कर दिया। वे लड़ने के घंटे गए, उपलब्ध श्रृंखलाओं की सूची को ब्रिसिंज के साथ बदल दिया और जल्दी से उनके साथ खेल रहे थे।

परिणाम और कुछ आकार में सुधार

आइए क्रॉस-कंपाइलर द्वारा उत्पादित परिणामों पर एक नज़र डालें।

मैंने एक छोटा सा प्रयोग किया, एक रस्ट प्रोग्राम बनाया जो गेस्ट अकाउंट्स के लिए क्यूआर-कोड्स को मेरे होम-वाईफाई (OpenWRT को चलाने वाला एक लिंक्डइन लिंक) प्रदान करेगा।

निम्नलिखित लाइन का उपयोग करके मैं एक बाइनरी बनाने में सक्षम था:

cross build --target = armv7-Unknown-linux-musleabihf

परिणामी बाइनरी का आकार 5.7 एमबी था। जो कि एक SoC पर तैनात करने के लिए काफी पैकेज है जहां डिस्क स्थान बिल्कुल प्रचुर नहीं है।

संकलक विकल्पों में थोड़ा खोदने का समय।

- रिलीज के विकल्प का उपयोग करके हम बाइनरी से डिबग प्रतीकों को छीनने में सक्षम हैं:

cross build --release --target = armv7-Unknown-linux-musleabihf

यह आकार को 3.0 एमबी तक कम कर देता है, अल्मोस 50% की कमी। प्रभावशाली, लेकिन अभी भी इस तरह की छोटी कार्यक्षमता के लिए एक बड़ा द्विआधारी।

लेकिन हम संकलित गुलाब हैं इसलिए हमें कहीं और देखना होगा।

हाल ही में, इंस्टाना में अपने वर्तमान प्रोजेक्ट के लिए कुछ गो-कोड पर काम करते हुए, मैंने अपैक्स की खोज की। UPX निष्पादक के लिए एक पैकेट है जो आकार-गो-बायनेरिज़ को कम करने के लिए बहुत अच्छा काम करता है। मुझे लगा कि यह मेरे नए क्रॉस संकलित बाइनरी के साथ एक कोशिश के लायक हो सकता है:

अपक्स --brute 

परिणाम: बाइनरी 700 केबी तक नीचे है।

यह मेरे द्वारा अपेक्षित किसी भी चीज से बेहतर है। हम प्रारंभिक आकार से 88% नीचे हैं, मेगाबाइट के नीचे।

सारांश

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

लेकिन मेरा पसंदीदा परिणाम UPX द्वारा प्राप्त आकार में कमी है।