2012-09-25 33 views
9

Estoy haciendo una introducción al curso de programación en la universidad, y el idioma de elección es Ada. Estoy codificando en Kate y compilando con GNAT 4.6.3. Tenemos que utilizar las bibliotecas proporcionados por el maestro para nuestros programas, así:Obtener Ada (compilado con GNAT) para importar archivos desde fuera del directorio actual?

with foo; 
use foo; 

Por supuesto, el archivo foo.adb tiene que ser contenida en el mismo directorio que mi archivo de origen. Dado que varios proyectos dependen de esta biblioteca, y me gusta mantener cada proyecto en su propio subdirectorio, tengo que copiar los archivos de la biblioteca en cada nuevo proyecto. Sin mencionar que mi código de biblioteca y código fuente están todos en el mismo directorio.

Entonces, ¿hay alguna manera de ordenar de go:

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

?

He intentado buscar un poco, pero todo lo que he encontrado es información sobre las opciones del compilador. Prefiero no tener que perder el tiempo con eso, especialmente porque solo ciertos proyectos necesitarán esta biblioteca en particular, por lo que no tendría sentido agregarlo a una configuración de compilación global y hacer que el compilador inútilmente busque las rutas que no utiliza. no necesitas buscar

Respuesta

8

Usaría las instalaciones del proyecto GNAT con la línea de comando gnatmake.

Acabo de establecer un pequeño ejemplo (¡así puedo estar seguro de que lo que digo funciona!). Tengo 3 directorios; teacher/ contiene la fuente proporcionada por el maestro, que supongo que no querrá cambiar y puede que no tenga acceso de escritura de todos modos, jacks_lib/ contiene que apunta a teacher/ (también puede poner allí su propio código de biblioteca) y jack/ contiene su código main.adb y 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; 

Luego, en 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 

Debo agregar que estoy usando GCC 4.7.0 en Mac OS X, pero esto debería funcionar bien con cualquier GNAT reciente.

5

opciones del compilador son la forma de gestionar las ubicaciones de código fuente para una generación - la definición de "rutas de búsqueda" - en particular la opción "-i" (incluir) para (como GNAT) basado en gcc y la mayoría de los compiladores .

Si usted está construyendo desde la línea de comandos, es simplemente una cuestión de:

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

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

Si está utilizando el GPS (GNAT Programación Studio), a continuación, abra el cuadro de diálogo Propiedades del proyecto, seleccionar los directorios Fuente pestaña, y agregue las rutas de búsqueda allí. (También puede editar directamente un archivo de propiedades del proyecto (".gpr") directamente, pero raramente lo hago. YMMV). La configuración del compilador se configura fácilmente por proyecto, por lo que no hay un problema de "configuración del compilador global" con cuál debería preocuparse por sí mismo.

+0

Me temo que estamos usando un editor de texto bastante escueto, no un GPS ... Creo que podría escribir un script bash para manejar la configuración de las opciones de línea de comandos para mí, o algo? –

+0

Si puede invocar gnatmake desde la línea de comandos, también puede invocarlo desde un script. –

3

Ampliando sobre la respuesta de @ Marcc, la GNAT User's Guide cubre gnatmake en el capítulo 6, bajo §6.2 Interruptores para gnatmake: Fuente y la ruta de búsqueda de bibliotecas interruptores; la guía debe incluirse con su distribución. El comando gnatmake es un objetivo conveniente para make, como se muestra en este example.

3

Su no ha mencionado explícitamente en las respuestas sofar, por lo que voy a decir que:

Los with & use cláusulas en Ada hacemos ninguna demanda sobre la ubicación de los & unidades usadas withed, solamente que existen.

Cuando se trata de encontrar realmente las unidades, que depende totalmente de los guiones make & .gpr archivos & opciones de compilación o cualquier otra cosa que ocurra.

Así es como Ada crea un grado de portabilidad de código (por no vinculante del código a una estructura de directorios!), Sólo tiene que corregir las opciones de compilación :)

Además, aprender acerca de las opciones del compilador es casi nunca una mala idea, le servirá bien en Ada & muchos otros idiomas.

+1

Sí, es un detalle de implementación que GNAT utiliza el sistema de archivos para [_library units_] (http://www.adaic.org/resources/add_content/standards/05rm/html/RM-10.html). – trashgod

Cuestiones relacionadas