Conan, el administrador de paquetes y dependencias para C y C++, liberó la versión 2.0.0 en febrero 21 de 2023 incluyendo varios cambios relevantes con respecto a la versión anterior 1.X, algunos con los cuales se requirió actualizar los paquetes, pues no eran compatibles con la siguiente versión.

cmake-conan es un proveedor de dependencias para usar Conan en CMake. También ha sido actualizado para funcionar con Conan 2.X a partir de la versión 2.0.5, desde CMake 3.24.

Para integrar CMake con la versión 1.X de conan usando cmake-conan hace falta modificar el archivo CMakeLists.txt con algunas instrucciones adicionales, como se planteaba en la publicación Conan como administrador de paquetes.

Para conan 2.X es mucho más sencillo y directo, solo hay que tener en cuenta algunas consideraciones, y el uso de find_package() es transparente.

Configuración

No obstante, puede haber algunas configuraciones requeridas para hacerlo funcionar la primera vez.

Uno de los retos que tuve fue la actualización a Ubuntu 24. Teniendo en cuenta que conan es instalado desde python, Ubuntu 24 requiere crear un python virtual environment y sobre éste instalar conan.

El primer reto es realizar esta instalación y tener en cuenta la ruta absoluta del ambiente virtual de python1 en el que se instala conan.

El segundo es el cambio de generators y layouts de conan definidos en el conanfile que puede ser un script .py, o un archivo de texto .txt.

El tercero es el uso de cmake-conan, que requiere descargar el archivo conan_provider.cmake.

Con todo la anterior listo (y con cmake > 3.24) solo basta definir la variable CMAKE_PROJECT_TOP_LEVEL_INCLUDES apuntando a la ruta absoluta hacia el archivo conan_provider.cmake, y elegir el CMAKE_BUILD_TYPE para que un proyecto que use find_package() funcione integrando cmake, conan, y el paquete a usar. Si el build type es debug entonces también hará falta validar que exista un perfil de conan con esa misma configuración, ya que el perfil predeterminado es de tipo release.

Ejemplo usando fmt

Para este ejemplo de uso de fmt 11.2.0 manejado por conan 2, usando cmake-conan, se requieren los siguientes archivos:

  1. CMakeLists.txt

     cmake_minimum_required(VERSION 3.24)
        
     project(hello_fmt_cpp
       VERSION "1.0.0"
       DESCRIPTION "fmt 11 con conan-cmake"
       LANGUAGES CXX
     )
    
     add_executable(${PROJECT_NAME} main.cpp)
    
     find_package(fmt REQUIRED)
    
     target_include_directories(${PROJECT_NAME}
       SYSTEM PRIVATE ${fmt_INCLUDE_DIRS})
    
     target_link_libraries(${PROJECT_NAME}
       PRIVATE ${fmt_LIBRARIES})
    
  2. conanfile.txt

     [requires]
       fmt/11.2.0
    
     [generators]
       CMakeDeps
    
     [layout]
       cmake_layout
    
  3. main.cpp

     #include <fmt/core.h>
    
     int main()
     {
       fmt::print("Hola fmt 11 con cmake-conan 2.X\n");
     }
    
  4. Descargar el archivo conan_provider.cmake desde github:

     wget https://raw.githubusercontent.com/conan-io/cmake-conan/refs/heads/develop2/conan_provider.cmake
    

Compilación

Con esos cuatro archivos en el directorio local ya se puede proceder a compilar, teniendo en cuenta que hay que definir las variables CMAKE_BUILD_TYPE y CMAKE_PROJECT_TOP_LEVEL_INCLUDES:

mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_PROJECT_TOP_LEVEL_INCLUDES=/ruta-a/conan_provider.cmake
cmake --build .

Al finalizar exitosamente se puede ejecutar el programa:

./hello_fmt_cpp

Obteniendo:

Hola fmt 11 con cmake-conan 2.X

Para CLion

Adicional a lo anterior, para CLion hace falta indicarle dónde está instalado conan, es decir, la ruta al virtual environment de python en el que se encuentra el paquete de conan 2.X. Para hacerlo hay que ir a: Settings> Build> CMake: CMake options y agregar las siguientes opciones:

-DCMAKE_PROJECT_TOP_LEVEL_INCLUDES="/ruta/a/conan_provider.cmake"
-DCONAN_COMMAND="/ruta/a/.venv/bin/conan"

Así, CLion podrá configurar el perfil usado (debug o release) para funcionar con conan, siempre y cuando encuentre un archivo conanfile en la raíz del proyecto, y el archivo conan_provider.cmake.

También es posible usar directamente el plugin de conan2 quien se encargará de descargar el archivo provider. Hará falta indicarle solamente la ruta del ambiente virtual de python, y permitirá ver información de paquetes directamente desde el plugin.

Fuentes

Deja un comentario