Андрей Черепанов

локализация, свободное учётное ПО

Previous Entry Share
Сборка новой версии Chromium 35.0.1916.116 (часть 2): обновляем патчи
altlinux
sibskull
Как и было ранее предсказано, сборка новой версии chromium завершилась неудачей: не наложился патч. Попробуем исправить ситуацию.

Переходим по адресу несобравшегося задания: http://git.altlinux.org/tasks/120100/ и нажимаем на ссылку FAILED в строке:
Status: test-only FAILED at 2014-May-21 10:38:06


Там нам интересна строка какой пакет вызвал проблему (притворимся, что мы и не знаем, хотя это был слонёнок chromium):
2014-May-21 10:38:06 :: [i586] #200 chromium-35.0.1916.114-alt1.src.rpm: build FAILED


Возвращаемся назад и в таблице выбираем ссылку i586 у подзадания #200, а затем файл log. По ссылке http://git.altlinux.org/tasks/120100/build/200/i586/log видно, что не наложился патч #5 (chromium-fix-arm-icu.patch) на файл third_party/icu/icu.gyp:
Patch #5 (chromium-fix-arm-icu.patch):
+ /usr/bin/patch -p0 -d src
patching file third_party/icu/icu.gyp
Hunk #1 FAILED at 27.
1 out of 1 hunk FAILED -- saving rejects to file third_party/icu/icu.gyp.rej
patching file native_client/src/trusted/service_runtime/linux/nacl_bootstrap.gyp
Hunk #1 succeeded at 42 (offset 6 lines).


Что интересно, на другой файл патч наложился.


Примечание:
Для удобства проверки заданий и логов сборки я делал скрипт gtl (http://git.altlinux.org/people/cas/packages/alt-build-tools.git), в котором показываются с расцветкой как список заданий, так и логи подзаданий (с выделением типовых ошибок), чтобы не открывать браузер и не переходить по ссылкам. Для быстрого анализа мне нужно было выполнить
gtl 120100 | grep ': build FAILED'
2014-May-21 10:37:16 :: [x86_64] #200 chromium-35.0.1916.114-alt1.src.rpm: build FAILED
2014-May-21 10:38:06 :: [i586] #200 chromium-35.0.1916.114-alt1.src.rpm: build FAILED
$ gtl 120100@200



1. Разворачиваем среду
Для получения сборочной среды с развёрнутым исходным кодом и уже наложенными патчами у нас есть два пути:
1. Запустить подготовительный этап прямо на хост-системе: rpm -bp  chromium.spec
Это было бы удобно, так как можно сразу по-живому править патчи, так как они тут же и используются. Но есть и крупный недостаток: придётся устанавливать уйму -devel пакетов, да и к тому же на хост-системе у меня p7, а собираем мы под Sisyphus.
2. Использовать Hasher (изолированную среду сборки). У неё тоже есть недостаток, так как для разворачивания она требует доступ к полному репозиторию. Хорошо, если есть локальное зеркало. А вот по сети тянуть будет тягомотно. Инструкцию по подготовке хэшерницы можно найти на http://www.altlinux.org/Сборка_пакета_с_нуля. Да и копировать исправленные патчи их хэшерницы — дополнительная операция.

Подразумевается, что репозиторий указан. У меня:
$ grep SourceList ~/.hasher/apt.conf
Dir::Etc::SourceList /home/cas/.hasher/apt.list;
$ cat ~/.hasher/apt.list
rpm file:/space/ALT/Sisyphus/ x86_64 classic
rpm file:/space/ALT/Sisyphus/ noarch classic


Так как нам потребуется для сборки ещё и пакеты libv8-3.25 и libv8-3.25-devel, инициализируем пустую хэшерницу командой hsh $TMPDIR --initroot возьмём их из задания 120100 (столбец Build results → x86_64 для подзадания v8, затем подкаталог rpms) с http://git.altlinux.org/tasks/120100/build/100/x86_64/rpms/

Запустим сборку:
$ hsh -v $TMPDIR http://git.altlinux.org/tasks/120100/build/100/x86_64/rpms/


После ожидаемого вылета сборки (как и на git.alt), ставим для удобства vim-console (по умолчанию в базовой системе хэшерницы доступен только обычный «олскульный» vi без подсветки) и заходим в хэшерницу:
$ hsh-install vim-console
$ hsh-shell

2. Правим патч
Конечно, при использовании сборки из Git было бы проще, но правка патча показательна для понимания кухни сборки.

$ cd ~/RPM/BUILD/chromium/src

Подсказка: воспользуйтесь клавишей Tab для автодополнения пути. Заметьте, патч накладывался на подкаталог src, поэтому мы туда сразу и перейдём.

Хитрый patch при невозможности наложения создаёт копию оригинального файла и файла с неложившимися фрагментами (hunks) патча. Просмотрим, что не наложилось:
$ cat third_party/icu/icu.gyp.rej

И прямо в vim src/third_party/icu/icu.gyp применим фрагмент. Полученные изменения добавим к патчу:
$ diff -u third_party/icu/icu.gyp{.orig,} >> ~/RPM/SOURCES/chromium-fix-arm-icu.patch

Примечание:
Обратите внимание на конструкцию имя_файла{.orig,} — это способ в Bash прописать два или более файла, различающимися небольшой частью. Очень удобно при переименовании и копировании.

Теперь запускаем vim ~/RPM/SOURCES/chromium-fix-arm-icu.patch и удаляем первый фрагмент, который у нас не наложился.

3. Проверка наложения патчей
Проверяем с нуля распаковку исходного кода и наложение патчей:
$ rpm -bp ~/RPM/SPECS/chromium.spec

Объяснение: параметр -bp в команде rpm производит действия, указанные в секции %prep спека: распаковывает исходный код, накладывает патчи. Так как каталог сборки каждый раз очищается, запускать эту команду можно сколько угодно раз.

При возникновении проблем (ищите по строке, содержащей «hunk FAILED») возвращаемся к п.2 и действуем аналогично. Например, патч chromium-gn-r0.patch  оказался не нужен вовсе (уже приложен), удаляем его. При необходимости дополняем пути к файлам необходимым количеством вышестоящих каталогов, которые будут проинорированы при наложении патча. Например, для chromium-nspr.patch нужно в пути к файлам добавить a/chromium/ (к примеру, буквы можно взять произвольно) или убрать у нормально накладывающихся фрагментов и уменьшить параметр -p у %patch<номер>.

Успешная распаковка заканчивается строкой
+ exit 0

4. Пересобираем src.rpm
Выходим из хэшерницы (команда exit или Ctl+d, кому что нравится) и берём исправленные патчи и спек. Так как они chroot хэшерницы лежит в $TMPDIR/chroot, а домашний каталог сборщика — в /usr/src, строка синхронизации будет выглядеть так:

$ rsync -vaP --exclude '*~' $TMPDIR/chroot/usr/src/RPM/{SPECS,SOURCES}/* .

То есть берём исправленные спек и патчи из двух подкаталогов хэшерницы, но не берём файлы резервных копий, появившихся в результате редактирования патчей и спека в vim. Удаляем ненужный патч вручную (не хотел я запускать rsync --delete, чтобы он не поудалял у меня .git). Получившиеся изменения в git: http://git.altlinux.org/people/cas/packages/chromium.git?p=chromium.git;a=commitdiff;h=b07692e701e6b54b391175f56446332f1a8025ca

Далее собираем src.rpm, подписываем его и отправляем на git.alt (как описано в первой части).

5. Вносим изменения в задание
Удаляем несобираемое подзадание. Номер в восьмеричной (!) системе счисления после # показывается и на странице задания и в логах. Восьмеричная система удобна тем, что при вставки подзадания позволяет быстро поделить на два и остаться целым числом.
$ ssh git.alt task delsub 120100 200

Вставляем сборку srpm перед подзаданием 200 (можно и 300, участвуют как существующие, так и удалённые номера, которые не очищаются):
$ ssh git.alt task add 120100 200 srpm chromium-35.0.1916.114-alt1.src.rpm

И снова запускаем задание на сборку в режиме тестирования:
$ ssh git.alt task run --test-only 120100

  • 1
Что-то давно не пишете. С днем Рождения !

  • 1
?

Log in