Немного о том, как установить:
Распаковать куда-нибудь, далее обозначено многоточием.
Добавить в PATH …\AdaMagic\windows\bin
Установить переменную среды ADA_MAGIC=…\AdaMagic\windows
Подредактировать …\AdaMagic\windows\SITE\rts_path и …\AdaMagic\windows\SITE\config
Дальше тяжело без документации. В PDF мало. Решал эту проблему. Вот, что удалось выяснить:
AdaMagic умел работать в 3х режимах, промежуточное представление, которое нужно компилировать дальше в машинный код собственными усилиями, либо в C/C++, либо в Java. И всё это — AdaMagic. Один поставщик (Intermetrics, AverStar, SofCheck) раздавал лицензии разным компаниям под разные условия, и когда мы берём чей-то компилятор, это адаптация AdaMagic.
Вот у MapuSoft именно второй сценарий, а у ObjectAda — первый и третий, но нет второго. ObjectAda однажды устроил раздачу бесплатных версий своего компилятора (ObjectAda 7.2 Special Edition), я себе такой сохранил, впрочем, в Интернете ещё можно найти, архив называется oa71sped.zip , и вот он пригодился. Свет проливается на то, как всё устроено. В частности, обнаруживается, что adacgen.exe — это переименованный adacomp.exe, а adabgen.exe — это переименованный adabuild.exe. А ещё в ObjectAda можно найти adacomp.inf и adabuild.inf, и если их переименовать и положить в …\AdaMagic\windows , то утилиты командной строки перестают ругаться. Правда, справка не вполне подходит. Так, в ObjectAda есть ключ -asm, что имеет смысл для компилятора для Windows, но не имеет смысла для конвертера в C/C++. Более правильная «документация» нашлась здесь:
http://www.ada-auth.org/cpl/reports/ACATR048.txt Это отчёт на проверку соответствия стандарту языка Ада 95, а заодно он включает искомую документацию, хоть и старую, но сойдёт. Кстати, там всплывают ещё одни возможные имена: adacsrc и adacbuild, соответственно. Также частично удалось восстановить смысл новых ключей, глядя в код AppCOE.
Итого ключи adacgen (как представляющей наибольший интерес утилиты) получаются:
Сильно не понятные ключи (Показать/Скрыть)
-0
-of
-21060
-21061
-21062
-21065L
Относительно понятные ключи (Показать/Скрыть)
-double-size-%s
-c++
-eh
-av
-lc Generate continuous source listing interspersed with messages.
-lp Paginated source listing.
-le Generate continuous source listing interspersed with messages only if errors exist.
-lf
-lr Generate source listing only for source lines with messages. Available in conjunction with -lc or -le.
-lx Generate a cross-reference listing.
-pl Page length.
-pw Page width.
-nh
-chip
+bw Enable BackEnd warnings.
-c Frontend only, don't run the BackEnd.
-f Force generation of .c despite any errors.
-g Generate information for symbolic debugger.
-ga Generate Ada debugging information.
-gc Generate CodeView debugging information.
-h Print a short usage message. The message also prints if a tool is invoked with no parameters.
-help
-ldf
-nonr Force nr off.
-noxr Do not save cross-reference information for the browser.
-no_be_default
-ns
-O Call the optimizer with optimizing level:
all, 3, 2, 1, 0, none.
The default is to use level 3 optimization.
-xr Save xref info for the Browser (default).
-0 Identifies executable version numbers (default).
-of Read options from specified "file".
-ki Keep the info file.
-kil
-ne Don't re-exec adacomp process on failure.
-nle
-pB Pass "option" to the Back End.
-sr (Search and Register) Enable automatic registration of
source files.
-T Print timing information on compiler phases.
-noeo Turns off emitter optimizations.
-config
-xd Override default ADA_MAGIC environment
variable if exists.
-xL Override default lister.
-xX Override default xref lister.
-b
-standard.ol
-line_limit
-translate
-a Analyzer only, don't run the Emitter or BackEnd.
-ds
-eo Turns on emitter optimizations (default).
-ke Keep intermediate files.
-m msg_kind Suppresses the display of any messages of msg_kind
for the current invocation of the compiler.
+m msg_kind Enables the display of any messages of msg_kind
for the current invocation of the compiler.
-mr msg_kind Suppresses the display of any messages of msg_kind
for any recursive invocations of the compiler.
+mr msg_kind Enables the display of any messages of msg_kind
for any recursive invocations of the compiler.
The valid values for msg_kind:
a - all messages
d - implementation-dependent warning messages
e - error messages
i - information messages
n - nyi messages
w - general warning messages
r - redundant messages
By default, all messages except information and redundant messages are
displayed. For recursive invocations, no messages are displayed by
default. For convenience, "-m a" will suppress all messages *except*
errors.
-N Suppress numeric checks.
-nr No "current heap" releases (just keep allocating,
never releasing).
-nz Initialize all heap memory to a non-zero value.
(In hex, the non-zero value is BAD1BAD1 so it
is easy to spot in the debugger, and causes a
Bus Error on the Sparc when dereferenced.)
-ped
-prl Record layout listing for packed record types only.
-q Quiet mode -- suppress all inessential messages.
-rl Record layout listing for all record types.
-s Suppress checks in object code.
-t Trace each declaration and statement passed to
the emitter.
-v Provide verbose output as the tool executes.
-late_inlines Allow pragma Inline to be specified after a specless
subprogram body (for compatibility with Ada 83).
-no_inlines
-discard_names
-suppress_aggregate_temps
-show_freezing
-83 Identify Ada 95 incompatibilities in Ada 83 source. No code is generated.
-2005
-ap
-bool Place "{" and "}" on their own line.
-cap
-cppa
-cppe Use C++ exceptions and namespaces.
-cppn C++ output.
-cppc
-trace
-eot
-gl
-hm
-hs
-kc comment
-kh header
-kt
-ks
-kspan
-kn
-ro
-pp
-singunder
-sleh Suppress language exceptions at runtime.
-speh
-sp
-w Limit on the length of generated C source line.
-xx
-e Report only the first <n> errors. The default is 50 errors.
Также оказалось полезно, что компилятор запоминает, с какими ключами собирались файлы, и пишет в файлы info. Например, Ada RTL для Windows собрана так:
COMPSW: adacomp SRC -m a -config ./config -config ./config -ke -xr -gc -O none -trace -eo +mr e -translate -pB -IXIL
Здесь по идее должен быть adacgen, а не adacomp, но не везде имя поменяли, и в данном случае в файлики штампуется оригинальное имя утилиты.
А вот ключи для компиляции демки судоку, собранной средствами AppCOE:
COMPSW: adacomp SRC -m a -config ./config -config ./config -ke -xr -gc -O none -trace -eo +mr e -translate -pB -IXIL
Поскольку AppCOE ставить не хочется, вот так вот и достаётся оттуда информация.
Экспериментировал с emscripten. Собралось 287 из 325 файлов Ada RTL. Остальное нужно портировать вручную. Там всякие функции получения системного времени, аргументов командной строки и т. п.
Так как заморачиваться этим на первых порах не хочется, хотелось предоставить какую-нибудь заглушку, чтоб компилятор сам не вызывался, и чтоб можно было с неполным рантаймом собирать. Оттранслировать в C++ и не дать автоматически транслировать дальше. Посмотреть в исходник, что там вызывается и написать заглушки.
Нашёл, как это делать:
Сначала каждый исходник нужно обработать adareg:
adareg Hello_World_2.ads
Звёздочки (adareg *.ads *.adb) тоже понимаются.
Потом конвертировать:
adacgen -c -cppn -cppe -ke -ki Hello_World_2.ads
Это сконвертирует исходник Ada в C++. Так нужно и для тел, и для спецификаций сделать. Чтобы в C, надо убрать "-cppn -cppe". Чтобы убрать проверки, можно добавить -s. Это уже становится не Ada, но всё ещё хотя бы язык с нормальной системой типов и модулей. Всё это нужно, чтобы хоть что-то запустить на момент, пока рантайм ещё не портирован и даже заглушек ещё нет.