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)?
Ich glaube, dass Ocaml Listen oder Foren http://caml.inria.fr/resources/forums.en.html sind ein besserer Ort zu fragen. –
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. –
@ 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. –