пятница, 11 января 2013 г.

Сборка собственного тулчейна MinGW для x86 в Windows


Готовый тулчейн с официального сайта может нас не устраивать поскольку его компоненты сконфигурированы и собраны не так как нам нужно. С другой стороны, самостоятельная сборка MinGW позволяет лучше понять как собираются и устанавливаются  GNU утилиты.
На просторах интернета я так и не нашел исчерпывающего руководства по сборке MinGW, такого руководства, чтобы без лишних заморочек разобраться в вопросе. Это и послужило причиной написания данной статьи. В ней будет представлен набор скриптов, позволяющий одним махом собрать MinGW. Забегая вперед, скажу, что если нет желания собирать MinGW самому, уже готовый тулчейн можно взять здесь.

 

Что потребуется

Процесс сборки тулчейна  MinGW - непростая задача, поэтому необходимо запастись терпением и настойчивостью.
Первым делом скачиваем и устанавливаем Perl. Он необходим для работы automake.
Понадобится также Python. Нужно скачать и установить версию 2.x.x. Он необходим для корректной работы отладчика GDB.
Для сборки нужен существующий и рабочий тулчейн MinGW со средой MSYS. Взять их можно с официального сайта. Устанавливается все это с помощью утилиты mingw-get, которая сама скачает в заданную папку (в нашем случае это C:/MinGW) выбранные компоненты. Нужно не забыть поставить "птичку" напротив MSYS в диалоге выбора компонентов, чтобы он тоже установился.
Список компонентов, которые нам потребуются для сборки:
Сборка будет осуществляться в папке C:\build. Все компоненты скачиваем и помещаем в папку build\distrib.

 

Настройка MSYS

MSYS - это минимальная UNIX-подобная оболочка (Minimal SYStem), достаточная для запуска скриптов automake и работающая в Windows. Именно в MSYS будет происходить весь процесс сборки.
Если установка MinGW производилась утилитой mingw-get, MSYS должен быть правильно настроен, однако чтобы быть уверенным в успехе, стоит еще раз проверить настройки.
Для этого открываем файл etc\profile в текстовом редакторе и проверяем переменную окружения PATH. В нее должен входить путь к папке bin нашего рабочего тулчейна:
export PATH=".:/usr/local/bin:/bin:/c/MinGW/bin:$PATH"
В файле etc\fstab задаются точки монтирования, которые будут доступны внутри оболочки MSYS. Убеждаемся, что точка монтирования /mingw задана и указан путь к нашему рабочему тулчейну.
Нужно отметить, что в MSYS виндовые пути задаются так: /диск/длинный/путь, где "диск" - это имя диска в Windows.

 

Подготовка к сборке

Сборка будет проходить в три стадии:
  1. Стадия Bootstrap. В этой стадии мы рабочим тулчейном, который только что установили, собираем bootstrap-тулчейн. Все его компоненты собираются статически. Это нужно чтобы отвязаться от runtime библиотек рабочего тулчейна, который мы взяли с сайта. В результате должен получиться полностью автономный MinGW, который будет находиться в папке bootstrap.
  2. Стадия Build. В этой стадии мы первым делом меняем рабочий тулчейн на только что собранный bootstrap-тулчейн, для этого корректируем переменную PATH. После этого мы собираем (уже bootstrap-тулчейном) все компоненты кроме gcc и binutils также статически, складывая их в папку build. А для gcc и binutils мы включаем опцию сборки как статических, так и динамических версий библиотек, и складываем их в папку final.
  3. Стадия Final. В этой стадии мы меняем bootstrap-тулчейн на final-тулчейн, корректируя переменную PATH, и собираем final-тулчейном все необходимые компоненты в виде динамических библиотек, а некоторые также в виде статических.
Полученный final-тулчейн - это то что нам нужно. Им уже можно будет собирать свои программы.
Для каждого тулчейна (bootstrap, build, final) создается своя папка.
В папке каждого тулчейна создается папка log для хранения log-файлов, образующихся в процессе конфигурации и сборки. Они нужны для диагностики неполадок и после завершения сборки папки log можно удалить. После распаковки каждого компонента в его папке создается папка build, в которой происходит конфигурация и сборка. После сборки и установки компонента его папка удаляется.
Для организации сборки в несколько потоков имеется ключ -jN, где N - это число потоков. Однако данная опция, использованная в MSYS, нередко вызывает его блокировку, поэтому в своих скриптах я ее не  использую. Возможно это особенность MSYS.

 

