build process - tutorial - Construyendo una biblioteca usando autotools de cmake
cmake tutorial (1)
Este es mi primer intento con cmake y me gustaría tener, si es posible, algunos comentarios sobre lo que hice, ya que aún quedan algunos problemas.
En el CMakeLists.txt de la carpeta de la biblioteca, creé dos destinos de makefile: configure-antlr3c
y antlr3c
. El primer destino ejecuta el script de configuración de autotools, el segundo ejecuta el ejecutable make para construir la biblioteca:
# CMakeLists.txt in libantlr3c-3.1.3
add_custom_target(
configure-antlr3c
${SHELL_EXECUTABLE} configure
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)
add_custom_target(
antlr3c
${MAKE}
DEPENDS configure-antlr3c
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)
El problema principal es que configure-antlr3c
target siempre está "desactualizado", por lo que siempre se ejecutará aunque no se produzcan cambios. Además, necesariamente necesito generar mis makefiles cmake en un directorio separado (no en el directorio raíz de mi proyecto) para evitar anular los autotools Makefile de la biblioteca ...
¿Alguien ha tenido este problema (construir proyectos de autotools con cmake)? Y si es así, ¿cuáles han sido tus soluciones?
Gracias.
EDITAR: Solución en la raíz CMakeLists.txt:
include(ExternalProject)
ExternalProject_Add(
libantlr3c
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lib/libantlr3c-3.1.3
CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/lib/libantlr3c-3.1.3/configure --prefix=${CMAKE_CURRENT_SOURCE_DIR}/lib/libantlr3c-3.1.3
PREFIX ${CMAKE_CURRENT_SOURCE_DIR}/lib/libantlr3c-3.1.3
BUILD_COMMAND make
BUILD_IN_SOURCE 1
)
Creo que sería mejor usar la característica ExternalProject de cmake. Supongo que tienes tu proyecto y tienes libantrl en un subdirectorio?
project
+- libantlr
+- mysrc
---- etc ----
Si ese es el caso, puedes hacer algo como esto en el nivel superior CMakeLists.txt:
cmake_minimum_required(VERSION 2.8)
project(test)
include(ExternalProject)
ExternalProject_Add(libantlr
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libantlr
CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/libantlr/configure --prefix=<INSTALL_DIR>
BUILD_COMMAND ${MAKE})
<INSTALL_DIR>
se expande a algo así como libantlr-prefix, por lo que las cosas se instalan en su árbol de compilación en lugar de en / usr / local, que es lo que haría autotools sin un prefijo.