2012-10-14 32 views
48

在找到目标机器的generate the fitting configuration files的方法之后,交叉编译器本身仍然必须构建。如果主机和目标系统差异太大,使用1 1/2内部版本described here(以及更多详细信息,here)的方法似乎不起作用。下面是构建脚本(可以用$ svn cat svn://svn.psellos.com/trunk/ocamlxarm/3.1/xarm-build获得)的改变部分如何构建一个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 
} 

编译卡在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文件不得不修改为使用交叉编译工具链,以及HAS_STACK_OVERFLOW_DETECTION不得不因为 amsrun/signals_asm.c从配置/ SH删除否则无法编译

那么有没有一种方法可以使这项工作更好地适应(并且可以使用OCaml的4.00.0版本)?

+7

我相信Ocaml列表或论坛http://caml.inria.fr/resources/forums.en.html是一个更好的地方要问。 –

+0

我不知道你的目标是什么样的,但我怀疑xarm-build脚本实际上非常接近。它适用于从英特尔上的OS X到ARM上的iOS(类似系统,但非常不同的CPU)的交叉编译。 (免责声明:我写了xarm-build。)但是Basile是对的,你可能在OCaml邮件列表上得到更好的答案。有许多小细节必须完全正确。 –

+0

@JeffreyScofield其(Linux,i386) - >(Linux,PPC)。这些平台不应该太差,但似乎目标文件/可执行文件格式略有不同。无论如何,我会问OCAML家伙。谢谢。 –

回答

5

这个问题已经以一种相当奇怪的方式回答了自己。它真正要求的(2012年)是针对Ocaml 4.x版iOS的交叉编译器(未指定版本)。而且问题中的代码转储试图为Ocaml 3.1.x使用Jeffrey Scofield的交叉编译指令和脚本(ocamlxarm/3.1),这对Ocaml 4.0并不适用。但是,Scofield's web page,这个问题链接到,已同时更新(最后在2014年12月),以实际提供Ocaml 4.0(目前ocaml-4.01.0 + xarm-4.0.2-v7)的解决方案,从而使问题正如这里所问(“是否有一种方法可以使这项工作”)没有意义或相当无足轻重。可以是:

  • 下载当前在该网页上提供的预制ocaml-4.01.0+xarm-4.0.2-v7.dmg包。请务必阅读使用说明,并使用他的cross-compiling wrapper script,让您在iOS 7和8目标之间切换,从而让您的生活更轻松。或者,如果您仍然需要从源代码构建Ocaml交叉编译器...
  • 请按照页面的“附录:从源代码构建”部分的说明进行操作(对于它来说,似乎没有HTML锚点,抱歉)。这些指令不幸的是长达12段(9KB的文本),所以我不打算在这里复制它们。它们包含一个指向necessary patches的链接,用于交叉编译OCaml 4.0.1到iOS。希望该网页上的内容正是用于构建上述ocaml-4.01.0 + xarm-4.0.2-v7.dmg的步骤。但是,由于该dmg软件包中没有Apple平等的RedHat-style SRPM(Apple确实有相同的技术?),所以不可能完全肯定用于生成上述dmg的步骤完全转载于此网页。我有而不是试图按照这些步骤来查看它们是否有效。

但我觉得还是在这里问的问题在一般意义上是基本解决“有没有一种方法,使这项工作”通过下载从斯科菲尔德的网页预建4.0.1二进制文件...链接正确的问题。 Scofield的ocamlxarm构建系统3.1版无法交叉编译Ocaml 4.0的问题应该是目前没有人关注的谚语。如果斯科菲尔德的说明或4.0版补丁无法正常工作时出现问题,我认为应该单独询问它们,因为这里提到的问题的内在错误似乎与该场景无关。

(如果上面似乎过于迂腐,它主要是由器官功能障碍综合征的要求,我已经扩大了我的答案,目前的状态。)

虽然OP可能不关心我什么在本段中,考虑到他的问题标题的通用性,我会指出还有一个相当新的项目,它维护一个针对Android的OCaml交叉编译器,称为opam-android。而且这个版本的所有构建部分都作为git仓库中的脚本,因此可能会更容易窃取 - 如何完成。通过比较这两个交叉编译器的补丁,一般来说,如何使OCaml作为交叉编译器工作并不多:您需要针对特定​​目标平台进行破解。我要说的一件事就是Scofield的iOS补丁比Android补丁更具侵入性(时间更长)。很多Scofield的补丁都与注册级代码生成有关。我对iOS内部知识不够了解,为什么iOS需要这些更改而不是Android,即使他们基本上使用相同的ARM CPU系列。也许有人应该问这是杰弗里斯科菲尔德本人可能会很乐意回答的一个真正有趣/非平凡的问题。