Сборка первой стадии (Bootstrap)

Чтобы удовлетворить зависимости, собирать компоненты мы будем в следующем порядке: gmp, ppl, cloog-ppl, mpfr, mpc, libiconv, binutils, gcc.
Во всех компонентах задаем папку, куда будут установлены библиотеки: --prefix=$BOOTSTRAP_DIR.
Разрешаем сборку только статических библиотек: --disable-shared, --enable-static.

1. GMP
../configure --prefix=$BOOTSTRAP_DIR \
        --build=i686-pc-mingw32 \
        --enable-cxx \
        --enable-fat \
        --disable-shared \
        --enable-static \
        CFLAGS='-g -O2' \
        CXXFLAGS='-g -O2' \
        CPPFLAGS='-fexceptions'>>$BOOTSTRAP_DIR/log/gmp.log

make>>$BOOTSTRAP_DIR/log/gmp.log
make install>>$BOOTSTRAP_DIR/log/gmp.log

Включаем поддержку С++ обертки на GMP: --enable-cxx. Это нужно для того, чтобы PPL потом нашла нашу собранную библиотеку GMP.

2. PPL
../configure --prefix=$BOOTSTRAP_DIR \
        --build=i686-pc-mingw32 \
        --disable-shared \
        --enable-static \
        --disable-debugging \
        --with-gmp=$BOOTSTRAP_DIR \
        --with-cflags='-g -O2' \
        --with-cxxflags='-g -O2' \
        CPPFLAGS='-fexceptions' \
        LDFLAGS='-s -static-libstdc++ -static-libgcc'>>$BOOTSTRAP_DIR/log/ppl.log

make>>$BOOTSTRAP_DIR/log/ppl.log
make install>>$BOOTSTRAP_DIR/log/ppl.log

Указываем местоположение библиотеки GMP: --with-gmp=$BOOTSTRAP_DIR.
Отключаем отладочную информацию: --disable-debugging.
Задаем флаги компоновщику для связывания со статическим RTL: -static-libstdc++ -static-libgcc.

3. CLOOG-PPL
../configure --prefix=$BOOTSTRAP_DIR \
             --build=i686-pc-mingw32 \
             --disable-shared \
             --enable-static \
             --with-ppl=$BOOTSTRAP_DIR \
             --with-gmp=$BOOTSTRAP_DIR \
             --with-host-libstdcxx=`g++ -print-file-name=libstdc++.a` \
             CFLAGS='-g -O2' \
             CPPFLAGS='-fexceptions' \
             LDFLAGS='-s -static-libgcc'>>$BOOTSTRAP_DIR/log/cloog.log

make>>$BOOTSTRAP_DIR/log/cloog.log
make install>>$BOOTSTRAP_DIR/log/cloog.log

Указываем местоположение библиотек PPL и GMP: --with-ppl=$BOOTSTRAP_DIR, --with-gmp=$BOOTSTRAP_DIR.
Флаг --with-host-libstdxx указывает, где искать стандартную библиотеку C++. Выражение `g++ -print-file-name=libstdc++.a` дает полный путь к файлу libstdc++.a принадлежащему рабочему тулчейну, что очень удобно.

4. MPFR
../configure --prefix=$BOOTSTRAP_DIR \
        --build=i686-pc-mingw32 \
        --disable-shared \
        --enable-static \
        --enable-thread-safe \
        --with-gmp=$BOOTSTRAP_DIR \
        CFLAGS='-g -O2' \
        CPPFLAGS='-fexceptions'>>$BOOTSTRAP_DIR/log/mpfr.log

make>>$BOOTSTRAP_DIR/log/mpfr.log
make install>>$BOOTSTRAP_DIR/log/mpfr.log

5. MPC
../configure --prefix=$BOOTSTRAP_DIR \
        --build=i686-pc-mingw32 \
        --disable-shared \
        --enable-static \
        --with-mpfr=$BOOTSTRAP_DIR \
        --with-gmp=$BOOTSTRAP_DIR \
        CFLAGS='-g -O2' \
        CPPFLAGS='-fexceptions'>>$BOOTSTRAP_DIR/log/mpc.log

make>>$BOOTSTRAP_DIR/log/mpc.log
make install>>$BOOTSTRAP_DIR/log/mpc.log

6. LIBICONV
../configure --prefix=$BOOTSTRAP_DIR \
        --build=i686-pc-mingw32 \
        --disable-shared \
        --enable-static \
        --disable-nls \
        --enable-extra-encodings \
        CFLAGS='-g -O2' \
        CPPFLAGS='-fexceptions' \
        LDFLAGS='-s -static-libgcc'>>$BOOTSTRAP_DIR/log/libiconv.log

make>>$BOOTSTRAP_DIR/log/libiconv.log
make install>>$BOOTSTRAP_DIR/log/libiconv.log

Отключаем локализацию (National Language Support): --disable-nls.

7.  BINUTILS
../configure --prefix=$BOOTSTRAP_DIR \
        --build=i686-pc-mingw32 \
        --disable-nls \
        --enable-threads \
        --disable-shared \
        --enable-static \
        --with-gmp=$BOOTSTRAP_DIR \
        --with-mpc=$BOOTSTRAP_DIR \
        --with-mpfr=$BOOTSTRAP_DIR \
        --with-ppl=$BOOTSTRAP_DIR \
        --disable-ppl-version-check \
        --with-cloog=$BOOTSTRAP_DIR \
        --disable-cloog-version-check \
        --with-host-libstdcxx=`g++ -print-file-name=libstdc++.a` \
        CFLAGS='-g -O2' \
        CXXFLAGS='-g -O2' \
        CPPFLAGS='-fexceptions' \
        LDFLAGS='-s -static-libgcc -static-libstdc++'>>$BOOTSTRAP_DIR/log/binutils.log

make tooldir=$BOOTSTRAP_DIR>>$BOOTSTRAP_DIR/log/binutils.log
make tooldir=$BOOTSTRAP_DIR install>>$BOOTSTRAP_DIR/log/binutils.log

Переопределяем tooldir, чтобы все утилиты устанавливались в ${prefix}/bin и ${prefix}/lib, а не в отдельные директории ${prefix}/i686-pc-mingw32/bin и ${prefix}/i686-pc-mingw32/lib.

8. GCC
../configure --prefix=$BOOTSTRAP_DIR \
             --build=i686-pc-mingw32 \
             --libexecdir=$BOOTSTRAP_DIR/lib \
             --disable-bootstrap \
             --disable-multilib \
             --disable-libgomp \
             --enable-threads=win32 \
             --disable-shared \
             --enable-languages=c,c++ \
             --disable-win32-registry \
             --disable-nls \
             --enable-version-specific-runtime-libs \
             --with-gmp=$BOOTSTRAP_DIR \
             --with-mpfr=$BOOTSTRAP_DIR \
             --with-mpc=$BOOTSTRAP_DIR \
             --with-ppl=$BOOTSTRAP_DIR \
             --with-cloog=$BOOTSTRAP_DIR \
             --with-libiconv-prefix=$BOOTSTRAP_DIR \
             --with-stage1-ldflags='-s -static-libstdc++ -static-libgcc' \
             --with-host-libstdcxx=`g++ -print-file-name=libstdc++.a` \
             CFLAGS='-g -O2' \
             CXXFLAGS='-g -O2' \
             CPPFLAGS='-fexceptions' \
             LDFLAGS='-s -static-libstdc++ -static-libgcc'>>$BOOTSTRAP_DIR/log/gcc.log

make>>$BOOTSTRAP_DIR/log/gcc.log
make install>>$BOOTSTRAP_DIR/log/gcc.log

Указываем куда установятся исполняемые файлы компиляторов (cc1.exe cc1plus.exe и т.п): --libexecdir=$BOOTSTRAP_DIR/lib. Для bootstrap-тулчейна нужны только C и C++: --enable-languages=c,c++. Не поддерживаем кросскомпиляцию: --disable-multilib. Не используем реестр для определения своего местонахождения: --disable-win32-registry. Задаем путь к стандартным библиотекам ${prefix}/lib/gcc/${target}/${версия}: --enable-version-specific-runtime-libs.

9. W32API и MINGWRT
Переключаемся на только что собранный bootstrap-тулчейн и собираем им Win32 API и рантайм.
export PATH=".:/bin:$BOOTSTRAP_DIR/bin:/mingw/bin"

