Выбрать главу

Модификация порта OpenOffice 1.1.4

С моей точки зрения, порт для сборки OpenOffice editors/openoffice имел множество недостатков, но эти изменения я никогда не пробовал отправить во FreeBSD Team для помещения их в дерево портов. Какие изменения были внесены мной:

• возможность отказаться от сборки Mozilla Suite, нужной только для работы с адресной книгой формата Mozilla;

• возможность загрузить и применить последний (на тот момент) файл локализации интерфейса;

• возможность загрузить и применить внешние патчи, созданные в «Инфра-Ресурс» для версии для Linux.

Порт на самом деле состоит из двух файлов – editors/openoffice-1.1 и russian/openoffice. Makefile порта russian/openoffice-1.1 достаточно прост:

CATEGORIES= russian

.if !defined (LANG) && !defined(USE_LANG)

USE_LANG= ru_RU.KOI8-R

.endif

LANG_LIST= ru_RU.KOI8-R uk_UA.KOI8-U

LANG_PKGNAME= ru

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, выполнив запрошенное действие, возвращается в каталог, из которого она была запущена. Точно так же выполняются все другие действия, связанные со сменой каталога, – например распаковка файлов.