2012-10-14 39 views
48

在找到目標機器的generate the fitting configuration files的方法之後,交叉編譯器本身仍然必須構建。如果主機和目標系統差異太大,使用1 1/2內部版本described here(以及更多詳細信息,here)的方法似乎不起作用。下面是構建腳本(可以用$ svn cat svn://svn.psellos.com/trunk/ocamlxarm/3.1/xarm-build獲得)的改變部分如何構建一個OCaml交叉編譯器

# 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不得不因爲 amsrun/signals_asm.c從配置/ SH刪除否則無法編譯

那麼有沒有一種方法可以使這項工作更好地適應(並且可以使用OCaml的4.00.0版本)?

+7

我相信Ocaml列表或論壇http://caml.inria.fr/resources/forums.en.html是一個更好的地方要問。 –

+0

我不知道你的目標是什麼樣的,但我懷疑xarm-build腳本實際上非常接近。它適用於從英特爾上的OS X到ARM上的iOS(類似系統,但非常不同的CPU)的交叉編譯。 (免責聲明:我寫了xarm-build。)但是Basile是對的,你可能在OCaml郵件列表上得到更好的答案。有許多小細節必須完全正確。 –

+0

@JeffreyScofield其(Linux,i386) - >(Linux,PPC)。這些平臺不應該太差,但似乎目標文件/可執行文件格式略有不同。無論如何,我會問OCAML傢伙。謝謝。 –

回答

5

這個問題已經以一種相當奇怪的方式回答了自己。它真正要求的(2012年)是針對Ocaml 4.x版iOS的交叉編譯器(未指定版本)。而且問題中的代碼轉儲試圖爲Ocaml 3.1.x使用Jeffrey Scofield的交叉編譯指令和腳本(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錨點,抱歉)。這些指令不幸的是長達12段(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的步驟完全轉載於此網頁。我有而不是試圖按照這些步驟來查看它們是否有效。

但我覺得還是在這裏問的問題在一般意義上是基本解決「有沒有一種方法,使這項工作」通過下載從斯科菲爾德的網頁預建4.0.1二進制文件...鏈接正確的問題。 Scofield的ocamlxarm構建系統3.1版無法交叉編譯Ocaml 4.0的問題應該是目前沒有人關注的諺語。如果斯科菲爾德的說明或4.0版補丁無法正常工作時出現問題,我認爲應該單獨詢問它們,因爲這裏提到的問題的內在錯誤似乎與該場景無關。

(如果上面似乎過於迂腐,它主要是由器官功能障礙綜合徵的要求,我已經擴大了我的答案,目前的狀態。)

雖然OP可能不關心我什麼在本段中,考慮到他的問題標題的通用性,我會指出還有一個相當新的項目,它維護一個針對Android的OCaml交叉編譯器,稱爲opam-android。而且這個版本的所有構建部分都作爲git倉庫中的腳本,因此可能會更容易竊取 - 如何完成。通過比較這兩個交叉編譯器的補丁,一般來說,如何使OCaml作爲交叉編譯器工作並不多:您需要針對特定​​目標平臺進行破解。我要說的一件事就是Scofield的iOS補丁比Android補丁更具侵入性(時間更長)。很多Scofield的補丁都與註冊級代碼生成有關。我對iOS內部知識不夠了解,爲什麼iOS需要這些更改而不是Android,即使他們基本上使用相同的ARM CPU系列。也許有人應該問這是傑弗里斯科菲爾德本人可能會很樂意回答的一個真正有趣/非平凡的問題。