50

在找到为目标机器生成合适的配置文件的方法之后,仍然必须构建交叉编译器本身。如果主机和目标系统差异太大,使用此处描述的 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
}

编译卡在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必须从config/sh中删除,因为否则无法编译amsrun/signals_asm.c 。

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

4

1 回答 1

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 的步骤完全是在那个网页上转载。试着自己按照这些步骤来看看它们是否有效。

但是我认为,通过从斯科菲尔德的网页下载预先构建的 4.0.1 二进制文件,从一般意义上的“有没有办法使这项工作”基本上解决了这里提出的问题......在问题中链接。Scofield 的 ocamlxarm 构建系统版本 3.1 无法交叉编译 Ocaml 4.0 的问题应该是目前没人关心的众所周知的问题。我认为,如果 Scofield 的说明或 4.0 补丁不起作用,则应单独询问,因为此处问题中的细节错误似乎与该场景无关。

(如果上面的内容看起来过于迂腐,那主要是由于 mods 的要求,我将我的答案扩展到了目前的状态。)

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

于 2015-01-11T07:48:40.047 回答