2015-07-07 9 views
6

Ho un target personalizzato che è in realtà una libreria generata esternamente che voglio integrare nella mia build.target personalizzato come libreria di destinazione in cmake

add_custom_command(
     OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/liblib2.a 
     COMMAND make -f ${CMAKE_CURRENT_SOURCE_DIR}/makefile liblib2.a) 

add_custom_target(lib2 
     DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/liblib2.a) 

Come faccio a sapere CMake che questo obiettivo è in realtà una libreria, dove si può trovare e dove sono le intestazioni?

Per essere chiari: Non voglio che la parte superiore di CMakeList che utilizza questa libreria debba specificare manualmente le cartelle di inclusione e la cartella di ubicazione della libreria Deve essere eseguita automaticamente (dalle proprietà di destinazione).

Su una libreria standard di CMake Vorrei solo avere per aggiungere la proprietà INTERFACE_INCLUDE_DIRECTORIES nelle CMakeLists biblioteca per fare CMake collegare il mio app con la -I parametri pertinenti e gcc -L:

set_target_properties(lib1 
    PROPERTIES 
    INTERFACE_INCLUDE_DIRECTORIES 
    ${CMAKE_CURRENT_SOURCE_DIR}) 

Ma nel caso di un obiettivo personalizzato non so come farlo.

Qualsiasi indizio?

Grazie per il vostro aiuto.


Grazie a zaufi funziona!

Per gli altri che potrebbero essere interessati a costruire incorporato esternamente bersaglio all'interno cmake qui è quello che ho fatto:

cmake_minimum_required(VERSION 2.8) 

SET(LIB_FILE ${CMAKE_CURRENT_SOURCE_DIR}/bin/liblib2.a) 
SET(LIB_HEADER_FOLDER ${CMAKE_CURRENT_SOURCE_DIR}/include) 

# how to build the result of the library 
add_custom_command(OUTPUT ${LIB_FILE} 
        COMMAND make 
        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) 

# create a target out of the library compilation result 
add_custom_target(lib2_target DEPENDS ${LIB_FILE}) 

# create an library target out of the library compilation result 
add_library(lib2 STATIC IMPORTED GLOBAL) 
add_dependencies(lib2 lib2_target) 

# specify where the library is and where to find the headers 
set_target_properties(lib2 
    PROPERTIES 
    IMPORTED_LOCATION ${LIB_FILE} 
    INTERFACE_INCLUDE_DIRECTORIES ${LIB_HEADER_FOLDER}) 

Ora in una CMakeLists.txt posso fare somthing come

add_subdirectory(${ROOT_DIR}/lib1 bin/lib1) 
add_subdirectory(${ROOT_DIR}/lib2 bin/lib2) 
add_executable(app app.c) 
target_link_libraries(app lib1 lib2) 

Non c'è bisogno per specificare dove sono .a e .h.

risposta

9

È possibile utilizzare add_library() e indicare che in realtà è imported. Quindi, utilizzando set_target_properties() è possibile impostare le proprietà richieste per INTERFACE_XXX. Dopo di ciò, puoi usarlo come target ordinale come ogni altro costruito dal tuo progetto.

+0

Impressionante, funziona, grazie! Ho aggiunto l'implementazione completa alla fine della mia domanda. – nlko