KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Рашид Ачилов - Создаем порт для FreeBSD своими руками. Часть II

Рашид Ачилов - Создаем порт для FreeBSD своими руками. Часть II

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Рашид Ачилов, "Создаем порт для FreeBSD своими руками. Часть II" бесплатно, без регистрации.
Перейти на страницу:

LANG_EXT= 07

LANG_CONFIGURE_ARG= RUSS

MASTERDIR= ${.CURDIR}/../../editors/openoffice-1.1

USE_RUSSIAN_GSI= yes

USE_INFRA_PATCHSET= yes

include "${MASTERDIR}/Makefile"


При запуске make в каталоге editors/openoffice-1.1 получаем OpenOffice c английским интерфейсом и справкой, при запуске в каталоге russian/openoffice — с русским интерфейсом. Достигается это таким же образом, как любой порт включает в себя bsd.port.mk, — командой. include. Только здесь параметром команды является имя так называемого «мастер-порта», то есть порта, в котором делается вся обработка. Это очень широко распространённый прием для крупных проектов — создается один мастер-порт и несколько портов, в которых только определяются некоторые переменные. Так работают postgresql, openldap, php и множество других портов. В приведенном выше примере мной были добавлены переменные «USE_RUSSIAN_GSI=yes» и «USE_INFRA_PATCHSET=yes», использование которых будет видно в коде из основного порта. Основной порт чересчур громоздок, чтобы приводить его весь, я приведу только некоторые фрагменты.


if defined(USE_RUSSIAN_GSI)

MASTER_SITES+= http://ootrans.i-rs.ru/out/:oorus

endif

if defined(USE_INFRA_PATCHSET)

MASTER_SITES+= ftp://ftp.i-rs.ru/pub/openoffice/1.1.4/ru/:oorus

endif


Эти строки были внесены сразу же после списка MASTER_SITES. Они задают сервера, откуда будут загружаться необходимые файлы и устанавливают группу, которая будет впоследствии связана с файлами дистрибутива.


if!defined(WITHOUT_MOZILLA)

DISTFILES+= ${MOZILLA_PROJECT}:moz

${MOZILLA_SOURCE}:mozsrc

USE_GNOME+= orbit gtk12

endif

if defined(USE_RUSSIAN_GSI)

GSI_VERSION= 2005-01-20

GSI_DIR= rusgsi

DISTFILES+= gsi-$(GSI_VERSION)-sorted.txt.bz2:oorus

endif

if defined(USE_INFRA_PATCHSET)

INFRA_PATCHDIR= infrapatch

INFRA_PATCHEXT= OOo_1.1.4_infra_patches

DISTFILES+= ${INFRA_PATCHEXT}.tar.gz: oorus

endif


Вот именно эта доработка позволила мне уменьшить сборку порта часа на два. Задание «WITHOUT_MOZILLA=yes» исключит из списка DISTFILES файлы исходного кода Mozilla Suite, и, следовательно, загружаться они не будут. Другие условия дополняют список DISTFILES файлами, содержащими модификации интерфейса (gsi-2005-01-20-sorted.txt.bz2), и набором патчей от «Инфра-Ресурс», задают имена каталогов, в которые они будут распаковываться и привязывают их к серверу в группу oorus.


# When USE_RUSSIAN_GSI was defined, ensure, that

# PREBUILD_TRANSEX3 and RUSSIAN_GSI were also defined

if defined(USE_RUSSIAN_GSI)

if!defined(PREBUILD_TRANSEX3)

PREBUILD_TRANSEX3= yes

GSI_PREBUILD= ${WRKDIR}/${GSI_DIR}/btransex

endif

if!defined(RUSSIAN_GSI)

RUSSIAN_GSI= ${WRKDIR}/${GSI_DIR}/gsi-${GSI_VERSION}-sorted.txt

endif

endif

# When USE_INFRA_PATCHSET was defined, ensure,

# that INFRA_PATCHER was also defined

if defined(USE_INFRA_PATCHSET)

