Компиляцию в Solaris можно делать многими способами, но я расскажу о 2-х, на мой взгляд, популярных: SunStudio и gcc.
В базовой поставке эти компоненты отсутствуют, поэтому их придётся ставить отдельно. Но для обеих компонентов будут нужны header’ы и их тоже нужно будет поставить:
#pkg install system/header
Иначе будет ругаться
fatal error: string.h: No such file or directory
Напомню, что в Solaris include-файлы лежат в /usr/include.
Кстати, под Solaris лучше использовать именно SunStudio, а не gcc, так как у первого лучше оптимизация под Solaris.
1) GCC
Установка (на примере gcc 4.5):
# pkg install pkg:/developer/gcc-45@4.5.2-0.175.0.0.0.2.537
Теперь компиляциию можно выполнять так:
# CFLAGS="-m64 -O2" CPPFLAGS="-m64 -O2" CCASFLAGS="-m64 -O2" CXXFLAGS="-m64 -O2" LDFLAGS="-m64 -O2" ./configure
# gmake -j16
Здесь использован метод оптимизации -O2, а так же сборка в 16 потоков. Но можно использовать даже -O4, если код написан хорошо.
Можно ещё отдельно указывать компиляторы для c/c++:
# CC="/usr/gcc/4.5/bin/gcc" CXX="g++" ./configure
Если при сборке приложения нужны библиотеки, которые не находятся в $PATH, их можно указать так (или RPATH):
LDFLAGS="-m64 -L/usr/postgres/9.2-pgdg/lib/64 -R/usr/postgres/9.2-pgdg/lib/64"
А для включения хидеров так (аналогично добавить в CFLAGS/CCASFLAGS/CXXFLAGS/…):
CPPFLAGS="-I/pkg/db-4.0.14/include"
Лучше конечно не переопределять переменные типа LDFLAGS/CFLAGS/…, а добавлять к ним нужные значения. Например:
LDFLAGS += -Lreadline-subdir -Lanotherdir
2) SunStudio
Сам SunStudio можно скачать (а лучше установить правильно через pkg) с сайта oracle.com, предварительно зарегистровавшись. После скачивания его достаточно просто распаковать и можно использовать. А использовать его нужно так:
# CC="/opt/solarisstudio12.3/bin/cc" CFLAGS="-xtarget=generic -xarch=amd64 -m64 -xO4" CXX="CC" CXXFLAGS="-xtarget=generic -xarch=amd64 -m64 -xO4" LDFLAGS="-xarch=amd64 -m64" ./configure --with-apxs2=/usr/apache2/bin/apxs --prefix=/usr/local/php5 --with-config-file-path=/usr/local/php5/etc --enable-ftp
# gmake
# gmake install
То есть переопределяем компилятор через переменную CC.
На новых компиляторах можете получить сообщение
cc: Warning: -xarch=amd64 is deprecated, use -m64 to create 64-bit programs
3) Оптимизация.
Пару слов расскажу об оптимизации. Идеально использовать наивысший уровень оптимизации (-O5/fast), но тогда могут возникать проблемы при переносе с одной архитектуры на другую.
При сборке с параметром fast, компилятор сам подставляет значения -xchip, -xcache, -xarch, которые как раз и привязываются к архитектуре. Возможны и другие ключи, такие как -DBIT_FUNCS_ASM, при котором одно и то же приложение собирается на AMD Opteron и не собирается на Intel Xeon. Что бы понять, какие параметры выставляются при сборке с параметром -fast, выполним такую команду:
# /opt/solarisstudio12.3/bin/CC -fast -dryrun
### CC: Note: NLSPATH = /opt/solarisstudio12.3/prod/bin/../lib/locale/%L/LC_MESSAGES/%N.cat:/opt/solarisstudio12.3/prod/bin/../../lib/locale/%L/LC_MESSAGES/%N.cat
### command line files and options (expanded):
### -xO5 -xchip=amdfam10 -xcache=64/64/2:512/64/16 -xarch=amdsse4a -xdepend=yes -fsimple=2 -fns=yes -ftrap=%none -xlibmil -xlibmopt -xbuiltin=%all -D__MATHERR_ERRNO_DONTCARE -nofstore -xregs=frameptr -Qoption CC -iropt -dryrun
usage: CC [ options ] files. Use 'CC -flags' for details
Для gcc можно использовать такую:
# /usr/bin/cc -# -fast -dry
cc: Warning: Option -dry passed to ld, if ld is invoked, ignored otherwise
### cc: Note: NLSPATH = /opt/solarisstudio12.3/prod/bin/../lib/locale/%L/LC_MESSAGES/%N.cat:/opt/solarisstudio12.3/prod/bin/../../lib/locale/%L/LC_MESSAGES/%N.cat
### command line files and options (expanded):
### -# -xO5 -xchip=amdfam10 -xcache=64/64/2:512/64/16 -xarch=amdsse4a -xdepend=yes -fsimple=2 -fns=yes -ftrap=%none -xlibmil -xlibmopt -xbuiltin=%all -D__MATHERR_ERRNO_DONTCARE -fsingle -xalias_level=basic -nofstore -xregs=frameptr -dry
usage: cc [ options ] files. Use 'cc -flags' for details
Отсюда видно жёсткую привязку к архитектуре AMD (в данном случае используется CPU AMD Opteron 6174 2200 MHz). А вот вывод команды на Intel Xeon E7540 2.00GHz:
# /opt/solarisstudio12.3/bin/CC -fast -dryrun
### CC: Note: NLSPATH = /opt/solarisstudio12.3/prod/bin/../lib/locale/%L/LC_MESSAGES/%N.cat:/opt/solarisstudio12.3/prod/bin/../../lib/locale/%L/LC_MESSAGES/%N.cat
### command line files and options (expanded):
### -xO5 -xchip=nehalem -xcache=32/64/8:256/64/8:18432/64/24 -xarch=sse4_2 -xdepend=yes -fsimple=2 -fns=yes -ftrap=%none -xlibmil -xlibmopt -xbuiltin=%all -D__MATHERR_ERRNO_DONTCARE -nofstore -xregs=frameptr -Qoption CC -iropt -dryrun
usage: CC [ options ] files. Use 'CC -flags' for details
Получаем -xchip=nehalem, что означает использование Core-I7/Xeon.
Что бы узнать, наилучший выбор -xchip, -xcache, -xarch выполним команду:
# /opt/solarisstudio12.3/bin/CC -xtarget=native -dryrun
### CC: Note: NLSPATH = /opt/solarisstudio12.3/prod/bin/../lib/locale/%L/LC_MESSAGES/%N.cat:/opt/solarisstudio12.3/prod/bin/../../lib/locale/%L/LC_MESSAGES/%N.cat
### command line files and options (expanded):
### -xchip=pentium_pro -xcache=16/64/4:2048/64/16 -xarch=amdsse4a -dryrun
usage: CC [ options ] files. Use 'CC -flags' for details
Полный список xchip и других параметров для архитектур мне найти не удалось, зато кое-что можно взять по этим ссылкам:
http://docs.oracle.com/cd/E19205-01/819-5265/bjaxf/index.html
http://patches.libav.org/patch/30904/
http://www.oracle.com/technetwork/systems/ccompare-141326.html
Предположим, что у вас уже есть бинарный файл (исполняемый или object) и нужно узнать, с какой оптимизацией он был собран. Узнать это можно так:
– С++ код
$ dump -C Bar.o
...
<122> .../tmanfe/; /opt/SUNWspro/bin/CC -G -xtarget=native -compat=4 -xO4 Bar.cpp
– С код
$ dwarfdump getpagesize
...
DW_AT_SUN_command_line /opt/SUNWspro/bin/cc -c -xarch=sse2 -m32 -xO3 +w getpagesize.c
4) Разное.
Переопределение константы PORT, которая должна быть в заголовочных файлах:
$ configure --with-cc-opt=-DPORT=100
5) Ссылки
https://yvoinov.blogspot.com/2018/11/automake-checks-for-programs.html
https://maskray.me/