2012-09-25 7 views
9

Sto facendo un'introduzione al corso di programmazione all'università, e la lingua di elezione è Ada. Sto codificando in Kate e sto compilando con GNAT 4.6.3. Dobbiamo utilizzare le librerie insegnanti fornito per i nostri programmi, in questo modo:Ottieni Ada (compilato con GNAT) per importare file dalla directory corrente esterna?

with foo; 
use foo; 

Naturalmente, il file foo.adb deve essere contenuta nella stessa directory come il mio file di origine. Dal momento che più progetti dipendono da questa libreria e mi piace mantenere ciascun progetto nella propria sottodirectory, devo copiare i file della libreria in ogni nuovo progetto. Per non parlare di avere il mio codice libreria e il codice sorgente tutti nella stessa directory.

Quindi non v'è alcun modo per ordinare di andare:

with ../../lib/foo 
use ../../lib/foo 

?

Ho provato a guardarmi intorno ma tutto quello che ho trovato è roba sulle opzioni del compilatore. Preferirei non dover scherzare con quelli, soprattutto perché solo alcuni progetti richiederanno questa particolare libreria, quindi non avrebbe senso aggiungerla a un'impostazione globale del compilatore e fare in modo che il compilatore cerchi inutilmente i percorsi che non fa Non ho bisogno di cercare.

risposta

8

Vorrei utilizzare la funzione GNAT Project con la riga di comando gnatmake.

Ho appena creato un piccolo esempio (quindi posso essere sicuro di quello che dico funziona!). Ho 3 directory; teacher/ contiene l'origine fornita dall'insegnante, che presumo tu non voglia cambiare e potrebbe non avere accesso in scrittura in ogni caso, jacks_lib/ contiene teacher.gpr che punta a teacher/ (potresti inserire anche il tuo codice libreria) e jack/ contiene il tuo codice main.adb e main.gpr.

jacks_lib/teacher.gpr:

project Teacher is 
    -- This project calls up the teacher-supplied source. 

    -- This is a list of paths, which can be absolute but 
    -- if relative are relative to the directory where this .gpr 
    -- is found. 
    for Source_Dirs use ("../teacher"); 

    -- Keep the built objects (.ali, .o) out of the way. Use the -p 
    -- gnatmake flag to have directories like this built 
    -- automatically. 
    for Object_Dir use ".build"; 
end Teacher; 

jack/main.gpr:

-- teacher.gpr tells where to find library source and how to build it. 
with "../jacks_lib/teacher"; 

project Main is 
    -- for Source_Dirs use ("."); (commented out because it's the default) 

    -- Keep built objects out of the way 
    for Object_Dir use ".build"; 

    -- Build executables here rather than in Object_Dir 
    for Exec_Dir use "."; 

    -- What's the main program? (there can be more than one) 
    for Main use ("main.adb"); 
end Main; 

jack/main.adb:

with Foo; 
procedure Main is 
begin 
    null; 
end Main; 

Poi, nel jack/,

$ gnatmake -p -P main.gpr 
object directory "/Users/simon/tmp/jacks_lib/.build" created for project teacher 
object directory "/Users/simon/tmp/jack/.build" created for project main 
gcc -c -I- -gnatA /Users/simon/tmp/jack/main.adb 
gcc -c -I- -gnatA /Users/simon/tmp/teacher/foo.ads 
gnatbind -I- -x /Users/simon/tmp/jack/.build/main.ali 
gnatlink /Users/simon/tmp/jack/.build/main.ali -o /Users/simon/tmp/jack/main 

Devo aggiungere che sto usando GCC 4.7.0 su Mac OS X, ma questo dovrebbe funzionare bene con qualsiasi GNAT recente.

5

opzioni del compilatore sono il modo di gestire posizioni di codice sorgente per una build - che definisce "percorsi di ricerca" - in particolare l'opzione "-i" (includere) per gcc-based (come GNAT) e la maggior parte degli altri compilatori .

Se si sta costruendo dalla riga di comando, è semplicemente una questione di:

gnatmake -I../../lib/foo -Iother/path -Iyet/another/path project1_main.adb 

gnatmake -I../../lib/foo -Isome/path -Iyet/another/path project2_main.adb 

Se si sta utilizzando il GPS (GNAT Programming Studio), quindi aprire la finestra di dialogo Proprietà progetto, selezionare i dirs Fonte scheda e aggiungere i percorsi di ricerca lì. (È anche possibile modificare direttamente un file di proprietà del progetto (".gpr") direttamente, ma raramente lo faccio. YMMV.) Le impostazioni del compilatore sono facilmente configurabili in base al progetto, quindi non c'è alcun problema con "impostazioni globali del compilatore" quale si dovrebbe preoccupare di se stessi.

+0

Ho paura che stiamo usando un editor di testo piuttosto nudo, non GPS ... Credo che potrei scrivere uno script bash per gestire l'impostazione delle opzioni della riga di comando per me o qualcosa del genere? –

+0

Se puoi invocare gnatmake dalla riga di comando, puoi ugualmente invocarlo da uno script. –

3

amplificazione su @ risposta di marcc, il GNAT User's Guide copre gnatmake nel capitolo 6, sotto §6.2 Interruttori per gnatmake: fonte e biblioteca percorso di ricerca interruttori; la guida dovrebbe essere inclusa nella distribuzione.

Il comando gnatmake è un obiettivo conveniente per make, come mostrato in questo example.

3

La sua non è stato esplicitamente menzionato nelle risposte SOFAR, così lo dico:

I with & use clausole Ada fanno alcuna garanzia circa la posizione delle withed & unità utilizzate, solo che esistono.

Quando si tratta di trovare effettivamente le unità, che è del tutto fino alle make script & .gpr file & opzioni di compilazione o qualsiasi altra cosa si arriva con.

Questo è il modo di Ada crea un grado di portabilità del codice (da non vincolante il codice per una struttura di directory!), Hai solo bisogno di correggere le opzioni di compilazione :)

Inoltre, conoscere le opzioni di compilazione non è quasi mai una cattiva idea, ti servirà bene in Ada & molte altre lingue.

+1

Sì, è un dettaglio di implementazione che GNAT utilizza il file system per [_library units_] (http://www.adaic.org/resources/add_content/standards/05rm/html/RM-10.html). – trashgod