2012-10-14 14 views
48

Po znalezieniu sposobu na maszynę docelową do maszyny generate the fitting configuration files, sam kompilator krzyżowy musi zostać zbudowany. Podejście wykorzystujące kompilację 1 1/2 described here (i, z bardziej szczegółowymi informacjami, here) wydaje się nie działać, jeśli system hosta i system docelowy różnią się zbytnio. Oto Zmieniona część skryptu build (które mogą być uzyskane z $ svn cat svn://svn.psellos.com/trunk/ocamlxarm/3.1/xarm-build)Jak zbudować kompilator krzyżowy OCaml

# 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 
} 

Kompilacja utknie w stdlib podkatalogu, gdzie twierdzenie na konwencjach zawijających zawiedzie.

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 

nawet dostać się do tego punktu, amsrun/Makefile musiały zostać zmodyfikowane w celu zastosowania cross kompilacji toolchain i HAS_STACK_OVERFLOW_DETECTION musiały zostać usunięte z config/sh od amsrun/signals_asm.c nie można skompilować w inny sposób.

Czy istnieje sposób na wykonanie tej pracy, czy też inne podejścia w this manner są lepiej dostosowane (i pracują z wersją OCaml 4.00.0)?

+7

Uważam, że listy Ocaml lub fora http://caml.inria.fr/resources/forums.en.html są lepszym miejscem do zapytania. –

+0

Nie wiem, jak wygląda twój obiekt docelowy, ale podejrzewam, że skrypt xarm-build jest całkiem blisko. Działa na krzyżową kompilację z OS X na Intel na iOS na ARM (podobne systemy, ale bardzo różne procesory). (Zrzeczenie się: napisałem xarm-build.) Ale Basile ma rację, możesz uzyskać lepsze odpowiedzi na listach mailowych OCaml. Jest wiele drobnych szczegółów, które muszą być dokładnie w porządku. –

+0

@JeffreyScofield Its (Linux, i386) -> (Linux, PPC). Platformy te nie powinny być zbyt różne, ale wydaje się, że pliki obiektów/plików wykonywalnych różnią się nieznacznie. W każdym razie, poproszę facetów OCAML. Dzięki. –

Odpowiedz

5

Pytanie samo sobie odpowiedziano ... w dość dziwny sposób. To, o co naprawdę prosiło (w 2012 r.) Było kierowanie na różne kompilatory (nieokreśloną wersję) iOS dla wersji 4.x systemu Ocaml. I zrzut kodu w pytaniu próbował użyć instrukcji i skryptu krzyżowego kompilacji Jeffrey Scofield (ocamlxarm/3.1) dla Ocaml 3.1.x, który nie działał zupełnie na Ocaml 4.0. Jednak w międzyczasie zaktualizowano Scofield's web page, do której to pytanie się odnosi, w celu zapewnienia rozwiązania dla programu Ocaml 4.0 (obecnie ocaml-4.01.0 + xarm-4.0.2-v7), co sprawia, że ​​pytanie jak zapytano tutaj ("czy istnieje sposób na wykonanie tej pracy") dyskusyjne lub dość banalne. Albo:

  • Pobierz gotowy pakiet ocaml-4.01.0+xarm-4.0.2-v7.dmg obecnie dostępny na tej stronie. Zapoznaj się również z instrukcją użytkowania i ułatw sobie życie, korzystając z jego cross-compiling wrapper script, która pozwala przełączać się między 7 i 8 obiektami docelowymi. Lub jeśli nadal potrzebujesz zbudować kompilator krzyżowy Ocaml ze źródeł ...
  • Postępuj zgodnie z instrukcjami w sekcji "Dodatek: Budowa ze źródeł" (nie ma dla niej kotwicy HTML, Przepraszam). Instrukcje te są niestety około dwunastu akapitów (9 KB), więc nie zamierzam ich tutaj kopiować. Zawierają one link do necessary patches do kompilacji krzyżowej OCaml 4.0.1 do iOS. Mam nadzieję, że to, co jest napisane na tej stronie, to dokładnie kroki użyte do zbudowania wspomnianego wcześniej pliku ocaml-4.01.0 + xarm-4.0.2-v7.dmg. Jednakże, ponieważ nie ma czegoś takiego jak odpowiednik Apple'a dla tego pakietu dmg (czy Apple ma nawet taką samą technologię?), Nie jest całkowicie pewne, że kroki użyte do wygenerowania wspomnianego dmg są całkowicie odtworzone w tym Strona internetowa. Mam , a nie próbowałem wykonać te kroki, aby sprawdzić, czy działają.

Ale myślę jednak, że pytanie zadawane jest tu w zasadzie rozwiązany w ogólnym sensie „czy jest jakiś sposób aby to działało” pobierając gotowych 4.0.1 binarnych ze strony internetowej Scofielda ... połączony bezpośrednio w pytaniu. Problemy z wersją systemu ocamlxarm w wersji 3.1 Scofielda, która nie jest zdolna do krzyżowej kompilacji programu Ocaml 4.0, powinny być przysłowiową rzeczą, na którą nikt nie ma teraz ochoty. Jeśli są problemy z instrukcjami lub łatkami Scofield dla 4.0, które nie działają, powinny być zadawane osobno, jak sądzę, ponieważ drobiazgowe błędy z tego pytania wydają się nieistotne dla tego scenariusza.

(A jeśli powyższe wydaje się zbyt pedantyczny, było przede wszystkim żądanie modów że Rozszerzyliśmy moja odpowiedź na jego obecnym stanie.)

Chociaż PO prawdopodobnie nie dba o to, co ja powiesz w tym paragrafie, biorąc pod uwagę, jak generyczny jest jego tytuł pytania, zwrócę uwagę, że istnieje również całkiem nowy projekt utrzymujący cross-kompilator OCaml kierowany na Androida, o nazwie opam-android. A ten ma wszystkie bity budowlane jako skrypty w repozytorium git, więc może być łatwiej ukraść - jak to się robi. Porównując łatki tych dwóch krzyżowych kompilatorów, niewiele można powiedzieć ogólnie, jak sprawić, aby OCaml działał jako cross-kompilator poza: musisz zhakować go dla konkretnej platformy docelowej. Jedna rzecz, którą powiem, to to, że łatka iOS Scofielda jest dużo bardziej inwazyjna (i znacznie dłuższa) niż łatki na Androida. Wiele poprawek Scofielda ma związek z generowaniem kodu na poziomie rejestru. Nie wiem wystarczająco dużo o wewnętrznych składnikach iOS, aby powiedzieć, dlaczego te zmiany były potrzebne na iOS, ale nie na Androida, nawet jeśli w zasadzie używają tej samej rodziny procesorów ARM. Może ktoś powinien zadać to pytanie jako rzeczywiście interesujące/nietrywialne pytanie, na które sam Jeffrey Scofield z przyjemnością odpowiedziałby.