Подтвердить что ты не робот

Как создать перекрестный компилятор OCaml

После поиска способа сгенерировать подходящие файлы конфигурации для целевой машины, сам кросс-компилятор все равно должен быть построен. Подход с использованием 1 1/2 build описанный здесь (и, более подробно, здесь), похоже, не работает, если хост и целевые системы слишком сильно отличаются. Вот измененная часть сборки script (которую можно получить с помощью $ 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 пришлось модифицировать, чтобы использовать кросс-компиляцию toolchain, а HAS_STACK_OVERFLOW_DETECTION пришлось удалить из config/sh, так как amsrun/signals_asm.c не может быть скомпилирован иначе.

Итак, есть способ сделать эту работу или другие подходы в таким образом лучше подходит (и работать с 4.00.0 релиз OCaml)?

4b9b3361

Ответ 1

Вопрос ответил сам... довольно странным образом. То, что он действительно запрашивал (в 2012 году), было таргетинг кросс-компилятора (неуказанная версия) iOS для версии 4.x Ocaml. И дамп кода в этом вопросе пытался использовать команды кросс-компиляции Джеффри Скофилда и script (ocamlxarm/3.1) для Ocaml 3.1.x, что не совсем сработало для Ocaml 4.0. Но веб-страница Скофилда, с которой связались вопросы, была обновлена ​​тем временем (последняя в декабре 2014 г.), чтобы фактически предоставить решение для Ocaml 4.0 (в настоящее время ocaml-4.01.0 + xarm-4.0.2-v7), тем самым задавая вопрос, заданный здесь ( "есть способ сделать эту работу" ) спорным или довольно тривиальным. Или:

  • Загрузите предварительно созданный ocaml-4.01.0+xarm-4.0.2-v7.dmg пакет, который в настоящее время предоставляется на этой веб-странице. Обязательно прочтите инструкцию по использованию и упростите свою жизнь, используя свою кросс-компиляционную оболочку script, которая позволяет переключаться между iOS 7 и 8 целями. Или, если вам как-то все еще нужно построить кросс-компилятор Ocaml из источников...
  • Следуйте инструкциям в разделе "Приложение: Строительство из источников" на странице (для него, похоже, нет якоря HTML). К сожалению, эти инструкции содержат двенадцать абзацев (9 Кбайт текста), поэтому я не собираюсь их копировать. Они включают ссылку на необходимые исправления для кросс-компиляции OCaml 4.0.1 в iOS. Надеемся, что на этой веб-странице написаны именно те шаги, которые были использованы для создания вышеупомянутого ocaml-4.01.0 + xarm-4.0.2-v7.dmg. Однако, поскольку в этом пакете dmg нет Apple-эквивалента RedHat-стиля SRPM (возможно, у Apple есть эквивалентная технология?), Это невозможно полностью убедитесь, что этапы, используемые для создания вышеупомянутого dmg, полностью воспроизводятся на этой веб-странице. Я не пробовал себя следовать этим шагам, чтобы убедиться, что они работают.

Но, тем не менее, я думаю, что вопрос, заданный здесь, в основном разрешен в общем смысле "есть ли способ сделать эту работу", загрузив предварительно созданные версии 4.0.1 из веб-страницы Scofield..., связанные прямо в вопрос. Проблемы с Scofield ocamlxarm build system version 3.1, неспособные перекрестно компилировать Ocaml 4.0, должны быть пресловутым материалом, на который никто не заботится. Если есть проблемы с инструкциями Scofield или исправлениями для 4.0, которые не работают, их следует спросить отдельно, я думаю, потому что ошибки nitty gritty из вопроса здесь кажутся неуместными для этого сценария.

(И если вышеизложенное кажется чересчур педантичным, в основном по просьбе модов я расширил свой ответ до его текущего состояния.)

Хотя OP, вероятно, не заботится о том, что я собираюсь сказать в этом параграфе, учитывая, насколько общий его заголовок вопроса, я также укажу, что существует довольно недавний проект, поддерживающий таргетинг кросс-компилятора OCaml Android, называемый opam-android. И у этого есть все его биты здания как скрипты в репозитории git, так что может быть легче украсть-как-это-сделано. Сравнивая патчи этих двух кросс-компиляторов, не так много можно сказать в общем, как заставить OCaml работать в качестве кросс-компилятора, кроме: вам нужно взломать его для конкретной целевой платформы. Одна вещь, которую я скажу, это то, что патч Scofield iOS намного более инвазивный (и намного дольше), чем патчи для Android. Многие исправления Scofield связаны с генерацией кода регистра. Я не знаю достаточно о внутренних компонентах iOS, чтобы сказать, почему эти изменения были необходимы для iOS, но не для Android, даже в основном они используют одно и то же семейство процессоров ARM. Возможно, кто-то должен спросить об этом как о действительно интересном/нетривиальном вопросе, который, вероятно, с радостью ответит на вопрос Джеффри Скофилда.