INFRA_PATCHER= ${WRKDIR}/${INFRA_PATCHDIR}/${INFRA_PATCHEXT}/do_infrapatch

endif


Для работы с файлом трансляции интерфейса потребуется начальная обработка его программой transex3, что и задается соответствующим параметром.

Также устанавливается имя скрипта, который запустит эту программу. Это небольшой скрипт, который будет создан автоматически. Кроме того, задается имя распакованного файла трансляции элементов интерфейса и имя программы, которая будет использована для наложения патчей.

Переходим к реальным действиям:


if defined(USE_RUSSIAN_GSI)

@${ECHO_MSG} "===> Extracting russian GSI file"

@${MKDIR} ${WRKDIR}/${GSI_DIR}

@${CP} ${DISTDIR}/${DIST_SUBDIR}/gsi-${GSI_VERSION}-sorted.txt.bz2 ${WRKDIR}/${GSI_DIR}

@cd ${WRKDIR}/${GSI_DIR} &&

${BZIP2_CMD} — d gsi-${GSI_VERSION}-sorted.txt.bz2

endif

if defined(USE_INFRA_PATCHSET)

@${ECHO_MSG} "===> Extracting Infra patches set"

@${MKDIR} ${WRKDIR}/${INFRA_PATCHDIR}

@${CP} ${DISTDIR}/${DIST_SUBDIR}/${INFRA_PATCHEXT}.tar.gz ${WRKDIR}/${INFRA_PATCHDIR}

@cd ${WRKDIR}/${INFRA_PATCHDIR} &&

${TAR} — xzvf ${INFRA_PATCHEXT}.tar.gz

endif


Копируем упакованный файл трансляции интерфейса из /usr/ports/distfiles/openoffice (задана DIST_SUBDIR) в каталог, который был создан заранее, и распаковываем его архиватором bzip2. Копируем архив патчей «Инфра-Ресурс» в другой, предварительно созданный каталог и распаковываем его, но уже программой tar. Обратите внимание, что все команды параметризированы, — всюду используется ${PROGRAM}, а не /bin/program!


post-patch:

if defined(USE_INFRA_PATCHSET)

@${ECHO_MSG} "===> Patching OOo with Infra patches set"

@cd ${WRKDIR}/${INFRA_PATCHDIR}/${INFRA_PATCHEXT} &&

${SH} ${INFRA_PATCHER}

endif


Дополняем мишень patch подмишенью post-patch, в которой собственно и запускаем скрипт, вносящий изменения. Обратите внимание — записать это в две строки нельзя! Если записать команды cd и запуск скрипта на разных строках, то запуск скрипта произойдет не из каталога, в который перешли командой cd, а из текущего, потому что make, выполнив запрошенное действие, возвращается в каталог, из которого она была запущена. Точно так же выполняются все другие действия, связанные со сменой каталога, — например распаковка файлов.


if defined(PREBUILD_TRANSEX3)

@${ECHO_MSG} "===> Pre-build TRANSEX3"

@${ECHO} "source ${WRKSRC}/FreeBSDEnv.Set"

> ${GSI_PREBUILD}

@${ECHO} "cd transex3 && build — all && deliver"

>> ${GSI_PREBUILD}

@${CHMOD} +x ${GSI_PREBUILD}

@cd ${WRKSRC} && PATH="${PATH}:${LOCALBASE}/bin:${LOCALBASE}/sbin" && ${TCSH} ${GSI_PREBUILD}

endif

if defined(USE_RUSSIAN_GSI)

@${ECHO_MSG} "===> Build russian GSI"

@cd ${WRKSRC} && PATH="${PATH}:${LOCALBASE}/bin:${LOCALBASE}/sbin" && ${TCSH} — c 'source FreeBSDEnv.Set && localize — m — i ru-RU — l ${LANG_EXT} — f ${RUSSIAN_GSI}

endif


Первая часть задает предварительную сборку программы transex3, для чего формируется скрипт, затем осуществляется переход в каталог с распакованными исходниками и запуск сборки. Обратите внимание, как передается значение переменной PATH. Вторая часть задает обработку исходных текстов OpenOffice согласно новому файлу локализации интерфейса.