9.1 W32Api
../configure --prefix=$BOOTSTRAP_DIR \
             --build=i686-pc-mingw32 \
             CFLAGS='-s -O2' \
             CXXFLAGS='-s -O2' \
             CPPFLAGS='-fexceptions'>>$BOOTSTRAP_DIR/log/w32api.log

make>>$BOOTSTRAP_DIR/log/w32api.log
make install>>$BOOTSTRAP_DIR/log/w32api.log

9.2 MingwRT
../configure --prefix=$BOOTSTRAP_DIR \
             --build=i686-pc-mingw32 \
             CFLAGS='-g -O0' \
             CXXFLAGS='-g -O0' \
             CPPFLAGS='-fexceptions' \
             LDFLAGS='-s -static-libstdc++ -static-libgcc'>>$BOOTSTRAP_DIR/log/mingwrt.log

make>>$BOOTSTRAP_DIR/log/mingwrt.log
make install>>$BOOTSTRAP_DIR/log/mingwrt.log

При сборке MingwRT отключаем оптимизацию (-O0). Оптимизация почему-то портит рантайм, в результате тулчейн перестает правильно работать. Причина этого мне не известна.

Сборка первой стадии завершена. В папке bootsrap лежит тулчейн, с которым мы будем работать в следующей стадии.

 

Сборка второй стадии (Build)

В этой стадии мы снова соберем все компоненты, но уже bootstrap-тулчейном. Компоненты gmp, ppl, cloog-ppl, mpfr, mpc, libiconv, pthreads будут собраны, как и в первой стадии, в виде статических библиотек, и установлены в папку build. Оставшиеся компоненты binutils и gcc собираем статически и динамически. Их нужно установить в папку final. Для удовлетворения зависимостей будем соблюдать порядок сборки компонентов.

1. Меняем старый тулчейн на собранный в первой стадии bootstrap-тулчейн, для этого корректируем переменную среды PATH:
export PATH=".:/bin:$BOOTSTRAP_DIR/bin:/mingw/bin"

2. GMP
../configure --prefix=$BUILD_DIR \
             --build=i686-pc-mingw32 \
             --enable-cxx \
             --enable-fat \
             --disable-shared \
             --enable-static \
             CFLAGS='-g -O2' \
             CXXFLAGS='-g -O2' \
             CPPFLAGS='-fexceptions'>>$BUILD_DIR/log/gmp.log

make>>$BUILD_DIR/log/gmp.log
make install>>$BUILD_DIR/log/gmp.log

3. PPL
../configure --prefix=$BUILD_DIR \
             --build=i686-pc-mingw32 \
             --disable-shared \
             --enable-static \
             --disable-debugging \
             --with-gmp=$BUILD_DIR \
             --with-cflags='-g -O2' \
             --with-cxxflags='-g -O2' \
             CPPFLAGS='-fexceptions' \
             LDFLAGS='-s -static-libstdc++ -static-libgcc'>>$BUILD_DIR/log/ppl.log

make>>$BUILD_DIR/log/ppl.log
make install>>$BUILD_DIR/log/ppl.log

4. CLOOG-PPL
../configure --prefix=$BUILD_DIR \
             --build=i686-pc-mingw32 \
             --disable-shared \
             --enable-static \
             --with-ppl=$BUILD_DIR \
             --with-gmp=$BUILD_DIR \
             --with-host-libstdcxx=`g++ -print-file-name=libstdc++.a` \
             CFLAGS='-g -O2' \
             CPPFLAGS='-fexceptions' \
             LDFLAGS='-s -static-libgcc'>>$BUILD_DIR/log/cloog.log

make>>$BUILD_DIR/log/cloog.log
make install>>$BUILD_DIR/log/cloog.log

5. MPFR
../configure --prefix=$BUILD_DIR \
             --build=i686-pc-mingw32 \
             --disable-shared \
             --enable-static \
             --enable-thread-safe \
             --with-gmp=$BUILD_DIR \
             CFLAGS='-g -O2' \
             CPPFLAGS='-fexceptions'>>$BUILD_DIR/log/mpfr.log

make>>$BUILD_DIR/log/mpfr.log
make install>>$BUILD_DIR/log/mpfr.log

