2012-10-14 7 views
48

Nach dem Finden eines Weges zu generate the fitting configuration files für die Zielmaschine, muss der Cross-Compiler selbst noch gebaut werden. Der Ansatz, der den 1 1/2 Build described here (und mit weiteren Details here) verwendet, scheint nicht zu funktionieren, wenn sich das Host- und das Zielsystem zu sehr unterscheiden. Hier ist der geänderte Teil des Build-Skript (das mit $ svn cat svn://svn.psellos.com/trunk/ocamlxarm/3.1/xarm-build erhalten werden kann)Wie man einen OCaml Cross Compiler erstellt

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

Die Zusammenstellung im Unterordner stdlib stecken bleibt, wo eine Behauptung auf Aufrufkonventionen versagt.

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 

Um auch zu diesem Punkt zu gelangen, amsrun/Makefile hatte geändert werden, das Kreuz kompilieren Werkzeugkette zu verwenden, und die HAS_STACK_OVERFLOW_DETECTION hatte von config/sh seit amsrun/signals_asm.c entfernt werden konnte nicht anderweitig kompiliert werden.

Also gibt es eine Möglichkeit, dies funktioniert, oder sind andere Ansätze in this manner besser geeignet (und arbeiten mit der Version 4.00.0 von OCaml)?

+7

Ich glaube, dass Ocaml Listen oder Foren http://caml.inria.fr/resources/forums.en.html sind ein besserer Ort zu fragen. –

+0

Ich weiß nicht, wie Ihr Ziel aussieht, aber ich vermute, dass das Skript xarm-build ziemlich nahe ist. Es funktioniert für Kreuzkompilierung von OS X auf Intel zu iOS auf ARM (ähnliche Systeme, aber sehr unterschiedliche CPUs). (Disclaimer: Ich habe xarm-build geschrieben.) Aber Basile hat Recht, Sie könnten bessere Antworten auf den OCaml-Mailinglisten bekommen. Es gibt viele kleine Details, die genau stimmen müssen. –

+0

@ JeffreyScofield Sein (Linux, i386) -> (Linux, PPC). Diese Plattformen sollten nicht zu verschieden sein, aber es scheint, dass sich die Formate der Objektdatei/ausführbaren Datei geringfügig unterscheiden. Wie auch immer, ich werde die OCAML Jungs fragen. Vielen Dank. –

Antwort

5

Die Frage hat sich beantwortet ... auf eine ziemlich seltsame Art und Weise. Was es wirklich (2012) verlangte, war ein Cross-Compiler Targeting (eine nicht spezifizierte Version von) iOS für Version 4.x von Ocaml. Und der Code-Dump in der Frage versuchte, Jeffrey Scofields Cross-Compiling-Anweisungen und -Skript (ocamlxarm/3.1) für Ocaml 3.1.x zu verwenden, was für Ocaml 4.0 nicht ganz funktionierte. Aber Scofield's web page, auf die die Frage verweist, wurde in der Zwischenzeit aktualisiert (zuletzt im Dezember 2014), um tatsächlich eine Lösung für Ocaml 4.0 (derzeit ocaml-4.01.0 + xarm-4.0.2-v7) bereitzustellen, womit die Frage gestellt wird wie hier gefragt ("gibt es eine Möglichkeit, dies zu tun") strittig oder ziemlich trivial. Entweder:

  • Laden Sie das vorinstallierte ocaml-4.01.0+xarm-4.0.2-v7.dmg Paket herunter, das derzeit auf dieser Webseite bereitgestellt wird. Lesen Sie auch die Gebrauchsanweisung und machen Sie sich das Leben leichter, indem Sie seine cross-compiling wrapper script verwenden, mit der Sie zwischen iOS 7 und 8 Zielen wechseln können. Oder wenn Sie irgendwie noch den Ocaml Cross-Compiler aus Quellen erstellen müssen ...
  • Folgen Sie den Anweisungen im Abschnitt "Anhang: Erstellen von Quellen" auf der Seite (es scheint keinen HTML-Anker dafür zu geben, Es tut uns leid). Diese Anweisungen sind leider über zwölf Absätze (9KB Text) lang, also werde ich sie hier nicht kopieren. Sie enthalten einen Link zum necessary patches für die Kreuzkompilierung von OCaml 4.0.1 nach iOS. Hoffentlich ist das, was auf dieser Webseite geschrieben ist, genau die Schritte, die verwendet wurden, um die oben erwähnte ocaml-4.01.0 + xarm-4.0.2-v7.dmg zu erstellen. Da es jedoch für dieses dmg-Paket nicht so etwas wie ein Apple-Äquivalent von RedHat-style SRPM gibt (hat Apple sogar eine äquivalente Technologie?), Ist es nicht völlig sicher, dass die Schritte zur Erzeugung des oben erwähnten dmg vollständig darauf reproduziert werden Website. Ich habe nicht versucht, diese Schritte zu folgen, um zu sehen, ob sie funktionieren.

Aber ich denke trotzdem, dass die Frage hier gefragt grundsätzlich im allgemeinen Sinne von behoben ist „ist es eine Möglichkeit, diese Arbeit zu machen“, indem sie die vorgefertigten 4.0.1 Binärdateien von Scofield Homepage Download ... verbunden direkt in der Frage. Probleme mit Scofields ocamlxarm build system Version 3.1, die Ocaml 4.0 nicht kompilieren können, sollten das sprichwörtliche Zeug sein, an dem sich niemand zu diesem Zeitpunkt interessiert. Wenn es Probleme mit den Anleitungen oder Patches von Scofield für 4.0 gibt, die nicht funktionieren, sollten sie separat gefragt werden, denke ich, weil die wesentlichen Fehler aus der Frage hier für dieses Szenario irrelevant erscheinen.

(Und wenn die oben allzu pedantisch scheint, war es meist durch Mods Wunsch, dass ich meine Antwort auf seinem gegenwärtigen Zustand erweitert haben.)

Obwohl die OP wahrscheinlich etwa kümmert sich nicht darum, was ich bin In diesem Abschnitt werde ich sagen, dass der Titel der Frage allgemein ist. Ich möchte darauf hinweisen, dass es auch ein ziemlich neues Projekt gibt, das einen OCAML-Cross-Compiler für Android verwaltet, genannt opam-android. Und dieser hat alle seine Bau-Bits als Skripte in einem Git-Repo, so dass es einfacher sein kann, zu stehlen - wie es gemacht wird. Wenn man die Patches dieser beiden Cross-Compiler vergleicht, kann man im Allgemeinen nicht viel darüber sagen, wie OCaml als Cross-Compiler funktioniert, außer: man muss es für die spezifische Zielplattform hacken. Eine Sache, die ich sagen werde ist, dass Scofields iOS-Patch viel invasiver (und viel länger) als die Android-Patches ist. Ein Großteil des Scofield-Patches hat mit der Generierung von Code auf Registerebene zu tun. Ich weiß nicht genug über iOS-Interna, um zu sagen, warum diese Änderungen für iOS benötigt wurden, aber nicht für Android, auch wenn sie im Grunde die gleiche ARM-CPU-Familie verwenden. Vielleicht sollte jemand das als eine wirklich interessante/nicht-triviale Frage stellen, die Jeffrey Scofield selbst wahrscheinlich gerne beantworten würde.