Категорії
Solaris

Компиляция в Solaris

Компиляцию в 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/

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

Домашняя страничка Andy
Записки молодого админа
Самостоятельная подготовка к Cisco CCNA
Самостоятельная подготовка к Cisco CCNP
Powered by Muff