gpt4 book ai didi

ocaml - 如何构建 OCaml 交叉编译器

转载 作者:行者123 更新时间:2023-12-03 06:08:15 24 4
gpt4 key购买 nike

找到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以使用交叉编译工具链,并且HAS_STACK_OVERFLOW_DETECTION必须从配置中删除/s.h 因为 amsrun/signals_asm.c 无法以其他方式编译。

那么有没有办法让这项工作发挥作用,或者 this manner 中有其他方法吗?更适合(并与 OCaml 4.00.0 版本一起使用)?

最佳答案

这个问题已经以一种相当奇怪的方式回答了自己。它真正要求的(2012 年)是针对 Ocaml 4.x 版本的 iOS(未指定版本)的交叉编译器。问题中的代码转储试图使用 Jeffrey Scofield 的 Ocaml 3.1.x 交叉编译指令和脚本 (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 anchor )。不幸的是,这些说明大约有 12 段(文本的 9KB)长,所以我不打算在此处复制它们。它们包含指向 necessary patches 的链接用于将 OCaml 4.0.1 交叉编译到 iOS。希望该网页上写的内容正是用于构建上述 ocaml-4.01.0+xarm-4.0.2-v7.dmg 的步骤。然而,因为没有像 Apple 等效的 RedHat-style SRPM 的东西。对于该 dmg 包(Apple 是否有等效技术?),不可能完全确定用于生成上述 dmg 的步骤是否完全复制在该网页上。我没有尝试自己按照这些步骤来看看它们是否有效。

但我认为,这里提出的问题基本上可以通过从 Scofield 的网页下载预构建的 4.0.1 二进制文件来解决“是否有办法使这项工作有效”的一般意义...链接在问题。 Scofield 的 ocamlxarm 构建系统版本 3.1 无法交叉编译 Ocaml 4.0 的问题应该是众所周知的问题,目前无人关心。如果 Scofield 的说明或 4.0 补丁无法正常工作,我认为应该单独询问它们,因为这里问题中的具体错误似乎与该场景无关。

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

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

关于ocaml - 如何构建 OCaml 交叉编译器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12885960/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com