2012-10-14 17 views
48

लक्ष्य मशीन के लिए generate the fitting configuration files पर कोई रास्ता खोजने के बाद, क्रॉस कंपाइलर को अभी भी बनाया जाना चाहिए। 1 1/2 बिल्ड described here (और, अधिक जानकारी के साथ, here) का उपयोग करने का दृष्टिकोण काम नहीं करता है यदि होस्ट और लक्ष्य सिस्टम बहुत अधिक भिन्न होते हैं। यहाँ निर्माण स्क्रिप्ट (जो $ svn cat svn://svn.psellos.com/trunk/ocamlxarm/3.1/xarm-build साथ प्राप्त किया जा सकता) की बदली हुई भागओकैमल क्रॉस कंपाइलर का निर्माण कैसे करें

# Small steps 
config1() { 
    # Configure for building bytecode interpreter to run on Intel OS X. 
    # But specify * architecture for assembly and partial link. 
    echo 'xarm-build: ----- configure phase 1 -----' 
    ./configure \ 
      -prefix "" \ 
      -no-curses \ 
      -no-tk \ 
      -no-graph \ 
      -as "" \ 
      -aspp ""\ 
      -partialld "" 
    # Post-modify config/Makefile to select the * back end for 
    # ocamlopt (to generate * assembly code). 
    $SED -i'.bak'\ 
     -e '1i\# modified by xarm-build for OCamlXARM' \ 
     -e 's/^ARCH[ ]*=.*/ARCH=/' \ 
     -e 's/^MODEL[ ]*=.*/MODEL=/' \ 
     config/Makefile 
     #-e 's/^SYSTEM[  ]*=.*/SYSTEM=/' \ 
    $SED -i'.bak'\ 
     -e '1i\/* modified by xarm-build for OCamlXARM*/' \ 
     -e 's/^#define[  ][ ]*HAS_STACK_OVERFLOW_DETECTION.*$//' \ 
     config/s.h 

    # Post-modify utils/config.ml to tell ocamlopt to create * 
    # binaries for itself. Also tell ocamlc and ocamlopt to use * 
    # architecture when compiling C files. 
    make utils/config.ml 
    $SED -i'.bak'\ 
     -e 's#let[ ][ ]*mkexe[ ]*=.*#let mkexe ="'"$CC"'"#' \ 
     -e 's#let[ ][ ]*bytecomp_c_compiler[ ]*=.*#let bytecomp_c_compiler ="'"$CC"'"#' \ 
     -e 's#let[ ][ ]*native_c_compiler[ ]*=.*#let native_c_compiler ="'"$CC"'"#' \ 
     utils/config.ml 
} 

build1() { 
    # Don't assemble asmrun/*.S for Phase 1 build. Modify Makefile 
    # temporarily to disable. Be really sure to put back for Phase 2. 
    echo 'xarm-build: ----- build phase 1 -----' 
    trap 'mv -f asmrun/Makefile.aside asmrun/Makefile' EXIT 
    mv -f asmrun/Makefile asmrun/Makefile.aside 
    $SED -e '/^[ ]*ASMOBJS[ ]*=/s/^/#/' \ 
     -e 's#^include[  ][ ]*../config/Makefile#include ../config/Target/Makefile#' \ 
     asmrun/Makefile.aside > asmrun/Makefile 
    make world && make opt 
    mv -f asmrun/Makefile.aside asmrun/Makefile 
    trap - EXIT 
} 

संकलन stdlib सबफ़ोल्डर, जहां बुला सम्मेलनों पर एक अभिकथन विफल रहता है में फंस जाता है।

let loc_external_arguments = 
    match Config.system with 
    | "rhapsody" -> poweropen_external_conventions 0 7 100 112 
    | "elf" | "bsd" -> calling_conventions 0 7 100 107 outgoing 8 
    | _ -> assert false 

भी इस मुद्दे पर पाने के लिए, amsrun/Makefile पार संकलन toolchain उपयोग करने के लिए संशोधित किया जा सकता था, और HAS_STACK_OVERFLOW_DETECTION के बाद से amsrun/signals_asm.c config/श से हटाया जाना था अन्यथा संकलित नहीं किया जा सका।

तो क्या यह काम करने का कोई तरीका है, या this manner में अन्य दृष्टिकोण बेहतर अनुकूल हैं (और ओसीएमएल की 4.00.0 रिलीज के साथ काम करते हैं)?

+7

मेरा मानना ​​है कि ओकैम सूचियां या फ़ोरम http://caml.inria.fr/resources/forums.en.html पूछने के लिए एक बेहतर जगह है। –

+0

मुझे नहीं पता कि आपका लक्ष्य कैसा दिखता है, लेकिन मुझे संदेह है कि एक्सर्म-बिल्ड स्क्रिप्ट वास्तव में बहुत करीब है। यह इंटेल पर ओएस एक्स से एआरएम (इसी तरह के सिस्टम, लेकिन बहुत अलग CPUs) पर क्रॉस संकलन के लिए काम करता है। (अस्वीकरण: मैंने एक्सर्म-बिल्ड लिखा था।) लेकिन बेसिल सही है, आपको ओकैमल मेलिंग सूचियों पर बेहतर उत्तर मिल सकते हैं। ऐसे कई छोटे विवरण हैं जिन्हें बिल्कुल सही होना है। –

+0

@ जेफरीस्कोफिल्ड इसकी (लिनक्स, i386) -> (लिनक्स, पीपीसी)। ये प्लेटफ़ॉर्म बहुत अलग नहीं होने चाहिए, लेकिन ऐसा लगता है कि ऑब्जेक्ट फ़ाइल/निष्पादन योग्य फ़ाइल स्वरूप थोड़ा अलग हैं। वैसे भी, मैं ओसीएएमएल लोगों से पूछूंगा। धन्यवाद। –

उत्तर

5

प्रश्न ने खुद को उत्तर दिया है ... बल्कि अजीब तरीके से। वास्तव में यह पूछ रहा था कि (2012 में) ओकैम के संस्करण 4.x के लिए आईओएस का एक क्रॉस-कंपाइलर लक्ष्यीकरण (एक अनिर्दिष्ट संस्करण) था। और सवाल में कोड डंप ओककल 3.1.x के लिए जेफरी स्कोफील्ड के क्रॉस-कंपाइलिंग निर्देश और स्क्रिप्ट (ओकैमक्सम/3.1) का उपयोग करने की कोशिश कर रहा था, जो ओकैम 4.0 के लिए काफी काम नहीं करता था। लेकिन Scofield's web page, जिस पर सवाल लिंक है, वास्तव में ओकैम 4.0 (वर्तमान में ओकंप -401.0 + xarm-4.0.2-v7) के लिए समाधान प्रदान करने के लिए (दिसंबर 2014 में अंतिम) अपडेट किया गया है, इस प्रकार सवाल उठा रहा है जैसा कि यहां पूछा गया है ("यह काम करने का कोई तरीका है") म्यूट या काफी तुच्छ। या तो:

  • वर्तमान में उस वेब पेज पर प्रदान किए गए पूर्व निर्मित ocaml-4.01.0+xarm-4.0.2-v7.dmg पैकेज डाउनलोड करें। उपयोग निर्देश को भी पढ़ना सुनिश्चित करें, और अपने cross-compiling wrapper script का उपयोग कर अपने जीवन को आसान बनाएं जो आपको आईओएस 7 और 8 लक्ष्यों के बीच स्विच करने देता है। या यदि आपको किसी भी तरह से स्रोतों से ओकंपल क्रॉस-कंपाइलर बनाने की आवश्यकता है ...
  • पृष्ठ के "परिशिष्ट: स्रोतों से बिल्डिंग" अनुभाग में दिए गए निर्देशों का पालन करें (इसके लिए एक HTML एंकर नहीं लगता है, माफ़ कीजिये)। ये निर्देश दुर्भाग्य से बारह पैराग्राफ (9 केबी टेक्स्ट) लंबे हैं, इसलिए मैं उन्हें यहां कॉपी करने वाला नहीं हूं। इसमें आईओएसएल 4.0.1 को क्रॉस-कंपाइलिंग के लिए necessary patches का लिंक शामिल है। उम्मीद है कि, उस वेब पेज पर जो लिखा गया है वह उपर्युक्त ओकंपल-4.01.0 + xarm-4.0.2-v7.dmg बनाने के लिए उपयोग किए जाने वाले कदम हैं। हालांकि, चूंकि उस डीएमजी पैकेज के लिए RedHat-style SRPM के ऐप्पल समकक्ष की तरह कुछ नहीं है (क्या ऐप्पल की समकक्ष तकनीक भी है?), यह पूरी तरह से निश्चित नहीं है कि उपर्युक्त डीएमजी उत्पन्न करने के लिए उपयोग किए गए चरणों को पूरी तरह से पुन: उत्पन्न किया जाता है वेब पृष्ठ। मेरे पास ने स्वयं को यह देखने के लिए उन चरणों का पालन करने की कोशिश की है कि वे काम करते हैं या नहीं।

लेकिन मुझे लगता है कि फिर भी सवाल पूछा गया है कि स्कोफील्ड के वेबपृष्ठ से प्री-बिल्ट 4.0.1 बाइनरी डाउनलोड करके "इस काम को करने का कोई तरीका है" के सामान्य अर्थ में मूल रूप से हल किया गया है ... सवाल में सही है। स्कोफिल्ड के ओकैमक्सर्म बिल्ड सिस्टम संस्करण 3.1 के साथ समस्याएं ओकंप 4.0 को क्रॉस-कंपाइल करने में सक्षम नहीं होने चाहिए, इस बिंदु पर कोई भी परवाह नहीं करता है। यदि स्कोफिल्ड के निर्देशों या 4.0 के लिए पैच के साथ पैच में समस्याएं हैं, तो मुझे अलग-अलग पूछा जाना चाहिए, मुझे लगता है, क्योंकि यहां प्रश्न से नटली गड़बड़ियां उस परिदृश्य के लिए अप्रासंगिक लगती हैं।

(और अगर ऊपर बहुत ज्यादा पंडिताऊ लगता है, यह ज्यादातर mods के अनुरोध के द्वारा किया गया है कि मैं उसकी वर्तमान स्थिति पर मेरा उत्तर का विस्तार किया है।)

हालांकि ओपी शायद मैं क्या कर रहा हूँ के बारे में परवाह नहीं करता इस पैराग्राफ में कहने जा रहे हैं कि उनके प्रश्न का शीर्षक कितना सामान्य है, मैं बताता हूं कि ओकेमल क्रॉस-कंपाइलर को एंड्रॉइड को लक्षित करने वाली एक हालिया परियोजना भी मौजूद है, जिसे opam-android कहा जाता है। और इस के पास गिट रेपो में स्क्रिप्ट के रूप में इसकी सभी बिल्डिंग बिट्स हैं, इसलिए इसे चोरी करना आसान हो सकता है-यह कैसे किया जाता है। इन दो क्रॉस-कंपाइलरों के पैच की तुलना में, सामान्य रूप से कहा जा सकता है कि OCaml को क्रॉस-कंपाइलर के रूप में कैसे काम करना है: आपको इसे विशिष्ट लक्ष्य प्लेटफ़ॉर्म के लिए हैक करना होगा। एक बात मैं कहूंगा कि स्कोफिल्ड का आईओएस पैच एंड्रॉइड पैच की तुलना में बहुत अधिक आक्रामक (और बहुत लंबा) है। स्कॉफील्ड के पैच को बहुत से रजिस्टर-स्तरीय कोड पीढ़ी के साथ करना है। मुझे आईओएस आंतरिक के बारे में पर्याप्त जानकारी नहीं है कि आईओएस के लिए उन बदलावों की आवश्यकता क्यों थी, लेकिन एंड्रॉइड के लिए नहीं, यहां तक ​​कि वे मूल रूप से उसी एआरएम सीपीयू परिवार को भी नियोजित करते हैं। हो सकता है कि किसी को इसे वास्तव में एक दिलचस्प/गैर-मामूली सवाल के रूप में पूछना चाहिए कि जेफरी स्कोफील्ड शायद जवाब देने में खुश होंगे।