Difference between revisions of "Simple template for libraries in contrib"
Line 18: | Line 18: | ||
include(ICUBcontribHelpers) | include(ICUBcontribHelpers) | ||
icubcontrib_set_default_prefix() #set CMAKE_INSTALL_PREFIX to the ICUBcontrib one; print warning if user modifies it | |||
## | ## useful options (i.e., rpath settings and name of debug libraries on msvc) | ||
include(ICUBcontribOptions) | |||
include( | |||
#find packages | #find packages | ||
Line 62: | Line 61: | ||
#Important: notice that we use the name of the project | #Important: notice that we use the name of the project | ||
target_link_libraries(${PROJECT_NAME} ctrlLib) | target_link_libraries(${PROJECT_NAME} ctrlLib) | ||
Now, if you want your library to be imported by 3rd-party projects through CMake, you can export it with the | |||
icubcontrib_export_library(...) macro. The paradigm is the same as for the [[ Better_Repository#Writing_a_library | icub_export_library(...) macro in the "main" iCub repository ]]. | |||
Example: | |||
icubcontrib_export_library(${PROJECT_NAME} INTERNAL_INCLUDE_DIRS ${PROJECT_SOURCE_DIR}/include | |||
EXTERNAL_INCLUDE_DIRS ${YARP_INCLUDE_DIRS} # only list directory for headers that are included by the header files of the library you are exporting | |||
DESTINATION include/iCub | |||
FILES f${foler_header}) | |||
You can export multiple libraries within the same source tree, calling the icubcontrib_export_library(...) macro for each of them. In order to be able to all the libraries as a single package, you need to call then the icubcontrib_finalize_export(<packagename>) macro: | |||
icubcontrib_finalize_export(mylibraries). | |||
This allows 3rd-party projects to find and use your library like this: | |||
find_package(mylibraries) | |||
include_directories(${mylibraries_INCLUDE_DIRS}) | |||
... | |||
target_link_libraries(my3dpartyproj mylibrary) | |||
Note that: | |||
* you need to call the icubcontrib_finalize_export macro even if you are only exporting one library (<packagename> can be the same as the library name) | |||
* for 3d-party projects to be able to find your exported library, its exported configuration files should be in the CMake search list; if users do not install icub-contrib libraries to default system directories, they are advised to set the CMAKE_PREFIX_PATH environment variable to point to the ICUBcontrib installation path (see the Setup ICUBcontrib sections in the [[ ICub_Software_Installation | installation instructions]]). |
Latest revision as of 19:58, 19 November 2013
These instructions only apply to YARP > 2.3.23 and iCub > 1.1.13 software versions
See Simple template for libraries in contrib old for older instructions
CMake code for a library in contrib is quite similar to that required for modules.
cmake_minimum_required(VERSION 2.8.7) project(mylibrary)
#find packages, examples YARP and/or ICUB find_package(YARP REQUIRED) find_package(ICUB REQUIRED) find_package(ICUBcontrib REQUIRED) #optionally: use cmake find scripts provided by YARP and iCub list(APPEND CMAKE_MODULE_PATH ${YARP_MODULE_PATH} ${ICUB_MODULE_PATH} ${ICUBCONTRIB_MODULE_PATH})
include(ICUBcontribHelpers) icubcontrib_set_default_prefix() #set CMAKE_INSTALL_PREFIX to the ICUBcontrib one; print warning if user modifies it
## useful options (i.e., rpath settings and name of debug libraries on msvc) include(ICUBcontribOptions)
#find packages find_package(GSL) find_package(OpenCV) include_directories(${YARP_INCLUDE_DIRS}) include_directories(${ICUB_INCLUDE_DIRS})
include_directories(${GSL_INCLUDE_DIRS}) include_directories(${OpenCV_INCLUDE_DIRS})
set(folder_source src/file1.cpp src/file2.cpp) set(folder_header include/iCub/file1.h include/iCub/file2.h) # add local directory and other (optional) packages to to search path for # header files include_directories(${PROJECT_SOURCE_DIR}/include) source_group("Source Files" FILES ${folder_source}) source_group("Header Files" FILES ${folder_header}) add_library(${PROJECT_NAME} ${folder_source} ${folder_header})
#link other packages, this is required to let cmake know dependencies #your code will compile without this, but you can have problems linking agains #your lib in modules using it target_link_libraries(${PROJECT_NAME} ${YARP_LIBRARIES} ${OpenCV_LIBRARIES} ${GSL_LIBRARIES})
if you want to link all the libraries in iCub, you can rely on the ICUB_LIBRARIES variable:
#link against all libraries in the iCub build set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${ICUB_LINK_FLAGS}") target_link_libraries(${PROJECT_NAME} ${ICUB_LIBRARIES})
but you might prefer to just link the one you actually need:
#link against single libraries in the iCub package #Important: notice that we use the name of the project target_link_libraries(${PROJECT_NAME} ctrlLib)
Now, if you want your library to be imported by 3rd-party projects through CMake, you can export it with the icubcontrib_export_library(...) macro. The paradigm is the same as for the icub_export_library(...) macro in the "main" iCub repository . Example:
icubcontrib_export_library(${PROJECT_NAME} INTERNAL_INCLUDE_DIRS ${PROJECT_SOURCE_DIR}/include EXTERNAL_INCLUDE_DIRS ${YARP_INCLUDE_DIRS} # only list directory for headers that are included by the header files of the library you are exporting DESTINATION include/iCub FILES f${foler_header})
You can export multiple libraries within the same source tree, calling the icubcontrib_export_library(...) macro for each of them. In order to be able to all the libraries as a single package, you need to call then the icubcontrib_finalize_export(<packagename>) macro:
icubcontrib_finalize_export(mylibraries).
This allows 3rd-party projects to find and use your library like this:
find_package(mylibraries) include_directories(${mylibraries_INCLUDE_DIRS}) ... target_link_libraries(my3dpartyproj mylibrary)
Note that:
- you need to call the icubcontrib_finalize_export macro even if you are only exporting one library (<packagename> can be the same as the library name)
- for 3d-party projects to be able to find your exported library, its exported configuration files should be in the CMake search list; if users do not install icub-contrib libraries to default system directories, they are advised to set the CMAKE_PREFIX_PATH environment variable to point to the ICUBcontrib installation path (see the Setup ICUBcontrib sections in the installation instructions).