1*4882a593SmuzhiyunFrom 6cb16322decd643fed9de332d9cda77f7738b7af Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Adrian Perez de Castro <aperez@igalia.com> 3*4882a593SmuzhiyunDate: Mon, 7 Sep 2020 12:14:22 +0300 4*4882a593SmuzhiyunSubject: [PATCH] CMake: Allow using BUILD_SHARED_LIBS to choose static/shared 5*4882a593Smuzhiyun libs 6*4882a593Smuzhiyun 7*4882a593SmuzhiyunBy convention projects using CMake which can build either static or 8*4882a593Smuzhiyunshared libraries use a BUILD_SHARED_LIBS flag to allow selecting between 9*4882a593Smuzhiyunboth: the add_library() command automatically switches between both using 10*4882a593Smuzhiyunthis variable when the library kind is not passed to add_library(). It 11*4882a593Smuzhiyunis also usual to expose the BUILD_SHARED_LIBS as an user-facing setting 12*4882a593Smuzhiyunwith the option() command. 13*4882a593Smuzhiyun 14*4882a593SmuzhiyunThis way, the following will both work as expected: 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun % cmake -DBUILD_SHARED_LIBS=OFF ... 17*4882a593Smuzhiyun % cmake -DBUILS_SHARED_LIBS=ON ... 18*4882a593Smuzhiyun 19*4882a593SmuzhiyunThis is helpful for distributions which need (or want) to build only 20*4882a593Smuzhiyunstatic libraries. 21*4882a593Smuzhiyun 22*4882a593SmuzhiyunSigned-off-by: Adrian Perez de Castro <aperez@igalia.com> 23*4882a593Smuzhiyun[Upstream status: https://github.com/google/brotli/pull/655] 24*4882a593Smuzhiyun--- 25*4882a593Smuzhiyun CMakeLists.txt | 46 ++++++++++++++----------------------------- 26*4882a593Smuzhiyun c/fuzz/test_fuzzer.sh | 6 +++--- 27*4882a593Smuzhiyun 2 files changed, 18 insertions(+), 34 deletions(-) 28*4882a593Smuzhiyun 29*4882a593Smuzhiyundiff --git a/CMakeLists.txt b/CMakeLists.txt 30*4882a593Smuzhiyunindex 4ff3401..f889311 100644 31*4882a593Smuzhiyun--- a/CMakeLists.txt 32*4882a593Smuzhiyun+++ b/CMakeLists.txt 33*4882a593Smuzhiyun@@ -6,6 +6,8 @@ cmake_minimum_required(VERSION 2.8.6) 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun project(brotli C) 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun+option(BUILD_SHARED_LIBS "Build shared libraries" ON) 38*4882a593Smuzhiyun+ 39*4882a593Smuzhiyun if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) 40*4882a593Smuzhiyun message(STATUS "Setting build type to Release as none was specified.") 41*4882a593Smuzhiyun set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build." FORCE) 42*4882a593Smuzhiyun@@ -137,10 +139,6 @@ set(BROTLI_LIBRARIES_CORE brotlienc brotlidec brotlicommon) 43*4882a593Smuzhiyun set(BROTLI_LIBRARIES ${BROTLI_LIBRARIES_CORE} ${LIBM_LIBRARY}) 44*4882a593Smuzhiyun mark_as_advanced(BROTLI_LIBRARIES) 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun-set(BROTLI_LIBRARIES_CORE_STATIC brotlienc-static brotlidec-static brotlicommon-static) 47*4882a593Smuzhiyun-set(BROTLI_LIBRARIES_STATIC ${BROTLI_LIBRARIES_CORE_STATIC} ${LIBM_LIBRARY}) 48*4882a593Smuzhiyun-mark_as_advanced(BROTLI_LIBRARIES_STATIC) 49*4882a593Smuzhiyun- 50*4882a593Smuzhiyun if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") 51*4882a593Smuzhiyun add_definitions(-DOS_LINUX) 52*4882a593Smuzhiyun elseif(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") 53*4882a593Smuzhiyun@@ -161,29 +159,25 @@ transform_sources_list("scripts/sources.lst" "${CMAKE_CURRENT_BINARY_DIR}/source 54*4882a593Smuzhiyun include("${CMAKE_CURRENT_BINARY_DIR}/sources.lst.cmake") 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun if(BROTLI_EMSCRIPTEN) 57*4882a593Smuzhiyun- set(BROTLI_SHARED_LIBS "") 58*4882a593Smuzhiyun-else() 59*4882a593Smuzhiyun- set(BROTLI_SHARED_LIBS brotlicommon brotlidec brotlienc) 60*4882a593Smuzhiyun- add_library(brotlicommon SHARED ${BROTLI_COMMON_C}) 61*4882a593Smuzhiyun- add_library(brotlidec SHARED ${BROTLI_DEC_C}) 62*4882a593Smuzhiyun- add_library(brotlienc SHARED ${BROTLI_ENC_C}) 63*4882a593Smuzhiyun+ set(BUILD_SHARED_LIBS OFF) 64*4882a593Smuzhiyun endif() 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun-set(BROTLI_STATIC_LIBS brotlicommon-static brotlidec-static brotlienc-static) 67*4882a593Smuzhiyun-add_library(brotlicommon-static STATIC ${BROTLI_COMMON_C}) 68*4882a593Smuzhiyun-add_library(brotlidec-static STATIC ${BROTLI_DEC_C}) 69*4882a593Smuzhiyun-add_library(brotlienc-static STATIC ${BROTLI_ENC_C}) 70*4882a593Smuzhiyun+add_library(brotlicommon ${BROTLI_COMMON_C}) 71*4882a593Smuzhiyun+add_library(brotlidec ${BROTLI_DEC_C}) 72*4882a593Smuzhiyun+add_library(brotlienc ${BROTLI_ENC_C}) 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun # Older CMake versions does not understand INCLUDE_DIRECTORIES property. 75*4882a593Smuzhiyun include_directories(${BROTLI_INCLUDE_DIRS}) 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun-foreach(lib IN LISTS BROTLI_SHARED_LIBS) 78*4882a593Smuzhiyun- target_compile_definitions(${lib} PUBLIC "BROTLI_SHARED_COMPILATION" ) 79*4882a593Smuzhiyun- string(TOUPPER "${lib}" LIB) 80*4882a593Smuzhiyun- set_target_properties (${lib} PROPERTIES DEFINE_SYMBOL "${LIB}_SHARED_COMPILATION") 81*4882a593Smuzhiyun-endforeach() 82*4882a593Smuzhiyun+if(BUILD_SHARED_LIBS) 83*4882a593Smuzhiyun+ foreach(lib brotlicommon brotlidec brotlienc) 84*4882a593Smuzhiyun+ target_compile_definitions(${lib} PUBLIC "BROTLI_SHARED_COMPILATION" ) 85*4882a593Smuzhiyun+ string(TOUPPER "${lib}" LIB) 86*4882a593Smuzhiyun+ set_target_properties (${lib} PROPERTIES DEFINE_SYMBOL "${LIB}_SHARED_COMPILATION") 87*4882a593Smuzhiyun+ endforeach() 88*4882a593Smuzhiyun+endif() 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun-foreach(lib IN LISTS BROTLI_SHARED_LIBS BROTLI_STATIC_LIBS) 91*4882a593Smuzhiyun+foreach(lib brotlicommon brotlidec brotlienc) 92*4882a593Smuzhiyun target_link_libraries(${lib} ${LIBM_LIBRARY}) 93*4882a593Smuzhiyun set_property(TARGET ${lib} APPEND PROPERTY INCLUDE_DIRECTORIES ${BROTLI_INCLUDE_DIRS}) 94*4882a593Smuzhiyun set_target_properties(${lib} PROPERTIES 95*4882a593Smuzhiyun@@ -200,9 +194,6 @@ target_link_libraries(brotlidec brotlicommon) 96*4882a593Smuzhiyun target_link_libraries(brotlienc brotlicommon) 97*4882a593Smuzhiyun endif() 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun-target_link_libraries(brotlidec-static brotlicommon-static) 100*4882a593Smuzhiyun-target_link_libraries(brotlienc-static brotlicommon-static) 101*4882a593Smuzhiyun- 102*4882a593Smuzhiyun # For projects stuck on older versions of CMake, this will set the 103*4882a593Smuzhiyun # BROTLI_INCLUDE_DIRS and BROTLI_LIBRARIES variables so they still 104*4882a593Smuzhiyun # have a relatively easy way to use Brotli: 105*4882a593Smuzhiyun@@ -216,7 +207,7 @@ endif() 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun # Build the brotli executable 108*4882a593Smuzhiyun add_executable(brotli ${BROTLI_CLI_C}) 109*4882a593Smuzhiyun-target_link_libraries(brotli ${BROTLI_LIBRARIES_STATIC}) 110*4882a593Smuzhiyun+target_link_libraries(brotli ${BROTLI_LIBRARIES}) 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun # Installation 113*4882a593Smuzhiyun if(NOT BROTLI_EMSCRIPTEN) 114*4882a593Smuzhiyun@@ -233,13 +224,6 @@ if(NOT BROTLI_BUNDLED_MODE) 115*4882a593Smuzhiyun RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" 116*4882a593Smuzhiyun ) 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun- install( 119*4882a593Smuzhiyun- TARGETS ${BROTLI_LIBRARIES_CORE_STATIC} 120*4882a593Smuzhiyun- ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" 121*4882a593Smuzhiyun- LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" 122*4882a593Smuzhiyun- RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" 123*4882a593Smuzhiyun- ) 124*4882a593Smuzhiyun- 125*4882a593Smuzhiyun install( 126*4882a593Smuzhiyun DIRECTORY ${BROTLI_INCLUDE_DIRS}/brotli 127*4882a593Smuzhiyun DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" 128*4882a593Smuzhiyun-- 129*4882a593Smuzhiyun2.28.0 130*4882a593Smuzhiyun 131