LINUX.ORG.RU

Скрипт сборки freetype с патчами bohoomil

 , ,


1

4

С выходом новой версии патчей от bohoomil у меня уходит достаточно много сил на сборку пакета. В процессе нужно вспомнить все варварские приёмы с помощью которых я заталкиваю freetype в пакет. Решил я это дело автоматизировать, не столько для автоматизации, а в качестве памятки. Перед запуском нужно удовлетворить зависимости:

apt-get build-dep freetype
apt-get install devscripts

Функция buildi386 нужна только для сборки multiarch пакетов. Например для wine на amd64 нужен libfreetype6:i386. Чтобы увидеть эффект нужно поместить файл infinality-settings.sh туда, где он будет запускаться при запуске иксов. Например в /etc/profile.d/

#!/bin/bash

GITURL='https://codeload.github.com/bohoomil/fontconfig-ultimate/zip/pkgbuild'
FREETYPEURL='http://download.savannah.gnu.org/releases/freetype'
BOHOOMILDIR='fontconfig-ultimate-pkgbuild/01_freetype2-iu'

# apt-get build-dep freetype
# apt-get install devscripts

revision=''

die()
{
	echo
	echo "FAIL: $@"
	exit 1
}

downloadsrc()
{
	for i in freetype freetype-doc ft2demos
	do
		wget "$FREETYPEURL/$i-$revision.tar.gz" ||
			die "wget $FREETYPEURL/$i-$revision.tar.gz"
	done
}

prepare()
{
	rm -rf freetype
	mkdir freetype
	cd freetype || exit 1

	wget --output-document=bohoomil.zip "$GITURL" || die "wget $GITURL"
	unzip bohoomil.zip || die 'unzip bohoomil.zip'

	revision=`grep -m1 '^pkgver\=' "$BOHOOMILDIR/PKGBUILD"`
	[[ $revision =~ ^pkgver=(.+)$ ]]
	revision=${BASH_REMATCH[1]}

	if [ -z "$revision" ]
	then
		die "can't get freetype revision from $BOHOOMILDIR/PKGBUILD"
	fi

	echo "Found freetype revision: $revision"

	apt-get source freetype || die "apt-get source freetype"
	rm *

	cd freetype-* || die "can't cd to freetype-X/debian"
	rm *

	debrev="$revision"
	if [[ ! $revision =~ ^.+\-.+$ ]]
	then
		debrev="$revision-0.1"
	fi

	debchange --newversion "$debrev" 'bohoomil patches added' ||
		die "debchange failed"

	cd ..
	cd "freetype-$revision" || die "can't cd to freetype-$revision"

	downloadsrc

	# build error fix
	echo 'usr/share/man' >> debian/libfreetype6-dev.install

	# replace debian patches in freetype
	rm debian/patches-freetype/*

	cp "../$BOHOOMILDIR/"*.patch debian/patches-freetype/
	ls debian/patches-freetype/*.patch | xargs -n 1 basename |
		sed 's|$| \-p1|' > debian/patches-freetype/series

	# remove patches from freetype2-demos
	rm debian/patches-ft2demos/*
	echo '01-empty.patch' > debian/patches-ft2demos/series
	touch debian/patches-ft2demos/01-empty.patch
}

build()
{
	export CFLAGS="-Wno-error"

	echo "y" | debuild -uc -us
	# now build fails, update symbols file, and run again
	cp debian/libfreetype6/DEBIAN/symbols debian/libfreetype6.symbols
	echo "y" | debuild -uc -us -nc
}

buildi386()
{
	export CFLAGS="-Wno-error -m32"
	export LDFLAGS="-Wl,-melf_i386"
	export DEB_BUILD_ARCH="i386"
	export DEB_HOST_MULTIARCH="i386-linux-gnu"

	echo "y" | debuild -uc -us -ai386

	cd ..
	echo "### fix debs i386 ###"

	# fix depends libc6-i386 to libc6
	for i in *_i386.*deb
	do
		dpkg -x "$i" "/tmp/$i"
		dpkg -e "$i" "/tmp/$i/DEBIAN"
		sed '/Depends\: / s|\-i386||g' -i "/tmp/$i/DEBIAN/control"
		dpkg -b "/tmp/$i/" "$i"
		rm -r "/tmp/$i"
	done
}

if (( $EUID < 1000 ))
then
	echo 'Moron!?'
	exit 1
fi

prepare
build

# uncomment if you want to build i386 packages on amd64 arch.
#buildi386



Последнее исправление: PoMbl4 (всего исправлений: 2)

С выходом новой версии патчей от bohoomil у меня уходит достаточно много сил на сборку пакета.

Ты что-то делаешь не так, у меня не уходит.

Vovka-Korovka ★★★★★
()
Ответ на: комментарий от Vovka-Korovka

Я рад за тебя. А я вот не мэйнтейнер. Мне всего лишь нужен deb пакет для личных нужд. Для меня главное, что на выходе он как настоящий. У меня нет времени и желания постигать все тонкости правильной сборки deb'ов. Да и как говорят - с rpm куда меньше возни.

PoMbl4
() автор топика
Ответ на: комментарий от PoMbl4

У меня нет времени и желания постигать все тонкости правильной сборки deb'ов.

А время и желание писать жуткие костыли есть.

Vovka-Korovka ★★★★★
()
Ответ на: комментарий от Vovka-Korovka

Костыли не костыли, но новичок с помощью этого скрипта сможет получить себе freetype с патчами. И может быть не убежит обратно на шинду офигев от шрифтов. В первую очередь это приводилось к полной автоматизации для этого. Иного способа в debian получить freetype с патчами тупо нет. Только собирать руками. Было что-то годы назад, но уже не актуально. Во вторых эта поделка пилит всё на глазах без всяких там левых ppa.

PoMbl4
() автор топика
Ответ на: комментарий от PoMbl4

Да. Кстати, отличная идея - я до этого не догадался, а ведь реально не хватает.

das_tier ★★★★★
()
Ответ на: комментарий от sehellion

Я вот в то время уже не упарывался, но после покупки lcd монитора в 2008 взамен трубки, я не смог смотреть на него. Мигрировал на шинду. Вернулся на линукс с момента появления патчей от infinality. Такие дела.

PoMbl4
() автор топика
Ответ на: комментарий от sehellion

Не знаю куда тебе смотреть. Может быть у тебя везде сплошной terminus и для тебя всё замечательно. Я же предпочитаю смотреть сайты так как они задумывались. А тут одним лишь terminus'ом не обойтись.

PoMbl4
() автор топика
Ответ на: комментарий от PoMbl4

Не, если я отключаю использование шрифтов с сайтов, то у меня на лоре в уведомлениях иконки пропадают, что меня очень огорчает, а так бы поставил один шрифт на все сайты

sehellion ★★★★★
()
Ответ на: комментарий от PoMbl4

Здравствуйте. В результате исполнения приведённого Вами скрипта должны появиться следующие deb-файлы:

freetype2-demos_2.6-0.1_amd64.deb
libfreetype6_2.6-0.1_amd64.deb
libfreetype6-dev_2.6-0.1_amd64.deb

Правильно?

Sferg
()
Ответ на: комментарий от PoMbl4

Просто несколько смущает отсутствие файла fontconfig (прошу прощения, ежели в чём не прав). Дело в том, что я только сегодня обнаружил Вашу статейку здесь и пользовался старой версией Infinality, для облагораживания шрифтов, взятой где-то на просторах Сети:

fontconfig-infinality_1-2_all.deb
freetype-infinality_2.4.12-1_all.deb
libfreetype-infinality6_2.4.12-1_amd64.deb

Свежий вариант от Bohoomil для Debian уже и не надеялся найти.

Sferg
()
Ответ на: комментарий от Sferg

Этот скрипт только лишь собирает пакеты freetype. fontconfig я не собираю, ибо он мало влияет на отрисовку шрифтов, вместо него у меня свои настройки в ~/.fonts.conf. Если вы используете GTK приложения, то вам нужно собрать cairo с соответствующими патчами. Скрипт не собирает cairo, так как его сборка достаточно проста, и её можно осуществить руками. Если есть востребованность, то я могу позже запилить автоматическую сборку cairo.

PoMbl4
() автор топика
Ответ на: комментарий от Sferg

Для начала вы можете просто установить готовый пакет, который в муках родил мой скрипт. Это уже даст какой-то эффект. Автоматическую сборку cairo наверное я смогу запилить лишь завтра.

PoMbl4
() автор топика
Ответ на: комментарий от PoMbl4

Хорошо. Как сможете - так сможете. Это особо не к спеху. Главное, отдыхайте. Время уже позднее.

Sferg
()
Ответ на: комментарий от PoMbl4

Здравствуйте. Хотел собрать ещё пакет для i386 (для чего раскомментировал строчку buildi386 в Вашем скрипте, который я положил и запускаю из /tmp), пакеты под amd64 собираются исправно, а вот при сборке пакетов под i386 в конце процедуры ругань:

configure: error: in `/tmp/freetype/freetype-2.6/freetype-2.6/builds/unix':
configure: error: C compiler cannot create executables
See `config.log' for more details
builds/unix/detect.mk:87: ошибка выполнения рецепта для цели «setup»
make[2]: *** [setup] Ошибка 77
make[2]: выход из каталога «/tmp/freetype/freetype-2.6/freetype-2.6»
dh_auto_configure: ./configure --build=x86_64-linux-gnu --prefix=/usr --includedir=${prefix}/include --mandir=${prefix}/share/man --infodir=${prefix}/share/info --sysconfdir=/etc --localstatedir=/var --libdir=${prefix}/lib/i386-linux-gnu --libexecdir=${prefix}/lib/i386-linux-gnu --disable-maintainer-mode --disable-dependency-tracking --host=i586-linux-gnu --without-bzip2 returned exit code 2
debian/rules:80: ошибка выполнения рецепта для цели «override_dh_auto_configure»
make[1]: *** [override_dh_auto_configure] Ошибка 2
make[1]: выход из каталога «/tmp/freetype/freetype-2.6»
debian/rules:50: ошибка выполнения рецепта для цели «build»
make: *** [build] Ошибка 2
dpkg-buildpackage: ошибка: debian/rules build возвратил код ошибки 2
debuild: fatal error at line 1376:
dpkg-buildpackage -rfakeroot -d -us -uc -ai386 failed
### fix debs i386 ###
dpkg-deb: ошибка: не удалось прочитать архив «*_i386.*deb»: Нет такого файла или каталога
dpkg-deb: ошибка: не удалось прочитать архив «*_i386.*deb»: Нет такого файла или каталога
sed: невозможно прочитать /tmp/*_i386.*deb/DEBIAN/control: Нет такого файла или каталога
dpkg-deb: ошибка: не удалось открыть для чтения файл информации о пакете «/tmp/*_i386.*deb//DEBIAN/control»: Нет такого файла или каталога
rm: невозможно удалить «/tmp/*_i386.*deb»: Нет такого файла или каталога

Не пойму в чём дело. В сборке новичок периодическими проблесками понимания.

Sferg
()
Ответ на: комментарий от Sferg

Нужно установить пакеты для кросс-компиляции, не помню что именно нужно установить, у меня так:

i   cross-gcc-dev                   - Tools for building cross-compilers and cro
i A gcc                             - GNU C compiler                            
i A gcc-4.8                         - GNU C compiler                            
i   gcc-4.8-base                    - GCC, the GNU Compiler Collection (base pac
i A gcc-4.9                         - GNU C compiler                            
i   gcc-4.9-base                    - GCC, the GNU Compiler Collection (base pac
i A gcc-4.9-base:i386               - GCC, the GNU Compiler Collection (base pac
i A gcc-4.9-multilib                - GNU C compiler (multilib files)           
i   gcc-multilib                    - GNU C compiler (multilib files)           
i A lib32gcc-4.9-dev                - GCC support library (32 bit development fi
i A lib32gcc1                       - GCC support library (32 bit Version)      
i A libgcc-4.8-dev                  - GCC support library (development files)   
i A libgcc-4.9-dev                  - GCC support library (development files)   
i   libgcc1                         - GCC support library                       
i A libgcc1:i386                    - GCC support library                       
i A libx32gcc-4.9-dev               - GCC support library (x32 development files
i A libx32gcc1                      - GCC support library (x32)                 
i A linux-compiler-gcc-4.8-x86      - Compiler for Linux on x86 (meta-package)

Что касается сборки cairo, то он легко собирается руками. Последовательность действий такая.

# apt-get build-dep cairo
$ apt-get source cairo
Кидаем патчи из freetype/fontconfig-ultimate-pkgbuild/03_cairo-iu/
в cairo-1.14.2/debian/patches/

в конец файла series добавляем
cairo-respect-fontconfig_pb.patch -p1
cairo-server-side-gradients.patch -p1
cairo-webkit-html5-fix.patch -p1

заходим в cairo-1.14.2 и делаем debuild -uc -us

PoMbl4
() автор топика
Ответ на: комментарий от PoMbl4

Да, не все пакеты для кросс-компиляции были установлены. Доустановил, процедура выполнения скрипта стала выполнянться чуточку дольше, однако всё равно завершается руганью (чуточку другой):

/usr/include/zlib.h:34:19: fatal error: zconf.h: No such file or directory
 #include "zconf.h"
                   ^
compilation terminated.
/tmp/freetype/freetype-2.6/freetype-2.6/src/sfnt/rules.mk:66: ошибка выполнения рецепта для цели «/tmp/freetype/freetype-2.6/freetype-2.6/objs/sfnt.lo»
make[2]: *** [/tmp/freetype/freetype-2.6/freetype-2.6/objs/sfnt.lo] Ошибка 1
make[2]: выход из каталога «/tmp/freetype/freetype-2.6/freetype-2.6»
dh_auto_build: make -j1 returned exit code 2
debian/rules:83: ошибка выполнения рецепта для цели «override_dh_auto_build»
make[1]: *** [override_dh_auto_build] Ошибка 2
make[1]: выход из каталога «/tmp/freetype/freetype-2.6»
debian/rules:50: ошибка выполнения рецепта для цели «build»
make: *** [build] Ошибка 2
dpkg-buildpackage: ошибка: debian/rules build возвратил код ошибки 2
debuild: fatal error at line 1376:
dpkg-buildpackage -rfakeroot -d -us -uc -ai386 failed
### fix debs i386 ###
dpkg-deb: ошибка: не удалось прочитать архив «*_i386.*deb»: Нет такого файла или каталога
dpkg-deb: ошибка: не удалось прочитать архив «*_i386.*deb»: Нет такого файла или каталога
sed: невозможно прочитать /tmp/*_i386.*deb/DEBIAN/control: Нет такого файла или каталога
dpkg-deb: ошибка: не удалось открыть для чтения файл информации о пакете «/tmp/*_i386.*deb//DEBIAN/control»: Нет такого файла или каталога
rm: невозможно удалить «/tmp/*_i386.*deb»: Нет такого файла или каталога
Sferg
()
Ответ на: комментарий от PoMbl4

Выполнил apt-get build-dep -a i386 freetype. Теперь в конце следующее:

rmdir /tmp/freetype/freetype-2.6/debian/tmp/usr/include/freetype2/freetype/config
rmdir: не удалось удалить «/tmp/freetype/freetype-2.6/debian/tmp/usr/include/freetype2/freetype/config»: Нет такого файла или каталога
/tmp/freetype/freetype-2.6/freetype-2.6/builds/unix/install.mk:32: ошибка выполнения рецепта для цели «install»
make[2]: [install] Ошибка 1 (игнорирование)
rm -f /tmp/freetype/freetype-2.6/debian/tmp/usr/include/freetype2/freetype/*
rmdir /tmp/freetype/freetype-2.6/debian/tmp/usr/include/freetype2/freetype
rmdir: не удалось удалить «/tmp/freetype/freetype-2.6/debian/tmp/usr/include/freetype2/freetype»: Нет такого файла или каталога
/tmp/freetype/freetype-2.6/freetype-2.6/builds/unix/install.mk:32: ошибка выполнения рецепта для цели «install»
make[2]: [install] Ошибка 1 (игнорирование)
...
Can't exec "i586-linux-gnu-strip": Нет такого файла или каталога at /usr/share/perl5/Debian/Debhelper/Dh_Lib.pm line 225.
dh_strip: i586-linux-gnu-strip --remove-section=.comment --remove-section=.note --strip-unneeded debian/libfreetype6/usr/lib/i386-linux-gnu/libfreetype.so.6.12.0 failed to to execute: Нет такого файла или каталога
debian/rules:50: ошибка выполнения рецепта для цели «binary»
make: *** [binary] Ошибка 2
dpkg-buildpackage: ошибка: fakeroot debian/rules binary возвратил код ошибки 2
debuild: fatal error at line 1376:
dpkg-buildpackage -rfakeroot -d -us -uc -ai386 failed
### fix debs i386 ###
dpkg-deb: ошибка: не удалось прочитать архив «*_i386.*deb»: Нет такого файла или каталога
dpkg-deb: ошибка: не удалось прочитать архив «*_i386.*deb»: Нет такого файла или каталога
sed: невозможно прочитать /tmp/*_i386.*deb/DEBIAN/control: Нет такого файла или каталога
dpkg-deb: ошибка: не удалось открыть для чтения файл информации о пакете «/tmp/*_i386.*deb//DEBIAN/control»: Нет такого файла или каталога
rm: невозможно удалить «/tmp/*_i386.*deb»: Нет такого файла или каталога
Sferg
()
Ответ на: комментарий от Sferg

Can't exec «i586-linux-gnu-strip»: Нет такого файла или каталога

$ aptitude search binutils | grep ^i
i A binutils                        - GNU assembler, linker and binary utilities
i   binutils-i586-linux-gnu         - GNU binary utilities, for i586-linux-gnu t
PoMbl4
() автор топика
Ответ на: комментарий от PoMbl4

Собрался freetype6 под i386. Недоставало пакета binutils-i586-linux-gnu. Век живи, век учись - всё равно дураком помрёшь. Сейчас попробую Cairo сварганить.

Благодарствую!

Sferg
()
Ответ на: комментарий от PoMbl4

У меня тоже Jessie:

root@ASUS # lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 8.1 (jessie)
Release:        8.1
Codename:       jessie

Далее:

root@ASUS # apt-get -s build-dep cairo
Чтение списков пакетов… Готово
Построение дерева зависимостей
Чтение информации о состоянии… Готово
Selected version '1.14.0-2.1' (jessie) for cairo

Вроде бы всё собралось и установилось. Разницы визуально не заметно между старыми и новыми версиями libfreetype и libcairo. Хотя, как мне показалось, буква «в» вроде бы чётче стала выглядеть (хотя, скорее всего, это предубеждение).

P.S. Спасибо Вам большое за помощь!

Sferg
()
Ответ на: комментарий от Sferg

Вообще чтобы увидеть разницу стоит поиграть с файлом настроек. Раньше определенные интересные настройки приводили к возникновению разрыва между символами. Теперь же этого нет.

PoMbl4
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.