Chromium - сборка и модификация

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 14939
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Chromium - сборка и модификация

Непрочитанное сообщение Olej » 03 сен 2015, 12:18

Вот такую задачу мне предложили сделать: исходный код Chromium собрать и модифицировать (для некоторых специальных применений).
Если бы не некоторые особенности (неприятности) проекта Chromium, то и не создавал бы здесь темы ... а поскольку стоит задача ещё и модификации кода, то относим тему к разделу "Программирование". И фиксируем здесь все странности сборки Chromium ... может ещё пригодится.

P.S. Задачка на тему: сделай свой браузер :lol: ... а то их мало наделали :-o

Аватара пользователя
Olej
Писатель
Сообщения: 14939
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Chromium - сборка и модификация

Непрочитанное сообщение Olej » 03 сен 2015, 12:44

Olej писал(а):фиксируем здесь все странности сборки Chromium
Неприятность сборки Chromium выражается в том, что они замахнулись сборку под чем угодно: Windows, Linux, MacOS ... мобильной версии iOS (from Mac) and Android (from Linux).
Как всегда: платой за универсализм является а). громоздкость и б). не тщательность выверки каждого варианта ... тем более, что в данном случае основное внимание уделено Windows, а остальные кое-как...
Но (примечание для любителей собирать из исходников), что чем дальше, тем чаще такая ситуация будет повторяться для разных пакетов ... особенно с появлением мобильных версий.

Сборка Chromium описана здесь: Get the Code: Checkout, Build, Run & Submit.
There are two main components to your build environment:
1. depot_tools - this is our bootstrapped collection of utils that will help you checkout, compile, run and submit changes to the code
2. src - a git repo; your local git copy of the chromium code. This will need to be updated regularly as other users submit changes.
Получение depot_tools описано здесь: depot_tools_tutorial(7) Manual Page.

Код: Выделить всё

olej@nvidia ~/Chromium $ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
Cloning into 'depot_tools'...
remote: Sending approximately 16.84 MiB ...
remote: Total 13003 (delta 8182), reused 13003 (delta 8182)
Receiving objects: 100% (13003/13003), 16.84 MiB | 1.15 MiB/s, done.
Resolving deltas: 100% (8184/8184), done.
Checking connectivity... готово.

olej@nvidia ~/Chromium/depot_tools $ pwd
/home/olej/Chromium/depot_tools

olej@nvidia ~/Chromium/depot_tools $ du -hs
31M     .
Прописываем этот путь в $HOME/.bashrc

Код: Выделить всё

olej@nvidia ~ $ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/olej/Chromium/depot_tools
И получаем в своё распоряжение команду fetch (может и ряд других), которыми они (Chromium) делают все свои обновления из репозитария и т.д.

Код: Выделить всё

olej@nvidia ~/2015_WORK/in.WORK $ fetch
Error: Must specify a recipe.
usage: fetch.py [options] <recipe> [--property=value [--property2=value2 ...]]

This script can be used to download the Chromium sources. See
http://www.chromium.org/developers/how-tos/get-the-code
for full usage instructions.

Valid options:
   -h, --help, help   Print this message.
   --nohooks          Don't run hooks after checkout.
   -n, --dry-run      Don't run commands, only print them.
   --no-history       Perform shallow clones, don't fetch the full git history.

Valid fetch recipes:
  depot_tools
  nacl
  chromium
  webrtc_ios
  v8
  recipe_util
  pdfium
  dartium
  skia
  blink
  webrtc_android
  infra_internal
  webrtc
  breakpad
  android
  dart
  naclports
  mojo
  skia_buildbot
  gyp
  infra
  ios

Аватара пользователя
Olej
Писатель
Сообщения: 14939
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Chromium - сборка и модификация

Непрочитанное сообщение Olej » 03 сен 2015, 15:35

Olej писал(а): И получаем в своё распоряжение команду fetch (может и ряд других), которыми они (Chromium) делают все свои обновления из репозитария и т.д.
Далее получаем исходники Chromium:

Код: Выделить всё

olej@nvidia ~/Chromium $ pwd
/home/olej/Chromium
olej@nvidia ~/Chromium $ mkdir ~/chromium && cd $_
olej@nvidia ~/chromium $ pwd
/home/olej/chromium

Код: Выделить всё

olej@nvidia ~/chromium $ fetch --nohooks --no-history chromium
Running: gclient root
Running: gclient config --spec 'solutions = [
  {
    "managed": False,
    "name": "src",
    "url": "https://chromium.googlesource.com/chromium/src.git",
    "custom_deps": {},
    "deps_file": ".DEPS.git",
    "safesync_url": "",
  },
]
'
Running: gclient sync --nohooks --no-history
Running: git submodule foreach 'git config -f $toplevel/.git/config submodule.$name.ignore all'
Running: git config --add remote.origin.fetch '+refs/tags/*:refs/tags/*'
Running: git config diff.ignoreSubmodules all
Это дело длинное, потому как здесь он скачивает GIT-репозитарий ... который даже в самом экономном режиме (--no-history) составляет:

Код: Выделить всё

olej@nvidia ~/chromium $ du -hs
6,5G    .
Даже на быстром канале это займёт минут 20-30 (потому как скачивается очень много коротких файлов).

P.S. Здесь у них можно скачать 2 цели:
You can fetch one of two targets: chromium or blink. Either choice will clone both the Chromium and Blink repos, but there's a small difference.
- fetch chromium will use the Blink version that's rolled into Chromium via DEPS (usually a few hours old). This choice is easier if working only on Chromium.
- fetch blink will always retrieve the latest Blink (ToT) version, and is useful if working on Blink.
Соответственно:

Код: Выделить всё

olej@nvidia ~/chromium $ fetch --nohooks --no-history chromium
...
и

Код: Выделить всё

olej@nvidia ~/chromium $ fetch --nohooks --no-history blink
...
Чем они отличаются я (пока) не заморачивался.
Если возникнет необходимость - выясню и отпишу сюда в тему.
А может кто знает?

Аватара пользователя
Olej
Писатель
Сообщения: 14939
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Chromium - сборка и модификация

Непрочитанное сообщение Olej » 03 сен 2015, 16:04

Olej писал(а): Далее получаем исходники Chromium:
Я не понимаю и ничего не могу сказать о том, зачем они выбрали такой путь "через задницу" для простой работы с GIT-репозитарием:

- сделали утилиту (скрипт) fetch ...

- который вызывает ими же сделанный скрипт:

Код: Выделить всё

olej@nvidia ~ $ gclient --help
Usage: gclient.py <command> [options]

Meta checkout manager supporting both Subversion and GIT.

