Ovaj članak je sažetak prevoda sledećih tekstova:
http://www.slackwiki.com/Writing_A_SlackBuild_Script" onclick="window.open(this.href);return false;
http://www.slackwiki.com/Packages#Slack ... age_Layout" onclick="window.open(this.href);return false;
http://www.slackwiki.com/Slack-desc" onclick="window.open(this.href);return false;
Prevod ne uključuje i oblast "Other Concerns" koja sadrži naprednije informacije. Ukoliko već imate iskustva sa SlackBuild skriptama preporučujem da bacite pogled: http://www.slackwiki.com/Writing_A_Slac ... r_Concerns" onclick="window.open(this.href);return false;.
Bacite pogled i na moj članak iste tematikte u sledećoj temi.
Pisanje SlackBuild skripte
Uvod
Originalno napisao Florian Mueller jjdm@jjdm.org
Opširno pročistio i poboljšao Robby Workman (rworkman)
Preveo i manje izmene Bojan Popović (bocke)
Ako koristite Slakver kao glavni operativni sistem, verovatno ste želeli da instalirate nekoliko aplikacija koje nisu dostupne u zvaničnim slackware.com ili čak repozitorijuma treće strane kako što je AlienBob-ov repo, li možda jednostavno ne volite da koristite ne proverene paekte treće strane. U ovoj situaciji, imate nekoliko opcija kako instalirati aplikaciju:
- ./configure && make && make install
- korišćenje checkinstall
- korišćenje installwatch
- ručno kompajliranje i korišćenje makepkg
- pisanje SlackBuild skripta
Ne možemo vas naučiti da izgradite “savršen” paket, pošto bi to zahtevalo prilično duboko znanje Slakver operativnog sistema. Morate imate na umu interakciju vašeg paketa sa svim ostalim paketima na sistemu: moraju biti jednostavno integrisani u vašu Slackware instalaciju. Ono što vas možemo naučiti je kako da napravite paket koji radi i koji je veran “Slackware načinu”.
“Ali zahteva toliko vremena!”
Biće potrebno otprilite trideset minuta za prolazak kroz ovaj tutorijal i oko petnaest minuta za kreiranje svakog paketa (bez pripadajućeg procesa kompajliranja), ali vreme koje ćete sačuvati u budućnosti (kada želite da kreirate noviju verziju paketa) u potpunosti opravdava gubitak vremena.
Struktura Slakver paketa
Tipični Slakver paket ima sledeću strukturu
Code: Select all
./
./install/doinst.sh
./install/slack-desc
[./usr/bin]
[./usr/lib]
[...]
Direktorijum “install” i datoteke u njemu će biti obrisane nakon instalaciju u bazni direktorijum (obično “/”). Ovaj direktorijum nije obavezan za većinu paketa ali omogućava dodatnu funkcionalnost: slack-desc sadrži opis paketa, a doinst.sh sadrži post-instalacione instrukcije kao što je kreiranje simboličkih linkova.
Svaka druga datoteka unutar paketa se jednostavno otpakuje u bazni direktorijum. Najveći broj ovih datoteka je u standardnim lokacijama.
Takođe postoje i druge specijalne datoteke unutar paketa:
usr/doc/<imeaplikacije><verzija> Sva dokumentacija uključena u paketu (kao što su README, INSTALL, ChangeLog, docs/, itd) bi trebali biti postavljeni u ovaj direktorijum. Neke od datoteka u ovom direktorijumu bi trebale biti ručno kopirane iz izvorne arhive, s obzirom da Makefile datoteke obično ne kopiraju dokumentaciju u direktorijum za pakovanje paketa.
Priprema razvojnog okruženja
Primere razvojnih okruženja drugih Slackware korisnika možete pogledati ovde (eng).
Za početak
Nadamo se da je sada sve jasno vezano za strukturu Slakver paketa i da imate pripremljeno čisto razvojno okruženje, pa počinjemo proces izgradnje paketa sa SlackBuild skriptom.
Za ovaj primer, kreirali smo paket za latex2html.
Prvo morate kreirati direktorijum latex2html u baznom direktorijum ravojnog okruženja. Preuzmite najnoviji izvorni kod i stavite ga u ovaj direktorijum. Naravno, upotreba wget za dobavljanje najsvežijeg izvornog koda je opcionalna - možete takođe koristiti vaš omiljeni web browser da ga preuzmete, a zatim premestite u odgovarajući direktorijum
Code: Select all
cd <razvojno_okruženje>
mkdir latex2html
cd latex2html
wget http://www.latex2html.org/~latex2ht/current/latex2html-2002-2-1.tar.gz
Code: Select all
man touch
Code: Select all
touch latex2html.SlackBuild
touch slack-desc
Code: Select all
tar -xzf latex2html-2002-2-1.tar.gz || exit 1
Ispravna slack-desc datoteka bi trebala da izgleda poput ovoga:
Code: Select all
# HOW TO EDIT THIS FILE:
# The "handy ruler" below makes it easier to edit a package description. Line
# up the first '|' above the ':' following the base package name, and the '|' on
# the right side marks the last column you can put a character in. You must make
# exactly 11 lines for the formatting to be correct. It's also customary to
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
appname: appname (Short description of the application)
appname: <this line is generally left blank>
appname: Description of application - this description should be fairly
appname: in-depth; in other words, make it clear what the package does (and
appname: maybe include relevant links and/or instructions if there's room),
appname: but don't get too verbose.
appname: This file can have a maximum of eleven (11) lines of text preceded by
appname: the "appname: " designation.
appname:
appname: It's a good idea to include a link to the application's homepage too.
appname:
Code: Select all
# KAKO MENJATI OVU DATOTEKU:
# "Koristan lenjir" ispod čini uređivanje opisa paketa lakšim. Linija do prvog '|'
# iznad ":" nakon imena paketa ps sve do '|' na desnoj strani označava poslednju
# kolonu u koju možete postaviti slovo. Morate napraviti tačno 11 linija ovako
# formatiranih linija da bi format bio ispoštovan. Takođe je uobičajeno da se
# ostavi jedno prazno mesto posle ':'.
|-----koristan-lenjir--------------------------------------------------|
imeprograma: imeprograma (Kratak opis programa)
imeprograma: <ova linija se obično ostavlja prazna>
imeprograma: Opis programa - ovaj opis bi trebao biti prilično detaljan, drugim
imeprograma: rečima, pojasnite šta paket radi (i možda uključite odgovarajuće
imeprograma: linkove i/ili instrukcije ako ima prostora), ali nemojte biti previše
imeprograma: detaljni
imeprograma: Ova datotek aima najviše jedanaest (11) linija teksta ispred kojih se
imeprograma: nalazi "imeprograma:" oznaka.
imeprograma:
imeprograma: Dobra je ideja da takođe uključite i link ka sajtu programa.
imeprograma:
Prva linija mora sadržati ime aplikacije praćeno sa kratkim opisom (opis bi trebalo da se nalazi u zagradama).
“Koristan lenjir” ima svrhu da vas zaustavi na 79 karaktera širine, zato što je standardna konzola 80x25 i ako idete iznad toga, linije će se prelamati pri prikazu.
Prostor nakon ‘:’ je potreban samo kada postoji tekst posle ‘:’. U gornjem primeru na linijama 9 i 11 ne biste trebali imati prazan prostor nakon ‘:’.
Alati
- Postoji komandni alat koji automatizuje kreiranje slack-desc datoteka i pomaže vam da kreirate legalne slack-dec datoteke sa minimalnim trudom: http://slack-desc.sourceforge.net/
Pisanje SlackBuild skripte
Ova sekcija će zahtevati najviše vremena. Preći ćemo je korak po korak. Kada izgradite više paketa, verovatno ćete moći da kopirate neku već postojeću skriptu i uredite je po potrebi. Prvo, morate razumeti da možete napisati SlackBuild skripte na bilo koji način izaberete sve dok je rezultat ispravan paket. Metod koji je opisan ovde je manje ili više onaj koji koristi i Pat Volkerding[1], ali čak i Pat koristi različite stilove pisanja zvaničnih SlackBuild skripti. Stoga, ako vidite nešto što biste uradili na drugačiji način, slobodno to tako uradite - to je ok.
Prvobitna priprema
Otvorite latex2html.SlackBuild vašim omiljenim editorom. Sledi korak po korak uvod kroz funkcionalnu SlackBuild skriptu. Sigurno možete spojiti(paste) sadržaje ovih komada, ali po našem mišljenju imate bolju šansu razumevanja ako sve napišete sami.
Prva linija sadrži ime i putanju komandne školje. Preporučljivo je da ovo bude /bin/sh, zbog maksimalne portabilnosti skripta. /bin/sh je standardno prisutan na Slakver instalacijama (i obično je simbolički link na neki korn kompatibilan shell - napr: ash, ksh, bash, zsh). Iz tog razloga morate paziti da ne koriste sintaksu koja je specifična za jedan shell (napr: bash ili zsh imaju veliki broj proširenja i dodatnih komandi). U ovom primeru koristimo /bin/bash sa opcijom ‘-e’. Ona govori korisničkoj školjci (shell) da prekine izvršavanje skripte u slučaju greške. Ovo je korisno da bi se sprečilo da skripta nastavi i nakon greške kreirajući neispravan ili prazan paket, ili čak izvršavajući sistemske operacije nad praznim varijablama (što može dovesti i do gubitka važnih sistemskih datoteka)
Code: Select all
#!/bin/sh -e
Code: Select all
#<vaše ime> datum izmene gggg\mm\dd
U sledećih nekoliko linija, postavljamo nekoliko promenjljivih koje će biti korišćene kroz celu skriptu. Prvo “CWD” promenjljiva; u našem slučaju “CWD” će biti <razvojni direktorijum>/latex2html. Takođe testiramo i da li je postavljena promenjljiva TMP, i ako nije, postavljamo je na /tmp.
Code: Select all
#Postavi početne promenjljive:
CWD=$(pwd)
if [ "$TMP" = "" ]; then
TMP=/tmp
fi
Code: Select all
# Verzija koja se nalazi u imenu arhive sa izvornim kodom
VERSION=2002-2-1
# Ako je verzija u konfliktu sa Slakver standardom za pakovanje,
# recimo kao ovde: sadrži srednju crtu (“-”), možete postaviti
# PKG_VERSION na drugačiji način, kao napr:
PKG_VERSION=2002.2.1 # verzija paketa koja će se nalaziti u imenu paketa
# Primedba (bocke): danas se arch najčešće određuje automatski. Originalni tekst
# je nastao u doba kada multilib nije imao zvaničnu podršku (a možda ni x86_64).
# Dodat LIBDIRSUFFIX neophodan za kreiranje ispravnih x86_64 paketa.
# SlackBuilds.org skripte ovo rade malo drugačije. Pogledajte izvorni kod jedne
# od njih za više informacija (nakon prelaska celog tutorijala).
ARCH=${ARCH:-i486} # arhitektura na kojoj želite da izgradite paket
LIBDIRSUFFIX=”“ # sufiks lib direktorijuma, napr 64 za lib64 i x86_64
# Prvi broj je broj izgradnje - određuje koliko je puta paket izgrađen.
# Oznaka praćena povlakom je kratka forma autorovog mena.
# Primedba (bocke): Ovo se danas najčešće razdvaja u dve promenljive:
# BUILD i TAG.
BUILD=${BUILD:-1_rlw}
# Ime aplikacije.
# Primedba (bocke): U SlackBuilds.org je PRGNAM umesto APP.
APP=latex2html
# Instalacioni direktorijum paekta (gde će biti kreirana struktura direktorijuma
# paketa)
PKG=$TMP/package-$APP
Code: Select all
if [ "$ARCH" = "i486" ]; then
SLKCFLAGS="-O2 -march=i486 -mtune=i686"
elif [ "$ARCH" = "x86_64" ]; then
SLKCFLAGS="-O2 -fPIC"
fi
Otpakivanje izvornog koda
Code: Select all
# Brisanje preostalih direktorijuma ako postoje (od prethodne izgradnje)
# i ponovo kreiranje direktorijuma za pakovanje.
rm -rf $TMP $PKG
mkdir -p $TMP $PKG
rm -rf $TMP/$APP-$VERSION
# Promenite izvorni direktorijum aplikacije
cd $TMP || exit 1
# Otpakujte izvorni kod u TMP
# Napomena, ako je vaša aplikacija tar.bz2, koristićete tar -jxvf, ako je tar.xz
# ili tar.lzma koristićete tar -Jxvf
tar -zxvf $CWD/$APP-$VERSION.tar.gz || exit 1
# Prebacite se u direktorijum gde je otpakovana arhiva
cd $APP-$VERSION || exit 1
# Promenite vlasništvo i dozvole nad datotekama, ako je neophodno
# Ovo verovatno neće biti neophodno kad su u pitanju neke izvorne arhive
# ali neće štetiti.
chown -R root:root .
chmod -R u+w,go+r-w,a-s .
Code: Select all
# Postavite configure opcije
# Ako je vaša aplikacija pisana u C++, moraćete da dodate i liniju za CXXFLAGS
CFLAGS="$SLKCFLAGS" \
./configure \
--prefix=/usr \
--libdir=/usr/lib${LIBDIRSUFFIX} \
--sysconfdir=/etc \
--localstatedir=/var \
--with-perl=/usr/bin/perl \
--enable-eps \
--enable-gif \
--enable-png \
--build=$ARCH-slackware-linux \
--host=$ARCH-slackware-linux
# komajliranje izvornog koda, izlaz u slučaju greške
make || exit
# instalacija svega u direktorijum za pakovanje, izlaz u slučaju greške
make install DESTDIR=$PKG || exit
- --prefix=/usr
- --libdir=/usr/lib${LIBDIRSUFFIX}
- --sysconfdir=/etc
- --localstatedir=/var
Primetili ste da je skripta configure pokrenuta i sa nekim drugim opcijama. Za svaku aplikaciju koju kompajlirate mogu postojati različite specifične opcije. Pročitajte ove informacije i pažljivo ih pregledajte.
Code: Select all
./configure --help | less
Code: Select all
./configure ---help | lpr
Code: Select all
grep DESTDIR Makefile*
Savet: Uvek ručno i kao OBIČAN KORISNIK prođite kroz ./configure && make && make install DESTDIR=/nekidir proces PRE nego što pokrenete vašu SlackBuild skriptu. Postoji dosta aplikacija koje pokušavaju da urade “čudne stvari” u instalacionoj fazi.
Napr: apcupsd će pokušavati da zakrpi vašu /etc/rc.d/rc.6 incijalizacionu datoteku. Da, moguće je ovo isključiti opcijom configure skripte, ali nije očigledno da je ona potrebna sve dok ne pogledate u Makefile za apcupsd (ili nadgledate instalacioni postupak).
U svakom slučaju, ako prođete kroz proces kao običan korisnik, dobićete “Permission Denied” greške i slično, ukoliko make pokušava da piše negde gde ne bi trebalo.
Instalacija dokumentacije
Code: Select all
# Pravljenje direktorijuma gde će biti instalirana dokumentacija
mkdir -p $PKG/usr/doc/$APP-$VERSION
# Kopiranje dokumentaciju u taj direktorijum i ispravljanje dozvole pristupa
cp -a BUGS Changes FAQ INSTALL LICENSE MANIFEST README TODO docs/ $PKG/usr/doc/$APP-$VERSION
find $PKG/usr/doc/$APP-$VERSION -type f -exec chmod 644 {} \;
Napomena (rworkman): ja takođe volim da postavim kopiju SlackBuild skripta u istom direktorijumu.
Code: Select all
cat $CWD/$APP.SlackBuild > $PKG/usr/doc/$APP-$VERSION/$APP.SlackBuild
Poslednji koraci
Code: Select all
# Pravljenje ./install direktorijuma i kopiranje slack-desc datoteke u njega
mkdir -p $PKG/install
cat $CWD/slack-desc > $PKG/install/slack-desc
Code: Select all
# Dodaj doinst.sh u paket (ako postoji)
if [ -e $CWD/doinst.sh ]; then
cat $CWD/doinst.sh > $PKG/install/doinst.sh
fi
Code: Select all
# Uklanjanje debug informacija iz biblioteka i binarnih datoteka
( cd $PKG
find . | xargs file | grep "executable" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null
find . | xargs file | grep "shared object" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null
)
# Kompresija man strana, ako postoje
if [ -d $PKG/usr/man ]; then
( cd $PKG/usr/man
find . -type f -exec gzip -9 {} \;
for i in $(find . -type l) ; do ln -s $(readlink $i).gz $i.gz ; rm $i ; done
)
fi
# Kompresija info strana ako postoje (i ukljanjanje dir datoteke)
if [ -d $PKG/usr/info ]; then
gzip -9 $PKG/usr/info/*.info
rm -f $PKG/usr/info/dir
fi
Code: Select all
# Izgradnja paketa
cd $PKG
/sbin/makepkg -l y -c n $TMP/$APP-$PKG_VERSION-$ARCH-$BUILD.tgz
Code: Select all
# Izgradnja paketa
cd $PKG
/sbin/makepkg -l y -c n $TMP/$APP-$PKG_VERSION-$ARCH-$BUILD.txz