如何构build一个OCaml交叉编译器
在find一种方法来为目标机器生成适配configuration文件之后 ,交叉编译器本身仍然必须被构build。 如果主机和目标系统差异太大,那么使用这里描述的1 1/2构build的方法(以及更多细节在这里 )似乎不起作用。 以下是构build脚本的更改部分(可以使用$ 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/sh # 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,因为不能编译amsrun / signals_asm.c 。
那么是否有一种方法可以使这项工作成为可能,或者是否有其他方法可以更好地适用(并且可以使用OCaml的4.00.0版本)?
这个问题以一种相当奇怪的方式回答了自己。 它真正要求的是(2012年)是针对Ocaml 4.x版iOS的交叉编译器(未指定版本)。 问题中的代码转储尝试使用Jeffrey Scofield的Ocaml 3.1.x的交叉编译指令和脚本(ocamlxarm / 3.1),这对Ocaml 4.0并不适用。 但与此同时, Scofield的网页已经更新(去年12月),实际上为Ocaml 4.0(目前为ocaml-4.01.0 + xarm-4.0.2-v7)提供了一个解决scheme,在这里提出的问题(“是否有办法做这项工作”)是有争议的或相当微不足道的。 或者:
- 下载当前在该网页上提供的预制ocaml-4.01.0 + xarm-4.0.2-v7.dmg包。 请务必阅读使用说明,并使用交叉编译包装脚本使您的生活更轻松,该脚本可让您在iOS 7和8目标之间切换。 或者,如果你不知何故仍然需要build立从源的Ocaml交叉编译器…
- 按照页面的“附录:从源代码构build”一节中的说明(对于它,似乎没有HTML锚,对不起)。 这些指令不幸的是长达12段(9KB的文本),所以我不打算在这里复制它们。 它们包括一个链接,用于交叉编译OCaml 4.0.1到iOS的补丁 。 希望网页上写下的内容正是用于构build上述ocaml-4.01.0 + xarm-4.0.2-v7.dmg的步骤。 然而,由于这个dmg软件包中没有类似Apple的RedHat风格的SRPM (苹果公司是否有相同的技术?),所以不可能完全确定用于生成上述dmg的步骤是完全的转载在该网页上。 我还没有试图自己去遵循这些步骤,看看他们是否工作。
但是我认为,这里提出的问题基本上是通过从Scofield的网页上下载预先构build的4.0.1二进制文件的一般意义上解决的。 Scofield的ocamlxarm构build系统3.1版无法交叉编译Ocaml 4.0的问题应该是目前没有人关心的谚语。 如果斯考菲尔德的指令或补丁程序出现问题,4.0版不能正常工作,我认为应该单独询问它们,因为这里的问题的内在错误似乎与这种情况无关。
(如果上面的内容看起来过于迂腐,那么主要是由mods的要求,我已经扩大了我的答案,目前的状态。)
虽然OP可能不关心我在本段要说的内容,但是考虑到他的问题标题的通用性,我会指出还有一个相当新的项目,它维护一个针对Android的OCaml交叉编译器,称为opam-android 。 而且这个在git仓库里有所有的构build脚本,所以它可能更容易被盗取。 比较这两个交叉编译器的补丁,一般来说,如何使OCaml作为交叉编译器工作并不是那么容易:你需要针对特定的目标平台进行破解。 我要说的一件事就是Scofield的iOS补丁比Android补丁更具侵入性(时间更长)。 很多Scofield的补丁与注册级代码生成有关。 我对iOS内部知识不够了解,为什么iOS需要这些更改,而不是Android,即使他们基本上使用相同的ARM CPU系列。 也许有人应该问这是杰弗里·斯科菲尔德本人可能乐于回答的一个真正有趣/不重要的问题。