Как стать автором
Обновить

Сборка Mingw в Windows своими руками

Время на прочтение 8 мин
Количество просмотров 70K
В сети можно найти много описаний сборки mingw и GNU утилит под ним. Я тоже решил написать свой вариант, так как во-первых он на русском. Во-вторых используются последние стабильные исходники (по состоянию на 27.01.2011). В третьих добавлена оптимизация циклов (graphite loop optimizations). В четвертых я описываю причины выбора тех или иных опций конфигурации исходников. В пятых, чтобы не забыть.


Зачем собирать mingw самому?



  • Для того, чтобы сконфигурировать компоненты так как нужно мне, а не той тысяче пользователей, которые скачивают стандартный пакет с официального сайта.
  • Чтобы я сам определял какие компоненты мне нужны в виде shared библиотек с dll-ками, а какие я линкую статически.
  • Чтобы быть уверенным, что gcc работает максимально эффективно.
  • Чтобы исключить возможные закладки в исполняемые модули.
  • Чтобы лучше понять как собираются и устанавливаются GNU утилиты.

Каждый может найти причину для собственноручной сборки.

Что понадобится?



Как ни странно, но для сборки mingw нужен сам mingw. Товарищи постарались и сделали аккуратную программу установки, которая сама скачает и установит нужные пакеты. Она лежит на официальном сайте.
Помимо самого mingw при установке выбираем «C++ Compiler» и «MinGW Developer ToolKit». Ставим в C:\MinGW.

Качаем исходники:

Опционально:


Не обойтись без терпения, настойчивости и удачи!

Сборка



Создаем на самом быстром винчейстере рабочую папочку C:\mbuild. Все исходники складываем в C:\mbuild\distrib. Выращивать mingw будем в C:\mbuild\release. Запускаем скачанный msys…
cd /c/mbuild


Небольшое замечание. В большинстве инструкций сказано сложить исходники gmp, mpfr и mpc в папку к gcc — он соберет их автоматически. Мы так делать не будем, потому что ходим прикрутить к gcc CLooP, а он зависит от gmp. То есть нам придется собирать gmp до того, как мы приступим к конфигурации gcc.

GMP


tar -xjf distrib/gmp-5.0.1.tar.bz2 && cd gmp-5.0.1
mkdir build && cd build
../configure --prefix='/c/mbuild/release' --enable-cxx --disable-static --enable-shared CPPFLAGS='-fexceptions' &>config.my.log
make -j4 &>make.my.log
make install &>install.my.log


  • --enable-cxx CPPFLAGS='-fexceptions' — Обязательны для корректной сборки ppl
  • --disable-static --enable-shared — В windows нельзя одновременно иметь shared и static версии, иначе сборка дальнейших компонентов может завершиться ошибкой. Будем собирать shared версии. Не волнуйтесь, на компилируемые с помощью mingw программы зависимость не переносится.

Очень важно не использовать ключи оптимизации CFLAGS, CXXFLAGS и LDFLAGS такие как "-s -O2 -mtune=i686" — бывали случаи когда ppl из-за этого не находил gmp.

PPL


tar -xjf ../../distrib/ppl-0.11.tar.bz2 && cd ppl-0.11
mkdir build && cd build
../configure --prefix='/c/mbuild/release' --disable-static --enable-shared --disable-nls --enable-threads --disable-debugging --with-gmp-prefix=/c/mbuild/release --with-cflags='-s -O2' --with-cxxflags='-s -O2' &>config.my.log
make -j4 &>make.my.log
make install &>install.my.log

  • --disable-static --enable-shared — какой вариант линковки мы выбрали для gmp такой же следует выбрать и для ppl.
  • --disable-nls — отключая National Language Support не будем требовать от приложения умения общаться на русском.
  • --enable-threads — создаваемый mingw я буду использовать для компиляции многопоточных приложений.
  • --disable-debugging — отладочная информация ни к чему — она занимает лишнее место.
  • --with-gmp-prefix — сообщит где искать gmp.
  • --with-cflags --with-cxxflags — некоторая оптимизация.

Во время конфигурирования windows может сообщать о том, что программа conftest не запустилась. Не паникуйте — это всего лишь результат работы скрипта configure.

CLooG/PPL


tar -zxf ../distrib/clog-ppl-0.15.10.tar.gz
cd cloog-ppl-0.15.10
mkdir build && cd build
../configure --prefix='/c/mbuild/release' --disable-static --enable-shared --with-ppl=/c/mbuild/release --with-gmp=/c/mbuild/release CFLAGS='-s -O2' CPPFLAGS='-s -O2' &>config.my.log
make &>make.my.log

Тут имеется неприятная часть со скриптами конфигурации. Их почему-то просто нет. В логе make.my.log сообщается, что папка m4 отсутствует. Я не разбираюсь в причинах ее отсутствия. Просто копирую ее из ppl-0.11. Благо там имеются нужные скрипты.
make &>make.my.log
make install &>install.my.log