Commands are:
  cleanup  cleans up all working copies
  config   creates a .gclient file in the current directory
  diff     displays local diff for every dependencies
  fetch    fetches upstream commits for all modules
  grep     greps through git repos managed by gclient
  help     prints list of commands or help for a specific command
  hookinfo outputs the hooks that would be run by `gclient runhooks`
  pack     generates a patch which can be applied at the root of the tree
  recurse  operates [command args ...] on all the dependencies
  revert   reverts all modifications in every dependencies
  revinfo  outputs revision info mapping for the client and its dependencies
  root     outputs the solution root (or current dir if there isn't one)
  runhooks runs hooks for files that have been modified in the local working copy
  status   shows modification status for every dependencies
  sync     checkout/update all modules
  verify   verifies the DEPS file deps are only from allowed_hosts

Options:
  --version             show program's version number and exit
  -h, --help            show this help message and exit
  -j JOBS, --jobs=JOBS  Specify how many SCM commands can run in parallel;
                        defaults to 8 on this machine
  -v, --verbose         Produces additional output for diagnostics. Can be
                        used up to three times for more logging info.
  --gclientfile=CONFIG_FILENAME
                        Specify an alternate .gclient file
  --spec=SPEC           create a gclient file containing the provided string.
                        Due to Cygwin/Python brokenness, it can't contain any
                        newlines.
  --no-nag-max          Ignored for backwards compatibility.
- и целый вагон саморобных GIT-утилит, которые, подозреваю, и составляют depot_tools, и ничего более там нет :

Код: Выделить всё

olej@nvidia ~/Chromium/depot_tools $ pwd
/home/olej/Chromium/depot_tools

olej@nvidia ~/Chromium/depot_tools $ ls git*
git-auto-svn               git-cl-upload-hook  git_freezer.py       git_mark_merge_base.py  git-rebase-update       git-runhooks
git_auto_svn.py            git_common.py       git-gs               git-nav-downstream      git_rebase_update.py    git-squash-branch
git-cache                  git-crrev-parse     git-lkgr             git_nav_downstream.py   git-rename-branch       git_squash_branch.py
git_cache.py               git-crsync          git-map              git-nav-upstream        git_rename_branch.py    git-thaw
git-cherry-pick-upload     git-crup            git-map-branches     git-new-branch          git-reparent-branch     git-try
git_cherry_pick_upload.py  git-footers         git_map_branches.py  git_new_branch.py       git_reparent_branch.py  git_try.py
git-cl                     git_footers.py      git_map.py           git-number              git-retry               git-upstream-diff
git_cl.py                  git-freeze          git-mark-merge-base  git_number.py           git_retry.py            git_upstream_diff.py

git-templates:
description  hooks  info

git_utils:
git-tree-prune
Возможно, это, опять таки, связано с замахом на множество платформ, где не всегда есть все утилиты GIT, и желание собирать единообразно...
Или желание позашивать URL-ссылки внутрь скриптов, чтобы их не набирать...

Аватара пользователя
Olej
Писатель
Сообщения: 14939
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Chromium - сборка и модификация

Непрочитанное сообщение Olej » 03 сен 2015, 16:13

Olej писал(а): Далее получаем исходники Chromium:
Далее переходим в подкаталог ./src полученного исходника (о чем в инструкции не сказано)...

Код: Выделить всё

olej@nvidia ~/chromium/src $ pwd
/home/olej/chromium/src
Тут они предлагают проверить зависимости и установить если чего не хватает. И тут нас ожидает 1-й сюрприз:

Код: Выделить всё

olej@nvidia ~/chromium/src $ ./build/install-build-deps.sh
ERROR: Only Ubuntu 12.04 (precise), 14.04 (trusty),  14.10 (utopic) and 15.04 (vivid) are currently supported
:-o

Аватара пользователя
Olej
Писатель
Сообщения: 14939
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Chromium - сборка и модификация

Непрочитанное сообщение Olej » 03 сен 2015, 16:38

Olej писал(а): И тут нас ожидает 1-й сюрприз:
Mint 17.1, для которого пакетной базой является Ubuntu 14.04 - им не подходит!
Хотя в инструкции они расписывают:
If you're on Linux:
Интересно, что должны думать ... пользователи RedHat :shock: ... Gentoo :shock:

Т.е., они абсолютно отождествялют Linux с Ubuntu !
Нет, ребята, с такими подходами ... в жопу. :oops:

Очень странен уровень сборщиков исходников Chromium, когда они зашивают в скрипты конкретный дистрибутив и даже версии!!! :-o

Аватара пользователя
Olej
Писатель
Сообщения: 14939
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Chromium - сборка и модификация

Непрочитанное сообщение Olej » 03 сен 2015, 17:18

Olej писал(а): Далее переходим в подкаталог ./src полученного исходника (о чем в инструкции не сказано)...
Нахожу ./build/install-build-deps.sh и тупо правлю (некогда мне разбираться), стр.77:

Код: Выделить всё

ubuntu_codenames="(precise|trusty|utopic|vivid|rebecca)"

Код: Выделить всё

olej@nvidia ~/chromium/src $ ./build/install-build-deps.sh
Running as non-root user.
You might have to enter your password one or more times for 'sudo'.

This script installs all tools and libraries needed to build Chromium.
...
Что-то оно к концу несколько кочевряжится:

Код: Выделить всё

...
It produces the following output:
Чтение списков пакетов… Готово
Построение дерева зависимостей
Чтение информации о состоянии… Готово
E: Не удалось найти пакет lib32ncurses5-dev
E: Не удалось найти пакет lib32z1-dev
E: Не удалось найти пакет libstdc++6-4.9-dbg
E: Не удалось найти пакет по регулярному выражению «libstdc++6-4.9-dbg»

You will have to install the above packages yourself.
Они что, с точностью до версии пакеты указывают?
Или просто мозгами двинулись ...

Аватара пользователя
Olej
Писатель
Сообщения: 14939
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Chromium - сборка и модификация

Непрочитанное сообщение Olej » 04 сен 2015, 22:59

Следующий шаг оригинальной инструкции:
Run post-sync hooks
Finally, runhooks to run any post-sync scripts

Код: Выделить всё

$ gclient runhooks
По идее, это настройка инсталляции на окружение, то что в autoconf делается ./configure ...
Все пакеты установлены, и делаем привязку к ним...

Код: Выделить всё

olej@nvidia ~/chromium/src $ gclient runhooks

________ running '/usr/bin/python src/build/landmines.py' in '/home/olej/chromium'

________ running '/usr/bin/python src/build/download_nacl_toolchains.py --mode nacl_core_sdk sync --extract' in '/home/olej/chromium'
INFO: --Syncing arm_trusted to revision 9f62c3ead52424e10ebd520213a8f36e02b84377--
...
________ running '/usr/bin/python src/build/gyp_chromium' in '/home/olej/chromium'
Updating projects from gyp files...
/bin/sh: 1: cups-config: not found
gyp: Call to 'cups-config --api-version' returned exit status 127 while in /home/olej/chromium/src/printing/printing.gyp.
Package libpulse was not found in the pkg-config search path.
Perhaps you should add the directory containing `libpulse.pc'
to the PKG_CONFIG_PATH environment variable
No package 'libpulse' found
gyp: Call to 'pkg-config --cflags libpulse' returned exit status 1 while in /home/olej/chromium/src/media/media.gyp.
Package xtst was not found in the pkg-config search path.
Perhaps you should add the directory containing `xtst.pc'
to the PKG_CONFIG_PATH environment variable
No package 'xtst' found
gyp: Call to 'pkg-config --cflags xtst' returned exit status 1 while in /home/olej/chromium/src/build/linux/system.gyp.
Error: Command '/usr/bin/python src/build/gyp_chromium' returned non-zero exit status 1 in /home/olej/chromium
Hook '/usr/bin/python src/build/gyp_chromium' took 32.27 secs
Это 2-й сюрприз (облом), как понятно, не все, а именно -dev версии пакетов в системе (моей) установлены. Зачем тогда были предыдущие проверки?
Как бы там ни было, понятно из сообщений, что не установлены 3 пакета ... с ними легко разобраться:

Код: Выделить всё

olej@nvidia ~/VirtualBox VMs $ apt-file search cups-config
cups-server-common: /usr/share/cups/doc-root/help/man-cups-config.html
fvwm-crystal: /usr/share/fvwm-crystal/fvwm/Applications/Settings/Printing/~cups-config~Cups-Config
libcups2-dev: /usr/bin/cups-config
libcups2-dev: /usr/share/man/man1/cups-config.1.gz

olej@nvidia ~/VirtualBox VMs $ apt install libcups2-dev
...
Processing triggers for libc-bin (2.19-0ubuntu6.6) ...

olej@nvidia ~/VirtualBox VMs $ cups-config --api-version
1.6

Код: Выделить всё

olej@nvidia ~/VirtualBox VMs $ apt search libpulse
p   libpulse-dev                    - PulseAudio client development headers and
i   libpulse-mainloop-glib0         - PulseAudio client libraries (glib support)
p   libpulse-mainloop-glib0-dbg     - PulseAudio client libraries (glib support)
p   libpulse-ocaml                  - OCaml interface to the PulseAudio sound se
v   libpulse-ocaml-23zn2            -
p   libpulse-ocaml-dev              - OCaml interface to the pulseaudio library
v   libpulse-ocaml-dev-23zn2        -
i   libpulse0                       - PulseAudio client libraries
p   libpulse0-dbg                   - PulseAudio client libraries (debugging sym
i   libpulsedsp                     - PulseAudio OSS pre-load library
p   libpulsedsp-dbg                 - PulseAudio OSS pre-load library (debugging

olej@nvidia ~/VirtualBox VMs $ apt install  libpulse-dev
...
Настраивается пакет libpulse-dev:i386 (1:4.0-0ubuntu11.1) …

olej@nvidia ~/Chromium $ pkg-config --cflags libpulse
-D_REENTRANT

Код: Выделить всё

olej@nvidia ~/VirtualBox VMs $ apt search xtst
p   libxtst-dev                     - X11 Record extension library (development
p   libxtst-doc                     - X11 Record extension library (documentatio
i   libxtst6                        - X11 Testing -- Record extension library
p   libxtst6-dbg                    - X11 Record extension library (debug packag

olej@nvidia ~/VirtualBox VMs $ apt install libxtst-dev
...
Настраивается пакет libxtst-dev:i386 (2:1.2.2-1) …

olej@nvidia ~/VirtualBox VMs $ pkg-config --cflags xtst
Для поиска нужных пакетов приходится проявлять определённую изобретательность...

Аватара пользователя
Olej
Писатель
Сообщения: 14939
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Chromium - сборка и модификация

Непрочитанное сообщение Olej » 04 сен 2015, 23:11

Olej писал(а):Для поиск нужных пакетов приходится проявлять определённую изобретательность...
Таким же путём последовательных приближений, выясняем по 2-3 недостающих пакета при очередном запуске:

Код: Выделить всё

olej@nvidia ~/chromium/src $ gclient runhooks
...
В конечном итоге приходится доставлять:

Код: Выделить всё

olej@nvidia ~/VirtualBox VMs $ apt search libpci
p   libpci-dev                      - Linux PCI Utilities (development files)
v   libpci2                         -
i   libpci3                         - утилиты для работы с PCI (динамически загр
p   libpciaccess-dev                - Generic PCI access library for X - develop
i   libpciaccess0                   - Generic PCI access library for X

olej@nvidia ~/VirtualBox VMs $ apt install libpci-dev
...

olej@nvidia ~/VirtualBox VMs $ pkg-config --libs-only-l libpci
-lpci

Код: Выделить всё

olej@nvidia ~/VirtualBox VMs $ apt search libexif
p   libexif-dev                     - библиотека для получения метаданных EXIF и
p   libexif-gtk-dev                 - Library providing GTK+ widgets to display/
p   libexif-gtk5                    - Library providing GTK+ widgets to display/
i   libexif12                       - библиотека для получения метаданных EXIF и

olej@nvidia ~/VirtualBox VMs $ apt install libexif-dev
...

olej@nvidia ~/VirtualBox VMs $ pkg-config --cflags libexif
-I/usr/include/libexif

Код: Выделить всё

olej@nvidia ~/VirtualBox VMs $ apt-file search gconf-2.0.pc
libgconf2-dev: /usr/lib/i386-linux-gnu/pkgconfig/gconf-2.0.pc

olej@nvidia ~/VirtualBox VMs $ apt install libgconf2-dev
...

olej@nvidia ~/VirtualBox VMs $ pkg-config --cflags gconf-2.0
-pthread -I/usr/include/gconf/2 -I/usr/include/dbus-1.0 -I/usr/lib/i386-linux-gnu/dbus-1.0/include -I/usr/include/glib-2.0 -I/usr/lib/i386-linux-gnu/glib-2.0/include

Код: Выделить всё

olej@nvidia ~/VirtualBox VMs $ apt-file search gnome-keyring-1
libgnome-keyring-dev: /usr/include/gnome-keyring-1/gnome-keyring-memory.h
libgnome-keyring-dev: /usr/include/gnome-keyring-1/gnome-keyring-result.h
libgnome-keyring-dev: /usr/include/gnome-keyring-1/gnome-keyring.h
libgnome-keyring-dev: /usr/lib/i386-linux-gnu/pkgconfig/gnome-keyring-1.pc
libgnome-keyring-dev: /usr/share/vala/vapi/gnome-keyring-1.vapi
valac-0.14: /usr/share/vala-0.14/vapi/gnome-keyring-1.vapi
valac-0.16-vapi: /usr/share/vala-0.16/vapi/gnome-keyring-1.vapi
valac-0.18-vapi: /usr/share/vala-0.18/vapi/gnome-keyring-1.vapi
valac-0.20-vapi: /usr/share/vala-0.20/vapi/gnome-keyring-1.vapi
valac-0.22-vapi: /usr/share/vala-0.22/vapi/gnome-keyring-1.vapi

olej@nvidia ~/VirtualBox VMs $ apt install libgnome-keyring-dev
...

olej@nvidia ~/VirtualBox VMs $ pkg-config --cflags gnome-keyring-1
-I/usr/include/gnome-keyring-1 -I/usr/include/glib-2.0 -I/usr/lib/i386-linux-gnu/glib-2.0/include

Код: Выделить всё

olej@nvidia ~/VirtualBox VMs $ apt-file search nss.pc
libnss3-dev: /usr/lib/i386-linux-gnu/pkgconfig/nss.pc
libnss3-dev: /usr/lib/i386-linux-gnu/pkgconfig/xulrunner-nss.pc
libpathfinder-dev: /usr/include/pathfinder-1/pathfinder-nss.pc
libxmlsec1-dev: /usr/lib/pkgconfig/xmlsec1-nss.pc

olej@nvidia ~/VirtualBox VMs $ apt install libnss3-dev
...

olej@nvidia ~/VirtualBox VMs $ pkg-config --cflags nss
-I/usr/include/nss -I/usr/include/nspr
Так что поуродоваться с установкой дополнительных пакетов придётся...
Удивляют меня в этом разработчики Chromium.

И наконец:

Код: Выделить всё

olej@nvidia ~/chromium/src $ gclient runhooks
...
Updating projects from gyp files...
Hook '/usr/bin/python src/build/gyp_chromium' took 82.48 secs

________ running '/usr/bin/python src/tools/check_git_config.py --running-as-hook' in '/home/olej/chromium'

Аватара пользователя
Olej
Писатель
Сообщения: 14939
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Chromium - сборка и модификация

Непрочитанное сообщение Olej » 04 сен 2015, 23:16

Движемся дальше по инструкции:
Building Chromium
If you've checked out the code, you should see the following files and folders in the directory where you ran fetch:

.gclient This file (generated by fetch) defines the configuration of your checkout. It contains the location of the repository, as well as some other useful configuration
.gclient_entries This file (also generated by fetch) contains the repository and version information for each of Chromium's sub-repositories (dependencies)

Код: Выделить всё

olej@nvidia ~/chromium $ pwd
/home/olej/chromium

olej@nvidia ~/chromium $ ls -l .gc*
-rw-r--r-- 1 olej olej   208 сент.  3 10:59 .gclient
-rw-r--r-- 1 olej olej 10524 сент.  3 11:33 .gclient_entries
src/ Contains the Chromium codebase (an explanation of the directory structure)

out/ Contains the generated output from builds
Debug/ One of the default build folders; builds the debug build
Release/ One of the default build folders; builds the release build

Код: Выделить всё

olej@nvidia ~/chromium $ ls -l src/out
итого 12
drwxr-xr-x  3 olej olej 4096 сент.  3 19:37 Debug
drwxr-xr-x 20 olej olej 4096 сент.  3 19:37 gypfiles
drwxr-xr-x  3 olej olej 4096 сент.  3 19:37 Release

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя