Desaventuras en la tierra de Linux, parte 11

En fechas recientes he tenido un renovado interés en volver a programar después de varios meses prácticamente sin escribir ni una línea de código. He estado usando Geany para programar y está bien para programas pequeños pero le faltan algunas características que lo hacen quedarse corto para programas más complejos, en particular extraño el completado inteligente que tiene VIM pero aún no me siento preparado para volver a utilizarlo 😛 . Así que, buscando una alternativa para programar, encontré en el gestor de paquetes un IDE de programación llamado CodeLite. Luce como un IDE completo e incluso parece tener algunas características interesantes como una opción para diseñar interfaces de usuario de forma visual.

Entonces, ¿cuál es el problema?. Esta es mi -corta- experiencia con CodeLite:

Al seleccionar la opción Nuevo Proyecto del menú, aparece un gran número de opciones dependiendo de qué clase de proyecto quieras desarrollar, eso suena como una buena opción. Así que voy a seleccionar la opción Console > CMake Executable para generar un programa basado en CMake.

A continuación hay que seleccionar un nombre y ruta para el proyecto. Hasta ahora todo bien.

De regreso a la ventana principal de CodeLite y con el proyecto “listo para usar” podemos ver que han sido creados automáticamente un par de archivos:

resources/CMakeLists.txt
src/main.cpp

Justo como era de esperarse para un proyecto de CMake, ha sido creado un archivo CMakeLists.txt e incluso CodeLite nos ha hecho el favor de crear nuestro archivo principal de código main.cpp con un código básico de Hello world a partir del cual podemos trabajar. ¡Todo esto es genial! ¿Por qué no probamos el código base que CodeLite tan amablemente ha escrito para nosotros?. Selecciones la opción del menú Build > Run.

El resultado:

make: *** No se especificó ningún objetivo y no se encontró ningún makefile.  Alto.
/usr/lib/codelite/codelite_exec: 22: /usr/lib/codelite/codelite_exec: ./build-debug/HelloWorld: not found
Press ENTER to continue...

¡Genial… CodeLite no puede compilar ni siquiera el Hello world que él mismo generó! ¡Este es el tipo de cosas que hacen que la gente no pueda tomar en serio a Linux! ¡Este es el tipo de cosas que hacen que la gente desinstale el programa y nunca vuelva a considerar usarlo! ¡Yo mismo no pienso volver a usarlo!.

OK… tal vez estoy siendo injusto con CodeLite… tal vez la opción de CMake no está correctamente programada por alguna razón. Al intentar con un proyecto básico de gcc en la opción de Console > Simple executable (gcc) en la selección de nuevos proyectos, una vez más, CodeLite genera un simple programa de Hello world, esta vez no usa CMake y el código es un simple archivo .c y no uno .cpp. Al seleccionar el menú Build > Run esta vez funciona correctamente.

Así que tal vez CodeLite no es tan malo después de todo. Aún así es imperdonable que falle al compilar una de sus opciones predeterminadas. ¡Cuando escribes algo como esto o te aseguras que funcione o no le das soporte! No puedes presentar tu código como un proyecto serio cuando tiene este tipo de errores y si, como en mi caso, un usuario tiene la mala suerte de que lo primero que intenta hacer con tu software es justo eso que no funciona, pueden imaginar la mala impresión que eso genera 😦 . No sé si seguiré usando CodeLite después de esta pésima primera impresión. Parece soportar algunas opciones que Geany no tiene, como lo que ya mencioné sobre el autocompletado así que tal vez le de una oportunidad más antes de volver a VIM.

Antes de cerrar este post sobre CodeLite, intentemos usar la integración con gdb para depurar el programa que acabamos de compilar… “No se pudo iniciar la ventana de GDB”.

¡No pienso batallar más con esta versión de CodeLite 😦 y la estoy desinstalando ahora!. Cabe mencionar que es posible que las versiones más recientes de CodeLite tal vez hayan arreglado este error pero, como lo he mencionado en otros posts, en Debian, debido a su filosofía, a veces puedes estar obligado a usar versiones antiguas del software 😦 lo que es por sí mismo material para otro post de desaventuras en la tierra de Linux.

En corto No. 2 – Tips de cmake

Si programas algo más complejo que un Hello World, es recomendable que tengas algún sistema para asistir en la compilación de tus programas; puede ser un makefile escrito a mano o, por ejemplo, un script de cmake.

En uno de mis proyectos recientes tengo algunos archivos de código fuente que son la base para un par de ejemplos. Mi script de cmake tenía las siguientes líneas:

