Pull to refresh

OpenSource в действии

Reading time3 min
Views467
Очень часто в сети можно встретить пространные рассуждения о несомненной пользе открытого программного обеспечения, о мотивации программистов, участвующих в подобных проектах и так далее. Кроме того, особенно отмечается тот факт, что любой пользователь подобного ПО при наличии определенных технических навыков сможет «заточить» все это добро под себя. Дескать, не зря же исходный код-то открыт.

Однако лично я знаю очень мало людей (если быть честным, всего двух), которые хотя бы в малой мере пользовались преимуществами открытого исходного кода используемых ими программ. Основные аргументы: я не знаю, где этот самый код брать; я не знаю, как это все потом собирать; я боюсь сделать из своего дистрибутива помойку, собирая собственные модули.

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

Для иллюстрации всех приемов и механизмов я поставил перед собой довольно просто осуществимую, но не имеющую никакой практической ценности цель: у меня есть часто используемая утилита wget и я кровь из носа, как хочу, чтобы она со мной здоровалась при каждом запуске. Вот хочу и все тут. К этому и будем стремиться.


Поскольку все описанные далее манипуляции я выполнял на своем домашнем дистрибутиве (Fedora), то и рассматривать мы будем утилиты и команды, относящиеся к этой конкретной сборке. В других системах будут отличия (deb вместо rpm, aptitude вместо yum), но нас в большей части интересует методология, а не детали.

Для работы нам понадобятся установленные пакеты yum-utils и rpm-build.

Итак, для начала нам нужно определиться, к какому пакету относится наш исполняемый файл:

[root@phantomazz ~]$ rpm –qf `which wget`
wget-1.11.4-3.fc11.x86_64


Ага, наш пакет так и называется – “wget”. Теперь нам нужны его исходные коды. Помимо бинарных пакетов, в репозиториях хранятся обычно и пакеты с исходниками, поэтому нам не нужно ничего нигде искать. Достаточно воспользоваться встроенными средствами:

[root@phantomazz ~]$ yumdownloader --source wget


После выполнения этой команды в текущей директории появится rpm-пакет, содержащий интересующие нас исходные коды актуальной нам версии. Его необходимо установить:

[root@phantomazz ~]$ rpm –ivh wget-1.11.4-3.fc11.src.rpm


Все дальнейшие действия будут происходить в папке ‘/root/rpmbuild’, которая автоматом будет создана при установке пакета с исходными кодами. Именно там, в подпапке ‘SOURCES’ мы найдем непосредственно архив с исходными кодами ‘wget-1.11.4.tar.bz2’. Дальше дело техники: распаковать архив, найти файл ‘main.c’, в функции main сделать интересующие нас изменения (добавить вожделенный printf), и, внимание, запаковать все обратно в архив с таким же именем. Мы не будем собирать отдельный модуль – нас интересует пакет целиком, потому что это правильно. Никаких 'make && make install', после которых концы не найдешь, только пакеты, тем более что вся инфраструктура, необходимая для этого, уже подготовлена. Дело за малым – перейти в каталог ‘/root/rpmbuild/SPECS’ и выполнить:

[root@phantomazz ~]$ rpmbuild -bb wget.spec


Утилита rpmbuild сама выполнит сборку бинарных модулей и упакует все в единый пакет. Она действует в соответствии со .spec файлом, так что и на этом этапе есть возможность внести свои изменения: добавить или удалить какие-либо файлы из пакета, модифицировать установочные скрипты и так далее. Механизм обладает определенной гибкостью.

Итого на выходе в папке ‘/root/rpmbuild/RPMS’ мы получим пакет, готовый либо к немедленной установке в нашей системе, либо к дальнейшему распространению его среди подобных нам обладателей мании величия, которые любят, чтобы их утилиты с ними здоровались.

Как продолжение темы, возможно написание патча (кстати, примеры патчей можно посмотреть в каталоге с исходными кодами), автоматизирующего сборку пакета с нужным нам функционалом в будущих версиях, а возможен и запрет дальнейшего обновления этого пакета вообще, если он нас устраивает. Дело хозяйское.
Tags:
Hubs:
Total votes 13: ↑10 and ↓3+7
Comments11

Articles