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

    В сети можно найти много описаний сборки 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
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 29

      +2
      Вым бы обертку над этим всем на python и получится неплохой source-based дистрибутив.
      +2
      Получился такой LFS в миниатюре :)
        +2
        А ведь всего тремя командами можно поставить gentoo :)
          +1
          Спасибо :) Будет легче портировать на виндовс игрушку
            +2
            что за неуважение к .tar.lzma — распаковывать их tar -xzf :)
              +1
              Да простит меня 7-z. Чуть позже поправлю.
              +1
              «как с помощью команды ./configure && make && sudo make install из любого дистрибутива сделать слаку».
                0
                А сделать слаку из виндовса — это высший пилотаж :)
                Даже антилопе на картинке как-то взгрустнулось от такого…
                  0
                  К сожалению приходится =(
                –1
                У меня всегда возникает вопрос — почему в бесплатном софте сплошные недоделки? Обязательно чего-то не хватает и что-то нужно править. Такое ощущение, что пишут какие-то ленивы и растяпы — «заработало и ладно, потом доделаю». И ясное дело, что потом никогда не настаёт.
                  0
                  Просто в случае проприетарного это все не воспринимается как недоделки.
                  Кстати, а если сборку gcc заменить на сборку clang'а? Тогда получится неплохой результат.
                  ЗЫ
                  Блин когда в winAPI minGWшном они добавят поддержку фич из Vista и Win7
                    0
                    Не в бесплатном, а свободном. Причин много:
                    1. Его пишет большое количество людей.
                    2. Теоретически он рассчитан на любую платформу. Поэтому на конкретной приходится слегка докручивать.

                    Но иногда случается и так как вы описали.
                      0
                      Это я понимаю. Я не понимаю каким нужно быть растяпой, чтобы например портировать gcc под win, но забыть несколько скриптов и каталогов. Зато городо заявить, что это порт. Т.е. ясно, что кто-то умудрился его собрать с танца с бубном, но вместо того, чтобы довести дело «до ума» поленился и выложил нечто недоделаное.
                        0
                        Вы так говорите, как будто речь идёт об экзотической платформе, а не о самой популярной десктоп на самом популярно железе :)
                          0
                          Да нет, msys c mingw — это экзотика среди posix.
                      0
                      «Пора вам, барин, жениться...»

                      А статья хорошая.
                        +1
                        Я лично выступаю за кросскомпиляцию с Linux'а. Она проходит гораздо быстрее за счет почти бесплатного вызова fork и тулчейн настраивается проще, плюс configure работает в нативном режиме, что тоже гораздо быстрее.
                          0
                          Да, все действительно шустрее на порядок. Но я все время путался в target\host\build целях, плюс не всегда понимал как должен отработать configure, чтобы результат корректно работал на целевой платформе… Вроде бы все собиралось и запускалось, но тесты проходило не всегда… Да и в замкнутой программной среде с Windows, где приходилось поднимать из исходников что-то, что работает в стиле POSIX к сожалению не нашлось места Linux.
                            0
                            меня так и не получилось нормально кросс-компильнуть hedgewars относительно недавно, и пришлось мучать MinGW. Научите, как по-человечески?
                            хоть синусная пушка уже в релизе, всё равно интересно
                              0
                              Хм… ну Hedgewars в общем-то очень крепкий орешек: морда на Qt, кусок на sdl, кусок на FreePascal
                              Короче геморрой
                            +1
                            А компот lto? И собирали бы уже сразу среду для кросскомпиляции Win32/64 с помощью mingw-w64.
                              0
                              Про LTO вы правы. Надо добавить.
                              А win32\64 сверху на это прикручивается.
                                0
                                Хотя нет, сбили вы меня. Оно в trunk с 2009. По умолчанию включено. См <a «gcc.gnu.org/install/configure.html»>документацию.
                                0
                                Как вы их собираетесь сверху прикручивать? По хорошему, просто параллельно собираем два раза с разными целевыми платформами. Так можно получить 32-битный gcc, который собирает 64-битные приложения. Для душевного спокойствия можно потом собрать уже полностью 64-битный gcc.
                                  0
                                  Я имел ввиду как кросскомпилятор прикрутить — binutils свои, gcc с дополнительным префиксом ну и рантайм, естественно. Получится mingw, в котором можно использовать 2 целевые платформы.
                              –1
                              >> Зачем собирать mingw самому?

                              Чтобы нехуево так вздрочнуть

                            Only users with full accounts can post comments. Log in, please.