Полный текст Makefile из editors/openoffice-1.1 с внесенными мной изменениями можно скачать с.[3] Этот файл уже не используется как файл порта, но как образец написания Makefile, там есть чему поучиться.

Некоторые переменные USE_*

Здесь описаны некоторые наиболее часто используемые переменные USE_*, не упомянутые до сих пор. Полный список их значительно больше, смотреть его нужно в bsd.port.mk.

• IGNOREFILES= <список файлов> — задает список файлов, для которых не выполняется проверка контрольной суммы из distinfo.

• EXTRACT_ONLY=yes — только распаковать файлы дистрибутива, не выполнять никакой работы по сборке. Как правило, в таком порту применяется заменяющая подмишень do-install.

• RESTRICTED=yes — запрещает помещать собранный пакет на FTP или распространять на CD-ROM. Как правило вследствие лицензионных ограничений. Это не такая уже редкость, например такое ограничение имеет виртуальная машина Java.

• NO_CDROM=yes — почти то же самое, только разрешает помещение на FTP.

• FORBIDDEN=yes — запрещает сборку из-за уязвимостей программы.

• IGNORE=yes — запрещает сборку из-за грубых ошибок при сборке программы. Фактически используется для прекращения работы системы по каким-либо причинам (например, неподдерживаемая версия FreeBSD).

• BROKEN=yes — запрещает сборку из-за различных ошибок.

• USE_ZIP=yes — для распаковки использовать zip.

• USE_DOS2UNIX=yes — все тексты перекодировать таким образом, чтобы преобразовать переводы строк из вида DOS в вид UNIX.

• USE_GCC=<номер> — задает номер версии компилятора GCC. Я помню только один порт, использовавший эту USE_* — editors/openoffice на 4.х, имевший по умолчанию GCC 2.95.4.

• USE_GETOPT_LONG=yes — для 4.х добавляет зависимость от libgnugetopt. Для 5.х и выше уже неактуально — libgnugeopt перенесена в базовую систему.

• USE_PERL=yes, USE_JAVA=yes, USE_PYTHON=yes,

USE_RUBY=yes — добавляют соответствующие зависимости от интерпретатора соответствующего языка.

• USE_AUTOTOOLS=<tool>:<version> — добавляет зависимость от некоторой программы из GNU Autotools. Если задана и программа и версия, задает зависимость от конкретной версии, если версия опущена, то задает зависимость от программы без номера в имени. Например: «USE_AUTOTOOLS=libtool:15» задает зависимость от devel/libtool15, но «USE_AUTOTOOLS=libtool» задает зависимость от devel/libtool, что может быть совсем не одно и то же!

• USE_GNOME=<список компонентов через пробел> — задает зависимости от перечисленного списка компонентов GNOME. Например, приведенная выше строка: «USE_GNOME+= orbit gtk12» задает зависимости от компонентов devel/orbit и x11-toolkits/gtk12. При задании зависимостей следует придерживаться разумного минимума — указывать только те компоненты, которые действительно нужны для работы. Помните, что подключенные компоненты тоже имеют свои зависимости, которые могут иметь свои зависимости и т. д. — глубина вложенности неограничена.

• USE_QT_VER=3 — добавляет зависимость от библиотеки x11-toolkits/qt33 и неявно подключает файл bsd.kde.mk.

• USE_LINUX={yes|<число>} — добавляет зависимость от порта emulators/linux-base-8, если не указано <число>. Если <число> указано, то добавляется зависимость от порта emulators/linux-base-<число>.

• CONFLICTS=<список портов> — содержит список портов, с которыми может конфликтовать данный порт. Конфликт может выражаться в совпадающих именах каталогов для установки, совпадающих именах файлов, одинаковых TCP/UDP-портах, невозможность сборки одного порта при наличии другого и прочих причинах. Выражение для списка портов может содержать мета-символы «*?[]!». Например, «apache*-1.3.[012345]».

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*