6. MPC
../configure --prefix=$BUILD_DIR \
             --build=i686-pc-mingw32 \
             --disable-shared \
             --enable-static \
             --with-mpfr=$BUILD_DIR \
             --with-gmp=$BUILD_DIR \
             CFLAGS='-g -O2' \
             CPPFLAGS='-fexceptions'>>$BUILD_DIR/log/mpc.log

make>>$BUILD_DIR/log/mpc.log
make install>>$BUILD_DIR/log/mpc.log

7. LIBICONV
../configure --prefix=$BUILD_DIR \
             --build=i686-pc-mingw32 \
             --disable-shared \
             --enable-static \
             --disable-nls \
             --enable-extra-encodings \
             CFLAGS='-g -O2' \
             CPPFLAGS='-fexceptions' \
             LDFLAGS='-s -static-libgcc'>>$BUILD_DIR/log/libiconv.log

make>>$BUILD_DIR/log/libiconv.log
make install>>$BUILD_DIR/log/libiconv.log

8. PTHREADS
make GC>>$BUILD_DIR/log/pthreads.log

cp -f pthread*.dll $BUILD_DIR/bin
cp -f libpthread*.a $BUILD_DIR/lib
cp -f pthread.h $BUILD_DIR/include
cp -f sched.h $BUILD_DIR/include
cp -f semaphore.h $BUILD_DIR/include

Инсталлятор почему-то не работает, так что pthreads приходится устанавливать вручную.

9. BINUTILS

Обращаем внимание, что все требуемые библиотеки (gmp, mpc, mpfr, ppl, cloog-ppl) берутся из папки build, а сам компонент устанавливается в папку final. Это касается и компонента gcc.

../configure --prefix=$FINAL_DIR \
             --build=i686-pc-mingw32 \
             --disable-nls \
             --enable-threads \
             --with-gmp=$BUILD_DIR \
             --with-mpc=$BUILD_DIR \
             --with-mpfr=$BUILD_DIR \
             --with-ppl=$BUILD_DIR \
             --disable-ppl-version-check \
             --with-cloog=$BUILD_DIR \
             --disable-cloog-version-check \
             --with-host-libstdcxx=`g++ -print-file-name=libstdc++.a` \
             CFLAGS='-g -O2' \
             CXXFLAGS='-g -O2' \
             CPPFLAGS='-fexceptions' \
             LDFLAGS='-s'>>$BUILD_DIR/log/binutils.log

make tooldir=$FINAL_DIR>>$BUILD_DIR/log/binutils.log
make tooldir=$FINAL_DIR install>>$BUILD_DIR/log/binutils.log

10. GCC
../configure --prefix=$FINAL_DIR \
             --build=i686-pc-mingw32 \
             --libexecdir=$FINAL_DIR/lib \
             --disable-bootstrap \
             --disable-multilib \
             --enable-sjlj-exceptions \
             --enable-libgomp \
             --enable-threads=win32 \
             --enable-languages=c,c++ \
             --disable-win32-registry \
             --disable-nls \
             --enable-version-specific-runtime-libs \
             --with-gmp=$BUILD_DIR \
             --with-mpfr=$BUILD_DIR \
             --with-mpc=$BUILD_DIR \
             --with-ppl=$BUILD_DIR \
             --with-cloog=$BUILD_DIR \
             --with-libiconv-prefix=$BUILD_DIR \
             --with-host-libstdcxx=`g++ -print-file-name=libstdc++.a` \
             CFLAGS='-O2' \
             CXXFLAGS='-O2' \
             CPPFLAGS='-fexceptions' \
             LDFLAGS='-s'>>$BUILD_DIR/log/gcc.log

make>>$BUILD_DIR/log/gcc.log
make install>>$BUILD_DIR/log/gcc.log

Указываем куда установятся исполняемые файлы компиляторов (cc1.exe cc1plus.exe и т.п): --libexecdir=$BOOTSTRAP_DIR/lib. В данном случае, они будут находится там же, где и стандартные библиотеки. Оставляем только C и C++ (другие языки при желании можно тоже включить): --enable-languages=c,c++. Не поддерживаем кросскомпиляцию: --disable-multilib. Используем исключения, основанные на setjmp/longjmp: --enable-sjlj-exceptions. Включаем поддержку libgomp: --enable-libgomp. Используем потоки win32: --enable-threads=win32. Не используем реестр для определения своего местонахождения: --disable-win32-registry. Отключаем локализацию (National Language Support): --disable-nls. Задаем путь к стандартным библиотекам ${prefix}/lib/gcc/${target}/${версия}: --enable-version-specific-runtime-libs.

