From bd4c9cbf9783733041d7a2d2e97a2c968018aa97 Mon Sep 17 00:00:00 2001 From: Urs Fleisch Date: Sun, 24 Dec 2023 14:16:15 +0100 Subject: [PATCH] Support installation alongside TagLib 1 with -DTAGLIB_INSTALL_SUFFIX=-2 --- CMakeLists.txt | 12 +++++++++--- INSTALL.md | 38 ++++++++++++++++++++++-------------- bindings/c/CMakeLists.txt | 21 +++++++++++++++----- bindings/c/taglib_c.pc.cmake | 4 ++-- taglib-config.cmake | 4 ++-- taglib-config.cmd.cmake | 4 ++-- taglib.pc.cmake | 4 ++-- taglib/CMakeLists.txt | 19 +++++++++++++----- 8 files changed, 70 insertions(+), 36 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8aca8cb7..f2aaf824 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -44,6 +44,9 @@ if(PLATFORM_WINRT) add_definitions(-DPLATFORM_WINRT) endif() +set(TAGLIB_INSTALL_SUFFIX "" CACHE STRING + "Suffix added to installed files (include directory, libraries, .pc)") + add_definitions(-DHAVE_CONFIG_H) set(TESTS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/tests/") @@ -111,12 +114,14 @@ endif() if(NOT WIN32) configure_file("${CMAKE_CURRENT_SOURCE_DIR}/taglib-config.cmake" "${CMAKE_CURRENT_BINARY_DIR}/taglib-config" @ONLY) - install(PROGRAMS "${CMAKE_CURRENT_BINARY_DIR}/taglib-config" DESTINATION "${CMAKE_INSTALL_BINDIR}") + install(PROGRAMS "${CMAKE_CURRENT_BINARY_DIR}/taglib-config" DESTINATION "${CMAKE_INSTALL_BINDIR}" + RENAME "taglib${TAGLIB_INSTALL_SUFFIX}-config") endif() if(WIN32) configure_file("${CMAKE_CURRENT_SOURCE_DIR}/taglib-config.cmd.cmake" "${CMAKE_CURRENT_BINARY_DIR}/taglib-config.cmd") - install(PROGRAMS "${CMAKE_CURRENT_BINARY_DIR}/taglib-config.cmd" DESTINATION "${CMAKE_INSTALL_BINDIR}") + install(PROGRAMS "${CMAKE_CURRENT_BINARY_DIR}/taglib-config.cmd" DESTINATION "${CMAKE_INSTALL_BINDIR}" + RENAME "taglib${TAGLIB_INSTALL_SUFFIX}-config.cmd") endif() if(NOT BUILD_FRAMEWORK) @@ -131,7 +136,8 @@ if(NOT BUILD_FRAMEWORK) set(CMAKE_PC_LIBDIR "\${prefix}/${CMAKE_INSTALL_LIBDIR}") endif() configure_file("${CMAKE_CURRENT_SOURCE_DIR}/taglib.pc.cmake" "${CMAKE_CURRENT_BINARY_DIR}/taglib.pc" @ONLY) - install(FILES "${CMAKE_CURRENT_BINARY_DIR}/taglib.pc" DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/taglib.pc" DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig" + RENAME "taglib${TAGLIB_INSTALL_SUFFIX}.pc") endif() include_directories(${CMAKE_CURRENT_BINARY_DIR}) diff --git a/INSTALL.md b/INSTALL.md index 1d9862f9..678dfab9 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -26,21 +26,29 @@ generic help on running CMake. These are the most important build options. For details, have a look into the CMakeLists.txt file. -| Option | Description | -| ----------------------- | ------------------------------------------ | -| `BUILD_SHARED_LIBS` | Build shared libraries | -| `CMAKE_BUILD_TYPE` | Debug, Release, RelWithDebInfo, MinSizeRel | -| `BUILD_EXAMPLES` | Build examples | -| `BUILD_BINDINGS` | Build C bindings | -| `BUILD_TESTING` | Build unit tests | -| `TRACE_IN_RELEASE` | Enable debug output in release builds | -| `WITH_ZLIB` | Whether to build with ZLib (default ON) | -| `ZLIB_ROOT` | Where to find ZLib's root directory | -| `ZLIB_INCLUDE_DIR` | Where to find ZLib's include directory | -| `ZLIB_LIBRARY` | Where to find ZLib's library | -| `CMAKE_INSTALL_PREFIX` | Where to install Taglib | -| `ENABLE_STATIC_RUNTIME` | Link with MSVC runtime statically | -| `BUILD_FRAMEWORK` | Build a macOS framework | +| Option | Description | +| ----------------------- | -------------------------------------------------- | +| `BUILD_SHARED_LIBS` | Build shared libraries | +| `CMAKE_BUILD_TYPE` | Debug, Release, RelWithDebInfo, MinSizeRel | +| `BUILD_EXAMPLES` | Build examples | +| `BUILD_BINDINGS` | Build C bindings | +| `BUILD_TESTING` | Build unit tests | +| `TRACE_IN_RELEASE` | Enable debug output in release builds | +| `WITH_ZLIB` | Whether to build with ZLib (default ON) | +| `ZLIB_ROOT` | Where to find ZLib's root directory | +| `ZLIB_INCLUDE_DIR` | Where to find ZLib's include directory | +| `ZLIB_LIBRARY` | Where to find ZLib's library | +| `CMAKE_INSTALL_PREFIX` | Where to install Taglib | +| `TAGLIB_INSTALL_SUFFIX` | Suffix added to installed libraries, includes, ... | +| `ENABLE_STATIC_RUNTIME` | Link with MSVC runtime statically | +| `BUILD_FRAMEWORK` | Build a macOS framework | + +If you want to install TagLib 2 alongside TagLib 1, you can use +`-DTAGLIB_INSTALL_SUFFIX=-2` and make sure that `BUILD_EXAMPLES` is not `ON` +for both versions. The installed files will then include bin/taglib-2-config, +include/taglib-2, cmake/taglib-2, pkgconfig/taglib-2.pc, +pkgconfig/taglib_c-2.pc and the libraries have a suffix "-2". + ## Dependencies diff --git a/bindings/c/CMakeLists.txt b/bindings/c/CMakeLists.txt index a70700e6..1bd75636 100644 --- a/bindings/c/CMakeLists.txt +++ b/bindings/c/CMakeLists.txt @@ -32,7 +32,7 @@ set(tag_c_HDRS tag_c.h) add_library(tag_c tag_c.cpp ${tag_c_HDRS}) target_include_directories(tag_c INTERFACE - $ + $ ) target_link_libraries(tag_c PRIVATE tag) @@ -69,18 +69,28 @@ if(HAVE_CRUN_LIB) endif() set_target_properties(tag_c PROPERTIES - VERSION 0.0.0 - SOVERSION 0 + VERSION ${TAGLIB_SOVERSION_MAJOR}.${TAGLIB_SOVERSION_MINOR}.${TAGLIB_SOVERSION_PATCH} + SOVERSION ${TAGLIB_SOVERSION_MAJOR} DEFINE_SYMBOL MAKE_TAGLIB_C_LIB INSTALL_NAME_DIR ${CMAKE_INSTALL_FULL_LIBDIR} ) + +if(TAGLIB_INSTALL_SUFFIX) + if(BUILD_SHARED_LIBS) + set(TAGLIB_LIBRARY_SUFFIX "${TAGLIB_INSTALL_SUFFIX}${CMAKE_SHARED_LIBRARY_SUFFIX}") + else() + set(TAGLIB_LIBRARY_SUFFIX "${TAGLIB_INSTALL_SUFFIX}${CMAKE_STATIC_LIBRARY_SUFFIX}") + endif() + set_target_properties(tag_c PROPERTIES SUFFIX ${TAGLIB_LIBRARY_SUFFIX}) +endif() + install(TARGETS tag_c EXPORT taglibTargets FRAMEWORK DESTINATION ${FRAMEWORK_INSTALL_DIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/taglib + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/taglib${TAGLIB_INSTALL_SUFFIX} ) if(NOT BUILD_FRAMEWORK) @@ -95,5 +105,6 @@ if(NOT BUILD_FRAMEWORK) set(CMAKE_PC_LIBDIR "\${prefix}/${CMAKE_INSTALL_LIBDIR}") endif() configure_file(${CMAKE_CURRENT_SOURCE_DIR}/taglib_c.pc.cmake ${CMAKE_CURRENT_BINARY_DIR}/taglib_c.pc @ONLY) - install(FILES ${CMAKE_CURRENT_BINARY_DIR}/taglib_c.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/taglib_c.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig + RENAME taglib${TAGLIB_INSTALL_SUFFIX}_c.pc) endif() diff --git a/bindings/c/taglib_c.pc.cmake b/bindings/c/taglib_c.pc.cmake index b3b4b2ac..86d4e27d 100644 --- a/bindings/c/taglib_c.pc.cmake +++ b/bindings/c/taglib_c.pc.cmake @@ -7,5 +7,5 @@ Name: TagLib C Bindings Description: Audio meta-data library (C bindings) Requires: taglib Version: @TAGLIB_LIB_VERSION_STRING@ -Libs: -L${libdir} -ltag_c -Cflags: -I${includedir}/taglib +Libs: -L${libdir} -ltag_c@TAGLIB_INSTALL_SUFFIX@ +Cflags: -I${includedir}/taglib@TAGLIB_INSTALL_SUFFIX@ diff --git a/taglib-config.cmake b/taglib-config.cmake index 203dad9f..c2539fb0 100644 --- a/taglib-config.cmake +++ b/taglib-config.cmake @@ -39,10 +39,10 @@ while test $# -gt 0 do case $1 in --libs) - flags="$flags -L$libdir -ltag @ZLIB_LIBRARIES_FLAGS@" + flags="$flags -L$libdir -ltag@TAGLIB_INSTALL_SUFFIX@ @ZLIB_LIBRARIES_FLAGS@" ;; --cflags) - flags="$flags -I$includedir -I$includedir/taglib" + flags="$flags -I$includedir -I$includedir/taglib@TAGLIB_INSTALL_SUFFIX@" ;; --version) echo @TAGLIB_LIB_VERSION_STRING@ diff --git a/taglib-config.cmd.cmake b/taglib-config.cmd.cmake index 136b84fb..2af69497 100644 --- a/taglib-config.cmd.cmake +++ b/taglib-config.cmd.cmake @@ -27,8 +27,8 @@ goto theend * to allow for static, shared or debug builds. * It would be preferable if the top level CMakeLists.txt provided the library name during config. ?? :doit -if /i "%1#" == "--libs#" echo -L${CMAKE_INSTALL_FULL_LIBDIR} -llibtag -if /i "%1#" == "--cflags#" echo -I${CMAKE_INSTALL_FULL_INCLUDEDIR} -I${CMAKE_INSTALL_FULL_INCLUDEDIR}/taglib +if /i "%1#" == "--libs#" echo -L${CMAKE_INSTALL_FULL_LIBDIR} -llibtag${TAGLIB_INSTALL_SUFFIX} +if /i "%1#" == "--cflags#" echo -I${CMAKE_INSTALL_FULL_INCLUDEDIR} -I${CMAKE_INSTALL_FULL_INCLUDEDIR}/taglib${TAGLIB_INSTALL_SUFFIX} if /i "%1#" == "--version#" echo ${TAGLIB_LIB_VERSION_STRING} if /i "%1#" == "--prefix#" echo ${CMAKE_INSTALL_PREFIX} diff --git a/taglib.pc.cmake b/taglib.pc.cmake index 1f1c9fdb..66087317 100644 --- a/taglib.pc.cmake +++ b/taglib.pc.cmake @@ -7,5 +7,5 @@ Name: TagLib Description: Audio meta-data library Requires: Version: @TAGLIB_LIB_VERSION_STRING@ -Libs: -L${libdir} -ltag @ZLIB_LIBRARIES_FLAGS@ -Cflags: -I${includedir} -I${includedir}/taglib +Libs: -L${libdir} -ltag@TAGLIB_INSTALL_SUFFIX@ @ZLIB_LIBRARIES_FLAGS@ +Cflags: -I${includedir} -I${includedir}/taglib@TAGLIB_INSTALL_SUFFIX@ diff --git a/taglib/CMakeLists.txt b/taglib/CMakeLists.txt index dc43fd32..02e6c084 100644 --- a/taglib/CMakeLists.txt +++ b/taglib/CMakeLists.txt @@ -344,7 +344,7 @@ add_library(tag ${tag_LIB_SRCS} ${tag_HDRS}) target_include_directories(tag INTERFACE $ - $ + $ ) target_link_libraries(tag @@ -375,19 +375,28 @@ if(BUILD_FRAMEWORK) ) endif() +if(TAGLIB_INSTALL_SUFFIX) + if(BUILD_SHARED_LIBS) + set(TAGLIB_LIBRARY_SUFFIX "${TAGLIB_INSTALL_SUFFIX}${CMAKE_SHARED_LIBRARY_SUFFIX}") + else() + set(TAGLIB_LIBRARY_SUFFIX "${TAGLIB_INSTALL_SUFFIX}${CMAKE_STATIC_LIBRARY_SUFFIX}") + endif() + set_target_properties(tag PROPERTIES SUFFIX ${TAGLIB_LIBRARY_SUFFIX}) +endif() + install(TARGETS tag EXPORT taglibTargets FRAMEWORK DESTINATION ${FRAMEWORK_INSTALL_DIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/taglib + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/taglib${TAGLIB_INSTALL_SUFFIX} ) configure_package_config_file( "${PROJECT_SOURCE_DIR}/taglib-config.cmake.in" "${PROJECT_BINARY_DIR}/taglib-config.cmake" - INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/taglib + INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/taglib${TAGLIB_INSTALL_SUFFIX} ) write_basic_package_version_file( @@ -399,10 +408,10 @@ write_basic_package_version_file( install(EXPORT taglibTargets FILE taglib-targets.cmake NAMESPACE TagLib:: - DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/taglib + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/taglib${TAGLIB_INSTALL_SUFFIX} ) install(FILES "${PROJECT_BINARY_DIR}/taglib-config.cmake" "${PROJECT_BINARY_DIR}/taglib-config-version.cmake" - DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/taglib + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/taglib${TAGLIB_INSTALL_SUFFIX} )