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

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

Automatické konfigurování prostředí před kompilací

19.8.2010 00:00 | Radim Kolář | Články autora | přečteno 4168×

Typy autokonfigurace

Konfigurovat před kompilací můžeme dvěma způsoby. První je použít námi předdefinované volby podle platformy na které překládáme. Nejjednoduší způsob jak detekovat platformu na které překládáme je zavolat python funkci os.uname() a podle výsledku pak nastavit do proměnných prostředí příslušné přepínače. Pokud tato funkce neexistuje tak překládáme pod windows.

Například na FreeBSD musíme přidat /usr/local/include do dráhy C preprocesoru, protože ho GCC zahrnuté v systému nemá v seznamu adresářů ve kterých bude hledat include soubory. Pokud chceme rozlišit i verzi systému tak tu funkce uname vrací ve třetí položce jak uvidíte v následujícím příkladu:

import os

env = Environment()

if os.uname()[0] == 'FreeBSD':
   env.Append(CPPFLAGS = "-I/usr/local/include")
   print "Compiling on FreeBSD",os.uname()[2]

fbsd8:/tmp> scons -Q
Compiling on FreeBSD 8.1-RELEASE
scons: `.' is up to date.

Tento způsob nastavování kompilačních voleb používají zejména komerční nebo Windows produkty, protože tam dopředu znáte platformu na které překládáte a není potřeba detekovat zda na ní existují jednotlivé hlavičkové soubory. Naproti tomu u open source produktů které budou překládány uživatelem se vyskytuje mnohem větší rozdílnost systémů na kterých kompilujeme a je proto potřeba dělat autodetekci jako dělá GNU Autoconf.

Autodetekce

Mnohem zajímavější bude počtení o autodetekci. Funkčnost je podobná programu GNU autoconf, ale ovládá se mnohem snadněji. Není potřeba programovat v m4 makrojazyku nebo v shellu. Namísto toho máme k dispozici SCons funkce volané z Pythonu. GNU autoconf má více připravených testů v SCons najdete jen takové ty základní, ale velmi snadno se rozšiřuje o vlastní testy.

Před zahájením autokonfigurace musíme vytvořit kontext pro prostředí které chceme konfigurovat. Důležité je nazapomenout po skončení konfigurace změnit prostředí podle parametrů, které jsme si v průběhu autokonfigurace nastavili. Dělá se to zavoláním funkce Finish v konfiguračním kontextu .

Test hlavičkových souborů

Nejčastější test který budeme používat bude ověření existence hlavičkového souboru. SCons nabízí funkce CheckCHeader a CheckCXXHeader pro ověření existence hlavičkového souboru pro jazyky C, případně C++. Pokud hlavičkový soubor najdeme tak si nadefinujeme symbol pro C preprocesor standardními prostředky pro práci s prostředími.

import os

env = Environment()
conf = Configure(env)

if not conf.CheckCHeader('stdio.h'):
   print "Headers not found, check your installation"
   Exit(1)

if conf.CheckCHeader('unistd.h'):
   conf.env.Append(CPPFLAGS = '-DHAVE_UNISTD_H')
env = conf.Finish()

fbsd8:/tmp> scons
scons: Reading SConscript files ...
Checking for C header file stdio.h... yes
Checking for C header file unistd.h... yes
scons: done reading SConscript files.
scons: Building targets ...
scons: `.' is up to date.

SCons umí narozdíl od GNU Autoconf automaticky cachovat výsledky testů pokud se nezměnily vstupní podmínky. Není k tomu zapotřebí žádného kódu nebo nastavování navíc. Pokud spustíme SCons podruhé, tak se testy neprovedou ale použije se nacachovaná hodnota. U testu existence hlavičkových souborů moc velké zrychlení použitím cache nebude, ale u sofistikovanějších testů které překládají, linkují a spouští testovací program to již bude znát. Testy se cachují do podadresáře .sconf_temp v základním adresáři sestavovaného projektu.

fbsd8:/tmp> scons
scons: Reading SConscript files ...
Checking for C header file stdio.h... (cached) yes
Checking for C header file unistd.h... (cached) yes
scons: done reading SConscript files.
scons: Building targets ...
scons: `.' is up to date.
scons: done building targets.

Pokud chceme ignorovat cache a poctivě spustit všechny testy použijeme volbu --config=force

fbsd8:/tmp> scons --config=force
scons: Reading SConscript files ...
Checking for C header file stdio.h... yes
Checking for C header file unistd.h... yes
scons: done reading SConscript files.
scons: Building targets ...
scons: `.' is up to date.
scons: done building targets.
fbsd8:/tmp>

SCons nabízí i řadu dalších testů. Najdete je uvedené v manuálové stránce nebo v popisu API, v online HTML dokumentaci nejsou. Probereme si ty nejdůležitější.

Test existence funkce

Testování existence funkce v standardní C knihovně je snadné. Stačí zavolat CheckFunc('jméno funkce').

if conf.CheckFunc('fork'):
   conf.env.Append(CPPFLAGS = '-DHAVE_FORK')

tento formát funguje i na funkce s argumenty:

if conf.CheckFunc('malloc'):
   conf.env.Append(CPPFLAGS = '-DHAVE_MALLOC')

problém nastává pokud začneme používat volitelný argument obsahující hlavičkové soubory v kterých má být funkce obsažena. Když použijeme:

if conf.CheckFunc('malloc','#include <stdlib.h>'):
   conf.env.Append(CPPFLAGS = '-DHAVE_MALLOC')

tak bude GCC protestovat a test selže, protože se v testovacím programu pokoušíme volat funkci bez argumentů a funkce malloc vyžaduje argument. Smysl použití uvedení hlaviček spolu se jménem funkce mi tedy poněkud uniká. Naštěstí máme i jiné funkce které pracují i s hlavičkami správně. Nejlepší je proto testovat hlavičkové soubory na obsažené funkce pomocí CheckDeclaration.

