25.04.2010

Firefox KDE Integration в Gentoo

openSUSE, наверное, самый лучший для KDE-шника бинарный дистрибутив, с версии 11.1 предоставляет патчи для интеграции Firefox в KDE.
Эти патчи, естественно, свободно доступны и могут накладываться не только в openSUSE, но и в других дистрибутивах. Данный пост расскажет о том, как это делается в Gentoo.

Пост -- фактически перепечатка материала, доступного вот здесь. Посему далее пойдет текст reonaydo, в котором я лишь вставлю курсивом свои замечания по использованию данного способа. Итак:

"Однажды, на просторах интернета, наткнулся вот на эту страницу.
Оказалось, что в openSUSE для огнелиса сделали патчи, чтобы он более лаконично смотрелся в KDE окружении.
Решил я и у себя сделать такой firefox.

Для начала, необходимо поставить kmozillahelper.
# /usr/local/portage/kde-misc/kmozillahelper/kmozillahelper-0.6.ebuild
# Copyright 1999-2010 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $

EAPI="2"
inherit cmake-utils

DESCRIPTION="Mozilla KDE Integration"
HOMEPAGE="http://en.opensuse.org/KDE/FirefoxIntegration"
SRC_URI="http://aur.archlinux.org/packages/kmozillahelper/kmozillahelper/${PN}-${PV}.tar.bz2"

LICENSE="MIT"
SLOT="0"
#KEYWORDS="~x86"
KEYWORDS="~x86 ~amd64" # -- Valdos Sinus
IUSE=""

DEPEND="
        >=kde-base/kdelibs-4.2"
RDEPEND="${DEPEND}"

S=${WORKDIR}/${PN}
Собственно, этот ебилд надо поместить в локальный оверлей. Например, у меня этот ебилд лежит в /usr/overlays/my/kde-misc/kmozillahelper/ (я положил в /usr/local/portage/, мои ebuild-ы там -- Valdos Sinus)
Это библиотека, требуемая этими патчами.
А далее нужно патчить сам firefox и xulrunner.

Вначале, я сделал отдельные ебилды для xulrunner и firefox, поместил их в локальный оверлей, и поставил. Но возникла проблема обновления, так как при обновлении поставились бы версии без патчей. А каждый раз править ебилды – это слишком нудно.
Когда в дереве портежей уже была версия 3.6.3, я по-прежнему пользовался 3.6.0. Это меня дико огорчало.
Случайно, я наткнулся вот на этот баг в багзилле.
Вкратце, автор просил возможность автоматического наложения своих патчей при сборке ебилдов.
На что ему ответили, что это уже можно сделать, используя /etc/portage/bashrc.
Патчи будут браться из директории /некая_директория/категория_пакета/имя_пакета/
Там же в аттаче прикреплён пример этого bashrc.
Но меня тот пример не устроил по нескольким пуктам:
  • патчи искались исключительно имя_проги.patch или diff. Я не вижу в этом смысла, так как ведь уже и так патчи ищутся в директории соответствующей категории и имени пакета
  • Патчи накладывались на этапе compile. Хотя логичнее их накладывать вместе с патчами из ебилда на этапе prepare
  • В случае неудачного наложения патча, выводилась ошибка, но сборка продолжалась. Это нелогично. Так как раз уж я положил патч, то значит мне он нужен, и без него собирать я не хочу. Я хочу, чтобы в случае, если патч не смог наложиться, сборка прекращалась