Опции понятны из предыдущих описаний.

MPFR


tar -xjf distrib/mpfr-3.0.0.tar.bz2 && cd mpfr-3.0.0
mkdir build && cd build
../configure --prefix='/c/mbuild/release' --disable-static --enable-shared --enable-thread-safe --with-gmp=/c/mbuild/release CFLAGS='-s -O2' CPPFLAGS='-s -O2' &>config.my.log
make -j4 &>make.my.log
make install &>install.my.log


MPC


tar -xzf distrib/mpc-0.8.2.tar.gz
cd mpc-0.8.2
mkdir build && cd build
../configure --prefix=/c/mbuild/release --disable-static --enable-shared --with-gmp=/c/mbuild/release --with-mpfr=/c/mbuild/release CFLAGS='-s -O2' CPPFLAGS='-s -O2' &>config.my.log
make -j4 &>make.my.log
make install &>install.my.log


LIBICONV


tar -xzf distrib/libiconv-1.13.1.tar.gz && cd libiconv-1.13.1
mkdir build && cd build
../configure --prefix=/c/mbuild/release --enable-shared --disable-static --disable-nls CFLAGS='-s -O2 -mno-cygwin' CPPFLAGS='-s -O2 -mno-cygwin' &>confgi.my.log
make -j4 &>make.my.log
make install &>install.my.log

Вообще, libiconv необязателен, но включить его поддержку желательно (очень полезно, если вы будете собирать другие gnu утилиты этим mingw).
  • CFLAGS='-mno-cygwin' Для того, чтобы libiconv корректно собирался под msys следует явно указать, что мы используем не CygWin.


BINUTILS


tar -xjf distrib/binutils-2.21.tar.bz2 && cd binutils-2.21
mkdir build && cd build
../configure --prefix=/c/mbuild/release --disable-nls --enable-threads --with-gmp=/c/mbuild/release --with-mpc=/c/mbuild/release --with-mpfr=/c/mbuild/release --with-ppl=/c/mbuild/release --disable-ppl-version-check --with-cloog=/c/mbuild/release --disable-cloog-version-check CFLAGS='-s -O2' CPPFLAGS='-s -O2' &>config.my.log
make -j4 &>make.my.log
make install &>install.my.log

  • --disable-ppl-version-check --disable-cloog-version-check Когда то столкнулся с тем, что скрипты проверки версии ppl искали именно 10 версию, а не выше, по инерции использую теперь эти опции, хотя кое-где ситуацию уже исправили. Если есть желание можете покопаться в configure скрипте, посмотрев обработку ppl_version_minor. Binutils-2.21 конфигурируется нормально, а gcc-4.5.2 — нет.

INCLUDE


Распаковываем C:\mbuild\distrib\w32api-3.14-mingw32-src.tar.lzma в C:\mbuild\w32api. Именно в w32api, чтобы ее мог найти mingwrt при сборке.
tar -xzf distrib/mingwrt-3.18-mingw32-src.tar.gz
cp -r w32api/include /c/mbuid/release
cp -r mingwrt-3.18-mingw32/include /c/mbuild/release

Чтобы верно находились все длл-ки при конфигурации, добавим путь к релизу в PATH
export PATH= $PATH:/c/mbuild/release


GCC


tar -xjf gcc-4.5.2.tar.bz2
cd gcc-4.5.2
mkdir build && cd build
../configure --prefix=/c/mbuild/release --enable-shared=libstdc++ --enable-threads --enable-version-specific-runtime-libs --enable-languages=c,c++ --with-dwarf2 --disable-sjlj-exceptions --disable-win32-registry --disable-werror --disable-nls --disable-multilib --with-gmp=/c/mbuild/release --with-ppl=/c/mbuild/release --disable-ppl-version-check --with-cloog=/c/mbuild/release --disable-cloog-version-check --with-mpfr=/c/mbuild/release --with-mpc=/c/mbuild/release --enable-libgomp --with-libiconv-prefix=/c/mbuild/release --enable-libstdcxx-debug --enable-cxx-flags='-s -O2' --with-boot-ldflags='-s' &>config.my.log
make -j4 BOOT_CFLAGS='-s -O2' BOOT_CPPFLAGS='-s -O2' &>make.my.log

