[ previous ] [ Copyright Notice ] [ Contents ] [ next ]

Ръководство на новите отговорници по поддръжка на Debian
Chapter 3 Променяне на изходния код


Обикновенно, програмите се инсталират в /usr/local поддиректориите. Но Debian пакетите не трябва да използват тази директория тъй като тя е запазена за системно-администратоски (или потребителски) цели. Това означава че трябва да хвърлите едно око на системата за компилиране и инсталиране на програмата като обикновенно трябва да започнете с Makefile. Това е скрипта който make(1) ще използва за автоматичното изграждане на тази програма. За повече информация относно Makefile-овете, погледнете в файлът `rules', Section 4.4.

Забележете, че ако вашата програма използва GNU automake(1) и/или autoconf(1), тоест изходния код включва съответно Makefile.am и/или Makefile.in файлове ще трябва да направите промените в тях, защото всако извикване на automake ще презапише файловете Makefile.in с информация генерирана от Makefile.am, и всяко извикване на ./configure ще направи същото с Makefile-овете с данните от Makefile.in. Редактирането на Makefile.am файлове изисква известни познания относно automake за което може да прочетете тук: info automake, докато редактирането на Makefile.in файлове е почти същото като редактирането на Makefile-ове, само трябва да внимавате с променливите, тоест всеки низ заграден с `@', за пример @CFLAGS@ или @LN_S@, които се заменят с изстинските стойности при всяко извикване на ./configure.

Трябва да се отбележи че не можем да отделим място за всички детайли но ето няколко често срещани проблеми.


3.1 Инсталиране в поддиректория

Повечето програми използват определен начин за да се инсталират в съществуващата структура на вашата система, така че файловете да бъдат включени във вашия $PATH и да може да намерите документацията и man страниците на обичайните места. Трябва да се уверите че това се прави коректно, но ще трябва да ги накарате да се инсталират във временна поддиректория която ще бъде създадена във вашата debian/ директория, която обикновенно е именувана debian/tmp от която инструментите за поддръжка ще изградят работещ .deb пакет. Всичко което съдържа тази директория ще бъде инсталирано на потребителската система когато потребителят инсталира вашия пакет, единствената разлика е че dpkg ще инсталира файловете в главната директория (`/').

Основното нещо е да накарате програмата да се инсталира в debian/tmp но да се държи правилно когато се инсталира в основната директория, тоест когато се инсталира от .deb пакет. Когато работите с програма която ползва GNU autoconf, това е лесно защото dh_make се справя автоматично с тази задача, така че който ще пакетира такава програма може да пропусне следващата секция. Но за други програми които не ползват autoconf най-вероятно ще ви се наложи да разгледате и редактирате Makefile-овете.

Ето съответната част от Makefile-а на gentoo:

       # Where to put binary on 'make install'?
       BIN     = /usr/local/bin
       # Where to put icons on 'make install'? Note: if you change this,
       # gentoo will not find the icons as it starts up. You're going to
       # have to alter gentoo's icon path (in the config window, "Paths"
       # tab) to get it work.
       ICONS   = /usr/local/lib/gentoo/

Преди това ще трябва да добавим тези два нови реда:

       # Edited for Debian GNU/Linux.
       DESTDIR =

защото процеса на изграждане ги изисква (ще бъде обяснено по-късно в файлът `rules', Section 4.4).

След това в Makefile-а се вижда местонахождението на бинарния файл при инсталиране. Променете го на това:

       # Where to put binary on 'make install'?
       BIN     = $(DESTDIR)/usr/X11R6/bin

Но защо точно в тази директория а не в някоя друга? Защото за Debian са дефинирани няколко правила за това къде програмите трябва да бъдат инсталирани. Това е описано в Стандарт за Файлова Йерархия (виж /usr/share/doc/debian-policy/fhs/). Така че ние ще трябва да инсталираме бинарния файл в /usr/X11R6/bin вместо в /usr/local/bin, и man страницата (не съществува, но почти всяка програма има поне една, така че ще направим една по-късно) в /usr/share/man/man1 вместо в /usr/local/man/man1.

След това следва малко по-сложна ситуация. Ако промените реда на:

       ICONS   = $(DESTDIR)/usr/share/gentoo/

което е в съответствие с установените норми, ще трябва да редактирате и C изходния код. Но каде и какво да търсим? Може да разберете като напишете:

       grep -n usr/local/lib *.[ch]

(във всяка поддиректория която съдържа *.c и *.h файлове). Grep ще ви покаже името на файла и на кой ред е, когато намери съвпадение. Редактирайте тези редове и заместете usr/local/lib с usr/share - и това е всичко. Просто заместете usr/local/lib с вашият път и гледайте да не разбутате останалия код ако не разбирате от програмиране на C. :-)

След това трябва да намерите обекта install (търсете за ред започващ с `install:') и преименувайте всички указатели към директории различни от дефинираните в началото на Makefile-а. Обекта install: на gentoo изглежда така:

       # ----------------------------------------- Installation
       # You're going to have to be root to do this!
       install:        gentoo
     		  install ./gentoo $(BIN)
     		  install icons $(ICONS)
     		  install gentoorc-example $(HOME)/.gentoorc

След нашите промени изглежда така:

       # ----------------------------------------- Installation
       # You're going to have to be root to do this!
       install:        gentoo-target
                       install -d $(BIN) $(ICONS) $(DESTDIR)/etc
                       install ./gentoo $(BIN)
                       install -m644 icons/* $(ICONS)
                       install -m644 gentoorc-example $(DESTDIR)/etc/gentoorc
                       install -d $(DESTDIR)/usr/share/doc/gentoo/html
                       cp -a docs/* $(DESTDIR)/usr/share/doc/gentoo/html

Внимателния читател ще забележи че аз промених `gentoo' на`gentoo-target' на реда `install:'. На това му се вика отстраняване на грешки :-)

Когато и да направите промени по кода които не се отнасят за Debian пакета, изпратете ги до автора на програмата за да могат да бъдат включени в следващата версия. Забележете че няма нужда да изпращате debian/* файловете но всяка друга кръпка е добре да я изпратите. И се опитайте да направите кръпката не отнасяща се само за Debian или Linux (или дори Unix!) преди да ги изпратите.


3.2 Различия в библиотеките

Има и още един основен проблем: библиотеките често се различават от платформа до платформа. За пример Makefile-а може да съдържа обръщение към библиотека която не съществува в Debian или дори в Linux. В този случай нужно е да промени обръщението към някоя библиотека която съществува в Debian и изпълнява същите функции. Най-добрия начин е да коментирате тези редове защото може някой друг да се опита да компилира програмата на различна платформа, така че да има нещо което да му подскаже къде може да е проблема.

Значи, ако има в Makefile-а на вашата програма ред който изглежда горе-долу така (и програмата не иска да се компилира):

       LIBS = -lcurses -lsomething -lsomethingelse

Променете го да стане така, и най-вероятно ще проработи:

       LIBS = -lncurses -lsomething -lsomethingelse
       #LIBS = -lcurses -lsomething -lsomethingelse


[ previous ] [ Copyright Notice ] [ Contents ] [ next ]
Ръководство на новите отговорници по поддръжка на Debian
version 1.0, 25 January 2000.
Josip Rodin jrodin@jagor.srce.hr
Превод: Николай Христов geroy@stemo.bg