В итоге, я немного подправил bashrc.
Вот мой подправленный вариант:
# /etc/portage/bashrc
# echo 'PATCH_OVERLAY=/etc/portage/autopatch' >> /etc/make.conf
# mkdir -p /etc/portage/autopatch
# (or echo 'PATCH_OVERLAY=/home/.patches' >> /etc/make.conf
# and mkdir /home/.patches -- Valdos Sinus)
autopatch() {
        local diff level p patches patched 

        [[ ! -d "$PATCH_OVERLAY" ]] && return 0

        patches=$(ls -1 ${PATCH_OVERLAY}/${CATEGORY}/${PN}/*.{patch,diff} 2>/dev/null)
        [[ $patches == "" ]] && return 0

        if ! cd ${S}; then
                echo ">>> FAILED TO cd $S"
                return 1
        fi

        for p in ${patches}; do
                p=$(basename $p)
                diff=${PATCH_OVERLAY}/${CATEGORY}/${PN}/${p}
                if [[ -e $diff ]] && [ ! -e ${S}/.${p} ]; then
                        patched=0
                        for level in 0 1 2 3 4; do
                                if [[ $patched == 0 ]]; then
                                        patch -g0 --dry -p${level} >/dev/null < $diff
                                        if [ $? = 0 ]; then
                                                echo -e ' \e[0;36m*\e[0m '"auto patching (-p${level}) ${p}"
                                                patch -g0 -p${level} < $diff > /dev/null && patched=1
                                                touch ${S}/.${p}
                                        fi
                                fi
                        done
                        [[ $patched != 1 ]] && echo "!!! FAILED auto patching $p" && return 1
                else
                        [[ ! -e $diff ]] && echo "!!! $diff does not exist, unable to auto patch"
                fi
        done
        cd $OLDPWD
}

if [[ $EBUILD_PHASE == prepare ]]; then
        PATH=$PATH:/usr/sbin:/usr/bin:/bin:/sbin
        autopatch || exit
fi
В /etc/make.conf добавим строку:
PATCH_OVERLAY="/ваша/директория/с/патчами/" (здесь и далее я заменяю её на /home/.patches -- Valdos Sinus)
Итак, осталось только найти сами патчи.
Для начала xulrunner.
Создадим директорию /home/.patches/net-libs/xulrunner/
(Теперь начинается самое интересное. Та система патчей, которая предлагалась там, не очень мне подошла. Я патчи пронумеровал в соответствие с порядком патченья в PKGBUILD'е:
valdos-desk xulrunner # find . -type f | sed "s/\.\///g"
03-mozilla-helper-app.patch
07-mozilla-kde.patch
09-xulrunner-png14.patch
06-toolkit-ui-lockdown.patch
05-gecko-lockdown.patch
10-enable-x86_64-tracemonkey.patch
01-mozilla-libproxy.patch
04-mozilla-prefer_plugin_pref.patch
08-fix-mozilla-launcher.patch
02-mozilla-nognome-proxies.patch
11-startup-notification.patch
valdos-desk xulrunner #
В таком порядке всё работает.)
Где их взять? Я их брал со страницы арчевского aur`а. Вот тут.
Далее firefox. (/home/.patches/www-browser/mozilla-firefox -- Valdos Sinus)
 valdos-desk mozilla-firefox # find . -type f | sed "s/\.\///g"
firefox-kdejs.patch
firefox-cross-desktop.patch
firefox-no-gnomevfs.patch
firefox-kde.patch
firefox-browser-css.patch
valdos-desk mozilla-firefox #
Всё, кроме firefox-kdejs.patch качается там же, с aur`а.
Этого файла там нету. Там есть просто kde.js, и он необходим для сборки. Но его нужно переделать в патч.
Например, вот так:
diff -ur browser_old/app/profile/kde.js browser/app/profile/kde.js
--- browser_old/app/profile/kde.js      1970-01-01 08:00:00.000000000 +0800
+++ browser/app/profile/kde.js  2010-04-24 15:11:30.000000000 +0900
@@ -0,0 +1 @@
+pref("browser.preferences.instantApply", false);
Итак, bashrc сделан, патчи скачаны/сделаны, в make.conf запись сделана, kmozillahelper лежит в локальном оверлее.
Делаем:
emerge -1 xulrunner && emerge kmozillahelper mozilla-firefox
И радуемся.
p.s. Возможно, после установки kmozillahelper на директорию /usr/lib/mozilla будут права 700. Нужно исправить на 755, иначе никаких изменений не будет. (у меня такого, слава богу, не произошло. Но лучше перепроверьте =) -- Valdos Sinus)"

2 комментария:

  1. И в чём отличие патченого Firefox от ванильного? Что именно изменилось в его внешнем виде?
    P.S. Я использую тему Oxygen-KDE для Firefox, и она прекрасно справляется с интеграцией браузера в KDE.

    ОтветитьУдалить
  2. отличие в том, что используется KDE-шный диалог открытия файлов, используются файловые ассоциации KDE и в диалоге выбора программы для открытия файла можно выбрать в списке KDE-шные программы

    ОтветитьУдалить