"Создаем порт для FreeBSD своими руками. Часть II" - читать интересную книгу автора (Ачилов Рашид)Модификация порта 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) amp;amp; !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} "===gt; 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} amp;amp; \ ${BZIP2_CMD} -d gsi-${GSI_VERSION}-sorted.txt.bz2 .endif .if defined(USE_INFRA_PATCHSET) @${ECHO_MSG} "===gt; Extracting Infra patches set" @${MKDIR} ${WRKDIR}/${INFRA_PATCHDIR} @${CP} ${DISTDIR}/${DIST_SUBDIR}/${INFRA_PATCHEXT}.tar.gz ${WRKDIR}/${INFRA_PATCHDIR} @cd ${WRKDIR}/${INFRA_PATCHDIR} amp;amp; \ ${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} "===gt; Patching OOo with Infra patches set" @cd ${WRKDIR}/${INFRA_PATCHDIR}/${INFRA_PATCHEXT} amp;amp; \ ${SH} ${INFRA_PATCHER} .endif Дополняем мишень patch подмишенью post-patch, в которой собственно и запускаем скрипт, вносящий изменения. Обратите внимание – записать это в две строки нельзя! Если записать команды cd и запуск скрипта на разных строках, то запуск скрипта произойдет не из каталога, в который перешли командой cd, а из текущего, потому что make, выполнив запрошенное действие, возвращается в каталог, из которого она была запущена. Точно так же выполняются все другие действия, связанные со сменой каталога, – например распаковка файлов. .if defined(PREBUILD_TRANSEX3) @${ECHO_MSG} "===gt; Pre-build TRANSEX3" @${ECHO} "source ${WRKSRC}/FreeBSDEnv.Set" gt; ${GSI_PREBUILD} @${ECHO} "cd transex3 amp;amp; build --all amp;amp; deliver" gt;gt; ${GSI_PREBUILD} @${CHMOD} +x ${GSI_PREBUILD} @cd ${WRKSRC} amp;amp; PATH="${PATH}:${LOCALBASE}/bin:${LOCALBASE}/sbin" amp;amp; ${TCSH} ${GSI_PREBUILD} .endif .if defined(USE_RUSSIAN_GSI) @${ECHO_MSG} "===gt; Build russian GSI" @cd ${WRKSRC} amp;amp; PATH="${PATH}:${LOCALBASE}/bin:${LOCALBASE}/sbin" amp;amp; ${TCSH} -c 'source FreeBSDEnv.Set amp;amp; localize -m -i ru-RU -l ${LANG_EXT} -f ${RUSSIAN_GSI}' .endif Первая часть задает предварительную сборку программы transex3, для чего формируется скрипт, затем осуществляется переход в каталог с распакованными исходниками и запуск сборки. Обратите внимание, как передается значение переменной PATH. Вторая часть задает обработку исходных текстов OpenOffice согласно новому файлу локализации интерфейса. Полный текст Makefile из editors/openoffice-1.1 с внесенными мной изменениями можно скачать с [3]. Этот файл уже не используется как файл порта, но как образец написания Makefile, там есть чему поучиться. |
|
|