Зачем?
Стандартный GCC в Солярисах (5.11 snv_111b) — очень, можно сказать, древний — 3.4.3 (csl-sol210-3_4-20050802). Это не считая «общей кривизны», требующей напильника и терпения для сборки чего-угодно — хотя не уверен, что это изменится с новым компилятором в системе.
Захотелось мне давече собрать одну софтину — а ей вынь и полож gcc-4.3+ (и зачем им оно?).
Сложности
Дабы уменьшить количество потенциальных непоняток, я пошел проверенным путем — /usr/ports/lang/gcc на FreeBSD.
cd /usr/ports/lang/gcc
make checksum
Это «вытащило» почти всё, что нужно для сборки. В текущей версии портов — gcc-4.6-20110916, но как выгуглилось позже — это совсем не принципиально.
Также, полезно почитать Prerequisites for GCC, в частности из всего вытащенного понадобились
- GNU Multiple Precision Library (GMP) version 4.3.2 (or later)
Necessary to build GCC. If you do not have it installed in your library search path, you will have to configure with the --with-gmp configure option. See also --with-gmp-lib and --with-gmp-include. Alternatively, if a GMP source distribution is found in a subdirectory of your GCC sources named gmp, it will be built together with GCC.
- MPFR Library version 2.4.2 (or later)
Necessary to build GCC. It can be downloaded from www.mpfr.org. The --with-mpfr configure option should be used if your MPFR Library is not installed in your default library search path. See also --with-mpfr-lib and --with-mpfr-include. Alternatively, if a MPFR source distribution is found in a subdirectory of your GCC sources named mpfr, it will be built together with GCC.
- MPC Library version 0.8.1 (or later)
Necessary to build GCC. It can be downloaded from www.multiprecision.org. The --with-mpc configure option should be used if your MPC Library is not installed in your default library search path. See also --with-mpc-lib and --with-mpc-include. Alternatively, if an MPC source distribution is found in a subdirectory of your GCC sources named mpc, it will be built together with GCC
Распаковывал, попытался поставить всё в /usr/local (естественно, не забывая указывать --with-gmp=/usr/local --with-mpfr=/usr/local где нужно). Вроде бы, проблем никаких не должно возникать, но начались они почти сразу.
При сборке mpc-0.9 вылезла ошибка, «mpc_get_dc error: `_Imaginary_I' undeclared» — и нет в исходниках никакого «Imaginary» вообще. Гугл помог: Проблемы при сборке get.c — оказалось, в системе есть «мешающий» include — complex.h. В config.h, созданном после запуска configure есть строка:
#define HAVE_COMPLEX_H 1
Её нужно или закоментировать/удалить или вместо 1 написать 0 и запустить make по новой.
Всё собрал-поставил в /usr/local. А далее началось самое мучительное — сборка gcc-4.6. Попытки объяснить «где же лежат gmp/mpfr/mpc» в явном виде оказались совсем безуспешными — configure сразу вываливался. Поэтому, «Alternatively, if a XXX source distribution is found in a subdirectory of your GCC sources named xxx, it will be built together with GCC» оказалось единственным работающим вариантом. Пришлось сделать как написано — со всеми тремя деревьями исходников. Просто ./configure отработал нормально, далее make и наступание на знакомые грабли с
<complex.h>
— ищем созданный config.h (host-i386-pc-solaris2.11/mpc) исправляем, запускаем make — Ура!.. собирается… Упс.configure-stage1-target-libgcc
configure: error: cannot compute suffix of object files: cannot compile
Гуглим-пляшем с бубном и ещё немного…
gcc -v
Reading specs from /usr/sfw/lib/gcc/i386-pc-solaris2.11/3.4.3/specs
Configured with: /builds2/sfwnv-111a/usr/src/cmd/gcc/gcc-3.4.3/configure --prefix=/usr/sfw
--with-as=/usr/sfw/bin/gas --with-gnu-as --with-ld=/usr/ccs/bin/ld --without-gnu-ld
--enable-languages=c,c++,f77,objc --enable-shared
Пробуем так — тоже не помогает. make clean, кстати в промежутках делаем…
Разгадка
А ларчик просто открывался — нужно было удалить временные каталоги с следами предидущих попыток вручную,
rm -fr build-i386-pc-solaris2.11 host-i386-pc-solaris2.11 i386-pc-solaris2.11 prev-i386-pc-solaris2.11 stage1-i386-pc-solaris2.11
и только потом запускать
./configure --prefix=/usr/local --with-as=/usr/sfw/bin/gas --with-gnu-as --with-ld=/usr/ccs/bin/ld --without-gnu-ld --enable-languages=c,c++,fortran,objc --program-suffix=462 --enable-shared
gmake
(чиним config.h от mpc - или "на лету", или ещё раз gmake запускаем)
Часик пыхтения компилятора — и вуаля, можно делать make install
# gcc462 -v
Using built-in specs.
COLLECT_GCC=gcc462
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/i386-pc-solaris2.11/4.6.2/lto-wrapper
Target: i386-pc-solaris2.11
Configured with: ./configure --prefix=/usr/local --with-as=/usr/sfw/bin/gas --with-gnu-as --with-ld=/usr/ccs/bin/ld --without-gnu-ld --enable-languages=c,c++,fortran,objc --program-suffix=462 --enable-shared
Thread model: posix
gcc version 4.6.2 20110916 (prerelease) (GCC)
Работоспособность и достижение заданного результата (сборка софтины, требующей новый компилятор) пока не проверял — «надеюсь на лучшее» :).