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

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ů

13.9.2017 8:00 /František Kučera

Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě DIY, CNC, SDR nebo morseovka? Přijď na sraz spolku OpenAlt – tentokrát netradičně v pondělí: 18. září od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).


Přidat komentář

3.9.2017 20:45 /Redakce Linuxsoft.cz
PR: Dne 21. září 2017 proběhne v Praze konference "Mobilní řešení pro business". Hlavní tématy konference budou: nejnovější trendy v oblasti mobilních řešení pro firmy, efektivní využití mobilních zařízení, bezpečnostní rizika a řešení pro jejich omezení, správa mobilních zařízení ve firmách a další.
Přidat komentář

15.5.2017 23:50 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě DIY, CNC, SDR nebo morseovka? Přijď na sraz spolku OpenAlt, který se bude konat ve čtvrtek 18. května od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

12.5.2017 16:42 /Honza Javorek
PyCon CZ, česká konference o programovacím jazyce Python, se po dvou úspěšných ročnících v Brně bude letos konat v Praze, a to 8. až 10. června. Na konferenci letos zavítá např. i Armin Ronacher, známý především jako autor frameworku Flask, šablon Jinja2/Twig, a dalších projektů. Těšit se můžete na přednášky o datové analytice, tvorbě webu, testování, tvorbě API, učení a mentorování programování, přednášky o rozvoji komunity, o použití Pythonu ve vědě nebo k ovládání nejrůznějších zařízení (MicroPython). Na vlastní prsty si můžete na workshopech vyzkoušet postavit Pythonem ovládaného robota, naučit se učit šestileté děti programovat, efektivně testovat nebo si v Pythonu pohrát s kartografickým materiálem. Kupujte lístky, dokud jsou.
Přidat komentář

2.5.2017 9:20 /Eva Rázgová
Putovní konference československé Drupal komunity "DrupalCamp Československo" se tentokrát koná 27. 5.2017 na VUT FIT v Brně. Můžete načerpat a vyměnit si zkušenosti z oblasti Drupalu 7 a 8, UX, SEO, managementu týmového vývoje, využití Dockeru pro Drupal a dalších. Vítáni jsou nováčci i experti. Akci pořádají Slovenská Drupal Asociácia a česká Asociace pro Drupal. Registrace na webu .
Přidat komentář

1.5.2017 20:31 /Pavel `Goldenfish' Kysilka
PR: 25.5.2017 proběhne v Praze konference na téma Firemní informační systémy. Hlavními tématy jsou: Informační systémy s vlastní inteligencí, efektivní práce s dokumenty, mobilní přístup k datům nebo využívání cloudu.
Přidat komentář

15.4.2017 15:20 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě IoT a radiokomunikace? Přijď na sraz spolku OpenAlt, který se bude konat ve středu 19. dubna od 18:30 v Šenkovně (Sokolská 60, Praha 2).
Přidat komentář

5.3.2017 19:12 /Redakce Linuxsoft.cz
PR: 23. března proběhne v Praze konferenci na téma Cloud computing v praxi. Hlavními tématy jsou: Nejžhavější trendy v oblasti cloudu a cloudových řešení, Moderní cloudové služby, Infrastruktura současných cloudů, Efektivní využití cloudu, Nástrahy cloudových řešení a jak se jim vyhnout.
Přidat komentář

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

> Poslední diskuze

18.9.2017 14:37 / Rojas
high security vault

15.9.2017 7:33 / Wilson
new zealand childcare jobs

31.8.2017 12:11 / Jaromir Obr
Re: ukůládání dat ze souboru

30.7.2017 11:12 / Jaromir Obr
Národní znaky

27.7.2017 12:24 / Jaromir Obr
Cteni/zapis

Více ...

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