Pisanje SlakBuild skripte (slackwiki)

Uputstva, saveti i trikovi

Moderator: Urednik

Post Reply

Administrator
Administrator
offline
User avatar

Posts: 4100
Joined: 04 Feb 2011, 20:32
Location: Beograd
Contact:

Post Napisano: 18 Sep 2013, 07:34


Napomena

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
Proćićemo kroz poslednju opciju: pisanje SlackBuild skripti (koje kombinuju najbolje kvalitete prethodno pomenutih metoda) Korišćenjem SlackBuild skripta, automatizujete proces izgradnje, što vam omogućava da lakše ažurirate ili ispravite grešku u paketu. SlackBuild skripte su takođe metod koji Patrik Volkerding koristi za izgradnju svih zvaničnih paketa u Slakveru. Ako pogledate u različite skripte iz različitih izovra, primetićete da generalno postoji deo skripte koji je nezavisan od aplikacije i deo koji se odnosi na specifičnu aplikaciju.

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
Nakon toga, kreiraćemo potrebne datoteke korišćenjem komande touch. Ako ne znate šta radi komanda touch, pogledajte:

Code: Select all

man touch
Imajte na umu da će datoteka *.SlackBuild uvek sadržati ime aplikacije za koju je napisana; na primer: ona za pidgin će se zvati pidgin.SlackBuild.

Code: Select all

touch latex2html.SlackBuild
touch slack-desc
Otpakujte izvornu arhivu aplikacije da bismo pogledali u configure skriptu i odlučili koje opcije da koristimo.

Code: Select all

