Comment construire un compilateur croisé OCaml

Après avoir trouvé un moyen de générer les fichiers de configuration adaptés à la machine cible, le compilateur croisé lui-même doit toujours être créé. L’approche utilisant la version 1 1/2 décrite ici (et, avec plus de détails, ici ) ne semble pas fonctionner si les systèmes hôte et cible diffèrent trop. Voici la partie modifiée du script de compilation (qui peut être obtenue avec $ 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/sh # 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_comstackr[ ]*=.*#let bytecomp_c_comstackr ="'"$CC"'"#' \ -e 's#let[ ][ ]*native_c_comstackr[ ]*=.*#let native_c_comstackr ="'"$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 compilation est bloquée dans le sous-dossier stdlib , où une assertion sur les conventions d’appel échoue.

 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 

Pour arriver à ce point, amsrun / Makefile a dû être modifié pour utiliser la chaîne d’outils de compilation croisée, et HAS_STACK_OVERFLOW_DETECTION a dû être supprimé de config / sh car amsrun / signs_asm.c n’a pas pu être compilé autrement.

Y a-t-il un moyen de faire fonctionner ce système ou d’autres approches de cette manière sont-elles mieux adaptées (et fonctionnent-elles avec la version 4.00.0 d’OCaml)?

La question a répondu elle-même … d’une manière assez étrange. Ce qu’il demandait vraiment (en 2012) était un ciblage par compilateur croisé (une version non spécifiée de) iOS pour la version 4.x d’Ocaml. Et le vidage de code dans la question essayait d’utiliser les instructions et le script de compilation croisée de Jeffrey Scofield (ocamlxarm / 3.1) pour Ocaml 3.1.x, qui ne fonctionnaient pas tout à fait pour Ocaml 4.0. Mais la page Web de Scofield , à laquelle la question est liée, a été mise à jour entre-temps (dernière version en décembre 2014) pour fournir une solution pour Ocaml 4.0 (actuellement ocaml-4.01.0 + xarm-4.0.2-v7). la question posée ici (“y a-t-il un moyen de rendre ce travail”) est-elle théorique ou sortingviale? Non plus:

  • Téléchargez le package ocaml-4.01.0 + xarm-4.0.2-v7.dmg pré-construit fourni sur cette page Web. Assurez-vous de lire les instructions d’utilisation et simplifiez-vous la vie en utilisant son script d’encapsulation à compilation croisée qui vous permet de basculer entre les cibles iOS 7 et 8. Ou si vous avez encore besoin de construire le compilateur croisé Ocaml à partir de sources …
  • Suivez les instructions de la section “Annexe: Création à partir des sources” de la page (il ne semble pas y avoir d’ancrage HTML, désolé). Ces instructions ont malheureusement environ douze paragraphes (9 Ko de texte), alors je ne vais pas les copier ici. Ils incluent un lien vers les correctifs nécessaires à la compilation croisée d’OCaml 4.0.1 vers iOS. Espérons que ce qui est écrit sur cette page Web est exactement la procédure utilisée pour construire l’ocaml-4.01.0 + xarm-4.0.2-v7.dmg susmentionné. Cependant, comme il n’y a pas quelque chose comme un équivalent de SRPM de style RedHat d’Apple pour ce paquet dmg (Apple a-t-il une technologie équivalente?), Il n’est pas certain que les étapes utilisées pour générer le dmg susmentionné soient entièrement reproduit sur cette page Web. Je n’ai pas essayé de suivre ces étapes pour voir si elles fonctionnent.

Mais je pense néanmoins que la question posée ici est fondamentalement résolue dans le sens général “y a-t-il un moyen de faire fonctionner cela” en téléchargeant les binarys 4.0.1 pré-compilés de la page Web de Scofield … liée directement à la question. Les problèmes liés à la version 3.1 du système de génération ocamlxarm de Scofield, qui ne permet pas de comstackr de manière croisée Ocaml 4.0, devraient être des éléments proverbiaux dont personne ne se soucie à ce stade. S’il y a des problèmes avec les instructions de Scofield ou les correctifs pour la 4.0 ne fonctionnant pas, ils devraient être demandés séparément, je pense, parce que les erreurs sérieuses de la question ici semblent sans rapport avec ce scénario.

(Et si ce qui précède semble trop pédant, c’est surtout à la demande des mods que j’ai élargi ma réponse à son état actuel.)

Bien que l’OP ne se soucie probablement pas de ce que je vais dire dans ce paragraphe, étant donné le caractère générique de son titre, je signale qu’il existe également un projet assez récent de maintien d’un compilateur croisé OCaml Android, appelé opam-androïde . Et celui-ci a tous ses éléments de construction en tant que scripts dans un repository git, de sorte qu’il peut être plus facile de voler comme ça. En comparant les patchs de ces deux compilateurs croisés, on peut difficilement dire en général comment faire fonctionner OCaml en tant que compilateur croisé autre que: vous devez le pirater pour la plate-forme cible spécifique. Une chose que je dirai est que le patch iOS de Scofield est beaucoup plus invasif (et beaucoup plus long) que les patchs Android. Un grand nombre de correctifs de Scofield concernent la génération de code au niveau du registre. Je ne sais pas assez sur les internes iOS pour dire pourquoi ces changements étaient nécessaires pour iOS, mais pas pour Android, même s’ils utilisent essentiellement la même famille de processeurs ARM. Peut-être que quelqu’un devrait poser cette question comme une question intéressante / non sortingviale que Jeffrey Scofield lui-même serait probablement heureux de répondre.