2012-09-25 14 views
9

Robię wstęp do programowania na uniwersytecie, a wybranym językiem jest Ada. Koduję w Kate i kompiluję z GNAT 4.6.3. Musimy korzystać z bibliotek nauczyciela-dla naszych programów, tak jak poniżej:Pobierz Ada (skompilowana z GNAT), aby zaimportować pliki spoza bieżącego katalogu?

with foo; 
use foo; 

Oczywiście, wtedy plik foo.adb musi znajdować się w tym samym katalogu, co moim pliku źródłowego. Ponieważ wiele projektów zależy od tej jednej biblioteki i lubię trzymać każdy projekt w jego własnym podkatalogu, muszę skopiować pliki biblioteki do każdego nowego projektu. Nie wspominając już o tym, że mój kod biblioteczny i kod źródłowy znajdują się w tym samym katalogu.

Więc jest jakiś sposób, aby rodzaj podróży:

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

?

Próbowałem już trochę się rozejrzeć, ale wszystko, co znalazłem, dotyczyło opcji kompilatora. Raczej nie będę musiał z nimi mieszać, tym bardziej, że tylko niektóre projekty będą wymagać tej konkretnej biblioteki, więc nie ma sensu dodawać jej do globalnego ustawienia kompilatora i mieć kompilator bezsensownie szukający ścieżek, które robi. nie musisz szukać.

Odpowiedz

8

Chciałbym użyć obiektu projektu GNAT z wiersza polecenia gnatmake.

Właśnie przygotowałem mały przykład (dzięki czemu mogę być pewny, że to, co mówię, działa!). Mam 3 katalogi; teacher/ zawiera źródło dostarczone przez nauczyciela, co do którego zakładam, że nie będziesz chciał się zmieniać i może nie mieć dostępu do zapisu, jacks_lib/ zawiera teacher.gpr, który wskazuje na teacher/ (możesz również tam umieścić swój własny kod biblioteki) i jack/ zawiera kod main.adb i 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; 

Następnie w 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 

Powinienem dodać, że używam GCC 4.7.0 na Mac OS X, ale powinno to działać dobrze z każdym nowym GNAT-em.

5

Opcje kompilatora to sposób zarządzania lokalizacjami kodu źródłowego dla kompilacji - definiowanie "ścieżek wyszukiwania" - w szczególności opcji "-I" (włącz) dla opartych na gcc (takich jak GNAT) i większości innych kompilatorów .

Jeśli budujesz z linii poleceń, to po prostu kwestia:

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

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

Jeśli używasz GPS (GNAT Programming Studio), a następnie otworzyć okno właściwości projektu, wybierz katalogi źródłowe kartę i dodaj tam ścieżki wyszukiwania. (Możesz także bezpośrednio edytować plik właściwości projektu (".gpr") bezpośrednio, ale rzadko to robię.) YMMV.) Ustawienia kompilatora można łatwo skonfigurować dla każdego projektu, więc nie ma problemu z "ustawieniem globalnego kompilatora" który musiałby się nimi zająć.

+0

Obawiam się, że używamy edytora tekstowego o dość gołym kośćcu, a nie GPS ... Myślę, że mógłbym napisać skrypt basha do obsługi ustawiania opcji wiersza poleceń dla mnie, czy coś w tym stylu? –

+0

Jeśli możesz wywołać gnatmake z wiersza poleceń, możesz równie dobrze wywołać go ze skryptu. –

3

amplifikujące na @ odpowiedź MarcC, tym GNAT User's Guide obejmuje gnatmake w rozdziale 6, pod §6.2 Przełączniki dla gnatmake: Source i biblioteki wyszukiwania ścieżki przełącza; przewodnik powinien być dołączony do twojej dystrybucji.

Polecenie gnatmake jest wygodnym celem dla make, jak pokazano w tym example.

3

Jego nie zostały wyraźnie wymienione w odpowiedziach SOFAR, więc powiem to:

W with & use klauzul Ada dokonać żadnych roszczeń o lokalizacji z withed & używanych jednostek, tylko , które istnieją pod adresem.

Jeśli chodzi o faktycznie znalezienie jednostki, która należy wyłącznie do skryptów make & .gpr pliki & opcje kompilacji lub cokolwiek innego wymyślić.

ten sposób Ada tworzy stopień przenośności kodu (przez który nie wiąże kod do struktury katalogów!), Po prostu trzeba skorygować opcje kompilacji :)

także poznawanie opcji kompilatora jest prawie nigdy zły pomysł, będzie ci dobrze służyć w Ada & wielu innych językach.

+1

Tak, to szczegół implementacji, który GNAT używa systemu plików dla [_library units_] (http://www.adaic.org/resources/add_content/standards/05rm/html/RM-10.html). – trashgod