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

> Внимание!

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

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

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


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

Группа: Пользователи
Сообщений: 194
Пол: Мужской
Реальное имя: Иван Левашев
Jabber: bu_gen@octagram.name
Skype: i.levashew
QQ: 3152538431
WeChat
Ада: Сторонник
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик
Turbo Pascal: Установлен

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


Всегда пользовался 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





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

Репутация: -  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


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

Группа: Пользователи
Сообщений: 194
Пол: Мужской
Реальное имя: Иван Левашев
Jabber: bu_gen@octagram.name
Skype: i.levashew
QQ: 3152538431
WeChat
Ада: Сторонник
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик
Turbo Pascal: Установлен

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


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


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


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

Группа: Пользователи
Сообщений: 194
Пол: Мужской
Реальное имя: Иван Левашев
Jabber: bu_gen@octagram.name
Skype: i.levashew
QQ: 3152538431
WeChat
Ада: Сторонник
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик
Turbo Pascal: Установлен

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


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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Prednisone Without A Scrip
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Amoxicillin Treatment For Gonorrhea
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Бывалый
***

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

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


Why not settling on games that is fun and at the same time your earning. Well itll make suspense because of the game as well but dude just try it and it gave me hope while pandemic is real rn. What Makes Casino Fun?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





- Текстовая версия 22.11.2024 20:42
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name