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 3493×

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ů

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ář

8.5.2016 17:19 /Redakce Linuxsoft.cz
PR: Dne 26.5.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í, cloudové služby, infrastruktura cloudu, efektivní využití cloudu, možné nástrahy cloudů a jak se jim vyhnout
Přidat komentář

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

> Poslední diskuze

19.9.2016 21:04 / Marek Schoř
Poděkování

1.9.2016 13:07 / Walker
hardwood floor refinishing

12.8.2016 11:51 / Josef Zapletal
Jak udělat HTML/Javascript swiping gallery do mobilu?

8.8.2016 14:58 / Adams
fairies for hire

28.7.2016 15:51 / pepan
Re: NetBeans vs Eclipse

Více ...

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