50

ターゲットマシンのフィッティング構成ファイルを生成する方法を見つけた後でも、クロスコンパイラ自体を構築する必要があります。ここで説明する11/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を変更する必要があり、 amsrun / signal_asm.cをコンパイルできないため、 config/shからHAS_STACK_OVERFLOW_DETECTION削除する必要がありました。

それで、これを機能させる方法はありますか、またはこの方法で他のアプローチがより適していますか(そしてOCamlの4.00.0リリースで機能します)?

4

1 に答える 1