CMake: Compilando aplicaciones ZeroC Ice

IceArco

Esta receta explica cómo compilar un Hola Mundo para el middleware ZeroC Ice utilizando CMake.

Software necesario

Puedes descargarte el software que se va a utilizar del siguiente repo subversion:

$ svn co https://arco.esi.uclm.es/svn/public/samples/cmake/hello_ice

En el repositorio se encuentra la implementación de un "Hola Mundo" para ZeroC Ice y el CMakeLists.txt asociado.

Herramientas externas

Un programa en Ice presenta un problema común: archivos que se generan con herramientas externas al proyecto son necesarios para la compilación. En Ice, slice2cpp genera código que debe ser incluido en la compilación.

CMake proporciona un comando muy útil llamado ADD_CUSTOM_COMMAND y que permite definir cómo se generan ciertos objetivos. Utilizando este comando, veamos cómo quedaría el programa CMake para construir el Hola Mundo en Ice:

 
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
 
PROJECT(hello_ice)
 
FIND_LIBRARY(ice_lib Ice)
FIND_PATH(ice_path Ice)
 
IF(NOT ice_path)
  MESSAGE(FATAL_ERROR "** Librería de Ice no encontrada")
ENDIF()
 
# Variable con los slices necesarios
SET(SLICES ${CMAKE_CURRENT_SOURCE_DIR}/slice/hello.ice)
 
# slice2cpp
ADD_CUSTOM_COMMAND (
  OUTPUT hello.cpp hello.h
  COMMAND slice2cpp ${SLICES}
  )
 
INCLUDE_DIRECTORIES(
  ${CMAKE_CURRENT_SOURCE_DIR}
  ${CMAKE_CURRENT_BINARY_DIR}  # slice2cpp deja el .h en el directorio en 'build'
  ${ice_path}
  )
 
ADD_EXECUTABLE(Client hello.cpp Client.cpp)
ADD_EXECUTABLE(Server hello.cpp helloI.cpp Server.cpp)
TARGET_LINK_LIBRARIES(Server ${ice_lib})
TARGET_LINK_LIBRARIES(Client ${ice_lib})

Al principio, se hacen unas liberas comprobaciones de que la librería de Ice existe. A continuación se define el comando slice2cpp diciendo que como salidas los ficheros hello.cpp y hello.h a partir del fichero Slice hello.ice. Los archivos de salida son dependencias de los distintos ejecutables que se deben crear. Finalmente, se enlaza con las librerías necesarias.

Referencias

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Reglas genéricas

Mmmm, no quiero ser el escéptico, pero la regla de compilación de los Slice es poco menos que inútil…

ADD_CUSTOM_COMMAND (
  OUTPUT hello.cpp hello.h
  COMMAND slice2cpp ${SLICES}
  )

Con esto solo tienes cómo generar hello.h y hello.cpp. Y está mal, porque si SLICES no contiene hello.ice slice2cpp jamás generará esos hello.h y hello.cpp. No muy útil, la verdad.

En make estándar basta:

%.h %.cpp: %.ice
    slice2cpp $(SLICEFLAGS) $<

¿De verdad es más cómodo CMake?

Imagen de Lk2

Correcciones

Primero de todo: GRACIAS

Primero de lo demás: la ruta que das para descargar el repositorio es incorrecta (o al menos ahí no hay ningún slice).

He conseguido descargar el ejemplo que usa Ice desde el repositorio, pero el CMakeLists.txt es diferente en bastantes cosas (por ejemplo en vez de FIND_LIBRARY utilizas "check_library_exists" y algunas cosas más diferentes. ¿Qué versión es más nueva? ¿Repo o receta?