OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Воскресенье, 22 Сентябрь, 2019 08:45

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




Начать новую тему Ответить на тему  [ Сообщений: 41 ]  На страницу 1, 2, 3  След.
Автор Сообщение
СообщениеДобавлено: Вторник, 09 Ноябрь, 2010 17:04 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 321
Откуда: Украина, Днепропетровская обл.
Программирование на Обероне начинается с выбора компилятора. Многие из нас уже определились с основным компилятором (средой) и пользуются только им, или ещё и посматривают в сторону другого, особо его не “обживая”. Некоторые предпочли AOS или BlackBox. Имеется также превосходный безплатный оптимизирующий компилятор XDS, который, вероятно, является наилучшей реализацией языка Оберон-2. Однако политика Excelsior в отношении этого компилятора остаётся неясной. Омрачает прогнозы тот факт, что Александр Ильин обнаружил и забагрепортил несколько найденных им в компиляторе ошибок, которые исправлять разработчики совсем не торопятся. Как и не собираются открывать исходники, чтобы Оберон-сообщество получило возможность исправить ошибки своими силами или доработать компилятор с учётом требований, возникших за последнее десятилетие (например, сделать INTEGER 32-битным или ввести поддержку юникод-строк).

Всё это заставляет искать другие компиляторы. И недавним открытием (благодаря Александру Ильину) стал для меня консольный компилятор ETH Oberon для Win32, которым, ввиду его малой распространённости, хочу поделиться и с вами. О плюсах:

