如何构建OCaml交叉编译器

Per*_*ses 49 ocaml cross-compiling

在找到为目标机器生成拟合配置文件的方法之后,仍然必须构建交叉编译器本身.如果主机和目标系统差异太大,那么使用这里描述的1 1/2构建的方法(以及更多细节,这里)似乎不起作用.这是构建脚本的更改部分(可以使用获得$ 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
}
Run Code Online (Sandbox Code Playgroud)

编译卡在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 
Run Code Online (Sandbox Code Playgroud)

为了达到这一点,必须修改amsrun/Makefile以使用交叉编译工具链,并且HAS_STACK_OVERFLOW_DETECTION必须从config/sh中删除,因为无法编译amsrun/signals_asm.c.

那么有没有办法让这项工作,或者以这种方式更好地适应其他方法(并使用OCaml的4.00.0版本)?

Fiz*_*izz 5

这个问题以一种相当奇怪的方式回答了自己.它真正要求的(在2012年)是针对Ocaml版本4.x的跨编译器目标(未指定版本的)iOS.问题中的代码转储试图使用Jeffrey Scofield的交叉编译指令和脚本(ocamlxarm/3.1)用于Ocaml 3.1.x,这对Ocaml 4.0并不适用.但是问题链接到的Scofield的网页在此期间(2014年12月最后一次)已经更新,实际上为Ocaml 4.0(目前为ocaml-4.01.0 + xarm-4.0.2-v7)提供了解决方案,从而制作了这里提出的问题("有没有办法让这项工作")毫无疑问或相当微不足道.或者:

  • 下载当前在该网页上提供的预构建的ocaml-4.01.0 + xarm-4.0.2-v7.dmg软件包.请务必阅读使用说明,并使用交叉编译包装脚本让您的生活更轻松,该脚本允许您在iOS 7和8目标之间切换.或者,如果你仍然需要从源代码构建Ocaml交叉编译器......
  • 按照页面中"附录:从源代码构建"部分中的说明进行操作(似乎没有HTML锚点,抱歉).不幸的是,这些说明大约有12个段落(9KB的文本),所以我不打算在这里复制它们.它们包含指向交叉编译OCaml 4.0.1到iOS 的必要补丁的链接.希望,该网页上的内容正是用于构建上述ocaml-4.01.0 + xarm-4.0.2-v7.dmg的步骤.但是,由于dmg软件包没有类似于Apple等效的RedHat风格的SRPM(Apple甚至还有相同的技术吗?),因此不可能完全确定用于生成上述dmg的步骤完全是转载在该网页上. 我试着按照这些步骤来看看它们是否有效.

但我认为,这里提出的问题基本上是通过从Scofield的网页下载预先构建的4.0.1二进制文件来解决问题中的"有没有办法使这项工作"得到解决.Scofield的ocamlxarm构建系统版本3.1无法交叉编译Ocaml 4.0的问题应该是此时无人问津的谚语.如果Scofield的4.0指令或补丁无法正常工作,我认为应该单独询问,因为这里的问题的细节错误似乎与那种情况无关.

(如果以上看起来过于迂腐,那主要是通​​过mods的请求,我已经扩展了我对现状的回答.)

尽管OP可能并不关心我将在本段中说些什么,但考虑到他的问题标题是如何通用的,我会指出还存在一个相当近期的项目,维护一个针对Android的OCaml交叉编译器,称为OPAM,机器人.而且这个作为git repo中的脚本具有所有构建位,因此可以更容易地窃取它是如何完成的.比较这两个交叉编译器的补丁,一般来说,如何使OCaml作为交叉编译器工作并不是很多:你需要为特定的目标平台进行破解.我要说的一件事是,Scofield的iOS补丁比Android补丁更具侵入性(并且更长).很多Scofield的补丁都与寄存器级代码生成有关.我对iOS内部的了解不足以说明为什么iOS需要这些更改但Android不需要这些更改,即使他们基本上使用相同的ARM CPU系列.也许有人会认为这是一个真正有趣/非平凡的问题,杰弗里斯科菲尔德本人可能很乐意回答.