在为目标机器找到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 以使用交叉编译工具链,并且必须从 config / sh <删除HAS_STACK_OVERFLOW_DETECTION
/ em>因为 amsrun / signals_asm.c 无法编译。
有没有办法让这项工作成功,或者this manner中的其他方法更适合(并使用OCaml的4.00.0版本)?
答案 0 :(得分:5)
这个问题已经以一种相当奇怪的方式回答了问题。它真正要求的(在2012年)是针对Ocaml版本4.x的跨编译器目标(未指定版本的)iOS。问题中的代码转储试图使用Jeffrey Scofield的交叉编译指令和脚本(ocamlxarm / 3.1)用于Ocaml 3.1.x,这对Ocaml 4.0来说并不适用。但问题所链接的Scofield's web page在此期间(2014年12月最后一次)已更新,以实际为Ocaml 4.0(目前为ocaml-4.01.0 + xarm-4.0.2-v7)提供解决方案,从而在这里提出问题(&#34;是否有办法使这项工作&#34;)没有实际意义或相当微不足道。之一:
但我认为,这里提出的问题基本上是在一般意义上解决的,并且有一种方法可以使这项工作成为可能。通过从Scofield的网页下载预先构建的4.0.1二进制文件...在问题中链接。 Scofield的ocamlxarm构建系统版本3.1无法交叉编译Ocaml 4.0的问题应该是此时无人问津的谚语。如果Scofield的4.0指令或补丁无法正常工作,我认为应该单独询问,因为这里的问题的细节错误似乎与那种情况无关。
(如果以上看起来过于迂腐,那主要是通过mods&'39;请求我已经扩展了我对现状的回答。)
虽然OP可能并不关心我将在本段中说些什么,但考虑到他的问题标题是如何通用的,我会指出那里也存在一个最新项目维护着一个针对Android的OCaml交叉编译器,名为opam-android。而且这个作为git repo中的脚本具有所有构建位,因此可能更容易窃取它是如何完成的。比较这两个交叉编译器的补丁,一般来说,如何使OCaml作为交叉编译器工作并不是很多:你需要针对特定的目标平台进行破解。我要说的一件事是,Scofield的iOS补丁比Android补丁更具侵入性(并且更长)。很多Scofield的补丁都与寄存器级代码生成有关。我对iOS内部的了解不足以说明为什么iOS需要这些更改但Android不需要这些更改,即使他们基本上使用相同的ARM CPU系列。也许有人会认为这是一个真正有趣/非平凡的问题,Jeffrey Scofield本人可能很乐意回答。