Самая длительная и ответственная часть. Я исользую именно полный исходник
gcc, а не отдельно gcc-core и gcc-с++ так как включаю libgomp и zlib, а
они не идут в составе gcc-core.
  • --enable-shared=libstdc++ — Обычно я компилирую библиотеки статически, но иногда приходится использовать stlport вместо родной STL, поэтому ее сделаем орываемой.
  • --enable-version-specific-runtime-libs Влияет на расположение заголовочных файлов и библиотек runtime. Эта опция нужна для того, чтобы обеспечить возможность использования нескольких версий runtime библиотек с одной mingw.
  • --enable-languages=c,c++ — собираем компилятор для языков C и C++.
  • --with-dwarf2 — отладочная информация dwarf-2
  • --disable-sjlj-exceptions — отключить sjlj исключения
  • --disable-win32-registry — модно настроить gcc таким образом, чтобы информацию об include папке он искал в реестре windows. Нас это не интересует.
  • --disable-werror — werror хорошо, когда его задаешь вручную.
  • --disable-nls эта опция не влияет на locale и все что связано с широкими символами в mingw. Их поддержка будет неполной (например некорректно работает получение текущей пользовательской локали — std::locale("") всегда вернет locale(«C»)) даже если мы разрешим NLS. Эта опция влияет лишь на сообщения компилятора. Лично мне было бы непривычно, если бы он заговорил по русски...
  • --disable-multilib — будем использовать наш компилятор для создания windows программ и только
  • --enable-libstdcxx-debug эта опция позволяет помимо основной версии stdc++ библиотеки иметь отладочную, чтобы можно было во время отладки путешествовать и по библиотечным функциям.

К сожалению с отладочной информацией собирается не только версия, которую мы подключили ключом --enable-libstdcxx-debug, но и основная. Побороть это с помощью опций сборки gcc я не смог. Поэтому предлагаю следующий вариант:
cd i686-pc-mingw/libstdc++-v3
make -j4 CFLAGS='-s -O2' CXXFLAGS='-s -O2' &>make.my.log

Тут мы несколько смухлевали. В реальности (в том числе, когда бы собираете кросс-компилятор) вам придется собрать сначала сам gcc с помощью make all-gcc, затем runtime и только потом завершить сборку всего gcc. Процесс описан, к примеру тут. Но мы не будем заморачиваться, так как в этом конкретном случае все работает и так.
cd ../../
make install &>install.my.log

К сожалению мне никогда не удавалось скомпилить gcc под mingw с использованием профилирования (make profiledbootstrap) — процесс завершался с ошибками. Чаще всего segmentation fault компилятора. А жаль… говорят прирост в скорости компиляции ~7%.

Runtime и W32API


w32api нужно собирать с помощью нового gcc. Для этого в файле fstab (поумолчанию C:\MinGW\msys\1.0\etc\fstab) меняем C:\MinGW на C:\mbuild\release и запускаем новый msys. В этом экземпляре msys используется вновьсобранный gcc. Но так как от зависимостей мы еще не избавились, нам придется сообщить msys где искать dll-ки старого mingw:
export PATH=$PATH:/c/MinGW/bin


W32API


cd ../../w32api
mkdir build && cd build
../configure --prefix=/c/mbuild/release CFLAGS='-s -O2' CPPFLAGS='-s -O2' &>config.my.log
make &>make.my.log
make install &>install.my.log


MingwRT


tar -xzf distrib/mingwrt-3.18-mingw32-src.tar.gz && cd mingwrt-3.18-mingw32-src
mkdir build && cd build
../configure --prefix=/c/mbuild/release CFLAGS='-s -O2' CPPFLAGS='-s -O2' &>config.my.log
make &>make.my.log
make install &>install.my.log


Из-за того, что gmp собирался не родным gcc он, скорее всего, имеет зависимости от libstdc++.dll и libgcc_s_dw2-1.dll. Первая была собрана с родным gcc, вторую придется скопировать из старого mingw. Как вариант можно пересобрать gmp в новом gcc для избавления от завимисотей.
Для уменьшения размера можете смело поудалять ненужные папки. Например share/doc.

Почти все. Для комфортной работы нам надо еще собрать make.

MAKE


tar -xjf distrib/make-3.82.tar.bz2 && cd make-3.82
./configure --disable-nls --with-libiconv-prefix='/mingw' CFLAGS='-s -O2' CPPFLAGS='-s -O2' &>config.my.log
make -j4 &>make.my.log
cp make.exe /c/mbuild/release/bin/mingw32-make.exe


Теперь все. в папочке C:\mbuild\release получили свой аккуратный mingw. Добавляем пакетов по вкусу, оборачиваем в аккуратный скрипт и получим что-то вроде nuwen mingw. Удачных сборок!

Постскриптум: Скачанный нами пакет mingw кроме того содержит:
  • mingw32-autoconf
  • mingw32-automake
  • mingw32-autotools
  • mingw32-basic-dsdtar
  • mingw32-bzip2
  • mingw32-cygutils
  • mingw32-expat
  • mingw32-gdb
  • mingw32-gendef
  • mingw32-gettext
  • mingw32-libarchive
  • mingw32-libtool
  • mingw32-mingw-get
  • mingw32-mingw-utils
  • mingw32-package-list
  • mingw32-pdcurses
  • mingw32-pexports
  • mingw32-popt
  • mingw32-pthreads-w32
  • mingw32-xz
Теги:
Хабы:
+26
Комментарии 29
Комментарии Комментарии 29

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн