2011-05-12 17 views
26

Este es mi primer intento con cmake y me gustaría tener, si es posible, algunas retroalimentaciones sobre lo que hice ya que algunos problemas persisten.Creando una biblioteca usando autotools de cmake

En el CMakeLists.txt de la carpeta de la biblioteca, creé dos objetivos de archivo MAKE: configure-antlr3c y antlr3c. El primer objetivo se ejecuta el script de configuración autotools, el segundo se corre el hacer ejecutable 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 objetivo es siempre "fuera de fecha", por lo que siempre se ejecutará incluso si no sucedieron cambios Además, necesito necesariamente generar mis makemakers de cmake en un directorio separado (no en el directorio raíz de mi proyecto) para evitar anular el archivo Make de la biblioteca autotools ...

Alguien ha tenido este problema (crear proyectos autotools con cmake)? Y si es así, ¿cuáles han sido tus soluciones?

Gracias.

EDIT: Solución En el CMakeLists.txt raíz:

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 
) 
+1

Debería agregar su solución a un bloque de Respuesta; no en la pregunta. – jww

Respuesta

37

Creo que sería mejor usar la característica de ExternalProject cmake. Supongo que tienes tu proyecto y tienes libantrl en un subdirectorio?

project 
     +- libantlr 
     +- mysrc 
    ---- etc ---- 

Si ese es el caso, se puede 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}) 

El <INSTALL_DIR> se amplía a algo así como libantlr-prefijo, así que las cosas están instalados en su construir árbol en lugar de/usr/local, que es lo que las autotools harían sin un prefijo.

+0

¡Perfecto! Y esto hace un seguimiento del hecho de que lo compilé y no necesito compilarlo cada vez que tengo una dependencia. Muchas gracias;) –

+1

Buena respuesta. Solo tenga en cuenta que "configure" necesita una ruta absoluta para "--prefix". –

Cuestiones relacionadas