ADD_EXECUTABLE (ejemplo-1 ${SOURCE_DIR}/ejemplo-1.c ${SOURCE_DIR}/base.c ${SOURCE_DIR}/extras.c)
ADD_EXECUTABLE (ejemplo-2 ${SOURCE_DIR}/ejemplo-2.c ${SOURCE_DIR}/base.c ${SOURCE_DIR}/extras.c)

Esto funciona pero noté que los archivos base.c y extras.c estaban siendo compilados dos veces cada que compilaba los programas, una vez para el ejecutable ejemplo-1 y otra vez para ejemplo-2. Normalmente esperaría que cada archivo sólo fuera compilado una vez pero al parecer eso no funciona así en cmake. En su lugar, para evitar compilar los archivos innecesariamente, se puede definir una librería temporal o de mentiras 😛 para que cada archivo sólo sea compilado una vez usando la instrucción ADD_LIBRARY con el modificador OBJECT. Por ejemplo:

ADD_LIBRARY(MI_LIBRERIA_DE_MENTIRAS OBJECT ${SOURCE_DIR}/base.c ${SOURCE_DIR}/extras.c)
ADD_EXECUTABLE (ejemplo-1 ${SOURCE_DIR}/ejemplo-1 $<TARGET_OBJECTS:MI_LIBRERIA_DE_MENTIRAS>)
ADD_EXECUTABLE (ejemplo-2 ${SOURCE_DIR}/ejemplo-2 $<TARGET_OBJECTS:MI_LIBRERIA_DE_MENTIRAS>)

 

 

En corto No. 1 – Imprimir el valor de un uint64_t con printf

En corto es una nueva serie de posts rápidos para cosas que no merecen escribir un post completo y detallado pero que pueden ser útiles. Los temas serán variados, desde programación, Linux, software y cualquier cosa que tenga en mente 😛 .

Comenzamos con cómo imprimir el valor de una variable uint64_t en C usando printf(). En primer lugar es necesario agregar el archivo de cabecera inttypes.h, además de stdint.h que se debe agregar para usar uint64_t:

#include <stdint.h>
#include <inttypes.h>

Ahora podemos imprimir el valor de una variable uint64_t con printf() de la siguiente manera:

uint64_t variable;
printf("%" PRIu64 "\n", variable);
printf("%" PRIx64 "\n", variable); // para imprimir en hexadecimal

Referencia completa aquí.

Modo 256 colores para la terminal de Linux Debian

He estado haciendo algunos experimentos con la librería ncurses (pronto habrá más noticias sobre estos experimentos). Mientras experimentaba, noté que algunas de las opciones avanzadas de color de ncurses no estaban disponibles en mi terminal de Linux (LXTerminal). Tras investigar un poco encontré que era necesario que la terminal estuviera en modo de 256 colores mientras que de forma predeterminada LXTerminal estaba en el modo de 8 colores como lo indica el siguiente comando:

monstruosoft@monstruosoft-PC:~$ tput colors
8

Buscando cómo activar el modo de 256 colores, visité varias páginas, todas indicaban que las terminales de Linux en general soportan modo de 256 pero también todas las páginas eran crípticas al respecto de cómo activar ese modo, eso sin mencionar que ningún resultado era específico para Debian.

Era obvio que la solución requería asignar a la variable de entorno TERM el valor xterm-256color. Al final la solución resultó ser justamente esa a pesar de lo crípticas que pudieran resultar las instrucciones en internet que, supongo, se refieren al procedimiento para que al abrir una ventana de terminal ésta inicie en modo de 256 colores. En mi caso, iniciar la terminal en modo de 8 colores y después cambiarme a modo de 256 colores era perfectamente válido.

monstruosoft@monstruosoft-PC:~$ tput colors
8
monstruosoft@monstruosoft-PC:~$ echo $TERM
xterm
monstruosoft@monstruosoft-PC:~$ export TERM=xterm-256color
monstruosoft@monstruosoft-PC:~$ echo $TERM
xterm-256color
monstruosoft@monstruosoft-PC:~$ tput colors
256

Estas simples instrucciones son suficientes para poner la terminal en modo de 256 colores y permite utilizar las opciones de personalización de color de ncurses.

[Nota:] Algunas aplicaciones pueden aprovechar las capacidades de la terminal y usar 256 sin necesidad de hacer el procedimiento anterior pero al menos para ncurses es necesario para poder usar algunas de las opciones avanzadas de color.