2015-07-07 8 views
6

Ich habe ein benutzerdefiniertes Ziel, das ist in der Tat eine extern generierte Bibliothek, die ich in meinem Build integrieren möchte.benutzerdefinierte Ziel als Zielbibliothek 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) 

Wie kann ich Cmake sagen, dass dieses Ziel in der Tat ist eine Bibliothek, , wo es gefunden und wo werden kann, sind die Header?

Um klar zu sein: Ich möchte nicht die obere CMakeList mit dieser Bibliothek manuell Include-Ordner angeben und die Bibliothek Speicherortordner Es muss automatisch erfolgen (von den Zieleigenschaften).

Auf einem Standard Cmake Bibliothek würde ich nur die INTERFACE_INCLUDE_DIRECTORIES Eigenschaft in der Bibliothek CMakeLists hinzufügen müssen, um Cmake meine app zu machen Verknüpfung mit dem entsprechenden -I und -L gcc Parameter:

set_target_properties(lib1 
    PROPERTIES 
    INTERFACE_INCLUDE_DIRECTORIES 
    ${CMAKE_CURRENT_SOURCE_DIR}) 

Aber im Fall von einem benutzerdefinierten Ziel weiß ich nicht, wie ich dazu.

Irgendwelche Hinweise?

Danke für Ihre Hilfe.


Danke an zaufi es funktioniert!

Für andere, die interessiert sein könnten hier Ziel innerhalb Cmake extern bauen eingebettet ist, was ich tat:

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}) 

Jetzt in einem CMakeLists.txt kann ich somthing wie

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) 

Keine Notwendigkeit tun um anzugeben, wo die .a und die .h sind.

Antwort

9

Sie können add_library() verwenden und sagen, dass es tatsächlich imported. Dann können Sie unter Verwendung von set_target_properties() die erforderlichen INTERFACE_XXX Eigenschaften dafür festlegen. Danach können Sie es als Ordnungsziel verwenden, wie jedes andere, das von Ihrem Projekt erstellt wird.

+0

Super, es funktioniert, Danke! Ich habe die vollständige Implementierung am Ende meiner Frage hinzugefügt. – nlko

Verwandte Themen