tar -xzf latex2html-2002-2-1.tar.gz || exit 1
Pisanje slack-desc datoteke

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:
Prevod:

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:
Oznaka “imeprograma:” se mora podudarati sa imenom aplikacije u nazivu Slakver paketa (na primer, paket “pidgin-2.10.7-i686.txz” mora imati oznaku “pidgin: “, a ne “Pidgin” ili “PIDGIN” ili nešto drugo.

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
Verovatno ćete želeti da uključite neku vrstu licence u vaše SlackBuild skripte (po mogućnosti GPL ili BSD stil licence), ali kao minimum želećete da koristite nešto poput ovoga:

Code: Select all

#<vaše ime>  datum izmene gggg\mm\dd 
Gde je gggg = godina, mm = mesec i dd = dan izmene.

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
Neki ljudi vole da vrše izgradnju u poddirektorijumu /tmp direktorijuma (kao što je /tmp/build), ali to je vaš izbor.

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
Postavite SLKCFLAGS (koje će biti korišćene i kao CFLAGS i kao CXXFLAGS). Ako izgrađujete paket na sistemu sa verzijom gcc-a starijom od 3.4.x, moraćete da koristite “-mcpu” umesto “-mtune”.


Code: Select all

if [ "$ARCH" = "i486" ]; then
  SLKCFLAGS="-O2 -march=i486 -mtune=i686"
 elif [ "$ARCH" = "x86_64" ]; then
  SLKCFLAGS="-O2 -fPIC"
fi
To je bio deo SlackBuild skripte u kome su postavili neke promenjive specifične za konkrentu aplikaciju. Kada kreirate paket neke druge aplikacije, obično menjate samo promenjljive, a većina ostalog dela skripte radi automatski.

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 .
Konfiguracija i kompajliranje izvornog koda

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
Neke od često korišćenih configure opcija su:
  • --prefix=/usr
  • --libdir=/usr/lib${LIBDIRSUFFIX}
  • --sysconfdir=/etc
  • --localstatedir=/var
Ovo postavlja konfiguracione datoteke u /etc, datoteke stanja (napr logovi) u /var, ostatak u /usr, a biblioteke u /usr/lib${LIBDIRSUFFIX} (napr: /usr/lib64). To je uobičajen Slakver način, ali vaš je sistem, takođe možete instalirati u /usr/local ili neku drugu lokaciju. Pogledajte Unix Filesystem Hierarchy Standard za više informacija o “ispravnim” lokacijama datoteka.

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
Takođe ih možete i odštampati

Code: Select all

./configure ---help | lpr
Promenjljiva DESTDIR je veoma važna u ovom skriptu jer određuje direktorijum u kojem bi datoteke trebale biti instalirane. Ovo će uvek biti naš direktorijum za pakovanje ($PKG). Nažalost Makefile datoteke nekh aplikacija ne podržavaju promenjljivu DESTDIR, tako da je ne možete koristiti sa tim aplikacijama. Jednostavna linija kao što je:

Code: Select all

grep DESTDIR Makefile*
dok ste u direktorijumu sa raspakovanim izvornim kodom, rećiće vam da li je promenjljiva DESTDIR podržana ili ne. Ako dobijete linije izlaza sa $DESTDIR u njima, podržana je. Ako komanda nema izlaz, ovo znači suprotno: $DESTDIR nije podržana.

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 {} \;
Proverite arhivu sa izvornim kodom aplikacije, jer neke aplikacije neće imati svu dokumentaciju koja je navedena u gornjoj liniji (BUGS, Changes, FAQ, INSTALL, LICENSE, MANIFEST, README, TODO) i neke aplikacije mogu imati dodatnu. Drugim rečima, nemojte samo kopirati/nalepiti (copy/paste) ovo u vašu SlackBuild skriptu - morate je promeniti za svaku individualnu aplikaciju.

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
Napomena: U nekim slučajevima će postojati i potreba za nekom postinstalacionom procedurom - za ovo biste dodali datoteku doinst.sh u $CWD direktorijum (direktorijum sa SlackBuild skriptom) koji sadrži potrebne komande.

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
Hajde da pokušamo da sačuvamo prostor na disku; uklonićemo (strip) podatke za ispravljanje grešaka (debug) iz binarnih datoteka i kompresovaćemo man strane sa gzip. U nekim slučajevima ćete moći koristiti i “make install-strp” umesto “make install” da bise postigli isto.



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
Izgradnja paketa

Code: Select all

# Izgradnja paketa
cd $PKG
/sbin/makepkg -l y -c n $TMP/$APP-$PKG_VERSION-$ARCH-$BUILD.tgz
Napomena (bocke): ako je u pitanju Slakware 13.0 ili noviji umesto tgz, možete korisiti i tbz, tlz ili txz. Recimo za txz, izmenili bismo gornji kod u:

Code: Select all

# Izgradnja paketa
cd $PKG
/sbin/makepkg -l y -c n $TMP/$APP-$PKG_VERSION-$ARCH-$BUILD.txz



Poznata ličnost
Poznata ličnost
offline

Posts: 153
Joined: 15 Aug 2012, 23:51

Post Napisano: 19 Sep 2013, 18:14


Alienov generator takođe sasvim solidno odrađuje skripte i za neke veće pakete koje nisam nalazio na SlakBuilds.org.
Uz manje, "šminkerske" izmene...



Administrator
Administrator
offline
User avatar

Posts: 2811
Joined: 01 Apr 2012, 13:50
Location: Mlečni put

Post Napisano: 19 Sep 2013, 18:22


Evo već par dana hoću da ga pomenem a nikako... :)
Use the source, Luke
SSZ irc kanal
Spread the Word, “CHOOSE SLACK! and Don’t look back.”



Prijatelj foruma
Prijatelj foruma
offline
User avatar

Posts: 1053
Joined: 18 Feb 2012, 15:14
Location: Despotovac
Contact:

Post Napisano: 19 Sep 2013, 18:50


Е сад нема оправдања за неписање скрипти. :)



Poznata ličnost
Poznata ličnost
offline

Posts: 153
Joined: 15 Aug 2012, 23:51

Post Napisano: 19 Sep 2013, 19:28


src2pkg je automatizovana alatkica koja gradi paket iz izvornog koda po sličnom principu, ako se ne varam...

Naložiste me, moraću da je isprobam na nečemu "žešćem" čega nema na SlackBuilds.org, npr. na Apache OpenOffice 4 :)

Inače, sve pohvale autoru teme na preglednosti, sistematičnosti i iscrpnosti. Najbolji post na ovu temu na koji sam ikada naleteo i to na našem forumu.


Post Reply

Who is online

Users browsing this forum: No registered users and 3 guests