Gestión de dependencias C++: Biicode

Hace tiempo que estoy interesado la construcción, gestión de dependencias, empaquetado y despliegue de proyectos software. Para Java, Scala, Python, etc. Es bastante sencillo ya que hay herramientas como Maven, Gradle, pip, Sbt, etc. Pero para C++_, lo más parecido que he encontrado es Maven con el plugin Nar o Gradle con su plugin cpp (que está en desarrollo).

Hace tiempo que conozco Biicode, pero no había sacado nunca tiempo para probarlo, hasta hoy.

El funcionamiento general es muy sencillo.

Necesitamos instalar biicode en nuestra máquina.

Yo he creado un pequeño ejemplo utilizando el sistema de log de la librería Poco.

He ejecutado este comando para crear mi proyecto, al que he llamado bii_log. Eso sí, lo tengo que crear debajo de mi nombre de usuario en Biicode, por si posteriormente lo quiero publicar.

bii new carlovin/bii_log --hello=cpp

Se ha creado una estructura de directorios y ficheros con nuestro proyecto. Aunque los únicos ficheros que vamos a tocar son:

blocks/carlosvin/bii_log/main.cpp
blocks/carlosvin/bii_log/biicode.conf

En el fichero biicode.conf vamos a configurar nuestras dependencias, en nuestro caso la librería Poco.

# Biicode configuration file

[requirements]
    fenix/poco(develop): 0

[parent]
        carlosvin/bii_log: 0

[includes]
    Poco/*.h: fenix/poco/Foundation/include

En la sección [includes], estamos redefiniendo la ruta a nuestros ficheros de cabeceras, porque si no lo hiciéramos tendríamos que hacer algo así:

#include "fenix/poco/Foundation/include/Logger.h"

Gracias a esta línea, en nuestro código tendremos includes más claros como:

#include "Poco/Logger.h"

Así de fácil, ya podemos utilizar la librería Poco en nuestro proyecto, por ejemplo:

#include "Poco/FileChannel.h"
#include "Poco/FormattingChannel.h"
#include "Poco/PatternFormatter.h"
#include "Poco/Logger.h"
#include "Poco/AutoPtr.h"

using Poco::FileChannel;
using Poco::FormattingChannel;
using Poco::PatternFormatter;
using Poco::Logger;
using Poco::AutoPtr;

int main(int argc, char** argv) {
        AutoPtr<FileChannel> pChannel(new FileChannel);
        pChannel->setProperty("path", "log/sample.log");
        pChannel->setProperty("rotation", "100 K");
        pChannel->setProperty("archive", "timestamp");

        //AutoPtr<ConsoleChannel> pCons(new ConsoleChannel);
        AutoPtr<PatternFormatter> pPF(new PatternFormatter);
        pPF->setProperty("pattern", "%Y-%m-%d %H:%M:%S %s: %t");
        AutoPtr<FormattingChannel> pFC(new FormattingChannel(pPF, pChannel));
        Logger::root().setChannel(pFC);

        Logger & logger = Logger::get("TestChannel");
        for(int i=0; i<10000; i++){
                poco_information(logger, "This is a info");
                poco_warning(logger, "This is a warning");
        }
        return 0;
}

Para compilar el proyecto simplemente hay que ejecutar:

bii cpp:build

Y para publicarlo y que cualquiera pueda utilizarlo, como nosotros hemos utilizado Poco:

bii publish

Además de lo sencillo que ha resultado todo, me ha gustado mucho que después de ejecutar "bii cpp:build", mi Eclipse con CDT indexaba perfectamente el código, así como el autocompletado y la navegación entre clases y métodos.

También he leído un artículo sobre lo bien que se integra con CLion: When CLion met biicode.

Comentarios