"Создаем порт для 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, там есть чему поучиться. |
||
|