From cf5fbac9afa706ff6812a4b954063b69137dd985 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20L=C3=B3pez-Cabanillas?= Date: Sun, 25 Jul 2021 21:27:48 +0200 Subject: [PATCH] cmake: export targets The build system creates two exported targets: - The executable FluidSynth::fluidsynth - The library FluidSynth::libfluidsynth A downstream project using CMake can find and link the library target directly with cmake (without needing pkg-config) this way: ~~~ project(sample LANGUAGES C) find_package ( FluidSynth ) if (FluidSynth_FOUND) add_executable( sample sample.c ) target_link_libraries ( sample PRIVATE FluidSynth::libfluidsynth ) endif () ~~~ After installing fluidsynth in a prefix like "$HOME/Fluidsynth3": cmake -DCNAKE_PREFIX_PATH="$HOME/Fluidsynth3/;..." Instead installing, the build directory can be used directly, for instance: cmake -DFluidSynth_DIR="$HOME/fluidsynth-2.2.2/build/" ... --- CMakeLists.txt | 23 +++++++++++++++++++++++ FluidSynthConfig.cmake.in | 11 +++++++++++ src/CMakeLists.txt | 18 ++++++++++++++++++ 3 files changed, 52 insertions(+) create mode 100644 FluidSynthConfig.cmake.in diff --git a/CMakeLists.txt b/CMakeLists.txt index ed2a7f3f..b04cd32b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -856,6 +856,29 @@ configure_file ( fluidsynth.pc.in install ( FILES ${CMAKE_BINARY_DIR}/fluidsynth.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig ) +# Exported targets for cmake: find_package(FluidSynth) +# when installed, use CMAKE_PREFIX_PATH=fluidsynth-prefix;... +# to use the build directory directly set the FluidSynth_DIR variable instead. + +# targets in the build directory +export(EXPORT FluidSynthTargets + FILE "${CMAKE_CURRENT_BINARY_DIR}/FluidSynthTargets.cmake" + NAMESPACE FluidSynth:: +) + +include(CMakePackageConfigHelpers) +write_basic_package_version_file( + FluidSynthConfigVersion.cmake + VERSION ${LIB_VERSION_INFO} + COMPATIBILITY SameMajorVersion +) + +configure_file(FluidSynthConfig.cmake.in FluidSynthConfig.cmake @ONLY) +install(FILES "${CMAKE_CURRENT_BINARY_DIR}/FluidSynthConfig.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/FluidSynthConfigVersion.cmake" + DESTINATION ${LIB_INSTALL_DIR}/cmake/fluidsynth +) + # Extra targets for Unix build environments if ( UNIX ) # RPM spec diff --git a/FluidSynthConfig.cmake.in b/FluidSynthConfig.cmake.in new file mode 100644 index 00000000..9f85511a --- /dev/null +++ b/FluidSynthConfig.cmake.in @@ -0,0 +1,11 @@ +# for the find_dependency() macro: +# include(CMakeFindDependencyMacro) +# it has the same syntax as find_package: +# find_dependency(MYDEP REQUIRED) + +# define variables for configuration options: +# set(network-enabled @enable-network@) + +# finally, include the targets/version files +include("${CMAKE_CURRENT_LIST_DIR}/FluidSynthTargets.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/FluidSynthConfigVersion.cmake") diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e913cb21..5cc98fbf 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -399,12 +399,14 @@ target_link_libraries ( fluidsynth if ( MACOSX_FRAMEWORK ) install ( TARGETS fluidsynth libfluidsynth + EXPORT FluidSynthTargets RUNTIME DESTINATION ${BIN_INSTALL_DIR} FRAMEWORK DESTINATION ${FRAMEWORK_INSTALL_DIR} ARCHIVE DESTINATION ${FRAMEWORK_INSTALL_DIR} ) else ( MACOSX_FRAMEWORK ) install ( TARGETS fluidsynth libfluidsynth + EXPORT FluidSynthTargets RUNTIME DESTINATION ${BIN_INSTALL_DIR} LIBRARY DESTINATION ${LIB_INSTALL_DIR} ARCHIVE DESTINATION ${LIB_INSTALL_DIR} @@ -413,6 +415,22 @@ else ( MACOSX_FRAMEWORK ) install ( FILES ${public_main_HEADER} DESTINATION ${INCLUDE_INSTALL_DIR} ) endif ( MACOSX_FRAMEWORK ) +# Exported targets. + +# build_interface: for the libfluidsynth target when imported from the build directory. +# install_interface: for the target when imported from the installed directory. +target_include_directories(libfluidsynth PUBLIC + "$" + "$" +) + +# installation of the exported targets +install(EXPORT FluidSynthTargets + FILE FluidSynthTargets.cmake + NAMESPACE FluidSynth:: + DESTINATION ${LIB_INSTALL_DIR}/cmake/fluidsynth +) + # ******* Auto Generated Lookup Tables ****** include(ExternalProject)