jueves, 8 de agosto de 2013

Compilación cruzada para Raspberry Pi desde Windows [III]: un IDE ligero y funcional con Notepad++

En el primer post sobre compilación cruzada para Raspberry Pi desde Windows vimos los fundamentos de la toolchain que SysProgs ofreceEn el segundo, complementamos la instalación de la toolchain con la librería BCM2835, que permite el acceso cómodo a los pins IO de la RPi.  Lo que pretendemos ahora no es sólo disfrutar de una edición de código cómoda, sino complementarla con un proceso de compilación y gestión de los ejecutables productivo y eficiente. Elegimos para ello el software Notepad++, que es un conocido editor de ficheros de texto orientado a la programación, distribuido bajo GPL, y con unos cuantos años ya a sus espaldas. Su arquitectura abierta ha permitido diseñar un buen número de plugins que complementan las típicas (y no tan típicas) opciones de edición de código que este editor ya implementa de serie.

image

Es, precisamente, uno de sus plugins, NppExec, el que nos va a permitir habilitar opciones de ejecución de programas o comandos externos con los que conseguir, como vamos a ver, nuestros objetivos. 
Empezaremos por activar NppExec, para lo que iremos al menú Plugins de Notepad++, y allí elegiremos la opción Plugin Manager / Show Plugin Manager, lo que abrirá la ventana del gestor de plugins. En ésta, marcaremos el plugin y lo instalaremos pulsando el botón Install
 image

Inmediatamente después tendremos acceso a las opciones del plugin por medio del menú Plugins: 

image
 
Es a partir de este momento cuando podemos empezar a disfrutar de la potencia de la ejecución de programas externos. En primer lugar, recordemos del primer post sobre la compilación cruzada para la Raspberry Pi qué comando utilizábamos para compilar con gcc cualquier programa escrito en C (o C++): 

arm-linux-gnueabihf-gcc.exe nombre_programa.c –o nombre_programa_compilado 

que guarda alguna semejanza con el siguiente código que introduciremos en el cuadro que se abre cuando pulsamos la opción Execute del plugin (a la que podemos acceder directamente pulsando la tecla de función F6): 

image

Vamos por partes: en primer lugar, encontramos el comando NPP_SAVE, que es propio del plugin NppExec. Lo que hace este comando es salvar por nosotros el archivo fuente editado cada vez que llamemos a ejecución este código que estamos implementando, con lo que ya nos ahorramos una acción. 
La siguiente línea ejecuta el compilador, que es invocado por su nombre incluyendo su ruta completa. Sólo haría falta el nombre del programa si su ubicación estuviera registrada en la variable de entorno PATH. A continuación encontramos el término $(FULL_CURRENT_PATH), que se trata de la expansión de la variable predefinida del plugin FULL_CURRENT_PATH, y que hace referencia al nombre completo (incluyendo ruta) del fichero de código fuente. En el ejemplo que se ve en las pantallas, haría referencia al fichero holamundo.c que pretendemos compilar. 

Finalmente, encontramos la expresión –o $(CURRENT_DIRECTORY)\$(NAME_PART), que corresponde a la parte de la salida del comando de ejecución de GCC. La variable predefinida CURRENT_DIRECTORY referencia al directorio actual, que es el mismo en el que se mantiene el fichero fuente. Tras expandirla, le hacemos seguir a continuación el carácter “\” para, inmediatamente después, expandir la variable NAME_PART, que toma el valor del nombre del fichero sin su extensión (en nuestro ejemplo, esta variable toma como valor el nombre del fichero holamundo.c sin su extensión, por lo que la compilación nos dará como resultado un fichero ejecutable denominado holamundo). Podemos, por supuesto, consignar el directorio o el nombre del ejecutable que deseemos. Por ejemplo, $(CURRENT_DIRECTORY)\build\out situará el resultado final de la compilación (que se denominará out) en el directorio build, que será un subdirectorio del actual. 

Una vez introducidos estos comandos, pulsaremos Save…, llamaremos a nuestro script con el nombre que deseemos (por ejemplo, “RPi gcc”) en la ventana que se abre, y pulsaremos Save, con lo que ya tendremos salvado este procedimiento de compilación. 

En la misma ventana de Execute, activaremos el script pulsando OK, lo que provocará la compilación del programa. Los resultados los podremos revisar en la propia consola de Notepad++, que habremos activado con el icono Show Console Dialog (en nuestra versión de Notepad++, el tercer icono por la derecha). Como vemos en la pantalla, en el ejemplo tenemos un error en el código que es puesto de manifiesto por la salida de GCC, interceptada por la consola de Notepad++:

image  
Para mayor comodidad, podemos incluir una entrada directa a este procedimiento en el menú Macro, para lo que iremos al menú Plugins / NppExec / Advanced Options…, donde elegiremos nuestro script en Associated script y lo denominaremos como creamos conveniente, marcando la opción Place to the Macros submenu:


Una vez que rearranquemos Notepad++, tendremos acceso directo al script de compilación desde el menú Macro:


Finalmente, vamos a asignar una combinación de teclas para, todavía, mayor facilidad de acceso a la orden de compilación. Para ello vamos al menú Configuración, donde entramos en el Gestor de atajos de teclado… 


En la ventana que se abre, elegiremos la pestaña u opción Plugin commands, donde encontraremos nuestra entrada (RPi gcc), la seleccionaremos pulsando encima de ella, y pulsaremos después el botón Modify


En la ventana de Shortcut que se nos abre elegiremos la opción de teclas que queramos (ojo, las opciones de combinaciones libres no son tantas; si no funciona la combinación elegida quizá ya esté tomada por otro comando o script). Pulsaremos OK y en la ventana del Shortcut mapper pulsaremos Close, con lo que ya tendremos acceso a la compilación pulsando la combinación de teclas elegidas (en nuestro ejemplo, Ctrl+F10 desencadenará el compilado del programa fuente activo). 
Podremos añadir otros scripts. Por ejemplo, para incluir la librería BCM2835 el comando de compilación debería ser:

C:\SysGCC\Raspberry\bin\arm-linux-gnueabihf-gcc.exe $(FULL_CURRENT_PATH) -l bcm2835 -o $(CURRENT_DIRECTORY)\$(NAME_PART)

O añadiendo la opción –ggdb al comando de compilación, lo que aportará al ejecutable abundante información de compilación que podrá explotarse con GDB, el depurador GNU:


De la misma manera, es fácil incorporar otro script que ejecutara directamente GDB (arm-linux-gnueabihf-gdb.exe) en la consola de Notepad++. Como ya se comentó en el primer post sobre la compilación cruzada para la RPi, el tutorial de SysProgs sobre su toolchain incluye una introducción muy sencilla y básica a la depuración remota desde Windows de una ejecución bajo el Linux de la Raspberry Pi. 


Finalmente, podremos arrancar programas externos desde el propio Notepad++. Iremos al menú Ejecutar / Ejecutar, donde en la ventana correspondiente elegiremos el programa a ejecutar. Cuando pulsemos Guardar… se abrirá la venta de Shortcut que nos permitirá elegir una combinación de teclas para ejecutar el programa externo: 
 

Creo que puede atisbarse la potencia de los scripts del plugin de Notepad++, así que expandamos nuestra ambición:  ¿podríamos, entonces, complementar los comandos que hemos visto con algún otro que descargara el ejecutable directamente desde el entorno Windows a la Raspeberry Pi?  Y ya puestos, ¿podríamos marcar de forma remota este fichero como ejecutable?  ¿E iniciar su ejecución?  Las respuestas son sí, sí y sí.  Pero llevará su trabajo en el próximo post.  

No hay comentarios: