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