LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> SCONS - Nástroj pro sestavování software - 4

V dnešním díle se doučíme základní operace s frameworkem pro sestavování software SCons. Probereme si výrobu dynamických knihoven včetně linkování programů proti nim a instalaci přeložených knihoven a programů.

7.5.2010 12:00 | Radim Kolář | Články autora | přečteno 3464×

SCONS - nástroj pro sestavování software - 4

V minulém dílu jsme si přeložili knihovnu fsplib a vytvořili z ní statickou knihovnu, kterou jsme pak přilinkovali k testovacímu programu.

Pro dnešní příklady budeme potřebovat:

  1. Scons 1.3.0. Postačí nám i starší verze, použijte tu co máte v distribuci. Zpětná kompabilita SCons je výborná, ale doporučoval bych používat alespoň 0.98, protože se mírně změnilo u předchozích verzí API. V dnešních jednoduchých příkladech to ale nebude vadit, protože u takto základních věcí se API neměnilo. V Ubuntu 8.04.4LTS je kupříkladu obsaženo postarší scons 0.97.

  2. fsplib knihovnu. Jednak je velmi jednoduchá na sestavení a jednak používá SCons build systém, takže si v ní můžete pro inspiraci prohlédnout dodané SCons* soubory.

  3. root přístup pro instalaci programů

Dynamická knihovna

Prvním příkladem, který si dnes ukážeme bude vytvoření dynamické knihovny. Je to velmi jednoduché, podobně jako v případě statické knihovny co jsme si ukazovali minule. Stačí dát do SConstruct

SharedLibrary('fsp', source=['fsplib.c','lock.c'])
na začátek souboru lock.h dát #define FSP_NOLOCKING a dílo je hotovo k překladu.
freebsd7:~/fsplib> scons -Q
gcc -o fsplib.os -c -fPIC fsplib.c
gcc -o lock.os -c -fPIC lock.c
gcc -o libfsp.so -shared fsplib.os lock.os
freebsd7:~/fsplib>

Podobně jako při vytváření statické knihovny je k názvu výsledného objektu přidán prefix lib. Všimněte si také že při vytváření dynamické knihovny jsou použity jiné kompilační volby a jiné výstupní soubory než při vytváření statické knihovny. Díky tomu můžeme vytvářet obě dvě verze knihovny současně aniž by vzájemně kolidovaly.

SharedLibrary('fsp', source=['fsplib.c','lock.c'])
StaticLibrary('fsp', source=['fsplib.c','lock.c'])

freebsd7:~/fsplib> scons -Q
gcc -o fsplib.o -c fsplib.c
gcc -o lock.o -c lock.c
ar rc libfsp.a fsplib.o lock.o
ranlib libfsp.a
freebsd7:~/fsplib>

Tímto dostaneme obě dvě verze knihovny fsplib. Dynamická se nekompilovala, protože byla sestavená z minula. SCons používá kvalitní detekci změny zdrojových souborů pomocí hash funkce obsahu souboru a proto jej pouhá změna data neošálí.

freebsd7:~/fsplib> touch fsplib.c lock.c
freebsd7:~/fsplib> scons -Q
scons: `.' is up to date.
freebsd7:~/fsplib>

Coding Style

V předchozích dílech jsem vysvětlil coding style používaný v SCons - Globální definice v SConstruct, definice per adresář v SConscript. Aktualizujeme tedy náš projekt podle těchto pravidel:

freebsd7:~/fsplib> mv SConstruct SConscript
freebsd7:~/fsplib> echo "SConscript(dirs=['.'])" > SConstruct
freebsd7:~/fsplib> scons -Q
scons: `.' is up to date.
freebsd7:~/fsplib>

To nám také odpoví na otázku jak sestavovat projekt který má více adresářů. Buďto rozšíříte seznam dirs, který je předán funkci SConscript nebo ji uvedete ještě jednou s jiným parametrem. Použiji druhou možnost, ukazuje to více inteligenci SCons frameworku. Z důvodu čitelnosti doporučuji ve vašich projektech používat raději tu první možnost.

freebsd7:~/fsplib> echo "SConscript(dirs=['test'])" >> SConstruct
freebsd7:~/fsplib> scons -Q
TypeError: File /usr/home/hsn/fsplib/test found where directory expected.:
  File "/usr/home/hsn/fsplib/SConstruct", line 2:
    SConscript(dirs=['test'])

Pokud jste před začátkem našich experimentů s SCons překompilovali fsplib pomocí dodaných SCons souborů, tak dostanete tuto zajímavou chybu. Pokud soubor test smažeme a SCons bude na jeho místě očekávat adresář který nenajde tak dostaneme jen warning.