Сборка третьей стадии (Final)

К этому моменту в папке final уже находятся gcc и binutils, установленные в предыдущей стадии. Это еще пока не полноценный тулчейн, потому что отсутствуют заголовочные файлы и библиотеки WinAPI и MinGW Runtime. Устанавливаем final-тулчейн, вместо bootstrap-тулчейна, корректируя переменную PATH: export PATH=".:/bin:$FINAL_DIR/bin:/mingw/bin".
После этого собираем WinAPI и MinGW Runtime уже final-тулчейном, и затем по порядку все нужные нам компоненты: gmp, ppl, cloog-ppl, mpfr, mpc, libiconv, pthreads, gdb, make. Все компоненты, кроме libiconv, собираются в виде динамических библиотек, а сама libiconv - как статически, так и динамически. Говорят, что в Windows некоторые компоненты GNU невозможно собрать в виде статических и динамических библиотек одновременно. Libiconv - можно, остальные не проверял.

1. W32API
../configure --prefix=$FINAL_DIR \
             --build=i686-pc-mingw32 \
             CFLAGS='-s -O2' \
             CXXFLAGS='-s -O2' \
             CPPFLAGS='-fexceptions'>>$FINAL_DIR/log/w32api.log

make>>$FINAL_DIR/log/w32api.log
make install>>$FINAL_DIR/log/w32api.log

2. MINGWRT
../configure --prefix=$FINAL_DIR \
             --build=i686-pc-mingw32 \
             CFLAGS='-g -O0' \
             CXXFLAGS='-g -O0' \
             CPPFLAGS='-fexceptions' \
             LDFLAGS='-s -static-libstdc++ -static-libgcc'>>$FINAL_DIR/log/mingwrt.log

make>>$FINAL_DIR/log/mingwrt.log
make install>>$FINAL_DIR/log/mingwrt.log

3. GMP
../configure --prefix=$FINAL_DIR \
             --build=i686-pc-mingw32 \
             --enable-cxx \
             --enable-fat \
             --disable-static \
             --enable-shared \
             CFLAGS='-O2' \
             CXXFLAGS='-O2' \
             CPPFLAGS='-fexceptions'>>$FINAL_DIR/log/gmp.log

make>>$FINAL_DIR/log/gmp.log
make install>>$FINAL_DIR/log/gmp.log

4. PPL
../configure --prefix=$FINAL_DIR \
             --build=i686-pc-mingw32 \
             --disable-static \
             --enable-shared \
             --disable-debugging \
             --with-gmp=$FINAL_DIR \
             --with-cflags='-O2' \
             --with-cxxflags='-O2' \
             CPPFLAGS='-fexceptions' \
             LDFLAGS='-s'>>$FINAL_DIR/log/ppl.log

make>>$FINAL_DIR/log/ppl.log
make install>>$FINAL_DIR/log/ppl.log

5. CLOOG-PPL
../configure --prefix=$FINAL_DIR \
             --build=i686-pc-mingw32 \
             --disable-static \
             --enable-shared \
             --with-ppl=$FINAL_DIR \
             --with-gmp=$FINAL_DIR \
             --with-host-libstdcxx=`g++ -print-file-name=libstdc++.dll.a` \
             CFLAGS='-O2' \
             CPPFLAGS='-fexceptions' \
             LDFLAGS='-s'>>$FINAL_DIR/log/cloog.log

make>>$FINAL_DIR/log/cloog.log
make install>>$FINAL_DIR/log/cloog.log

6. MPFR
../configure --prefix=$FINAL_DIR \
             --build=i686-pc-mingw32 \
             --disable-static \
             --enable-shared \
             --enable-thread-safe \
             --with-gmp=$FINAL_DIR \
             CFLAGS='-O2' \
             CPPFLAGS='-fexceptions'>>$FINAL_DIR/log/mpfr.log

make>>$FINAL_DIR/log/mpfr.log
make install>>$FINAL_DIR/log/mpfr.log

