Dopo aver trovato un modo per generate the fitting configuration files per il computer di destinazione, il compilatore incrociato deve essere ancora compilato. L'approccio utilizzando la build 1 1/2 described here (e, con ulteriori dettagli, here) non sembra funzionare se i sistemi host e di destinazione differiscono troppo. Ecco la parte modificata dello script di build (che può essere ottenuto con $ svn cat svn://svn.psellos.com/trunk/ocamlxarm/3.1/xarm-build
)Come compilare un compilatore incrociato 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
}
La compilazione si blocca nel stdlib sottocartella, dove un'affermazione su convenzioni di chiamata non riesce.
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
Per ottenere anche a questo punto, amsrun/Makefile dovuto essere modificati per utilizzare la croce compilare toolchain, e il HAS_STACK_OVERFLOW_DETECTION
doveva essere rimosso da config/sh dal amsrun/signals_asm.c non può essere compilato diversamente.
Quindi c'è un modo per farlo funzionare, o ci sono altri approcci in this manner più adatti (e funzionano con la versione 4.00.0 di OCaml)?
Credo che elenchi o forum di Ocaml http://caml.inria.fr/resources/forums.en.html siano un posto migliore per chiedere. –
Non so come sia il tuo obiettivo, ma ho il sospetto che lo script xarm-build sia in realtà piuttosto vicino. Funziona per la compilazione incrociata da OS X su Intel a iOS su ARM (sistemi simili, ma CPU molto diverse). (Disclaimer: Ho scritto xarm-build.) Ma Basile ha ragione, potresti ottenere risposte migliori sulle mailing list di OCaml. Ci sono molti piccoli dettagli che devono essere esattamente ragionevoli. –
@JeffreyScofield Its (Linux, i386) -> (Linux, PPC). Queste piattaforme non dovrebbero essere troppo diverse, ma sembra che il file oggetto/i formati di file eseguibili differiscano leggermente. Ad ogni modo, chiederò ai ragazzi OCAML. Grazie. –