From c9bebd6afc0ecb69ce15da3d65cffce0227c3e30 Mon Sep 17 00:00:00 2001 From: Dmitry Rodin Date: Fri, 2 Sep 2022 12:39:07 +0700 Subject: [PATCH 1/4] respect CMake BUILD_SHARED_LIBS setting --- CMakeLists.txt | 47 +++++++++++++---------------------------------- 1 file changed, 13 insertions(+), 34 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4ff340123..c2dd2356a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,6 +6,8 @@ cmake_minimum_required(VERSION 2.8.6) project(brotli C) +option(BUILD_SHARED_LIBS "Build shared libraries" OFF) + if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) message(STATUS "Setting build type to Release as none was specified.") set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build." FORCE) @@ -137,10 +139,6 @@ set(BROTLI_LIBRARIES_CORE brotlienc brotlidec brotlicommon) set(BROTLI_LIBRARIES ${BROTLI_LIBRARIES_CORE} ${LIBM_LIBRARY}) mark_as_advanced(BROTLI_LIBRARIES) -set(BROTLI_LIBRARIES_CORE_STATIC brotlienc-static brotlidec-static brotlicommon-static) -set(BROTLI_LIBRARIES_STATIC ${BROTLI_LIBRARIES_CORE_STATIC} ${LIBM_LIBRARY}) -mark_as_advanced(BROTLI_LIBRARIES_STATIC) - if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") add_definitions(-DOS_LINUX) elseif(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") @@ -161,29 +159,22 @@ transform_sources_list("scripts/sources.lst" "${CMAKE_CURRENT_BINARY_DIR}/source include("${CMAKE_CURRENT_BINARY_DIR}/sources.lst.cmake") if(BROTLI_EMSCRIPTEN) - set(BROTLI_SHARED_LIBS "") -else() - set(BROTLI_SHARED_LIBS brotlicommon brotlidec brotlienc) - add_library(brotlicommon SHARED ${BROTLI_COMMON_C}) - add_library(brotlidec SHARED ${BROTLI_DEC_C}) - add_library(brotlienc SHARED ${BROTLI_ENC_C}) + set(BUILD_SHARED_LIBS OFF) endif() -set(BROTLI_STATIC_LIBS brotlicommon-static brotlidec-static brotlienc-static) -add_library(brotlicommon-static STATIC ${BROTLI_COMMON_C}) -add_library(brotlidec-static STATIC ${BROTLI_DEC_C}) -add_library(brotlienc-static STATIC ${BROTLI_ENC_C}) +add_library(brotlicommon ${BROTLI_COMMON_C}) +add_library(brotlidec ${BROTLI_DEC_C}) +add_library(brotlienc ${BROTLI_ENC_C}) # Older CMake versions does not understand INCLUDE_DIRECTORIES property. include_directories(${BROTLI_INCLUDE_DIRS}) -foreach(lib IN LISTS BROTLI_SHARED_LIBS) - target_compile_definitions(${lib} PUBLIC "BROTLI_SHARED_COMPILATION" ) - string(TOUPPER "${lib}" LIB) - set_target_properties (${lib} PROPERTIES DEFINE_SYMBOL "${LIB}_SHARED_COMPILATION") -endforeach() - -foreach(lib IN LISTS BROTLI_SHARED_LIBS BROTLI_STATIC_LIBS) +foreach(lib IN LISTS BROTLI_LIBRARIES_CORE) + if(BUILD_SHARED_LIBS) + target_compile_definitions(${lib} PUBLIC "BROTLI_SHARED_COMPILATION" ) + string(TOUPPER "${lib}" LIB) + set_target_properties (${lib} PROPERTIES DEFINE_SYMBOL "${LIB}_SHARED_COMPILATION") + endif() target_link_libraries(${lib} ${LIBM_LIBRARY}) set_property(TARGET ${lib} APPEND PROPERTY INCLUDE_DIRECTORIES ${BROTLI_INCLUDE_DIRS}) set_target_properties(${lib} PROPERTIES @@ -195,13 +186,8 @@ foreach(lib IN LISTS BROTLI_SHARED_LIBS BROTLI_STATIC_LIBS) set_property(TARGET ${lib} APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${BROTLI_INCLUDE_DIRS}") endforeach() -if(NOT BROTLI_EMSCRIPTEN) target_link_libraries(brotlidec brotlicommon) target_link_libraries(brotlienc brotlicommon) -endif() - -target_link_libraries(brotlidec-static brotlicommon-static) -target_link_libraries(brotlienc-static brotlicommon-static) # For projects stuck on older versions of CMake, this will set the # BROTLI_INCLUDE_DIRS and BROTLI_LIBRARIES variables so they still @@ -216,7 +202,7 @@ endif() # Build the brotli executable add_executable(brotli ${BROTLI_CLI_C}) -target_link_libraries(brotli ${BROTLI_LIBRARIES_STATIC}) +target_link_libraries(brotli ${BROTLI_LIBRARIES}) # Installation if(NOT BROTLI_EMSCRIPTEN) @@ -233,13 +219,6 @@ if(NOT BROTLI_BUNDLED_MODE) RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" ) - install( - TARGETS ${BROTLI_LIBRARIES_CORE_STATIC} - ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" - LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" - RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" - ) - install( DIRECTORY ${BROTLI_INCLUDE_DIRS}/brotli DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" From 847cebbee6376caac07384f43c63e1b07e9d4999 Mon Sep 17 00:00:00 2001 From: Dmitry Rodin Date: Fri, 2 Sep 2022 12:44:09 +0700 Subject: [PATCH 2/4] add BROTLI_BUILD_EXECUTABLE option --- CMakeLists.txt | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c2dd2356a..9ea291bf0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,6 +7,7 @@ cmake_minimum_required(VERSION 2.8.6) project(brotli C) option(BUILD_SHARED_LIBS "Build shared libraries" OFF) +option(BROTLI_BUILD_EXECUTABLE "Build the brotli executable" ON) if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) message(STATUS "Setting build type to Release as none was specified.") @@ -200,20 +201,20 @@ if(BROTLI_PARENT_DIRECTORY) set(BROTLI_LIBRARIES "${BROTLI_LIBRARIES}" PARENT_SCOPE) endif() +set(INSTALL_TARGETS ${BROTLI_LIBRARIES_CORE}) + +if(BROTLI_BUILD_EXECUTABLE) # Build the brotli executable add_executable(brotli ${BROTLI_CLI_C}) target_link_libraries(brotli ${BROTLI_LIBRARIES}) +list(APPEND INSTALL_TARGETS brotli) +endif() # Installation if(NOT BROTLI_EMSCRIPTEN) if(NOT BROTLI_BUNDLED_MODE) install( - TARGETS brotli - RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" - ) - - install( - TARGETS ${BROTLI_LIBRARIES_CORE} + TARGETS ${INSTALL_TARGETS} ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" From 1505557db5d0a655c1fa89f8a78b4bfc58bdcc3c Mon Sep 17 00:00:00 2001 From: Dmitry Rodin Date: Fri, 2 Sep 2022 13:34:40 +0700 Subject: [PATCH 3/4] CMake install package config and version files --- CMakeLists.txt | 38 +++++++++++++++++++++++++++++++++- cmake/template/Config.cmake.in | 4 ++++ 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 cmake/template/Config.cmake.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 9ea291bf0..a2c00d9c9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -184,7 +184,9 @@ foreach(lib IN LISTS BROTLI_LIBRARIES_CORE) if(NOT BROTLI_EMSCRIPTEN) set_target_properties(${lib} PROPERTIES POSITION_INDEPENDENT_CODE TRUE) endif() - set_property(TARGET ${lib} APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${BROTLI_INCLUDE_DIRS}") + if(BROTLI_PARENT_DIRECTORY) + set_property(TARGET ${lib} APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${BROTLI_INCLUDE_DIRS}") + endif() endforeach() target_link_libraries(brotlidec brotlicommon) @@ -213,11 +215,45 @@ endif() # Installation if(NOT BROTLI_EMSCRIPTEN) if(NOT BROTLI_BUNDLED_MODE) + + set(config_install_dir "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}") + set(generated_dir "${CMAKE_CURRENT_BINARY_DIR}/generated") + set(version_config "${generated_dir}/${PROJECT_NAME}ConfigVersion.cmake") + set(project_config "${generated_dir}/${PROJECT_NAME}Config.cmake") + set(targets_export_name "${PROJECT_NAME}Targets") + set(namespace "${PROJECT_NAME}::") + + include(CMakePackageConfigHelpers) + + write_basic_package_version_file( + "${version_config}" VERSION "${BROTLI_VERSION}" COMPATIBILITY SameMajorVersion + ) + + configure_package_config_file( + "cmake/template/Config.cmake.in" + "${project_config}" + INSTALL_DESTINATION "${config_install_dir}" + ) + + install( + FILES "${project_config}" "${version_config}" + DESTINATION "${config_install_dir}" + ) + + install( + EXPORT ${targets_export_name} + DESTINATION ${config_install_dir} + NAMESPACE ${namespace} + ) + install( TARGETS ${INSTALL_TARGETS} + EXPORT ${targets_export_name} ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" + FRAMEWORK DESTINATION "${CMAKE_INSTALL_LIBDIR}" + INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" ) install( diff --git a/cmake/template/Config.cmake.in b/cmake/template/Config.cmake.in new file mode 100644 index 000000000..9b4c9ee03 --- /dev/null +++ b/cmake/template/Config.cmake.in @@ -0,0 +1,4 @@ +@PACKAGE_INIT@ + +include("${CMAKE_CURRENT_LIST_DIR}/@targets_export_name@.cmake") +check_required_components("@PROJECT_NAME@") From 559f72652341188b6d7b2bc7a2f3c4034c12e4d7 Mon Sep 17 00:00:00 2001 From: Dmitry Rodin Date: Fri, 2 Sep 2022 14:31:27 +0700 Subject: [PATCH 4/4] add Config.cmake.in to exported archive --- .gitattributes | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitattributes b/.gitattributes index 8915918cf..62fde88fa 100644 --- a/.gitattributes +++ b/.gitattributes @@ -42,6 +42,8 @@ python/** !export-ignore scripts !export-ignore scripts/sources.lst !export-ignore scripts/libbrotli*.pc.in !export-ignore +cmake !export-ignore +cmake/** !export-ignore # Add testdata tests !export-ignore