Блог OCamlСборка компилятора O'Caml из исходников
Проблема состоит в том, что рантайм-библиотеки O'Caml (которые входят в бинарный дистрибутив) собраны с использованием библиотек VS2005. В результате, в моем обычном окружении (часть заголовков и библиотек от VC6), нативные модули O'Caml не собираются – валится линковка на security_cookie и прочей ботве из VC8. В принципе, можно было бы забить на это дело и собирать в стандартном окружении для VS2005. При связывании O'Caml с C++ в принципе нет потенциальных граблей с выделением памяти в одном модуле и освобождении в другом – языки сильно разные, поэтому там даже мысли не возникает насчет подобной работы с памятью :). Однако, есть пара соображений против подобного «забивания»:
- Может появиться зависимость от рантайм-библиотек VC8. Пустячок, но неприятно: придется вместе с программой распространять и библиотеки VC8. А это не всегда просто, ибо на смену dll-hell пришел manifest-hell. :)
- Если в проекте будет смесь из объектных файлов C++ и O'Caml, то собирать подобный конгломерат будет довольно утомительно: часть файлов собирать с одними настройками Студии, а часть с другими. Или какую-то часть собирать из командной строки.
Поэтому, думаю, умение собирать O'Caml при помощи ICC + хедеры и либы от VC6 будет небесполезным.
Получение нужных компонентов
Скачать O'Caml можно отсюда:
http://caml.inria.fr/ocaml/release.en.html
Для сборки понадобится Source tarball. Кстати, можно еще скачать собранные бинарники – они тоже небесполезны.
O'Caml использует TCL/TK версии 8.4. Взять можно здесь:
http://www.activestate.com/products/ActiveTcl/
Сборка происходит в среде CygWin. Взять можно здесь:
http://www.CygWin.com/
Подготовка к сборке
- Для определенности будем считать, что исходники распакованы в каталоге D:\OCaml\ocaml-3.10.2.
- Пусть TCL будет установлен в каталог D:\Tcl.
Установка CygWin
При установке CygWin устанавливается только минимальный набор пакетов, недостаточный для сборки. Сверх минимального набора пакетов нам понадобится только пакет make.
При сборке в CygWin будет обламываться линковка из-за того, что в CygWin входит утилита link.exe, которая скрывает link.exe от Студии. Проблему можно решить модификацией переменной PATH – поставить пути к Студии раньше, чем пути к CygWin/bin. Я решил проблему проще: переименовал CygWin'овый link :)
Модификация CygWin.bat. Для подготовки среды сборки нужно установить ряд переменных окружения типа PATH, LIB и INCLUDE. Т.к. я не силен работе с линуксовой командной строкой, то вместо настройки из CygWin я просто модифицировал стартовый файл CygWin – CygWin.bat. Я просто добавил туда содержимое vsvars32 и iclvars из Студии и ICC. К переменной LIB нужно дополнительно добавить путь к библиотекам TCL: D:/Tcl/lib.
После настройки CygWin, запускаем ее и выполняем, согласно инструкции, следующие подготовительные команды:
Настройка makefile
В каталоге D:\OCaml\ocaml-3.10.2\config необходимо отредактировать makefile:
- Установить переменную PREFIX – путь, куда установить собранный O'Caml. Я указал D:/OCaml.
- Установить переменную TK_ROOT – путь, куда установлен TCL. Указываем: D:/Tcl.
- Заменить вызовы cl на вызовы icl. Т.е. компиляция будет происходить не встроенным в Студию компилятором, а ICC.
Обработка напильником исходников O'Caml
Допиливание связано с тем, что make обламывается на переводах строки в стиле Windows – оно ожидает их в линуховом формате. Возможно, здесь я сам прокосячил – при установке CygWin выдается запрос какие переводы строк следует поддерживать. Linux-формат стоял как recommended, поэтому я его и выбрал.
Итак, допилить нужно следующие файлы:
- d:\ocaml\ocaml-3.10.2\byterun\version.h – на него вообще выдается Mac file format detected – неправильный перенос строки там виден невооруженным взглядом.
- Файлы stdlib\Compflags и \build\*.* – замену можно сделать Фаром: открыть файл и по Shift-F2 сохранить с требованием использовать переводы строки в стиле Линукса.
Сборка
Просто выполняем в CygWin команды по инструкции:
Проверка
Запускаем из командной строки все необходимые батники для установки переменных окружения и запускаем на компиляцию вот этот учебный пример:
командой
Если все сделано правильно, то на выходе получим полностью самостоятельный EXE размером 335К. Тогда как EXE, собранный студийным компилятором, весит, примерно, 275К. Признаки компилятора Интел налицо :)
Примечания
Возможно, люди, которые лучше разбираются с командной строкой Линукса, могли бы предложить более прямой способ сборки. Мне же CygWin был нужен только для сборки, поэтому я с ним особо не церемонился.
Реально для сборки программ на O'Caml нужны только пересобранные рантайм-библиотеки, а не вообще весь компилятор, его рантайм и прикладные библиотеки. Вероятно, существует более простой способ, которым можно собрать только рантайм-библиотеки.
Ссылок на эту страницу нет