The Xbase++ ProjectBuilder
Transcript
The Xbase++ ProjectBuilder
The Xbase++ ProjectBuilder - PBUILD.EXE The Xbase++ ProjectBuilder - PBUILD.EXE The Xbase++ ProjectBuilder è uno strumento per gestire progetti software completi. Un progetto consiste in almeno un file EXE ma può anche comprendere svariati file EXE e/o DLL. La descrizione di un progetto è contenuta in un file project. Questo è un file ASCII con estensione XPJ(Xbase++ ProJect). Elenca tutti i dati necessari per creare un progetto. Per esempio, nome del file sorgente,informazioni per il compilatore e il linker o quale file eseguibile deve essere creato dal file sorgente. Creazione di un file project (XPJ file) Il modo più semplice per creare un file project è usare un file ASCII con la lista dei nomi di tutti i sorgenti PRG che fanno parte del progetto. Così può essere creato il file con il comando DIR : DIR /b *.prg > project.txt PBUILD @project.txt L' output del comando DIR è diretto nel file PROJECT.TXT. Questo file può essere facilmente modificato usando un semplice editor di testi per rimuovere i nomi dei file PRG che si trovano nella directory corrente ma che non fanno parte del progetto,ad esempio. Il ProjectBuilder (PBUILD.EXE) legge così un file e crea da questo un template per un file project con l'estensione XPJ (questo per Xbase++ ProJect). Per piccoli progetti, la struttura base di un file project può anche essere creata velocemente con un editor. Il seguente esempio mostra un file project per il programma CUSTOMER.EXE che richiede solo quattro file PRG : 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: [PROJECT] DEBUG = yes GUI = no CUSTOMER.XPJ 12: 11: PRINT.PRG VIEWCUST.PRG // Definizioni project-wide // La radice del progetto [CUSTOMER.XPJ] CUSTOMER.EXE // Lista di tutti i file EXE e DLL // del progetto [CUSTOMER.EXE] CUSTOMER.PRG GETCUST.PRG // Lista di tutti i sorgenti degli // EXE e/o DLL separatamente L'esempio mostra le principali caratteristiche di un file XPJ : è diviso in diverse parti, ognuna delle quali cominciano con un nome simbolico racchiuso in parentesi quadre. La prima sezione deve essere sempre chiamata [PROJECT]. Questo è il punto di partenza per il ProjectBuilder ed elenca definizioni valide per l'intero progetto. In questo esempio, un programma contenente Creazione di un file project (XPJ file) informazioni di debug è stato creato come applicazione in modalità testo (lines 2 and 3). Alla fine della lista di definizioni (line 4), appare il nome della sezione successiva che è stata analizzata dal ProjectBuilder. Questa sezione è la radice del progetto ed elenca tutti i file eseguibili che fanno parte del progetto, o rispettivamente, che devono essere inseriti dopo dal cliente. Questo include sia i file EXE che i file DLL. Ogni nome di file eseguibile è usato di nuovo come il nome di un'altra sezione che elenca i nomi dei file sorgente da cui sono creati i file eseguibili. Come risultato, la struttura di un file XPJ rappresenta le dipendenze che esistono tra file sorgente e file target di un progetto. Per esempio, il file prima menzionato CUSTOMER.EXE è il file target che dipende da quattro file PRG , o sorgenti, rispettivamente. Ogni volta che cambia un sorgente, il target deve essere aggiornato. Il ProjectBuilder analizza le dipendenze tra sorgente e target usando un file project e aggiornando l'intero progetto per apportare le ultime modifiche. L'esempio sopra mostra solo la struttura base di un file XPJ come può essere facilmente creato con un editor. Comunque, la maggior parte delle dipendenze possono esistere tra differenti file dello steso progetto.Queste includono, per esempio,dipendenze tra CH->PRG, PRG->OBJ, OBJ>EXE o OBJ->DLL e DEF->LIB. Il ProjectBuilder è capace di trovare tutte queste numerose dipendenze automaticamente non appena la struttura base del file project è cretata. Per questo il file PBUILD.EXE comincia con lo switch /g (g sta per generate): PBUILD customer.xpj /g Lo switch /g fa sì che il PBUILD.EXE analizzi tutte le dipendenze che esistono all'interno del progetto. Il ProjectBuilder allora espande un file project (elementare) e aggiunge tutte le informazioni omesse al file XPJ. Questo libera del tutto il programmatore da tante battute, specialmente per i grandi progetti. Ad esempio, PBUILD.EXE espande l'esempio precedente di file XPJ di 20 linee. Come risultato il file project cresce da 11 a 31 linee: 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: [PROJECT] COMPILE COMPILE_FLAGS DEBUG GUI LINKER LINK_FLAGS RC_COMPILE RC_FLAGS CUSTOMER.XPJ = = = = = = = = xpp /q yes no alink // Informazioni compiler e linker // precedente omesse arc [CUSTOMER.XPJ] CUSTOMER.EXE [CUSTOMER.EXE] // $START-AUTODEPEND COLLAT.CH GET.CH MEMVAR.CH PROMPT.CH SET.CH // Dipendenze create // automaticamente Creazione di un file project (XPJ file) 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: STD.CH CUSTOMER.OBJ GETCUST.OBJ PRINT.OBJ VIEWCUST.OBJ // $STOP-AUTODEPEND CUSTOMER.PRG GETCUST.PRG PRINT.PRG VIEWCUST.PRG Le modifiche compaiono nella sezione [PROJECT] , dove tutte le informazioni omesse per il compilatore e linking sono aggiunte. Inoltre, la sezione [CUSTOMER.EXE] ora contiene una lista di file di cui il ProjectBuilder ha trovato dipendenze. Questo automaticamente crea la lista racchiusa dai marcatori. // $START-AUTODEPEND e // $STOP-AUTODEPEND nella riga 16 e 27. Entrambi i marcatori indicano un'area nel file project che potrebbe essere modificata automaticamente quando il PBUILD.EXE è chiamato successivamente insieme con lo switch /g. Perciò, un file project non deve essere modificato tra questi marcatori o le modifiche in quest'area potrebbero essere perse. Creazione di un progetto Quando un file project che include tutte le dipendenze è generato, il progetto è creato, o aggiornato, rispettivamente,dall'attivazione PBUILD.EXE e specificando l'appropriato file project, se necessario . Di default,il ProjectBuilder cerca il file PROJECT.XPJ nella directory corrente. Dunque, ognuna delle seguenti possibilità crea un progetto: 1) PBUILD 2) PBUILD customer 3) PBUILD customer.prj In primo luogo, il ProjectBuilder crea il progetto che è descritto nel file PROJECT.XPJ. Dopo richiede che il file CUSTOMER.XPJ sia disponibile nella directory corrente (XPJ è l'estensione di default per il file project) , finchè alla terza chiamata, un nome di file completo indica il file project. Dopo l'attivazione, il ProjectBuilder analizza le dipendenze tra i file sorgente e target. Se un file sorgente è stato cambiato dall'ultima chiamata al PBUILD.EXE, per esempio se il file sorgente è più nuovo del file target, il ProjectBuilder crea nuovamente la corrispondenza con i targets (EXE o DLL). Solo dopo le modifiche dei sorgenti sono elaborati dal ProjectBuilder, il tempo per aggiornare complessi progetti è quindi ridotto in larga misura. Laa sezione [PROJECT] in un file XPJ La sezione [PROJECT] in un file XPJ Tutte le informazioni che possono essere elencate nella sezione [PROJECT] sono descritte sotto. Ogni file project deve cominciare con la sezione [PROJECT] che contiene le definizioni valide per l'intero progetto (project-wide definitions): COFF_LINKER= Questa definizione opzionale può essere usata per definire il linker da attivare dal ProjectBuilder quando l'OBJ_FORMAT= è settato su COFF (Common Object File Format). Se COFF_LINKER= non è definito in questo caso, il ProjectBuilder usa il linker definito con LINKER=. COMPILE= Indica il nome del compilatore Xbase++. Esso è sempre XPP. COMPILE_FLAGS= Tutti gli switch del compilatore da settare sono definiti quì. Nota che esistono diverse definizioni OBJ_DIR= e DEBUG= per gli switch /o e /b. DEBUG= Questa definizione può essere settata su YES (debug version) o su NO (non debug version). File eseguibili sono creati di conseguenza con o senza informazioni di debug. Un file eseguibile deve essere creato con DEBUG=YES in modo che possa essere monitorizzato con il debugger. GUI= Se un programma deve girare in modalità testo, deve essere settato GUI=NO . Ogni volta che un programma realizza un output grafico, che sia con Gra..() functions o con l'uso di Xbase Parts, deve essere definito GUI=YES. LINKER= Questa definizione indica il nome del linker usato per creare file EXE o DLL da file OBJ. Sarebbe il linker che incluso con la versione specifica per sistema operativo di Xbase++. LINK_FLAGS= Tutti i flag del linker che non sono inclusi in GUI= e DEBUG= sono elencati in questa definizione. Comunque, se il flag /PM e /DE sono usati anche quì, ignorano le corrispondenti definizioni di GUI= e DEBUG=. OBJ_DIR= Facoltativamente, la directory per i file OBJ può essere definita. Il compilatore crea i file OBJ in questa directory, ed il linker la cerca per trovare questi file. Solo una directory può essere settata. Note: Il settaggio OBJ_DIR incide solo sui file OBJ elencati nella nella sezione del file project delimitata con // $START-AUTODEPEND // $STOP-AUTODEPEND. PBuild completa il nome di questi file OBJ con la directory OBJ_DIR affinchè non siano specificate informazioni sul path per i file elencati nella sezione auto-dependency. In aggiunta i file OBJ possono essere specificati con path completo fuori dalla sezione auto-dependency. Laa sezione [PROJECT] in un file XPJ OBJ_FORMAT= Due valori possono essere usati per questa definizione per scegliere il formato dei file object: COFF (Common Object File Format) o OMF (Object Module Format). Il ProjectBuilder fa partire il Compiler ed aziona il AIMPLIB.EXE, se necessario, usando gli switch corrispondenti /coff o /omf. Inoltre, il linker definito con COFF_LINKER= o OMF_LINKER= è usato nel build process. OMF_LINKER= Questa definizione opzionale può essere usata per definire il linker da azionare dal ProjectBuilder quando OBJ_FORMAT= è settato su OMF (Object Module Format). Se OMF_LINKER= non è definito in questo caso, il ProjectBuilder il linker definito con LINKER=. RC_COMPILE= Questa definizione contiene il nome del compilatore di risorse venduto con Xbase++. Normalmente, le risorse addizionali sono usate solo per applicazioni GUI. OS/2 Queste sono note addizionali alla fine di questa sezione per le piattaforme OS/2. RC_FLAGS= Il flag per il compilatore di risorse è settato con questa definizione. <SECTION> Tutte le entries nella sezione [PROJECT] definite senza segno di uguaglianza sono usate come riferimento alla successiva sezione userdefined che viene analizzata dal ProjectBuilder. Normalmente, solo una sezione addizionale (the root section) è referenziata. A questo punto deve esserci almeno una sezione user-defined. Note: Le definizioni elencate nella sezione [PROJECT] sono valide per l'intero progetto. Comunque, possono anche apparire nella sezione user-defined. In questo caso, sono valide solo per una sezione. Se le definizioni sono trasferite al PBUILD.EXE dalla riga di comando usando lo switch /d switch, tutte le definizioni nel file project con lo stesso nome saranno ignorate. Compilatore di risorse per OS/2 Le dipendenze di risorse wether sono dichiarate nei file ARC o RC, le opzioni RC_COMPILE= deve essere settata su arc o rc. Se è usato il file ARC, il Project Builder attiva prima ARC.EXE (Alaska resource compiler) e dopo RC.EXE (OS/2 resource compiler). ARC.EXE traduce i file ARC in file RC che possono essere compilati da RC.EXE. Sezione User-defined nel file XPJ Dopo la sezione [PROJECT],la sezione user-defined è elencata nel file project. Il nome della prima sezione user-defined (la root section) deve essere indicata nella sezione [PROJECT], come mostra il seguente esempio: [PROJECT] DEBUG = YES ROOT // project-wide definition // prima sezione user-defined Sezione User-defined nel file XPJ [ROOT] file1.EXE file2.DLL [file1.EXE] <PRG files for the EXE file> [file2.DLL] DEBUG = NO // section-wide definition <PRG files for the DLL file> La prima sezione user-defined elenca tutti i file eseguibili (targets) creati dal ProjectBuilder. Per ogni target,esiste una sezione user-defined che ha lo stesso nome. Elenca i file PRG (sorgenti) per quel target. I sorgenti sono normalmente solo file PRG, ma possono anche essere file resource se richiesti da un'applicazione GUI.I file di risorse sono compilati da un compilatore di risorse e linkati per essere file eseguibili. Quando un file target sta per essere creato come una libreria dinamica (DLL file), il nome di file corrispondente deve includere l'estensione DLL. Il ProjectBuilder crea automaticamente tutti i file necessari per la creazione della DLL. Questo include il file di espoortazione delle definizioni (DEF file) e il file di importazione libreria (LIB file). L'ultimo deve essere linkato ad un EXE che usa le funzioni contenute nella DLL. Quando un file project contiene multiple sezioni user-defined, è sufficiente scrivere solo il file sorgente per ogni sezione (file PRG e file di risorse, se necessario). Il file project può quindi essere esteso alla descrizione di tutte le dipendenze tra sorgente e targets con l'attivazione di PBUILD.EXE con lo switch /g. Sezione User-defined nel file XPJ Opzioni per PBUILD.EXE Il ProjectBuilder viene lanciato dalla riga di comando digitando PBUILD. Se non è specificato un file project file, il ProjectBuilder cerca il file PROJECT.XPJ e crea il progetto descritto in questo file. La descrizione generale per la chiamata è: PBUILD @<file> or PBUILD [<XPJ file>] [<options>] @<file> Il carattere @ indica un file che elenca tutti i sorgenti che fanno partedel progetto. <file> è un file ASCII che contiene il nome di un file sorgente per ogni riga. Può essere creato molto facilmente digitando DIR /b *.PRG > PROJECT.LST dalla riga di comando,per esempio. Da questo file, il ProjectBuilder crea un file project con lo stesso nome ma con una differente estensione (XPJ). Il nome <file> è aanche usato per i file eseguibili da creare. <XPJ file> Quando un progetto non è descritto nel file PROJECT.XPJ, il nome del file project deve essere specificato nella riga di comando. L'estensione di default è XPJ. /? or /h Visualizza le informazioni sulle opzioni del PBUILD.EXE. Lo switch /? fornisce solo informazioni e non può essere combinato con altri switches. /a Lo switch /a costringe il ProjectBuilder ad eseguire una compilazione completa ed un ciclo di link per ogni sorgente del progetto. Questo ricostruisce un intero progetto nonostante non ci siano cambiamenti nel file sorgente dall'ultima modifica del progetto. /c Lo switch /c (clean) cancella tutti i file binari dell'intero progetto creato dal ProjectBuilder (OBJ, EXE, EXP, DEF, LIB, DLL and RES files). /d<id>[=<val>] La definizione <id> in un file project può essere settata sul valore <val> usando lo switch /d dalla riga di comando. Per esempio, digitando PBUILD /dDEBUG=NO si costruisce un progetto senza informazioni di debug anche se DEBUG=YES è specificato nella sezione [PROJECT]. Lo switch /d, quindi, cambia provvisoriamente le definizioni senza cambiare il file project. /g[<name>] Specificando lo switch /g si induce il ProjectBuilder ad analizzare il progetto per dipendenze. Quindi genera una lista di tutti i file da cui dipendono i target. Questa opzione deve essere usata per espandere la struttura base di un file project o quando sono cambiate le dipendenze. La struttura fondamentale di un file XPJ copre solo i file PRG e target (EXE o DLL). Un completo file XPJ , tuttavia, elenca file con estensione CH, OBJ, ARC, DEF e LIB (DEF e LIB sono usati per la creazione di file DLL). Opzionalmente, un nuovo file project può essere creato specificando <name>. Se il nome del file viene omesso, un file project esistente viene sovrascritto. /k Nel corso del processo di build vengono creati dei file temporanei che vengono cancellati automaticamente quando il ProjectBuilder ha finito. Usando l'opzione /k (for keep) si impedisce al ProjectBuilder di cancellare i file temporanei. /l Quando un file DLL è parte di un progetto, il ProjectBuilder automaticamente crea il corrispondente file DEF (Export definition files) e LIB (import libraries). Normalmente questo non è necessario quando un file PRG è cambiato ma solo quando il numero, serie o identificatore della funzione esportata cambia nella DLL. Per esempio, se una funzione in un file PRG è modificato dall'inserimento di alcune righe di codice, il file PRG deve essere compilato e la DLL deve essere linkata. Comunque, le definizioni esportate e la libreria importata non richiedono di essere Sezione User-defined nel file XPJ ricostruite in questo caso. Quindi, lo switch /l sopprime automaticamente la creazione dei file DEF e LIB. /n Con /n, il ProjectBuilder visualizza solo tutti i passi necessari per aaggiornare un progetto senza far eseguire le azioni corrispondenti (compilatore e linker non sono attivati). /v Lo switch /v attiva la modalità verbose del ProjectBuilder.