1. Начнём с того, что компилятор этот — вовсе не студенческая поделка. Это канонический Оберон из альма-матер ETH. Вот здесь (http://dic.academic.ru/dic.nsf/ruwiki/1070131) есть такое высказывание: “Наиболее зрелыми, видимо, следует считать ETH Oberon, реализации которого имеются для многих платформ, и Компонентный Паскаль. Есть несколько систем разработки программ для различных вариантов языка Оберон: ETH Oberon, доступная для многих вычислительных платформ”. Да, это тот самый компилятор, на котором разработана ETH Oberon System 3.

2. Для нас ценно то, что с ним можно работать не внутри Оберон-системы, а прямо из-под Windows. Качество исполняемого кода мною не изучалось, но уверен, что оно не хуже, чем у компилятора BlackBox.

3. Есть наработки кода, сделанные именно на этом компиляторе. Я подробно не искал, но, вероятно, с минимальными правками соберётся много чего даже из исходников AOS. Также я сделал ограниченную поддержку данного компилятора и в своём проекте “SDL for Oberon” (http://sourceforge.net/projects/sdl-for-oberon).

4. ETH Oberon частично поддерживает Active Oberon. Подчёркиваю, не весь Активный Оберон, только его подмножество. AO тоже родился в ETH, и компилятор ETH закономерно поддерживает его какую-то часть. Например, переопределение операций:

Код:
(** Comparison Operators*)

PROCEDURE "<="* (a, b: HUGEINT): BOOLEAN;
BEGIN   RETURN Compare()#Gt
END "<=";

PROCEDURE "="* (a, b: HUGEINT): BOOLEAN;
BEGIN   RETURN Compare()=Eq
END "=";

PROCEDURE "#"* (a, b: HUGEINT): BOOLEAN;
BEGIN   RETURN Compare()#Eq
END "#";

Запросто собирается следующее:

Код:
MODULE ReaderWriter; 

TYPE
  RW = OBJECT 
    (* n = 0, пусто *) 
    (* n < 0, n писателей *) 
    (* n > 0, n читателей *) 
    VAR n: LONGINT; 

    PROCEDURE EnterReader*; 
    BEGIN {EXCLUSIVE} 
      AWAIT(n >= 0); INC(n) 
    END EnterReader; 

    PROCEDURE ExitReader*; 
    BEGIN {EXCLUSIVE} 
      DEC(n) 
    END ExitReader; 

    PROCEDURE EnterWriter*; 
    BEGIN {EXCLUSIVE} 
      AWAIT(n = 0); DEC(n) 
    END EnterWriter; 

    PROCEDURE ExitWriter*; 
    BEGIN {EXCLUSIVE} 
      INC(n) 
    END ExitWriter; 

    PROCEDURE & Init; 
    BEGIN n := 0 
    END Init; 

  END RW; 

END ReaderWriter.

5. Также поддержан встроенный ассемблер, что вообще редкость для компиляторов Оберона. Между тем, что может быть нагляднее для восприятия кодовых вставок в программе, чем ассемблер?

Код:
PROCEDURE LIntToHInt*(i: LONGINT): HUGEINT;
CODE {SYSTEM.i386}
   MOV   EAX, i[EBP]
   CDQ
   MOV   EBX, 12[EBP]
   MOV   0[EBX], EAX
   MOV   4[EBX], EDX
END LIntToHInt;

PROCEDURE RealToHInt*(r: REAL): HUGEINT;
CODE {SYSTEM.i386, SYSTEM.FPU}
   FLD   DWORD   r[EBP]
   MOV   EAX, 12[EBP]
   FISTP   QWORD [EAX]
   WAIT
END RealToHInt;

PROCEDURE LRealToHInt*(r: LONGREAL): HUGEINT;
CODE {SYSTEM.i386, SYSTEM.FPU}
   FLD   QWORD   r[EBP]
   MOV   EAX, 16[EBP]
   FISTP   QWORD [EAX]
   WAIT
END LRealToHInt;

6. Ну и, наконец, в отличие от BlackBox и XDS — компилятор ETH полностью свободный и с открытыми исходниками. А поскольку он изначально спроектирован как портабельный, и есть реализации для других систем, то, вероятно, нетрудно будет собрать на основе приложенных исходников консольный компилятор ETH Oberon, генерирующий код для других платформ, отличных от 80x86, и линкер, создающий исполняемые файлы для других платформ. Безусловно, наиболее интересует создание исполняемых файлов и библиотек в формате ELF для Linux.

Минусы.

1. Слабая “обвязка” вокруг Windows, базовые привязки к dll придётся разрабатывать самостоятельно.

2. Неудобный линкер, требующий вручную прописывать импортируемые процедуры из подлинковываемых dll-библиотек.

3. Неудобный вывод позиции ошибки. Выводится не строка и позиция, а абсолютное число, высчитывать приходится вручную. Я не делал попыток прикрутить компилятор к текстовому редактору, чтобы курсор автоматически устанавливался в позицию ошибки, но буду рад увидеть подобные разработки, например, с Obide. (Другой вариант — рулит SynEdit со схемой подсветки синтаксиса Modula-3. Для Оберона пользуюсь, удобно).

4. Не удалось объявить на уровне типа нетрассируемый указатель. На атрибуты [UNTRACED], [NOTAG] и [C] при объявлении типа компилятор неизменно ругается “err 200 not yet implemented”. Это довольно серьёзный недостаток, потому что теряется возможность полноценно возвращать нетрассируемый указатель, а объявлять его, получается, можно лишь на уровне переменных. Т.е. не работает:

Код:
TYPE
  PRect* = POINTER [UNTRACED] TO Rect;

Также не работает:

Код:
TYPE
  PRect* [UNTRACED] = POINTER TO Rect;

Работает лишь так:

Код:
TYPE
    PRect* = POINTER TO Rect;
VAR
    rect* [UNTRACED]: PRect;

Такая реализация лишает нас возможности экспортировать на уровне типа нетрассируемый указатель, а также вернуть из процедуры нетрассируемый указатель на запись. Поэтому пришлось сделать вместо:

Код:
TYPE
  PSurface* = POINTER TO Surface;
  Surface* = RECORD [NOTAG]
      …
  END;
VAR
  LoadBMPRW-: PROCEDURE [C] (src: PRWops; freesrc: Integer): PSurface;

так:

Код:
TYPE
  Pointer = LONGINT;
VAR
  LoadBMPRW-: PROCEDURE [C] (src: PRWops; freesrc: Integer): Pointer (*PSurface*);

Если есть решение, которое я упустил, пожалуйста, дайте знать.

Кстати, решена ли эта проблема в Active Oberon? Насколько я понимаю, тоже нет (http://www.ocp.inf.ethz.ch/forum/index.php/topic,450.0.html). Невозможность экспортировать тип нетрассируемый указатель или безхитростно возвратить из процедуры (особенно написанной не на Обероне) нетрассируемый указатель на запись лично мне, после работы на BlackBox и XDS, кажется корявостью. Это позволяет предположить, что AO и ETH Oberon затрудняют интеграцию с другими хорошо зарекомендовавшими себя решениями, что они более “вещи в себе”, чем XDS и BlackBox, ибо последние более дружественны к интеграции с наработками на других языках/ОС.

5. Символ "_" в идентификаторах не поддержан наглухо. С чем это связано — остаётся только догадываться. Здесь я вспомнил также компилятор Oberon-M, который попортил мне этим немало крови, но заставил понемногу отказаться от символа “_” вообще. Полагаю, у мэтра Вирта есть причина невзлюбить этот символ в идентификаторах.

Как видите, компилятор совсем неплох, и я решился пропиарить его, поскольку мало кто из опрошенных мною оберонщиков о нём слышал; мне понравились и встроенный ассемблер, и поддержка подмножества Active Oberon, более того, я начал адаптацию библиотеки SDL именно для этого компилятора, а не для BlackBox. Этим и объясняются некоторые решения, в частности, отказ от символа "_" в идентификаторах. Это может показаться необоснованным, но важно для создания той самой единой языковой Оберон-базы, которая позволит свободно перейти с одного компилятора на другой, не перелопачивая при этом много кода (В идеале — вообще не изменяя).

Ну и, наконец, мечты. Хотелось бы иметь порт данного консольного компилятора для Linux, а также совсем уж хорошо иметь консольный компилятор для Win32/Linux, добытый из AOS. Надеюсь, кто-то займётся. Также хочу особенно обозначить важность кросс-компиляторных средств, ориентированных на Оберон как на языковую платформу, чтобы можно было в процессе разработки изменить компилятор. (Например, если возникла необходимость перейти на безплатный компилятор). Это подразумевает как общие по интерфейсным вызовам и логике модули привязки к сторонним библиотекам, так и оригинальные Оберон-разработки, которые будут вестись целенаправленно для нескольких компиляторов одновременно. Напомню, пресловутая кроссплатформенность языка Си зиждется именно на одинаковом по интерфейсу наборе библиотек типа stdio.h, strings.h и т.д. для каждой из платформ, что дало повод заявить о платформенной независимости части программ (особенно консольных), разработанных на Си. Пока что я не видел таких кросс-компиляторных наработок для языков Оберон-семейства. А отход от заглавных символов в идентификаторах в Zonnon меня, честно говоря, даже расстроил. По привычке это удобно даже при работе в Delphi.

P.S. Результаты работ по адаптации SDL к ETH Oberon выложены на http://sourceforge.net/projects/sdl-for-oberon, плюс маленькая демка. Сделано немного, делюсь тем, что сделал, как некий своеобразный результат небольшого исследования данного компилятора. Большего пока не планируется. Полная поддержка SDL для ETH Oberon возможна при решении проблемы объявления на уровне типов нетрассируемого указателя. Впрочем, для SDL я вижу ещё одно решение: создать объектную обвязку. Однако этим мне заниматься не хочется, да и времени нет.

P.P.S. Вопрос к знающим людям: возможно ли на основе приложенных исходников собрать консольные компилятор и линкер Active Oberon, порождающие независимые от AOS EXE-файлы для Windows?


Вложения:
Комментарий к файлу: Консольный компилятор ETH Oberon для Win32
ETHCompiler.zip [446.06 КБ]
Скачиваний: 334
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 09 Ноябрь, 2010 17:52 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
Oleg N. Cher писал(а):
Код:
TYPE
  PRect* = POINTER [UNTRACED] TO Rect;
А чем Вы редактировали код?

Так пробовали?
Код:
TYPE
  PRect* = POINTER TO [UNTRACED] Rect;
Код:
TYPE
  PRect* = POINTER TO Rect [UNTRACED];


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 09 Ноябрь, 2010 20:37 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 321
Откуда: Украина, Днепропетровская обл.
Valery Solovey писал(а):
А чем Вы редактировали код?

О, Ваш вопрос совершенно уместен, потому что если отредактировать “неправильным” редактором, ошибки появляются на совершенно ровном месте. Для примера попробуйте открыть XGrRsrc.Mod (скаченный с http://sourceforge.net/projects/sdl-for-oberon) в TigerPad и просто сохранить. Модуль перестанет компилироваться. Из этого можно сделать вывод, что поддержка текстового формата в компиляторе хоть и есть, но не совсем верная, и это проявляется на текстах модулей, использующих встроенный ассемблер. Но не сомневайтесь, я приспособился к этой, гм, особенности, и использовал “правильный” редактор SynEdit (со схемой подсветки синтаксиса Modula-3).
Цитата:
Так пробовали?
Код:
TYPE
  PRect* = POINTER TO [UNTRACED] Rect;
Код:
TYPE
  PRect* = POINTER TO Rect [UNTRACED];

Не работает.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 09 Ноябрь, 2010 21:23 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2311
Откуда: Россия, Томск
Интересно, можно ли в AOS или в данном компиляторе переопределить операторы присваивания или разыменования указателя?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 13 Ноябрь, 2010 12:01 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 321
Откуда: Украина, Днепропетровская обл.
Александр Ильин писал(а):
Интересно, можно ли в AOS или в данном компиляторе переопределить операторы присваивания или разыменования указателя?

Присваивания — можно:
Код:
(** Dyadic Assignment Operator *)
PROCEDURE ":="* (VAR a : HUGEINT; b : LONGINT);
BEGIN
   a := LIntToHInt(b)
END ":=";

Реализации присваивания в случае разных типов выражений можно определить отдельно. Разыменования — не нашёл. Недавнее открытие — можно использовать inline-процедуры (отмечаются префиксом "-"):
Код:
PROCEDURE -Compare(): LONGINT;
CODE {SYSTEM.i386, SYSTEM.FPU}
   FILD   QWORD 8[EBP]         ; b->ST(1)
   FILD   QWORD 16[EBP]         ; a->ST(0)
   FCOMPP
   DB   9BH, 0DFH, 0E0H         ; FSTSW   AX
   AND   EAX, 4500H              ; use c3, c2, c0
END Compare;


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 13 Ноябрь, 2010 20:27 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4489
Откуда: Россия, Орёл
Очередное обсуждение комм. лицензии вырезано: viewtopic.php?p=53871#p53871


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 14 Ноябрь, 2010 00:33 

Зарегистрирован: Понедельник, 27 Июль, 2009 16:55
Сообщения: 3
Цитата:
P.P.S. Вопрос к знающим людям: возможно ли на основе приложенных исходников собрать консольные компилятор и линкер Active Oberon, порождающие независимые от AOS EXE-файлы для Windows?

Ну да, уже в принципе скомпилировал компилятор...
Цитата:
что поддержка текстового формата в компиляторе хоть и есть, но не совсем верная,

Не учитывается 0AX символ возврата каретки Windows

На вскидку исправляем в модуле OPA.mod

Код:
(* Scanner: ASCII codes *)
      TAB = 09X;
      CR = 0DX;
      SPACE = 20X;

на
Код:
(* Scanner: ASCII codes *)
      TAB = 09X;
      CL = 0AX;
      CR = 0DX;
      SPACE = 20X;


и в функции PROCEDURE Get(VAR sym: INTEGER);

строку

Код:
| CR:   OPM.Get(OPS.ch); sym := ScCR

исправляем на
Код:
| CR,CL:   OPM.Get(OPS.ch); sym := ScCR


И пользуемся на здоровье...

Удалено модератором


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 14 Ноябрь, 2010 13:34 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2311
Откуда: Россия, Томск
Обычно такая константа называется не CL, а LF (Line Feed):
http://ru.wikipedia.org/wiki/Перевод_строки писал(а):
Системы, основанные на ASCII или совместимом наборе символов, используют или LF (перевод строки, 0x0A), или CR (возврат каретки, 0x0D) по отдельности, или последовательность CR+LF; см. ниже историческую причину для соглашения CR+LF. Эти названия основаны на командах принтера: перевод строки означает, что одна строка на бумаге должна быть перенесена при печати, а возврат каретки означает, что каретка печатающего устройства должна вернуться к началу текущей строки.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 24 Ноябрь, 2010 11:39 

Зарегистрирован: Среда, 24 Ноябрь, 2010 11:35
Сообщения: 6
Здравствуйте, скачала ETHCompiler, а как его теперь пересобрать???


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 25 Ноябрь, 2010 19:07 

Зарегистрирован: Вторник, 26 Январь, 2010 09:31
Сообщения: 714
Откуда: Барнаул
Анастасия писал(а):
Здравствуйте, скачала ETHCompiler, а как его теперь пересобрать???

У меня есть, файл приложен.
Там есть ReadmeRusAdd.txt, в котором всё описано, а в папке src волшебная кнопка, вернее батник makeall.bat.
Не помню, насколько приложенные исходники соответствуют оригинальным ETHOberon, возможно что-то правил, если не то, поищу ещё, просто у меня несколько папок, где я экспериментировал с ним. Но эти точно компилируются.


Вложения:
ETHCompiler.zip [602.55 КБ]
Скачиваний: 280
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 29 Ноябрь, 2010 01:14 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2311
Откуда: Россия, Томск
Kemet писал(а):
У меня есть, файл приложен.
Отлично! Большое спасибо вам!

А я в ответ поделюсь только что сделанным мейкфайлом. Я пользуюсь GNU Make для компиляции проектов. Для работы также потребуется наличие GNU утилит sed и tr.
Код:
# This is GNU makefile. (c) Alexander Iljin (ajsoft@yandex.ru), November 2010.
# Run 'make' to make the projects.

# Projects = space separated list of the exe-files to build
Projects := O2ETHCLC.exe O2ETHCLL.exe
# Platform = file name prefix for the target platform modules
Platform := Win32
# Compiler name to be used
Compiler := o2c.exe
# Compiler options: W = enable warnings, 2 = compile as Oberon-2 language
CompilerOptions := @W2
# Linker name to be used
Linker := o2l.exe

# Declare some phony targets for optimization.
.PHONY: clean default

# First rule will be made by default. Make all projects using default commands.
default: $(Projects)

# Every exe-project will have its dependencies listed in a Make-file; include
# those files as part of this file.
include $(Projects:.exe=.Make)

# These files must be present for successful make, so we need a rule like this.
# If this rule is removed and files deleted, the Make will say that there is
# nothing to be done to make the target and quit with success. In fact, these
# dependencies should be moved to the project-specific Project.Make file.
$(Projects): Oberon.Ico Stub.exe

# The following rule will update Make-files based on the contents of the
# Link-files. For every project listed in the Projects variable there will be a
# Make-file included. When a file is included, the GNU Make tries to update it,
# and this rule is exactly for the purpose. It will generate the Make-file by
# parsing the Link-file and listing its dependencies as Obj-files. In fact,
# this list should be generated by the linker application.
%.Make: %.Link
   # Output prerequisite name.
   echo $*.exe: >$@.tmp
   # First Sed script normalizes line endings from Oberon System CR to CR+LF.
   # If line endings are already CR+LF, it has no effect.
   # Second Sed script deletes lines upto "MODULES" and from "IMPORTS" to EOF.
   # This leaves us with the contents of the MODULES section. In this section
   # commas are replaced with ".Obj " text (space is intentional), making the
   # space-separated list of imported Obj-files. Also, tabs are replaced with
   # spaces. The words MODULES and IMPORTS in the source file must be on
   # separate lines.
   sed -e "s/\r/\n/g" <$< | sed -e "1,/MODULES/ d" -e "/IMPORTS/,$$ d" -e "s/,/.Obj /g" -e "s/\t/ /g" >>$@.tmp
   # Add extension for the last file name, for there is no comma at the end.
   echo .Obj>>$@.tmp
   # Tr removes EOL characters (\12 = LF, \15 = CR) and compresses consecutive
   # spaces.
   tr -ds \12\15 " " <$@.tmp >$@
   del $@.tmp

# There are two rules to make Obj-files. The first one simply expects a
# Mod-file of the same name. If there is no such file, the second rule is used.
%.Obj: %.Mod
   $(Compiler) $< $(CompilerOptions)

# The second rule expects a Win32.Name.Mod file, where "Win32" is the target
# platform name (the Platform variable specified above) and "Name" is the name
# of the Obj-file to be created.
%.Obj: $(Platform).%.Mod
   $(Compiler) $< $(CompilerOptions)

# To make exe- or dll-file we need the Link-file. The latter is passed to the
# Linker. The list of Obj-file dependencies specific to a project is
# automatically generated and included as Project.Make file.
%.exe %.dll: %.Link
   $(Linker) $<

# Run 'make clean' to remove everything but the sources.
clean:
   del *.Obj *.Make $(Projects)
Суть работы, как обычно в Make, заключается в том, чтобы откомпилировать только то, что изменилось. Если ничего не изменилось, то ничего не компилируется. При этом список зависимостей exe-файлов берётся из Link-файлов (тут-то и пригождается sed и tr). В принципе, можно было просто прописать зависимости прямо в мейкфайле вот так:
Код:
O2ETHCLC.exe: Kernel32.Obj Kernel.Obj ADVAPI32.Obj Registry.Obj FileDir.Obj Files.Obj Modules.Obj Objects.Obj Reals.Obj Dates.Obj Strings.Obj Console.Obj Fonts.Obj Texts.Obj OPM.Obj OPS.Obj OPT.Obj OPO.Obj OPB.Obj OPA.Obj OPL.Obj OPC.Obj OPP.Obj OPV.Obj CmdLine.Obj O2ETHCLC.Obj
Но я решил взять готовый список из Link-файла, тем самым избежав дублирования и получив универсальное решение (можно этот же мейкфайл использовать для компиляции других проектов).

В начале файла размещены переменные, позволяющие настраивать процесс, не углубляясь в детали.

Я ещё не сделал получение списка ресурсов (ICONS) из Link-файла, просто прописал Oberon.Ico в пререквизитах *.exe.

Если у кого-то есть вопросы, где добыть или как установить утилиты GNU под Windows, обращайтесь.

Пример работы:
Код:
F:\Distrib\Oberon\ETH Oberon\ETHCompiler\Src>make clean
del *.Obj *.Make O2ETHCLC.exe O2ETHCLL.exe

F:\Distrib\Oberon\ETH Oberon\ETHCompiler\Src>make
makefile:20: O2ETHCLC.Make: No such file or directory
makefile:20: O2ETHCLL.Make: No such file or directory
echo O2ETHCLL.exe: >O2ETHCLL.Make.tmp
sed -e "s/\r/\n/g" <O2ETHCLL.Link | sed -e "1,/MODULES/ d" -e "/IMPORTS/,$ d" -e "s/,/.Obj /g" -e "s/\t/ /g" >>O2ETHCLL.Make.tmp
echo .Obj>>O2ETHCLL.Make.tmp
tr -ds \12\15 " " <O2ETHCLL.Make.tmp >O2ETHCLL.Make
del O2ETHCLL.Make.tmp
echo O2ETHCLC.exe: >O2ETHCLC.Make.tmp
sed -e "s/\r/\n/g" <O2ETHCLC.Link | sed -e "1,/MODULES/ d" -e "/IMPORTS/,$ d" -e "s/,/.Obj /g" -e "s/\t/ /g" >>O2ETHCLC.Make.tmp
echo .Obj>>O2ETHCLC.Make.tmp
tr -ds \12\15 " " <O2ETHCLC.Make.tmp >O2ETHCLC.Make
del O2ETHCLC.Make.tmp
o2c.exe Win32.Kernel32.Mod @W2
o2c.exe Win32.Kernel.Mod @W2
o2c.exe Win32.ADVAPI32.Mod @W2
o2c.exe Win32.Registry.Mod @W2
o2c.exe Win32.FileDir.Mod @W2
o2c.exe Win32.Files.Mod @W2
o2c.exe Win32.Modules.Mod @W2
o2c.exe Win32.Objects.Mod @W2
o2c.exe Win32.Reals.Mod @W2
o2c.exe Dates.Mod @W2
o2c.exe Strings.Mod @W2
o2c.exe Console.Mod @W2
o2c.exe Fonts.Mod @W2
o2c.exe Texts.Mod @W2
o2c.exe OPM.Mod @W2
o2c.exe OPS.Mod @W2
o2c.exe OPT.Mod @W2
o2c.exe OPO.Mod @W2
o2c.exe OPB.Mod @W2
o2c.exe OPA.Mod @W2
o2c.exe OPL.Mod @W2
o2c.exe OPC.Mod @W2
o2c.exe OPP.Mod @W2
o2c.exe OPV.Mod @W2
o2c.exe CmdLine.Mod @W2
o2c.exe O2ETHCLC.Mod @W2
o2l.exe O2ETHCLC.Link
o2c.exe Types.Mod @W2
o2c.exe Win32.Threads.Mod @W2
o2c.exe Win32.Exceptions.Mod @W2
o2c.exe Bootlink.Mod @W2
o2c.exe O2ETHCLL.Mod @W2
o2l.exe O2ETHCLL.Link

F:\Distrib\Oberon\ETH Oberon\ETHCompiler\Src>make
make: Цель `default' не требует выполнения команд.
PS: Поскольку для мейкфайлов важно различие между символом табуляции и пробелом, то лучше не копируйте из браузера, а скачивайте приложенный архив.


Вложения:
Makefile.zip [1.6 КБ]
Скачиваний: 227
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 30 Ноябрь, 2010 12:35 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2311
Откуда: Россия, Томск
Обновил мейкфайл в предыдущем посте: добавил .PHONY, вынес Oberon.Ico и Stub.exe в отдельное правило, убрал отдельное правило для DLL.

Исправлено: отсутствие Oberon.Ico и/или Stub.exe приводило к тому, что Make успешно завершался, но exe-файл не создавался. Теперь будет ругаться на отсутствие файлов.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 30 Ноябрь, 2010 14:14 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
А O2ETHCLL выдаёт справку по команде
Код:
O2ETHCLL /?

И где взять формат Link-файла, а то даже непонятно, как скомпилировать какой-нибудь hello.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 30 Ноябрь, 2010 14:16 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
Кстати, если команду tr -ds \12\15 заменить на tr -ds \\12\\15, то работать будет? Потому как у меня без экранирования работа make завершается с ошибкой.

И ещё del. Он работает? Пока не заменил на rm, то не работал.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 30 Ноябрь, 2010 14:20 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
А, я кажется понял. Я использовал bash, а Вы, наверно, запускаете из стандартной оболочки винды.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 30 Ноябрь, 2010 14:36 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2311
Откуда: Россия, Томск
Valery Solovey писал(а):
И где взять формат Link-файла, а то даже непонятно, как скомпилировать какой-нибудь hello.
Для Hello* Link-файлы приложены: HelloGUI.Link и HelloCon.Link. Только там надо первую строчку поправить, чтобы имя exe-файла (PROGRAM ...) совпадало с именем Link-файла, иначе Make будет думать, что не смог собрать exe-файл.

Вообще, формат Link-файлов смотрите в UserGuide.txt, предпоследний раздел.
Valery Solovey писал(а):
А, я кажется понял. Я использовал bash, а Вы, наверно, запускаете из стандартной оболочки винды.
Да, я работаю в cmd.exe. И так нужно Make, Sed и Tr установить, не хочу ещё Bash тянуть в зависимости. Это касается экранирования обратных слэшей и del.

Чтобы в консоль выдавалась справка, нужно импортировать в реестр файл O2ETHCLC.Reg.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 30 Ноябрь, 2010 14:38 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2311
Откуда: Россия, Томск
Кстати, программа HelloGUI не завершается при закрытии окна сообщения (висит в списке задач). Чтобы это предотвратить, нужно добавить вызов Kernel32.Shutdown(0) в конец главного модуля. Как сделать так, чтобы само завершалось, ещё не понял.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 30 Ноябрь, 2010 14:57 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2311
Откуда: Россия, Томск
Закинул проект на GitHub: https://github.com/AlexIljin/OPCL
Написал несколько задач на ближайшую доработку. Желающие приглашаются : )


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 30 Ноябрь, 2010 15:41 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
Александр Ильин писал(а):
Для Hello* Link-файлы приложены: HelloGUI.Link и HelloCon.Link. Только там надо первую строчку поправить, чтобы имя exe-файла (PROGRAM ...) совпадало с именем Link-файла, иначе Make будет думать, что не смог собрать exe-файл.
Спасибо, я про архив с примерами как-то забыл, и написал свой.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 30 Ноябрь, 2010 17:25 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2311
Откуда: Россия, Томск
Добавил пример проекта с DLL, вариация на тему HelloGUI: программа вызывает процедуру, находящуюся в DLL, и та процедура отображает диалоговое окошко. Выложил на GitHub.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 41 ]  На страницу 1, 2, 3  След.

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


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

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


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

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB