Dr. Vermes Mátyás1
1999. július - 2003. szeptember
A CCC programok a Build projekt-generátorral készülnek. Build kielemzi a forráskönyvtárakban talált programokat, megállapítja, hogy azokból milyen lib-eket és exe-ket lehet csinálni. Összeveti a források, objectek, lib-ek, exe-k dátum/idejét, és elvégzi a szükséges fordítást, linkelést. Build ismeri és kezeli az összes olyan forrástípust, ami a CCC környezetben eddig előfordult: mnt, cls, msk, pge, asm, c, cpp, y, lex, prg, így nemcsak Clipper programok fordítására képes, hanem pl. yacc és lex programokhoz is megfelel. Valójában a Build olyankor is jó szolgálatot tesz, amikor egyáltalán nincs a projektben Clipper nyelvű program. Az egész CCC futtatórendszer, könyvtárak, utilityk (köztük maga a Build) fordítását is a Build vezérli.
Kiemelem, hogy a támogatott platformokon (DOS, Windows, Linux, Solaris) ugyanazt a makerendszert használjuk, ráadásul platformváltáskor nincs szükség a források konverziójára, hanem egyszerűen átmásoljuk a projektet tartalmazó directory struktúrát egyik gépről a másikra. A Build nem keveri össze különböző fordítókkal készített, különböző platformra szánt binárisokat.
A Build jelenleg az alábbi fordítókkal képes programot csinálni:
Microsoft C (Visual C) | Windows NT/2000 |
Borland C (C Builder) | Windows NT/2000 |
MinGW | Windows NT/2000 |
GCC | Linux, Solaris |
Maga a Build a DOS korlátai miatt csak UNIX-on és NT-n futtatható. Lehetséges azonban DOS-os fejlesztés is, ha NT-s környezetből fordítjuk az elavult rendszerre szánt programunkat.2
Build a forrásprogramok elemzésével megállapítja, hogy azok milyen összefüggésben vannak egymással (melyikből lesz object, melyik inkludálja valamelyik másikat, stb.), és a filéidők alapján eldönti, hogy milyen fordítási műveleteket kell végrehajtani. Ha Build úgy látja, hogy egy msk filéből elő kell állítani a say-t, akkor végrehajtja az msk2say.bat scriptet. Általában is minden filétípust a filé kiterjesztése alapján azonosítunk, és minden fordítási művelethez tartozik egy batch filé, aminek a nevét az előbbi példa mintájára képezzük: prg2obj.bat, cpp2obj.bat, obj2lib.bat, stb.3 Ezáltal Build működése éppen olyan, mint ahogy a make utility alkalmazza az implicit fordítási szabályokat. A szabályokhoz tartozó tevékenységet azonban nem a makefilében adjuk meg, hanem az iménti batch scriptekben.
A Build programnak paraméterként kell megadni, hogy hol keresse az adott platform xxx2yyy.bat alakú scriptjeit. A különböző platformokhoz különböző script készleteket csinálunk, és ezzel elfedjük a platformok közti eltéréseket.
A Build-et általában nem indítjuk közvetlenül, hanem olyan scripteken keresztül, amik megfelelő paraméterezéssel előkészítik Build-et egy-egy programtípus fordítására. Ezek a scriptek a $CCCDIR/usr/bin/$CCCUNAME könyvtárban találhatók. A Windowson használható scriptek:
bapp_w320.bat | Win32, CCC könyvtár nélkül |
bapp_w32_.bat | Win32 konzol, képernyőkezelés nélkül |
bapp_w32c.bat | Win32 konzol, fullscreen képernyő |
bapp_w32c_btbtx.bat | Win32 konzol, BTBTX adatbázis |
bapp_w32c_datidx.bat | Win32 konzol, DATIDX adatbázis |
bapp_w32c_dbfctx.bat | Win32 konzol, DBFCTX adatbázis |
bapp_w32g.bat | Win32 GUI |
bapp_w32g_btbtx.bat | Win32 GUI, BTBTX adatbázis |
bapp_w32g_datidx.bat | Win32 GUI, DATIDX adatbázis |
bapp_w32g_dbfctx.bat | Win32 GUI, DBFCTX adatbázis |
A Linux, Solaris platformon használható scriptek:
bapp_unix0.b | UNIX, CCC könyvtár nélkül |
bapp_unix_.b | UNIX, képernyőkezelés nélkül |
bapp_unixc.b | UNIX, karakteres (fullscreen) képernyő |
bapp_unixc_btbtx.b | UNIX, karakteres képernyő, BTBTX adatbázis |
bapp_unixc_datidx.b | UNIX, karakteres képernyő, DATIDX adatbázis |
bapp_unixc_dbfctx.b | UNIX, karakteres képernyő, DBFCTX adatbázis |
bapp_unixg.b | UNIX, Fltk (X) képernyőkezelés |
bapp_unix.b | Dinamikus megjelenítő választás |
A dinamikus megjelenítés választás azt jelenti, hogy a program elinduláskor felderíti (tipikusan környezeti változók alapján), hogy milyen megjelenítéssel (grafikus vagy karakteres) kell működnie.
A felsorolás közel sem teljes. A minták alapján könnyen lehet készíteni további variációkat, emellett a Build egy adott programtípuson belül, alkalmazás szinten is rugalmasan paraméterezhető, ahogy azt a következőkben látni fogjuk.
Build legegyszerűbb használata esetén az aktuális directoryban található forrásprogramokból készít exe, lib és so filéket. A programnak négy üzemmódja van, amit az -x, -l és -s kapcsolókkal, illetve ezek elhagyásával lehet beállítani.
Példa: bapp_unix.b -xpelda
Ez a parancs arra utasítja Build-et, hogy a pelda.prg forrásprogramból hozza létre pelda.exe-t úgy, hogy az aktuális directoryban lévő többi forrást szintén fordítsa le, és az objecteket linkelje az exe-hez. Részletesebben a következők történnek.
Példa: bapp_unix.b -lpelda
Ez a parancs arra utasítja Build-et, hogy készítse el pelda.lib-et, amibe be kell venni az aktuális directory minden olyan forrásprogramját, ami nem tartalmaz function main-t, ezenkívül az összes olyan prg-ből, ami main-t tartalmaz készítsen exe programot az előbbi lib hozzálinkelésével. A prg-k #include-jait most is vizsgálja Build, és lehetőség szerint beveszi őket a projekt függőségi listáiba. A -l üzemmód még az -x-nél is mohóbb, az összes forrást így vagy úgy felhasználja, hogy programot készítsen belőle.
Példa: bapp_unix.b -spelda
Ez az üzemmód UNIX-on alkalmazható, annyival több a -l módnál, hogy elkészül a könyvtár osztott változata (so) is.
Példa: bapp_unix.b
Ha az előbbi -x, -l, -s kapcsolók egyikét sem alkalmazzuk, akkor Build az aktuális directory minden main-t tartalmazó programjából exe-t készít, amihez hozzálinkeli az összes többi programból készített objectet anélkül, hogy azokból könyvtárat készítene.
A projektek (könyvtárak, végrehajtható programok) tartalmát a források megfelelő csoportosításával kell szabályozni. Például, ha nem akarjuk letörölni egy forrás elavult változatát, de az sem jó, ha jelenlétével zavarja Build működését, akkor egyszerűen félre kell rakni egy alkönyvtárba. A fent ismertetett négy üzemmód az alkalmazási programok 90%-ában elegendő. A bonyolultabb esetekben segítenek az alább ismertetett kapcsolók.
Külön kell szólni a BUILD_INC, BUILD_LIB, BUILD_LPT változókról.
Build összegyűjti az include és library paramétereket, és elhelyezi egy-egy környezeti változóban úgy (blank elválasztó), hogy később batch filéből shiftekkel könnyen fel lehessen dolgozni. A használt környezeti változók:
A CCCDIR/tools/mask/m script tartalma a következő:
#!/bin/bash bapp_unixc.b -lmask "BUILD_EXE=$CCCDIR/usr/bin/$CCCUNAME"
Ha az m script tartalma csak ennyi volna:
#!/bin/bash bapp_unixc.bakkor is lefordulna az összes program, létrejönne az öt exe (az aktuális directoryban), de nem készülne külön könyvtár.
Az előbbi script windowsos megfelelője m.bat:
@echo off bapp_w32c -lmask "BUILD_EXE=$(CCCDIR)/usr/bin/nt"
Nagyon hasonló a UNIX-os változathoz, azonban a UNIX és Windows shell eltérései miatt a paraméterekben előforduló speciális karaktereket másképp kell védeni. A $(CCCDIR) makrót a Build fogja értelmezni. A Build egyformán megérti a \ és / elválasztó karakterrel leírt útvonalakat.
Végeredményben két nagyon rövid, egymáshoz nagyon hasonló scriptet kell csak megírni, ezután bármely platformon az egybetűs m parancs hatására elkészül az adott direktoriban fellelhető összes program. Így működik a Build.
További példák sokasága található a CCC directory struktúrában, ahol minden projekt, beleértve a runtime libraryk fordítását, a prg forrást egyáltalán nem tartalmazó programok fordítását, a Build-del készül.
1ComFirm BT.
2 A CCC 2.x-ben megszűnt a DOS-os Clipper és a Watcom fordítási környezet karbantartása, újdonság viszont a MinGW.
3 A DOS világban meghonosodott kiterjesztéseket használjuk Linuxon is (bat, obj, lib, exe), ez azonban, hála a Linux rugalmasságának, semmilyen problémát nem okoz.