如何构建OCaml交叉编译器

时间:2012-10-14 19:55:05

标签: ocaml cross-compiling

在为目标机器找到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版本)?

1 个答案:

答案 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;)没有实际意义或相当微不足道。之一:

  • 下载当前在该网页上提供的预构建的ocaml-4.01.0+xarm-4.0.2-v7.dmg包。请务必阅读使用说明,并使用cross-compiling wrapper script让您在iOS 7和8目标之间切换,让您的生活更轻松。或者,如果您仍然需要从源代码构建Ocaml交叉编译器......
  • 按照&#34;附录中的说明:从源代码构建&#34;页面的一部分(对于它来说似乎没有HTML锚点,抱歉)。不幸的是,这些说明大约有十二段(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完全在该网页上复制。我试图按照这些步骤查看它们是否有效。

但我认为,这里提出的问题基本上是在一般意义上解决的,并且有一种方法可以使这项工作成为可能。通过从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本人可能很乐意回答。