> -- 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: Поскольку для мейкфайлов важно различие между символом табуляции и пробелом, то лучше не копируйте из браузера, а скачивайте приложенный архив.