Rozsáhlé projekty: CVS,make,knihovny

Na udržování rozsáhlých projektů byla vyvynuta řada nástrojů. V podstatě se dělí do několika kategorií. Jednak jsou to nástroje na udržování konzistentního projektu při spolupráci řady lidí (CVS, RCS). Dále pak nástroje na kompilaci (udržování informací o tom co je preložene zmeněné a pod). Tyto naástroje mohou být například aplikovány na vývoj nějaké knihovny.

Na internetu existuje rozsáhlá literatura k tomu to tématu. Nejdůležitejší asi jsou: Správa projektů pomoci CVS [ http://www.linux.cz/noviny/2001-04/clanek08.html], Program-Library-HOWTO [ http://www.linux.cz/linuxdoc/HOWTO/Program-Library-HOWTO/index.html].

Dále se budeme věnovat vývoji nějaké programové knihovny. Pod tímto názvem se myslí několik procedur a funkcí řešící problém s určité oblasti. Knihovny které se používají na počítači se tradičně dělí na několik skupin podle způsobu, jakým interagují s programem, který používá jejich funkce. Základní dělení je na statické, které se staticky pridají (přilinkují) k programu, takže ten se může odnést na disketě jinam, spustit a tam pojede (tj program i knihovna jsou v jednom souboru na disku). Dále pak na sdílené, které se k programu nijak nepřičelnují a ten pouze ví kde je hledat a pokud potřebuje nějakou funkci z knihovny, tak si ji najde a vyvola z jiného souboru na disku. Extrémním případem techto shared knihoven jsou tzv. dynamické knihovny (pluginy) které si program sám vyhledáva na disku při běhu, takže uživatel může například měnit knihovnu a tím i metody výpočtu apod.

Bylo by velmi težkopádné dokola překládat všechny funkce knihovny při malé změně jedné funkce a proto je třeba mít nástroj, který bude schpoen rozpoznat co se změnilo a co nikoli a podle toho daný soubor přeložit nebo jej nechat. Tím je program

make
. Je řízen pomocí
Makefile
souboru který obsahuje pravidla a akce které mají udělatr to či ono.

Vytvoření knihovny

Použití všemožných nástrojů si ukážeme na fiktivním případě tvorby programové knihovny.

Naším úkolem bude vytvořit statickou knihovnu pod Unixovým systémem se dvěma funkcema na jednoduché statistické funkce průměr a jeho chybu.

Nejprve napíšeme do souboru tyto dvě funkce. V souboru prumer.f90 bude:


function prumer(n,x)
integer :: n
real :: prumer, x(n)

prumer = sum(x(1:n))/n
end function

Soubor chyba.f90 pak bude obsahovat:


function chyba(n,x,prumer)
integer :: n
real :: chyba, x(n), prumer

chyba = sum((x(1:n)-prumer)**2)/(n - 1)
end function

Sestavení Makefile je jednoduché:


# Makefile pro std

libstd.a: chyba.o prumer.o
         ar rv libstd.a prumer.o chyba.o; \
         ranlib libstd.a

prumer.o: prumer.f90
         f90 -c prumer.f90

chyba.o: chyba.f90
         f90 -c chyba.f90

Poznámky. Nejdůležitější je pamatovat si, že mezery před odsazenými příkazu jsou dělané tabelátorem TAB. Příkaz ar vytváří archiv z několika souboru a ranlib pak jeho index. Parametr -c říká překladači, aby se soubor pouze přeložil a nevyvářel se program.

Takto vytvořenou knihovnu pak můžeme v nějakém našem programu použít zcela přirozeně:


program zk

real :: x(3) = (/ 1.0, 2.0, 3.0 /)

write(*,*) prumer(3,x)
end program

Který přeložíme pomocí příkazu:


f90 zk.f90 -L. -lstd

Parametr -L označuje adresář ve kterém se má hledat knihovna libstd.a která je specifikována jako druhý parametr -l bez předpony lib.