freebsd7:~/fsplib> rm test
freebsd7:~/fsplib> scons -Q

scons: warning: Ignoring missing SConscript 'test/SConscript'
File "/usr/home/hsn/fsplib/SConstruct", line 2, in 
scons: `.' is up to date.
freebsd7:~/fsplib>

Instalace programu

V předchozím díle jsme si ukázali jak slinkovat program staticky. Dnes si ještě ukážeme asi nejběžnější případ z praxe - slinkujeme program oproti dynamické knihovně. Netřeba podrobněji vysvětlovat, je to obnobné jako statické linkování co jsme prováděli minule.

fsplib=SharedLibrary('fsp', source=['fsplib.c','lock.c'])
Program(target = 'test', source = ['test.c', fsplib])
freebsd7:~/fsplib> echo "SConscript(dirs=['.'])" > SConstruct
freebsd7:~/fsplib> scons -Q
gcc -o test.o -c test.c
gcc -o test test.o libfsp.so
freebsd7:~/fsplib>

Dynamicky slinkovaný program test nefunguje, protože dynamický loader nenajde námi přeloženou knihovnu.

freebsd7:~/fsplib> ./test
/libexec/ld-elf.so.1: Shared object "libfsp.so" not found, required by "test"
freebsd7:~/fsplib> ldd ./test
./test:
        libfsp.so => not found (0x0)
        libc.so.7 => /lib/libc.so.7 (0x2807f000)
freebsd7:~/fsplib>

Program i knihovnu proto nainstalujeme do standardních adresářů. K tomu slouží funkce Install s dvěma parametry kam a co. Program test přejmenujeme na fsptest aby nám nekolidoval s již existujícím systémovým příkazem a mírně proto upravíme SConscript na:

fsplib=SharedLibrary('fsp', source=['fsplib.c','lock.c'])
testprog=Program(target = 'fsptest', source = ['test.c', fsplib])
Install('/usr/local/bin',testprog)
Install('/usr/local/lib',fsplib)

a spustíme:

freebsd7:~/fsplib> scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
gcc -o fsptest test.o libfsp.so
scons: done building targets.
freebsd7:~/fsplib> fsptest
fsptest: Command not found.
freebsd7:~/fsplib>

Vidíme, že sice došlo k linkování programu fsptest, ale již nikoliv k jeho instalaci nebo k instalaci dynamické knihovny. SCons standardně sestaví vše v adresáři a podadresářích ze kterých je spuštěn. V našem případě je spuštěn z ~/fsplib nikoliv z /usr/local. Když ho spustíme z /usr/local přirozeně pak nenajde soubor SConstruct aby vědel co má překládat.

freebsd7:~/fsplib> scons -C /usr/local
scons: Entering directory `/usr/local'
scons: *** No SConstruct file found.

V helpu zjistíme že můžeme scons předat umístění souboru SConstruct jako parametr na příkazové řádce.

