Оберон-клуб «ВЄДАsoft»

Твердыня модульных языков
Текущее время: 15 дек 2017, 19:57

Часовой пояс: UTC + 2 часа




Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
 Заголовок сообщения: Ofront и OfrontPlus на Линуксе
СообщениеДобавлено: 24 май 2016, 23:18 
Не в сети
Администратор
Аватара пользователя

Сообщения: 9
Откуда: Рига, Латвийская ССР
Я разбираюсь с Ofront, пытаюсь собрать консольный транслятор-компилятор для Линукса и для Виндоуса и решил написать об этом на форум.

Что я сделал:
1) Зашёл на software-templ.com и скачал бинарную версию Ofront для Линукса.
2) Прочёл, что исходный код линуксовской версии Ofront'а находится на Google code. Долго копался на этом сайте (кажется, проект Google Code закрыт?) и наконец-то на этой странице посередине нашёл кнопку Download, скачал исходники.
3) Зашёл в терминале в каталог «ofront/V4_ofront/linux386» и запустил команду «make», которая вылетела с ошибкой. Оказалось, что для того, чтобы собрать из исходников исполняемый файл, необходимо уже иметь исполняемый файл «ofront», поэтому я взял его из архива, скачанного на пункте №1. В архивах находится как компилятор (траслятор), так и система Oberon V4, запускающаяся в линуксовском окне через «X», но нас пока интересует только компилятор.
4) Отредактировал 15-ю строчку в файле «ofront/V4_ofront/linux386/makefile»:
Код: "OBERON"
  1. Было:
  2. OFRONT = $(SETPATH) ofront -s
  3. Стало:
  4. OFRONT = $(SETPATH) ../../../linbin/bin/ofront -s
То есть я просто указал путь к исполняемому файлу «ofront». Наверное, можно было скопировать этот файл в текущий каталог, но я решил этого не делать, чтобы он не был перезаписан одноимённым откомпилрованным файлом.
Снова запустил «make», на этот раз всё сработало. Помимо компилятора и нескольких исполняемых файлов, появилась ещё и библиотека OberonV4 в двух видах: libOberonV4.a (статическая) и libOberonV4.so (динамическая). Проверил «make install» - ничего не происходит, такой секции в makefil'е нет.
5) Пришло время проверить получившийся компилятор. Отдельно от всего этого создал отдельный каталог, в нём создал «MyMod.Mod»:
Код: "OBERON"
  1. MODULE MyMod;
  2. IMPORT Console;
  3. BEGIN
  4. Console.String('Hello MyMod!'); Console.Ln
  5. END MyMod.
Модуль «Console» подглядел в файлах, поставляемых с компилятором.
6) После долгих разбирательств подобрал вот такой вот bash-скрипт:
Код: "OBERON"
  1. #!/bin/bash
  2. OFRONTPATH=/home/...путь.../ofront/V4_ofront/linux386
  3. OFRONT=$OFRONTPATH/ofront
  4. OBERON=.:$OFRONTPATH $OFRONT -s MyMod.Mod -m
  5. cc MyMod.c -o MyMod -I$OFRONTPATH -L$OFRONTPATH -lOberonV4 -lm -lX11
Запуск транслятора весьма непривычный. Остановимся на нём поподробнее:
Код: "OBERON"
  1. OBERON=.:$OFRONTPATH $OFRONT -s MyMod.Mod -m
После того, как это разворачивается (подставляются значения переменных, начинающихся с $), получается примерно следующее:
Код: "OBERON"
  1. OBERON=.:/home/user/ofront /home/user/ofront/ofront -s MyMod.Mod -m
Тут на самом деле запускается файл «/home/user/ofront/ofront», а «OBERON=...» - это, передающаяся этому файлу, переменная окружения с именем «OBERON». Если её задать непосредственно перед запуском «ofront» на отдельной строчке или вообще не задавать, то «ofront» не найдёт файла с модулем «Console». Ту же самую команду можно выполнить в более привычном виде, через «env»:
Код: "OBERON"
  1. env OBERON=.:$OFRONTPATH $OFRONT -s MyMod.Mod -m
Скрипт я назвал «x» и выполнил команды:
Код: "OBERON"

7) Но появившийся исполняемый файл «MyMod» не работает:
Код: "OBERON"
  1. $ ./MyMod
  2. ./MyMod: error while loading shared libraries: libOberonV4.so: cannot open shared object file: No such file or directory
Это происходит потому, что он скомпонован с библиотекой OberonV4 динамически, а не статически и при запуске не может найти эту самую динамическую библиотеку (то есть файл «libOberonV4.so»). В свою очередь, это произошло потому, что файлы libOberonV4.so и libOberonV4.a находятся рядом и GCC молча взял тот, который *.SO. Поэтому либо переименовываем/перемещаем файл libOberonV4.so, чтобы он не мешался, либо редактируем одну строчку в скрипте компиляции:
Код: "OBERON"
  1. cc MyMod.c -o MyMod -I$OFRONTPATH -L$OFRONTPATH -lOberonV4 -static
Теперь всё работает, а «MyMod» весит не 6, а 639 килобайт (т. к. внутри себя содержит libOberonV4.a). Наверняка его можно почистить какой-нибудь утилиткой - убрать лишнее, но я этим никогда не занимался.
8) А ещё можно не компоновать программу статически, а вместо этого сделать так, чтобы она успешно находила этот «libOberonV4.so». Тут есть три варианта:
8.1) Запускаем программу не по-обыкновенному, а вот так:
Код: "OBERON"
  1. LD_LIBRARY_PATH=...путь.../ofront/V4_ofront/linux386 ./MyMod
8.2) Копируем libOberonV4.so в каталог с программой и запускаем вот так:
Код: "OBERON"
  1. LD_LIBRARY_PATH=. ./MyMod
(Линукс, в отличие от Виндоуса, не берёт динамический библиотечный файл по умолчанию из того же каталога, где находится программа)
8.3) Копируем файл «libOberonV4.so» в каталог «/usr/lib» и запускаем программу по-обыкновенному.


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Ofront и OfrontPlus на Линуксе
СообщениеДобавлено: 25 май 2016, 21:30 
Не в сети
Аватара пользователя

Сообщения: 846
Откуда: Днепропетровская обл.
Йозеф Темпл перенёс разработку Ofront на GitHub, здесь исходники должны быть посвежее:

https://github.com/jtempl/ofront/

Я не настолько хорошо знаю Linux как ты, Артур. :) И до разработки серьёзных программ на Ofront'е под Linux у меня руки не дошли. Для вывода использовал свою библиотеку LinDev.a, которую (давно!) собирал для Linux:

https://github.com/Oleg-N-Cher/XDev/tree/master/LinDev/Lib

Можно собрать свою статическую библиотечку, чтобы не зависеть от libOberonV4.

639 килобайт это много. Должны помочь ключики -ffunction-sections -fdata-sections при компиляции библиотеки и -Wl,--gc-sections при линковке исполняемого файла, но в Linux'е я это не пробовал. MinGW же линкует не весь код, а только необходимые функции.

P.S. Добавил в реп пример Hello для Windows, собирается запуском Work/Build.bat


Вложения:
Hello.png
Hello.png [ 20.34 КБ | Просмотров: 5047 ]
Вернуться к началу
 Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Часовой пояс: UTC + 2 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Тех.поддержка phpBB