if conf.CheckDeclaration('malloc','#include <stdlib.h>'):
   conf.env.Append(CPPFLAGS = '-DHAVE_MALLOC')

Testování knihoven

Pokud testujeme existenci symbolu v knihovně, tak jsme pro tento případ dobře vybaveni. Funkce CheckLib nejenže otestuje knihovnu na existanci zadaného symbolu, ale v případě úspěšného testu, pokud není uvedeno jinak, přidá knihovnu do seznamu v proměnné LIBS. Není proto potřeba ručně volat conf.env.Append což zjednodušuje kód.

conf.CheckLib('ssl','SSL_connect')   

Ke knihovnám patří hlavičkové soubory. SCons umí kontrolovat existenci knihovny i hlavičkového souboru na jeden zátah. Slouží k tomu CheckLibWithHeader. Pokud chcete mít opravdu robustní auto test tak nejprve otestujte existenci knihovny a hlavičkového souboru a poté existenci symbolu v knihovně. Stejně jako v předchozím případě bude v případě úspěšného testu knihovna přidána do seznamu LIBS.

conf.CheckLibWithHeader('ssl','openssl/ssl.h','C')

Testování typů

Poslední dnešní kategorii testů jsou testy typů. Můžeme testovat jak existenci typu pomocí CheckType, ale i jeho velikost pomocí CheckTypeSize. Můžeme si kupříkladu zjistit zda typ int je 4 nebo 8 bajtů.

if conf.CheckType('off_t','#include <sys/types.h>','C'):
   conf.env.Append(CPPFLAGS = '-DHAVE_OFFT')
   
offt = conf.CheckTypeSize('off_t','#include <sys/types.h>','C')
print "off_t size is",offt

U velikosti typů můžeme ještě pri testování uvést očekávanou velikost. Tímto otestujeme zda typ int má právě čtyři bajty.

conf.CheckTypeSize('int',None,'C',4)

V dalším díle se podíváme jak psát vlastní testy.

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ů

16.7.2018 1:05 /František Kučera

Červencový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 19. 7. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát bude přednáška na téma: automatizační nástroj Ansible, kterou si připravil Martin Vicián.


Přidat komentář

18.6.2018 0:43 /František Kučera
Červnový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 21. 6. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát na téma: F-Droid, aneb svobodný software do vašeho mobilu. Kromě toho budou k vidění i vývojové desky HiFive1 se svobodným/otevřeným čipem RISC-V.
Přidat komentář

23.5.2018 20:55 /Ondřej Čečák
Od pátku 25.5. proběhne na Fakultě informačních technologií ČVUT v Praze openSUSE Conference. Můžete se těšit na spostu zajímavých přednášek, workshopů a také na Release Party nového openSUSE leap 15.0. V na stejném místě proběhne v sobotu 26.5. i seminář o bezpečnosti CryptoFest.
Přidat komentář

20.5.2018 17:45 /Redakce Linuxsoft.cz
Ve čtvrtek 31. května 2018 připravuje webový magazín BusinessIT ve spolupráci s Best Online Média s.r.o. pátý ročník odborné konference Firemní informační systémy 2018. Akce proběhne v kongresovém centru Vavruška (palác Charitas), Karlovo náměstí 5, Praha 2 (u metra Karlovo náměstí) od 9:00 hod. dopoledne do cca 15 hod. odpoledne. Konference je zaměřena na efektivní využití firemních informačních systémů a na to, jak plně využít jejich potenciál. Podrobnější informace na webových stránkách konfrence.
Přidat komentář

14.5.2018 7:28 /František Kučera
Květnový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 17. 5. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát na téma: Audio – zvuk v GNU/Linuxu.
Přidat komentář

7.5.2018 16:20 /František Kučera
Na stránkách spolku OpenAlt vyšla fotoreportáž Pražské srazy 2017 dokumentující srazy za uplynulý rok. Květnový pražský sraz na téma audio se bude konat 17. 5. 2018 (místo a čas ještě upřesníme).
Přidat komentář

17.4.2018 0:46 /František Kučera
Dubnový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 19. 4. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tématem tohoto srazu bude OpenStreetMap (OSM) aneb svobodné mapy.
Přidat komentář

16.3.2018 22:01 /František Kučera
Kulatý OpenAlt sraz v Praze oslavíme klasicky: u limonády a piva! Přijďte si posedět, dát si dobré jídlo a vybrat z mnoha piv do restaurace Kulový blesk, který najdete v centru Prahy nedaleko metra I. P. Pavlova na adrese Sokolská 13, Praha 2. Sraz se koná ve čtvrtek 22. března a začínáme v 18:00. Heslo: OpenAlt. Vezměte s sebou svoje hračky! Uvítáme, když si s sebou na sraz vezmete svoje oblíbené hračky. Jestli máte nějaký drobný projekt postavený na Arduinu, nějakou zajímavou elektronickou součástku, či třeba i pěkný úlovek z crowdfundingové akce, neváhejte. Oslníte ostatní a o zábavu bude postaráno.
Přidat komentář

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

> Poslední diskuze

20.2.2018 18:48 / Ivan Majer
portal

20.2.2018 15:57 / Jan Havel
Jak využíváte služby cloudu v podnikání?

16.1.2018 1:08 / Ivan Pittner
verejna ip od o2 ubuntu

15.1.2018 17:26 / Mira Harvalik
Re: Jak udělat HTML/Javascript swiping gallery do mobilu?

30.12.2017 20:16 / Michal Knoll
odmocnina

Více ...

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