martes, 27 de marzo de 2018

Organización de los archivos de un proyecto (parte 2)

En en el post anterior comenté sobre los motivos para organizar los archivos de un proyecto de una forma más estructurada que la que ofrece ZinjaI al crear un proyecto, y sobre una estructura de subcarpetas más o menos habitual en proyectos medianos. Ahora toca ver cómo adaptar el proyecto de ZinjaI a esta nueva organización.


¿Cómo ajustar mi proyecto si reorganizo los fuentes existentes en carpetas?

El archivo de proyecto de ZinjaI (el .zpr) contiene referencias a los fuentes que debe procesar/mostrar/compilar. Estas referencias son rutas relativas a la ubicación del zpr mismo. Entonces, si se mueven los fuentes tanto como el zpr (por ej, si movemos ambas cosas a la carpeta src), no habrá problemas al abrirlo en ZinjaI. Pero si se mueven de forma diferente (los fuentes a src, pero el zpr no; o los fuentes se distribuyen dentro de src en sus propias subcarpetas), entonces las rutas relativas ya no serán válidas. Tendremos, o bien que mover los archivos desde ZinjaI (si son muy pocos, porque por ahora se hace de a uno), o bien moverlos por fuera (consola, explorador, etc) y luego reajustar el proyecto.


Desde ZinjaI, podemos mover un fuente utilizando la opción de "renombrar" (click derecho en la pestaña o en el árbol de proyecto) y luego eligiendo otra ubicación en el cuadro que aparece (que es el mismo de "guardar como..."). Si se movió por fuera, hay que quitarlo del proyecto y luego volverlo a agregar. Lo bueno es que se pueden agregar de a muchos con click derecho en  "Fuentes" en el árbol de proyecto.

La tercera opción, para "hackers" consiste en abrir el .zpr con cualquier editor de texto y buscar y reemplazar en las lineas "path=...", que son las que indican estas rutas relativas.


Ya armé las subcarpetas, pero el árbol de proyecto sigue siendo un lío...

El árbol de proyecto de ZinjaI muestra todos los archivos asociados al proyecto, sin importar si hay muchos, o si están organizados en carpetas. ¿Cómo podemos hacer para ver reflejada nuestra nueva organización en ese panel?

Si los archivos no son muuuchos, una opción es hacer que ZinjaI muestre en el árbol de proyecto las rutas relativas completas (click derecho en el árbol, hay una opción el menú contextual para esto). De esta forma, vemos a qué carpeta/módulo corresponde cada una, y el orden alfabético de la lista los ordena naturalmente por carpeta.


Si la estructura es muy compleja o los archivos demasiados para una sola lista; entonces podemos usar el panel "explorador" (Ctrl+E) en lugar del panel de "proyecto". Este panel muestra simplemente todos los archivos de una carpeta, anidados por carpetas, como lo haría un explorador de archivos. Si queremos, podemos hacer que ZinjaI siempre muestre el explorador en lugar del panel de proyecto, tomando como raiz la carpeta base de dicho proyecto (que se puede cambiar y se guarda en el .zpr), al abrir un proyecto. Esto se configura desde la pestaña "Programa/Proyecto" del cuadro de Preferencias (Ctrl+P).



¿Cómo reajustar mi proyecto para que considere bin, temp e include?

En las opciones de compilación y ejecución (menú Ejecución->Opciones...) es donde definimos en qué carpeta estarán los temporales (.o), el ejecutable (exe/bin), y cual será la carpeta de trabajo al momento de la ejecución (que puede ser diferente de la que contiene al ejecutable).
Aclaración: en los ejemplos voy a empezar todas las rutas con "../", porque deben ser relativas al zpr, y asumo que el zpr está en src con los fuentes. Si en lugar de estar en src, está en la raiz del proyecto, entonces no va el "../".

Entonces, en "Directorio para archivos temporales e intermedios" de la pestaña "Compilación" deberíamos definir temp o build, agregando una subcarpeta diferente para cada perfil (por ejemplo, "../temp/debug_lnx" para un perfil de depuración en GNU/Linux). Por otro lado, en la pestaña "General" se define la carpeta de trabajo (que debería ser "../bin" según la organización), y la ruta final del ejecutable (que podría ser "${TEMP_DIR}/foo.exe" en debug para que valla con los temporales, y "../bin/foo.exe" en release para que la versión final valla a parar a "bin").


Si tenemos los .h en carpetas diferentes a las de los .cpp (o bien porque hay subcarpetas en "src", o bien porque están en "include"), en la pestaña "Compilación", el campo "Directorios adicionales para buscar cabeceras" permite introducir esas direcciones para que al hacer los #includes en el código baste solo con el nombre del header (de lo contrario se requeriría toda la ruta relativa respecto de cada cpp). Por ejemplo, si pusimos los headers en "include", allí podría ir "../include".


¿Qué más puedo hacer?

El resto de las cosas creo que no dependen de ZinjaI, pero hay algunas funcionalidades a tener en cuenta. 
  • Si el proyecto (en general, el sistema, no el zpr) amerita la división en diferentes subproyectos (ahora sí, diferentes .zpr), se puede considerar el mecanismo de herencia de proyectos de ZinjaI (cuando un .zpr hereda los fuentes de otro; por ejemplo un programa cliente los de una biblioteca que quiere incorporar como parte propia).
  • Otra funcionalidad que puede ser útil es la de definir toolchains "externos" (en los que la compilación y ejecución se delega a herramientas externas, como por ejemplo make). 
  • También se pueden utilizar las herramientas personalizadas para lanzar diferentes scripts del proyecto (cmake/configure, ejecución de tests, compilación de recursos alternativos o de documentación, etc).


Finalmente, si hay algo que no se puede hacer o es molesto, pueden escribir en el foro preguntando cómo hacerlo o sugiriendo agregar alguna funcionalidad para tal fin, ya que ZinjaI sigue en constante desarrollo y muchas funcionalidades más avanzadas o específicas se van completando a medida que se hacen necesarias.

No hay comentarios:

Publicar un comentario