freebsd7:~/fsplib> scons -C /usr/local -f ~/fsplib/SConstruct
scons: Entering directory `/usr/local'
scons: Reading SConscript files ...

scons: warning: Ignoring missing SConscript 'SConscript'
File "/home/hsn/fsplib/SConstruct", line 1, in 
scons: done reading SConscript files.
scons: Building targets ...
scons: *** [SConscript] .sconsign.dblite: Permission denied
scons: building terminated because of errors.
freebsd7:~/fsplib>

To taky nevypadá příliš nadějně. Ze Souboru SConstruct totiž načítáme soubor SConscript, který se nachází ve stejném adresáři jako SConstruct, což nefunguje když je scons spouštěn z jiného adresáře. Volba -f totiž nezpůsobí přepnutí se do adresáře v kterém se nachází zadaný soubor a navíc se pomocí -C přepneme úmyslně jinam.

Další konzultací manuálu zjistíme, že scons můžeme předat to co má sestavit na příkazové řádce. To je to ono. Instalace totiž v scons není nic jiného než další objekt, který se má sestavit. Předáme mu proto k sestavení /usr/local. Není potřeba dokonce předávat konkrétní adresasáře nebo soubory které se mají nainstalovat.

freebsd7:~/fsplib> sudo scons -Q /usr/local
Install file: "fsptest" as "/usr/local/bin/fsptest"
Install file: "libfsp.so" as "/usr/local/lib/libfsp.so"

Jak již jsem zmínil v předchozích dílech, SCons generuje automaticky clean akci, která odstraní to co bylo přeloženo, případně nainstalováno. Chcete odinstalovat program? Nic snažšího.

freebsd7:~/fsplib> sudo scons -c -Q /usr/local
Removed test.o
Removed fsplib.os
Removed lock.os
Removed libfsp.so
Removed fsptest
Removed /usr/local/bin/fsptest
Removed /usr/local/lib/libfsp.so
freebsd7:~/fsplib>

Z použití utility make jsme zvyklí na instalaci pomocí make install. Není problém toto zařídit i v SCons. Použijeme alias, kdy scons naučíme že když mu řekneme vyrob install tak tím vlastně myslíme vyrob soubory v /usr/local

freebsd7:~/fsplib> echo "Alias('install', '/usr/local')" >> SConscript
freebsd7:~/fsplib> sudo scons -Q install
gcc -o test.o -c test.c
gcc -o fsplib.os -c -fPIC fsplib.c
gcc -o lock.os -c -fPIC lock.c
gcc -o libfsp.so -shared fsplib.os lock.os
gcc -o fsptest test.o libfsp.so
Install file: "fsptest" as "/usr/local/bin/fsptest"
Install file: "libfsp.so" as "/usr/local/lib/libfsp.so"

Po dnešku již budete umět použít SCons pro sestavení, nainstalování a odinstalování jednoduchého software. V dalším díle se podíváme na ovlivňování kompilačních voleb.

Verze pro tisk

pridej.cz

 

DISKUZE

Nejsou žádné diskuzní příspěvky u dané položky.



Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

1.12.2016 22:13 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Přijď na sraz spolku OpenAlt, který se bude konat ve čtvrtek 8. prosince od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Sraz bude tentokrát tématický. Bude retro! K vidění budou přístroje jako Psion 5mx nebo Palm Z22. Ze svobodného hardwaru pak Openmoko nebo čtečka WikiReader. Přijďte se i vy pochlubit svými legendami, nebo alespoň na pivo. Moderní hardware má vstup samozřejmě také povolen.
Komentářů: 1

4.9.2016 20:13 /Pavel `Goldenfish' Kysilka
PR: Dne 22.9.2016 proběhne v Praze konference Cloud computing v praxi. Tématy bude např. nejnovější trendy v oblasti cloudu a cloudových řešení, provozování ERP v cloudu, o hostování různých typů softwaru, ale třeba i o zálohování dat nabízeném podnikům formou služby.
Přidat komentář

1.9.2016 11:27 /Honza Javorek
Česká konference o Pythonu, PyCon CZ, stále hledá přednášející skrz dobrovolné přihlášky. Máte-li zajímavé téma, neváhejte a zkuste jej přihlásit, uzávěrka je již 12. září. Konference letos přijímá i přednášky v češtině a nabízí pomoc s přípravou začínajícím speakerům. Řečníci mají navíc vstup zadarmo! Více na webu.
Přidat komentář

27.8.2016 8:55 /Delujek
Dnes po 4 letech komunitního vývoje vyšla diaspora 0.6.0.0
diaspora* je open-source, distribuovaná sociální síť s důrazem na soukromý
Více v oficiálním blog-postu
Přidat komentář

24.8.2016 6:44 /Ondřej Čečák
Poslední týden CFP LinuxDays 2016; pokud byste rádi přednášeli na LinuxDays 2016 8. a 9. října v Praze, můžete svůj příspěvek přihlásit, následovat bude veřejné hlasování.
Přidat komentář

9.8.2016 22:56 /Petr Ježek
Zařazení souborového systému reiser4 do jádra 4.7 znamená konečně konec patchování jádra jen kvůli možnosti použít reiser4.
Přidat komentář

12.7.2016 13:14 /František Kučera
Spolek OpenAlt zve na 130. distribuovaný sraz příznivců svobodného softwaru a otevřených technologií (hardware, 3D tisk, SDR, DIY, makers…), který se bude konat ve čtvrtek 21. července od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

11.7.2016 16:53 /Redakce Linuxsoft.cz
Konference LinuxDays hledá přednášející. Přihlášky poběží do konce prázdnin, v září bude hlasování a program. Více na https://www.linuxdays.cz/2016/cfp/.
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

10.12.2016 11:01 / jeorge
kitchen designer

7.12.2016 8:10 / Hamon
scottish cottages

4.12.2016 22:54 / František Kučera
Dárek

9.11.2016 7:42 / Mane
hardwood floor waxing

8.11.2016 13:38 / Mira
Konfigurace maldet na Centos serveru

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2016) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze