IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

 
 Ответить  Открыть новую тему 
> [Ada, GNAT] Как установить и скомпилировать для Windows x64, TDM-GCC, gprbuild, MinGW64
сообщение
Сообщение #1


Большевик–концептуал
**

Группа: Пользователи
Сообщений: 99
Пол: Мужской
Реальное имя: Иван Левашев

Репутация: -  0  +


Всегда пользовался GNAT GPL. Знал про существование чего-то другого, и даже в шапке оно висит, та самая версия TDM-GCC без ограничений GPL и с возможностью собрать в Win64. Однажды-таки понадобилась.

Во-первых, достаточно просто было воспользоваться онлайн установщиком 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";


Хотя если у вас всего один компилятор на машине, таких проблем не будет.


--------------------
If you want to get to the top, you have to start at the bottom
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2





Группа: Пользователи
Сообщений: 2
Пол: Мужской

Репутация: -  0  +


Я для себя выбрал такой вариант (если вкратце):
  1. качаем и ставим msys2
  2. запускаем 64-битный шелл и ставим компилятор
    Код
    pacman -S mingw-w64-gcc-ada
  3. копирует DLL с рантайм библиотекой из bin/ в adalib/ где их ищет компилятор
    Код
    adalib=$(dirname `gcc -print-libgcc-file-name`)/adalib
    bin_dir=$(dirname `which gcc`)
    rm -f ${adalib}/libgna{t,rl}-6.dll.a
    cp ${bin_dir}/libgna{t,rl}-6.dll ${adalib}/
  4. Ставим gprbuild, asis, aws, matreshka из моего репозитория:
    Код

    echo [ci.mingw] >> /etc/pacman.conf
    echo SigLevel = Optional >> /etc/pacman.conf
    echo Server = https://dl.bintray.com/reznikmm/msys2/ >> /etc/pacman.conf
Теперь более подробно. Я перебрал несколько win64 компиляторов и ни один из них не работает, как надо. В частности упомянутый TDM не имеет DLL библиотек с рантаймом и следовательно не пригоден для сборки адских DLL.
MSYS2 удалось заставить делать то, что мне нужно, а именно собирать/использовать gprbuild, строить матрешку со всеми зависимостями (aws, asis для ada to javascript транслятора, libgpr, gnatutil как зависимости asis). Есть, как минимум, две ложки дегтя:
  1. Сборщики компилятора переместили gnat-6.dll/gnarl-6.dll из adalib в bin, заменив их gna*-6.dll.a, которые не в состоянии использвать компилятор.
  2. 32-битная версия компилятора где-то косячит с обработкой исключений, поэтому gprbuild в 32-битном исполнении не работает. Неприятным следствием этого является невозможность включить gprbuild и остальную кухню в официальный MSYS2, т.к. там требуется наличие двух (32/64) вариантов бинарных пакетов.
Если нет желания использовать мои бинарные сборки gprbuild, можно собрать самому. Это довольно просто. Нужно скачать скрипты сборки из форка репозитория msys2 и запустить pacman в соответствующем подкаталоге. Именно по этим скриптам мои бинарные сборки собираются appveyor-ом и выкладываются на bintray автоматически.

MSYS2 особенно придется по душе Arch-linux линуксоидам, потому, что использует пакетный менеджер этого дистрибутива линукс. Остальным тоже будет несложно эго освоить. Есть множество готовых библиотек, например SSL включить в AWS оказалось довольно просто.

Сообщение отредактировано: Bajiaoxing -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Большевик–концептуал
**

Группа: Пользователи
Сообщений: 99
Пол: Мужской
Реальное имя: Иван Левашев

Репутация: -  0  +


MSYS выше 1.1 я ещё не видел, даже не знал, что имеет смысл его искать. Вроде работает, и ладно


--------------------
If you want to get to the top, you have to start at the bottom
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Большевик–концептуал
**

Группа: Пользователи
Сообщений: 99
Пол: Мужской
Реальное имя: Иван Левашев

Репутация: -  0  +


OCTAGRAM3@Hermes MINGW64 ~
$ pacman -S mingw-w64-gcc-ada
ошибка: не найдена цель: mingw-w64-gcc-ada

OCTAGRAM3@Hermes MINGW64 ~
$ pacman -S mingw-w64-x86_64-gcc-ada
разрешение зависимостей...



Имя пакета, похоже, не то. Дальше установилось нормально.


--------------------
If you want to get to the top, you have to start at the bottom
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 




- Текстовая версия 28.03.2017 19:02
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"