Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

cmake simple config file example

Tags:

c++

cmake

Now I have a lib I made my self that I want to use in another CMake c++ project. It exists in my computer like this.

${MY_LIB_PATH}\include
${MY_LIB_PATH}\lib\x86\debug\lib-files
${MY_LIB_PATH}\lib\x86\release\lib-files
${MY_LIB_PATH}\lib\x64\debug\lib-files
${MY_LIB_PATH}\lib\x64\release\lib-files

What would a basic config file be like which makes CMake find_package know those? I expected it would be very simple because it just doesn't have much information to provide. But this page just make my head hurt.

Sorry, I decided to copy the source code around so I don't really know which answer should be accepted.

like image 901
J. Doe Avatar asked Apr 16 '18 12:04

J. Doe


People also ask

What is a config CMake file?

A config-file package is a set of files provided by upstreams for downstreams to use. CMake searches in a number of locations for package configuration files, as described in the find_package() documentation.

How do I include a .h file in CMake?

To include headers in CMake targets, use the command target_include_directories(...) . Depending on the purpose of the included directories, you will need to define the scope specifier – either PUBLIC , PRIVATE or INTERFACE .

What is CMakeLists txt?

CMakeLists. txt file contains a set of directives and instructions describing the project's source files and targets (executable, library, or both). When you create a new project, CLion generates CMakeLists. txt file automatically and places it in the project root directory.


2 Answers

Don't write a config yourself; use CMake's export command. It's too broad to cover here in its entirety, but here's a modified example from one of my projects:

install(TARGETS
        your_target
    EXPORT YourPackageConfig
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
export(TARGETS
        your_target
    NAMESPACE YourPackage::
    FILE "${CMAKE_CURRENT_BINARY_DIR}/YourPackageConfig.cmake"
)
install(EXPORT
        YourPackageConfig
    DESTINATION "${CMAKE_INSTALL_DATADIR}/YourPackage/cmake"
    NAMESPACE YourPackage::
)

This will create the config file for you, so other projects can use it via find_package.

find_package(YourPackage REQUIRED)
target_link_libraries(foo YouprPackage::your_target)

This handles the IMPORTED targets automatically, and also lets you embed compiler flags, include paths, library dependencies, and even which files are part of your interface (basically, anything that falls under the INTERFACE properties).

like image 123
Stephen Newell Avatar answered Sep 19 '22 17:09

Stephen Newell


Put a "${libname}-config.cmake" in library's root.

Then add an IMPORTED target in that file.

There is a example for libprotobuf.

add_library(libprotobuf STATIC IMPORTED GLOBAL)

set_target_properties(libprotobuf PROPERTIES 
    IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/prebuilt/android/${ANDROID_ABI}/libprotobuf.a"
    IMPORTED_LINK_INTERFACE_LIBRARIES "${ZLIB_LIBRARIES};${CMAKE_THREAD_LIBS_INIT}"
    INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/src")

Set Env or CMake variable "${libname}_DIR" to "${MY_LIB_PATH}"

Use it.

find_package(${libname})
#.......
target_link_libraries(main ${libname})
like image 41
WinCloud Avatar answered Sep 21 '22 17:09

WinCloud