Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

custom target as a target library in cmake

Tags:

cmake

I have a custom target that is in fact an externally generated library that I want to integrate in my build.

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) 

How can I tell cmake that this target is in fact a library, where it can be found and where are the headers ?

To be clear : I don't want the upper CMakeList using this library having to manually specify include folders and the library location folder It must be done automatically (from the target properties).

On a standard cmake library I would just have to add the INTERFACE_INCLUDE_DIRECTORIES property in the library CMakeLists to make cmake link my app with the relevant -I and -L gcc parameters :

set_target_properties(lib1   PROPERTIES   INTERFACE_INCLUDE_DIRECTORIES   ${CMAKE_CURRENT_SOURCE_DIR}) 

But in the case of a custom target I don't know how to to it.

Any clue ?

Thanks for your help.


Thanks to zaufi it works!

For others who may be interested in embedded externally build target inside cmake here is what I did :

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

Now in a CMakeLists.txt I can do somthing like

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) 

No need to specify where the .a and the .h are.

like image 491
nlko Avatar asked Jul 07 '15 16:07

nlko


People also ask

How do I add a target in CMake?

Use the add_custom_command() command to generate a file with dependencies. By default nothing depends on the custom target. Use the add_dependencies() command to add dependencies to or from other targets.

What are targets in CMake?

Targets. In general, targets comprise executables or libraries which are defined by calling add_executable or add_library and which can have many properties set. They can have dependencies on one another, which for targets such as these just means that dependent ones will be built after their dependencies.


2 Answers

You can use add_library() and tell that it actually imported. Then, using set_target_properties() you can set required INTERFACE_XXX properties for it. After that, you can use it as an ordinal target like every other built by your project.

like image 192
zaufi Avatar answered Oct 02 '22 16:10

zaufi


Thank you for posting the solution. I have wrapped your snippet in a function:

function(add_external_library)     set(options)     set(oneValueArgs TARGET WORKING_DIRECTORY OUTPUT COMMENT)     set(multiValueArgs COMMAND INCLUDE_DIRS)     cmake_parse_arguments(ARGS "${options}" "${oneValueArgs}" ${multiValueArgs}" ${ARGN})      # Specify how to build the result of the library     add_custom_command(OUTPUT "${ARGS_OUTPUT}"         COMMAND ${ARGS_COMMAND}         WORKING_DIRECTORY "${ARGS_WORKING_DIRECTORY}"         COMMENT "${ARGS_COMMENT}")      # Create a target out of the library compilation result     add_custom_target(${ARGS_TARGET}_target DEPENDS ${ARGS_OUTPUT})      # Create an library target out of the library compilation result     add_library(${ARGS_TARGET} STATIC IMPORTED GLOBAL)     add_dependencies(${ARGS_TARGET} ${ARGS_TARGET}_target)      # Specify where the library is and where to find the headers     set_target_properties(${ARGS_TARGET}         PROPERTIES         IMPORTED_LOCATION "${ARGS_OUTPUT}"         INTERFACE_INCLUDE_DIRECTORIES "${ARGS_INCLUDE_DIRS}") endfunction()  # Example add_external_library(TARGET YourLib     COMMAND           /bin/bash compile_your_lib.sh     WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"     OUTPUT            "output/yourlib.a"     INCLUDE_DIRS      "include/a" "include/b"     COMMENT           "Building YourLib")  add_executable(YourExe) target_link_libraries(YourExe YourLib) 
like image 32
Viacheslav Kroilov Avatar answered Oct 02 '22 17:10

Viacheslav Kroilov