2012-10-14 11 views
48

Dopo aver trovato un modo per generate the fitting configuration files per il computer di destinazione, il compilatore incrociato deve essere ancora compilato. L'approccio utilizzando la build 1 1/2 described here (e, con ulteriori dettagli, here) non sembra funzionare se i sistemi host e di destinazione differiscono troppo. Ecco la parte modificata dello script di build (che può essere ottenuto con $ svn cat svn://svn.psellos.com/trunk/ocamlxarm/3.1/xarm-build)Come compilare un compilatore incrociato 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 
} 

La compilazione si blocca nel stdlib sottocartella, dove un'affermazione su convenzioni di chiamata non riesce.

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 

Per ottenere anche a questo punto, amsrun/Makefile dovuto essere modificati per utilizzare la croce compilare toolchain, e il HAS_STACK_OVERFLOW_DETECTION doveva essere rimosso da config/sh dal amsrun/signals_asm.c non può essere compilato diversamente.

Quindi c'è un modo per farlo funzionare, o ci sono altri approcci in this manner più adatti (e funzionano con la versione 4.00.0 di OCaml)?

+7

Credo che elenchi o forum di Ocaml http://caml.inria.fr/resources/forums.en.html siano un posto migliore per chiedere. –

+0

Non so come sia il tuo obiettivo, ma ho il sospetto che lo script xarm-build sia in realtà piuttosto vicino. Funziona per la compilazione incrociata da OS X su Intel a iOS su ARM (sistemi simili, ma CPU molto diverse). (Disclaimer: Ho scritto xarm-build.) Ma Basile ha ragione, potresti ottenere risposte migliori sulle mailing list di OCaml. Ci sono molti piccoli dettagli che devono essere esattamente ragionevoli. –

+0

@JeffreyScofield Its (Linux, i386) -> (Linux, PPC). Queste piattaforme non dovrebbero essere troppo diverse, ma sembra che il file oggetto/i formati di file eseguibili differiscano leggermente. Ad ogni modo, chiederò ai ragazzi OCAML. Grazie. –

risposta

5

La domanda ha risposto a se stessa ... in un modo piuttosto strano. Quello che realmente chiedeva (nel 2012) era un targeting cross-compiler (una versione non specificata di) iOS per la versione 4.x di Ocaml. E il dump del codice nella domanda stava cercando di usare le istruzioni e lo script di compilazione incrociata di Jeffrey Scofield (ocamlxarm/3.1) per Ocaml 3.1.x, che non funzionava abbastanza per Ocaml 4.0. Ma lo Scofield's web page, a cui la domanda si collega, è stato aggiornato nel frattempo (ultimo dicembre 2014) per fornire effettivamente una soluzione per Ocaml 4.0 (attualmente ocaml-4.01.0 + xarm-4.0.2-v7), rendendo così la domanda come richiesto qui ("c'è un modo per farlo funzionare") moot o abbastanza banale. O:

  • Scaricare il pacchetto ocaml-4.01.0+xarm-4.0.2-v7.dmg predefinito già fornito su tale pagina Web. Assicurati di leggere anche le istruzioni per l'uso e semplifica la vita utilizzando il suo cross-compiling wrapper script che ti consente di passare da iOS 7 a 8 target. Oppure se in qualche modo hai ancora bisogno di compilare il cross-compiler di Ocaml dai sorgenti ...
  • Segui le istruzioni nella sezione "Appendice: Costruire da fonti" della pagina (non sembra un ancoraggio HTML per questo, scusa). Sfortunatamente queste istruzioni sono di circa dodici paragrafi (9KB di testo), quindi non le copierò qui. Includono un collegamento allo necessary patches per la conversione incrociata di OCaml 4.0.1 in iOS. Si spera che ciò che è scritto su quella pagina web siano esattamente i passi usati per costruire il summenzionato ocaml-4.01.0 + xarm-4.0.2-v7.dmg. Tuttavia, poiché non esiste qualcosa di simile a un equivalente Apple di RedHat-style SRPM per quel pacchetto dmg (Apple ha persino una tecnologia equivalente?), Non è possibile essere completamente certi che i passaggi utilizzati per generare il dmg di cui sopra siano interamente riprodotti su tale pagina web. Ho non ho provato a seguire questi passaggi per vedere se funzionano.

Ma penso nondimeno che la domanda posta qui sia sostanzialmente risolta nel senso generale di "c'è un modo per farlo funzionare" scaricando i binari predefiniti 4.0.1 dalla pagina Web di Scofield ... collegata giusto nella domanda. Problemi con la versione 3.1 del sistema di build ocamlxarm di Scofield non essere in grado di eseguire la cross-compilazione di Ocaml 4.0 dovrebbero essere le cose proverbiali a cui nessuno importa a questo punto. Se ci sono problemi con le istruzioni di Scofield o con le patch per 4.0 che non funzionano, dovrebbero essere poste separatamente, credo, perché gli errori nitty gritty della domanda qui sembrano irrilevanti per quello scenario.

(E se quanto sopra sembra eccessivamente pedante, è stato in gran parte su richiesta mods' che ho ampliato la mia risposta al suo stato attuale.)

Anche se il PO probabilmente non si preoccupa di quello che sto andando a dire in questo paragrafo, data la genericità del titolo della sua domanda, sottolineerò che esiste anche un progetto abbastanza recente che mantiene un cross-compilatore di OCaml con targeting per Android, chiamato opam-android. E questo ha tutti i suoi elementi costitutivi come script in un repository git, quindi potrebbe essere più facile rubare-come-è-fatto. Confrontando le patch di questi due cross-compilatori, non c'è molto che si possa dire in generale su come far funzionare OCaml come cross-compilatore diverso da: è necessario modificarlo per la specifica piattaforma di destinazione. Una cosa che dirò è che la patch iOS di Scofield è molto più invasiva (e molto più lunga) delle patch Android. Gran parte della patch di Scofield ha a che fare con la generazione del codice a livello di registro. Non ne so abbastanza degli interni di iOS per dire perché queste modifiche erano necessarie per iOS ma non per Android, anche se fondamentalmente utilizzano la stessa famiglia di CPU ARM. Forse qualcuno dovrebbe chiederlo come una domanda davvero interessante/non banale che Jeffrey Scofield stesso sarebbe probabilmente felice di rispondere.

Problemi correlati