haskell - क्रॉस कंपाइलिंग कोड जब मैं निर्भरता स्थापित कर सकता हूं?



raspberry-pi cross-compiling (1)

इस त्रुटि को समझने के लिए, आपको यह जानने की जरूरत है कि आंतरिक रूप से कैसे cabal install संक्षेप में, यह निम्न चरणों का पालन करेगा:

  1. स्रोत कोड डाउनलोड और अनपैक करें
  2. Setup.hs संकलित करें (इस फ़ाइल का उपयोग बिल्ड सिस्टम के अनुकूलन के लिए किया जाता है, उदाहरण के लिए, आप configure चरण में अतिरिक्त हैस्केल कोड को चलाने के लिए कुछ हुक लागू कर सकते हैं)
  3. setup configure <configure flags> && setup build && setup install

समस्या यह है कि --with-ghc cabal install लिए चरण 2 के लिए भी साथ --with-ghc जीएचसी द्वारा दिए गए जीएचसी का उपयोग करता है, लेकिन उस चरण के द्वारा निष्पादित निष्पादन योग्य मेजबान सिस्टम पर चलना होगा!

एक वैकल्पिक उपाय मैन्युअल रूप से करना है, जिसका अर्थ है कि आपके पास पूर्ण नियंत्रण है। सबसे पहले, स्रोत प्राप्त करें:

$ cabal get random
Downloading random-1.0.1.3...
Unpacking to random-1.0.1.3/
$ cd random-1.0.1.3

उसके बाद, host ghc का उपयोग कर Setup.hs संकलित करें:

$ ghc ./Setup.hs -o setup

और अंत में, कॉन्फ़िगर, निर्माण और स्थापित करें जैसा कि यूरास द्वारा एक टिप्पणी में सुझाव दिया गया है, हम hsc2hs 2 hsc2hs चलाने के लिए -x विकल्प भी जोड़ते हैं:

$ ./setup configure ----with-ghc=arm-unknown-linux-gnueabi-ghc --with-ghc-pkg=arm-unknown-linux-gnueabi-ghc-pkg --with-ld=arm-unknown-linux-gnueabi-ld --hsc2hs-options=-x
$ ./setup build && ./setup install

इसके बारे में पहले से ही एक मुद्दा है: https://github.com/haskell/cabal/issues/2085

मैंने सफलतापूर्वक एक घ्सी क्रॉस कंपाइलर बनाया है, जो मुझे अपने x64 linux मशीन से armv6h (मेरे मामले में रास्पबेरी पीआई) के लिए हैस्केल कोड संकलित करने की अनुमति देता है। मैंने रास्पबेरी पर एक हैलो वर्ल्ड प्रोग्राम सफलतापूर्वक चलाया है

नहीं, मैं अपने असली ऐप का निर्माण करना चाहता हूं, जिसमें अन्य हैस्केल मॉड्यूल पर निर्भरता बहुत अधिक है। जब मैं x 64 के लिए संकलित करता हूँ तो मैं बस ऐसा करता हूं

cabal install dependenciy1 depenency2 ...

मुझे पता है कि मैं अपना खुद का कार्यक्रम बना सकता हूं, इस कदम को स्वचालित करता हूं। लेकिन यह बात यहां नहीं है।

जब मैं क्रॉस-कंपाइलर का उपयोग करने की कोशिश करता हूं

arm-unknown-linux-gnueabi-ghc --make myapp.hs

यह मुझे मॉड्यूल के बारे में बताता है जो इसे नहीं मिल सका। बेशक, वे स्थापित नहीं हैं!

मैंने https://ghc.haskell.org/trac/ghc/wiki/building/CrossCompiling पढ़ा और उस के अनुसार मैंने कोशिश की

cabal --with-ghc=arm-unknown-linux-gnueabi-ghc --with-ghc-pkg=arm-unknown-linux-gnueabi-ghc-pkg --with-ld=arm-unknown-linux-gnueabi-ld install random

यादृच्छिक मैं यहाँ स्थापित करने के लिए कोशिश कर रहा हूँ depenency है मुझे निम्नलिखित त्रुटि मिलती है:

Resolving dependencies...
Configuring random-1.0.1.3...
Failed to install random-1.0.1.3
Last 10 lines of the build log ( /home/daniel/.cabal/logs/random-1.0.1.3.log ):
/home/daniel/.cabal/setup-exe-cache/setup-Cabal-1.18.1.3-arm-linux-ghc-7.8.3.20140804: /home/daniel/.cabal/setup-exe-cache/setup-Cabal-1.18.1.3-arm-linux-ghc-7.8.3.20140804:      cannot execute binary file
cabal: Error: some packages failed to install:
random-1.0.1.3 failed during the configure step. The exception was:
ExitFailure 126

जब मैं करता हूं

file /home/daniel/.cabal/setup-exe-cache/setup-Cabal-1.18.1.3-arm-linux-ghc-7.8.3.20140804

मुझे मिला

/home/daniel/.cabal/setup-exe-cache/setup-Cabal-1.18.1.3-arm-linux-ghc-7.8.3.20140804: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 3.10.2, not stripped

कोई आश्चर्य नहीं कि यह इसे निष्पादित नहीं कर सकता यह हाथ के लिए संकलित है

क्या मुझसे कोई चूक हो रही है? मेरा लक्ष्य सभी निर्भरताएं खींचना है, फिर एक स्थैतिक रूप से लिंक किए गए ऐप बनाएं जिसे मैं अपने रास्पबेरी पर तैनात कर सकता हूं।





cabal-install