7. MPC
../configure --prefix=$FINAL_DIR \
             --build=i686-pc-mingw32 \
             --disable-static \
             --enable-shared \
             --with-mpfr=$FINAL_DIR \
             --with-gmp=$FINAL_DIR \
             CFLAGS='-O2' \
             CPPFLAGS='-fexceptions'>>$FINAL_DIR/log/mpc.log

make>>$FINAL_DIR/log/mpc.log
make install>>$FINAL_DIR/log/mpc.log

8. LIBICONV
../configure --prefix=$FINAL_DIR \
             --build=i686-pc-mingw32 \
             --enable-static \
             --enable-shared \
             --disable-nls \
             --enable-extra-encodings \
             CFLAGS='-O2' \
             CPPFLAGS='-fexceptions' \
             LDFLAGS='-s'>>$FINAL_DIR/log/libiconv.log

make>>$FINAL_DIR/log/libiconv.log
make install>>$FINAL_DIR/log/libiconv.log

9. PTHREADS
make GC>>$FINAL_DIR/log/pthreads.log

cp -f pthread*.dll $FINAL_DIR/bin
cp -f libpthread*.a $FINAL_DIR/lib
cp -f pthread.h $FINAL_DIR/include
cp -f sched.h $FINAL_DIR/include
cp -f semaphore.h $FINAL_DIR/include

10. GDB
../configure --prefix=$FINAL_DIR \
             --build=i686-pc-mingw32 \
             --disable-nls \
             --with-python=$PYTHON_DIR \
             --with-expat=$FINAL_DIR \
             --with-gmp=$FINAL_DIR \
             --with-mpc=$FINAL_DIR \
             --with-mpfr=$FINAL_DIR \
             --with-ppl=$FINAL_DIR \
             --with-cloog=$FINAL_DIR \
             CFLAGS='-O2' \
             CXXFLAGS='-O2' \
             CPPFLAGS='-fexceptions' \
             LDFLAGS='-s'>>$FINAL_DIR/log/gdb.log


make>>$FINAL_DIR/log/gdb.log
make install>>$FINAL_DIR/log/gdb.log
 
Опция "--with-python" задает путь к папке с установленным Python'ом версии 2.x.x. Она включает поддержку Python'а в отладчике GDB, нужную для работы скриптов GDB Printers. Эти скрипты отображают значения переменных в процессе отладки в удобном человеку виде, упрощая тем самым отладку. Без этой опции значения переменных таких типов, как например std::string или std::vector<int>, не будут видны пользователю.

11. MAKE
../configure --prefix=$FINAL_DIR \
             --program-prefix=mingw32- \
             --build=i686-pc-mingw32 \
             --disable-nls \
             --with-libiconv-prefix=$FINAL_DIR \
             CFLAGS='-O2' \
             CPPFLAGS='-fexceptions' \
             LDFLAGS='-s'>>$FINAL_DIR/log/make.log

/bin/make>>$FINAL_DIR/log/make.log
/bin/make install>>$FINAL_DIR/log/make.log
Здесь нужно прямо указать какой make выбрать: тот что входит в MSYS или тот, который мы только что собрали. Выбираем make из MSYS.
Для разрешения конфликта имен, мы переименовываем только что собранный make в mingw32-make (опция --program-prefix=mingw32-). Он нам понадобится, когда мы будем что-то собирать без использования MSYS.

Что получилось

Компоненты binutils-2.22 и gcc-4.7.2 собраны статически. Компиляторы: только для c и c++. Стандартные библиотеки собраны в статическом и динамическом вариантах. Компоненты gmp-5.0.5, ppl-0.12.1, cloog-ppl-0.15.11, mpfr-3.1.1, mpc-1.0.1, w32api-3.17, mingwrt-3.20, pthreads-w32-2-9-1 (GC) собраны в виде динамических библиотек. Компонент libiconv-1.14 собран в виде статической и динамической библиотеки.
Скрипты для сборки вместе с исходниками всех компонентов можно взять отсюда.

Ссылки по теме

1. Собираем MinGW на MinGW. Часть 1. Необходимые библиотеки и сборка boot-версии;
2. Сборка MinGW в Windows своими руками.

Ключевые слова: gcc, mingw, toolchain, msys, x86, Windows