martes, 10 de febrero de 2009

MSYS

Una de las herramientas más útiles que he encontrado para el desarrollo en windows es sin duda MSYS.

Extraido de su página:

MSYS es una colección de utilidades GNU como bash, make, gawk y grep que permiten construir aplicaciones y programas que dependen tradicionalmente de la presencia de herramientas UNIX. Esta especialmente pensado para suplementar a MinGW y las deficiencias de la shell cmd (de windows).

Un ejemplo sería construir una libreria que hace uso de autotools build system. Los usuarios normalmente ejecutarían "./configure" y luego "make" para compilarlo. El script de configuración requiere un interprete que no está presente en sistemas Windows, pero incluido en MSYS.

No hay que confundir a MSYS como "UNIX en Windows", MSYS no incluye ningúna libreria ni compilador para C, por lo que no da la habilidad de portar magicamente programas UNIX a Windows ni proporciona ningúna funcionalidad especifica de UNIX como los nombres de ficheros sensibles a mayúscula.

Resumiendo: Con MSYS puedes compilar facilmente software multiplataforma con herramientas como make o configure (entre otras).

Un ejemplo es lo sencillo que resulta compilar SQLite para windows:
  1. Descarga el paquete sqlite-amalgamation-X.X.X.tar.gz de SQLite. Este incluye el código fuente tanto de la libreria como de la shell, además de los scripts de configuración.
  2. Dentro del directorio donde tengamos instalado MSYS existe un directorio llamado home. Este directorio es el destinado a colocar los ficheros provenientes de windows, asi que creamos un directorio nuevo dentro de home y lo llamamos "sqlite".
    Dentro descomprimimos el paquete descargado.
Hecho esto ya podemos ejecutar MSYS: Directorio de instalacion/msys.bat
Nos aparece una shell, parecida a cmd.exe de windows (pero mejor!). Aquí lo importante es recordar que los comandos que funcionan son los de UNIX/Linux; así que dir no funciona, habrá que utilizar ls.
Bien, cuando MSYS se abre el directorio de inicio es home, así que desde este lugar podemos acceder facilmente al directorio anteriormente creado sqlite:
cd sqlite
Lo siguiente es ejecutar configure para que prepare el sistema para la compilación:
configure
Por ultimo ejecuta:
make
Lo cual empezará el proceso de compilación.
Una vez terminado, en el mismo directorio se habrá creado un nuevo directorio ".libs", dentro del cual encontraremos la dll para windows necesaria para la distribución de nuestros programas, libsqlite3.a para linkar con codeblocks y sqlite3.exe, la linea de comandos de sqlite.

jueves, 5 de febrero de 2009

Qt 4.5, LGPL 2.1 y templates C++

Traducido de: obsenthryl's

La noticia ya ha llegado a los titulares de un montón de sitios web. Pero esta entrada no trata sobre eso, empecemos leyendo el anuncio oficial:
Nokia se enorgullece de anunciar que con la salida de Qt 4.5 vas a poder usar Qt bajo la Lesser General Public License (LGPL) version 2.1. Cuando sea distribuida en Marzo del 2009, Qt estará disponible bajo tres licencias: Comercial, LGPL y GPL
Estamos hablando de un modelo tri-licencia, mencionando explicitamente que LGPL 2.1 no tendrá ninguna modificacion (lo mismo indica en otras secciones del mismo FAQ). En la FAQ relacionada encontramos:
Cual es la diferencia entre LGPL y GPL?

Ambas licencias son documentos complejos que requieren una cuidadosa lectura para apreciar las diferencias significantes entre ambas. Sin embargo, una explicación "por lo alto" es que la GPL requiere que cualquier trabajo derivado (ej: aplicaciones desarrolladas usando Qt) deben licenciarse bajo los terminos de la GPL. La LGPL es menos restrictiva y permite el desarrollo de aplicacions de código cerrado. Distribuiremos Qt bajo la version 2.1 de la licencia LGPL, además de continuar ofreciendo Qt bajo la version 3.0 de GPL.

Sí, requieren extremado cuidado en su lectura. Y también, en otra sección del anuncio:

Porque querría comprar una licencia comercial? Cual es la diferencia?

La licencia comercial de Qt incluye soporte por email, acceso a actualizaciones y te permite desarrollar software de código cerrado. La LGPL conlleva algunas restricciones relacionadas con la capacidad de los usuarios para relinkar librerias y otras restricciones que pueden imponer requerimientos de arquitectura con la que algunas organizaciones pueden no estar de acuerdo.
De acuerdo, buenas noticias para los que quieran usar la LGPLv2.1 con Qt4.5.
Pero lo que no he visto en la FAQ, son una seria de temas relacionados con la licencia LGPL 2.1 sin modificaciones propuesta. Uno de los temas tiene que ver con las templates de C++.
Aunque es cierto que Qt 4.4 por ahora, no usa templates para los signals y los slots, las usa para las clases contenedoras. Tiene una licencia LGPL v2.1 sin modificar -Asumo que es su intención, como puede entreverse en su FAQ y republicado en otros websites - en consideración el uso de templates C++ y de técnicas de "template metaprogramming" por código de terceros, cuando se instancian esas templates LGPL v2.1 en un modelo de licencia no LGPLv2.1?
Se sabe que la instanciación de templates en realidad anida el código dentro del código final del usuario de formas que trascienden lo especificado en una licencia LGPLv2.1 no modificada.

La experiencia de otros desarrolladores presentan una solución sencilla: LGPLv3 soluciona este tema.

La LGPL requiere que los usuarios sean capaces de reemplazar el código LGPL con una versión modificada; esto es trivial si la libreria en cuestión es una librería compartida escrita en C. Pero no hay forma de hacer eso con C++, donde la mayor parte de la librería consiste en funciones inline y templates, que se expanden dentro del código que usa la librería. Así que para permitir a la gente reemplazar el código de la librería, alguien que la use debería distribuir su propio código fuente, resultando la LGPL equivalente a la GPL.

El artículo original continua ahondando en los problemas de las "novedades" que ofrece C++ y el atraso de la LGPL v2.1 en este aspecto.

Sin embargo, parece que Nokia leyó el muy buen artículo y ha hecho saber que están trabajando en añadir una excepción a la LGPLv2.1 que solvente este asunto con las templates y funciones inline de C++.

Por ultimo aprovecho para decir que ya ha salido la Release Candidate de Qt4.5 para las diferentes plataformas: