Во-первых, достаточно просто было воспользоваться онлайн установщиком tdm-gcc-webdl.exe. Меня смущал выбор всяких seh, sjlj, dwarf2, а онлайн-установщик этим тяжёлым выбором мозг не парит, просто качает, что нужно. При установке можно выбрать или 32-битный компилятор, или 64-битный, но с возможностью компилировать в 32-бита по ключу -m32. Пользоваться этим ключом всё же не просто, если компилировать библиотеки из всяких разных мест с самыми разными системами сборки, поэтому имеет смысл поставить в разные каталоги компиляторы с разной битностью. Компилятор Ады по умолчанию не ставится, но в установщике можно в опциях галочку найти для GNAT, и всё пройдёт успешно. В установщике есть выбор зеркала, вот тут какая-то проблема. Мне ближе всего оказалось зеркало в Казахтане, space.kz, но как-то так интересно вышло, что с этого зеркала скачать файлы установщик не смог. Пришлось запускать заново, опять ставить галочку и выбирать другое зеркало. В общем, space.kz — это бяка, или я не знаю, что с ним не так.
Далее, для сборки я привык пользоваться gprbuild. И если GNAT входит в состав GCC и поэтому попадает в состав и TDM-GCC, и дистрибутивов Linux, и т. п., то про gprbuild, gprmake или хотя бы gnatmake такого сказать нельзя. В моём случае у меня уже установлен GNAT GPL 2016, поэтому я просто пользуюсь gprbuild оттуда, но с сайта AdaCore можно скачать gprbuild отдельно. Вот, например, прямая ссылка: gprbuild-gpl-2016-x86-windows-bin.exe (4.43 MB), чтоб не качать полный дистрибутив GNAT GPL.
Это удобная система сборки, она позволяет собирать смешанные проекты на Ada, C и C++, и потенциально можно научить другим языкам программирования. В любой момент к адскому прокету можно добавить сишных или плюсовых исходников, и gprbuild знает, что с ними делать. Так, однажды мне потребовалось воспользоваться libbzip2 в режиме сжатия, а Zip-Ada умеет только разжимать этот формат и не подходит. Добавил исходники libbzip2 в проект, написал пакеты с импортами, и всё срослось.
Для C и C++ эта утилита умеет автоматически генерировать дерево зависимостей, и автоматически пересобирать только изменившееся аналогично тому, как это делается в Ada, Delphi и других языках программирования с развитой модульной системой. Также эта утилита знает, как делать статические и динамические библиотеки, и всё это кроссплатформенно. Если кто пытался это сделать вручную, знает, как это нетривиально. Не так давно я настрадался с CMake-gui, который я вообще не понял. У него в меню «File» нет привычных «Save» и «Load», а вместо этого какой-то кеш, который можно удалять, обновлять, и это всё, что можно сделать.
Собственно, в моём случае задача начинается именно с C++, и мне нужно иметь готовое решение именно этих проблем, отслеживание зависимостей и кроссплатформенную систему сборки, так что почему бы не gprbuild.
Установленный из GNAT GPL 2016 gprbuild, разумеется, настроен именно на этот компилятор (32-битный), а мне нужно было перенастроить на 64-битный TDM-GCC в другой директории. Сделать это оказалось совсем не сложно. Следуя инструкциям, я понял, что можно автоматически сгенерировать конфигурацию средствами gprconfig. Для начала посмотрел, что он умеет:
>gprconfig --show-targets
List of targets supported by a compiler:
i686-pc-mingw32 (native target)
i386-mingw32
x86_64-w64-mingw32
Были опасения, что он покажет только тот компилятор, вместе с которым установлен, но нет, он увидел в PATH всё, что есть. x86_64-w64-mingw32 — вот он, родимый. Раз такое дело, то попытался им создать файл конфигурации:
…>gprconfig "--target=x86_64-w64-mingw32"
--------------------------------------------------
gprconfig has found the following compilers on your PATH.
Only those matching the target and the selected compilers are displayed.
1. GNAT for Ada in c:\gnat\tdm-gcc-64-2017-01-07\bin\ version 5.1 (default runtime)
2. GCC-ASM for Asm in c:\gnat\tdm-gcc-64-2017-01-07\bin\ version 5.1.0
3. GCC-ASM for Asm2 in c:\gnat\tdm-gcc-64-2017-01-07\bin\ version 5.1.0
4. GCC-ASM for Asm_Cpp in c:\gnat\tdm-gcc-64-2017-01-07\bin\ version 5.1.0
5. GCC for C in c:\gnat\tdm-gcc-64-2017-01-07\bin\ version 5.1.0
6. G++ for C++ in c:\gnat\tdm-gcc-64-2017-01-07\bin\ version 5.1.0
7. GFORTRAN for Fortran in c:\gnat\tdm-gcc-64-2017-01-07\bin\ version 5.1.0
8. WINDRES for WinRes in c:\gnat\tdm-gcc-64-2017-01-07\bin\ version 2.25
Select or unselect the following compiler (or "s" to save): 1
И так, выбрал всё подряд, от 1 до 8, а затем «s» для сохранения. Файл сохранился в текущей директории, то есть, в проекте, под именем x86_64-w64-mingw32.cgpr. Теперь оставалось только проверить, работает ли это все?
…>gprbuild "--config=x86_64-w64-mingw32.cgpr" -PKey_SQL.gpr
Key_SQL.gpr:1:09: warning: there are no Ada sources in this project
g++ -c Key_SQL.Main.cpp
windres -i Key_SQL.Win_Res.rc
ar cr libkey_sql.a ...
ranlib libkey_sql.a
g++ key_sql.main.o -o Key_SQL.exe
…>Key_SQL.exe
Hello, World!
И это действительно 64-битный файл собрался. Таким образом, поставить TDM-GCC с поддержкой Ады достаточно несложно, и достаточно несложно потом научить gprbuild работать с чужим компилятором.
Добавлено. Нет, всё же кое-где автоматика gprconfig не справилась. Там у каких-то утилит прописываются пути, а каких-то нет. И получается, что 64-битные объектные файлы замечательно пакуются в 32-битные статические библиотеки, и даже список файлов в такой библиотеке можно посмотреть, только символические имена почему-то не резолвятся.
Значит, cgpr надо потом открыть, и пути точные прописать в этих местах:
Код
…
for Archive_Builder use ("c:\gnat\tdm-gcc-64-2017-01-07\bin\ar", "cr");
…
for Archive_Indexer use ("c:\gnat\tdm-gcc-64-2017-01-07\bin\ranlib");
…
for Driver ("WinRes") use "c:\gnat\tdm-gcc-64-2017-01-07\bin\windres";
…
for Archive_Builder use ("c:\gnat\tdm-gcc-64-2017-01-07\bin\ar", "cr");
…
for Archive_Indexer use ("c:\gnat\tdm-gcc-64-2017-01-07\bin\ranlib");
…
for Driver ("WinRes") use "c:\gnat\tdm-gcc-64-2017-01-07\bin\windres";
…
Хотя если у вас всего один компилятор на машине, таких проблем не будет.