xref: /aosp_15_r20/external/brotli/CMakeLists.txt (revision f4ee7fba7774faf2a30f13154332c0a06550dbc4)
1*f4ee7fbaSAndroid Build Coastguard Worker# Ubuntu 12.04 LTS has CMake 2.8.7, and is an important target since
2*f4ee7fbaSAndroid Build Coastguard Worker# several CI services, such as Travis and Drone, use it.  Solaris 11
3*f4ee7fbaSAndroid Build Coastguard Worker# has 2.8.6, and it's not difficult to support if you already have to
4*f4ee7fbaSAndroid Build Coastguard Worker# support 2.8.7.
5*f4ee7fbaSAndroid Build Coastguard Workercmake_minimum_required(VERSION 2.8.6)
6*f4ee7fbaSAndroid Build Coastguard Worker
7*f4ee7fbaSAndroid Build Coastguard Workerproject(brotli C)
8*f4ee7fbaSAndroid Build Coastguard Worker
9*f4ee7fbaSAndroid Build Coastguard Workerif(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
10*f4ee7fbaSAndroid Build Coastguard Worker  message(STATUS "Setting build type to Release as none was specified.")
11*f4ee7fbaSAndroid Build Coastguard Worker  set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build." FORCE)
12*f4ee7fbaSAndroid Build Coastguard Workerelse()
13*f4ee7fbaSAndroid Build Coastguard Worker  message(STATUS "Build type is '${CMAKE_BUILD_TYPE}'")
14*f4ee7fbaSAndroid Build Coastguard Workerendif()
15*f4ee7fbaSAndroid Build Coastguard Worker
16*f4ee7fbaSAndroid Build Coastguard Workerinclude(CheckCSourceCompiles)
17*f4ee7fbaSAndroid Build Coastguard Workercheck_c_source_compiles(
18*f4ee7fbaSAndroid Build Coastguard Worker  "#if defined(__EMSCRIPTEN__)
19*f4ee7fbaSAndroid Build Coastguard Worker   int main() {return 0;}
20*f4ee7fbaSAndroid Build Coastguard Worker   #endif"
21*f4ee7fbaSAndroid Build Coastguard Worker  BROTLI_EMSCRIPTEN
22*f4ee7fbaSAndroid Build Coastguard Worker)
23*f4ee7fbaSAndroid Build Coastguard Workerif (BROTLI_EMSCRIPTEN)
24*f4ee7fbaSAndroid Build Coastguard Worker  message("-- Compiler is EMSCRIPTEN")
25*f4ee7fbaSAndroid Build Coastguard Workerelse()
26*f4ee7fbaSAndroid Build Coastguard Worker  message("-- Compiler is not EMSCRIPTEN")
27*f4ee7fbaSAndroid Build Coastguard Workerendif()
28*f4ee7fbaSAndroid Build Coastguard Worker
29*f4ee7fbaSAndroid Build Coastguard Worker# If Brotli is being bundled in another project, we don't want to
30*f4ee7fbaSAndroid Build Coastguard Worker# install anything.  However, we want to let people override this, so
31*f4ee7fbaSAndroid Build Coastguard Worker# we'll use the BROTLI_BUNDLED_MODE variable to let them do that; just
32*f4ee7fbaSAndroid Build Coastguard Worker# set it to OFF in your project before you add_subdirectory(brotli).
33*f4ee7fbaSAndroid Build Coastguard Workerget_directory_property(BROTLI_PARENT_DIRECTORY PARENT_DIRECTORY)
34*f4ee7fbaSAndroid Build Coastguard Workerif(NOT DEFINED BROTLI_BUNDLED_MODE)
35*f4ee7fbaSAndroid Build Coastguard Worker  # Bundled mode hasn't been set one way or the other, set the default
36*f4ee7fbaSAndroid Build Coastguard Worker  # depending on whether or not we are the top-level project.
37*f4ee7fbaSAndroid Build Coastguard Worker  if(BROTLI_PARENT_DIRECTORY)
38*f4ee7fbaSAndroid Build Coastguard Worker    set(BROTLI_BUNDLED_MODE ON)
39*f4ee7fbaSAndroid Build Coastguard Worker  else()
40*f4ee7fbaSAndroid Build Coastguard Worker    set(BROTLI_BUNDLED_MODE OFF)
41*f4ee7fbaSAndroid Build Coastguard Worker  endif()
42*f4ee7fbaSAndroid Build Coastguard Workerendif()
43*f4ee7fbaSAndroid Build Coastguard Workermark_as_advanced(BROTLI_BUNDLED_MODE)
44*f4ee7fbaSAndroid Build Coastguard Worker
45*f4ee7fbaSAndroid Build Coastguard Workerinclude(GNUInstallDirs)
46*f4ee7fbaSAndroid Build Coastguard Worker
47*f4ee7fbaSAndroid Build Coastguard Worker# Parse version information from common/version.h. Normally we would
48*f4ee7fbaSAndroid Build Coastguard Worker# define these values here and write them out to configuration file(s)
49*f4ee7fbaSAndroid Build Coastguard Worker# (i.e., config.h), but in this case we parse them from
50*f4ee7fbaSAndroid Build Coastguard Worker# common/version.h to be less intrusive.
51*f4ee7fbaSAndroid Build Coastguard Workerfunction(hex_to_dec HEXADECIMAL DECIMAL)
52*f4ee7fbaSAndroid Build Coastguard Worker  string(TOUPPER "${HEXADECIMAL}" _tail)
53*f4ee7fbaSAndroid Build Coastguard Worker  set(_decimal 0)
54*f4ee7fbaSAndroid Build Coastguard Worker  string(LENGTH "${_tail}" _tail_length)
55*f4ee7fbaSAndroid Build Coastguard Worker  while (_tail_length GREATER 0)
56*f4ee7fbaSAndroid Build Coastguard Worker    math(EXPR _decimal "${_decimal} * 16")
57*f4ee7fbaSAndroid Build Coastguard Worker    string(SUBSTRING "${_tail}" 0 1 _digit)
58*f4ee7fbaSAndroid Build Coastguard Worker    string(SUBSTRING "${_tail}" 1 -1 _tail)
59*f4ee7fbaSAndroid Build Coastguard Worker    if (_digit STREQUAL "A")
60*f4ee7fbaSAndroid Build Coastguard Worker      math(EXPR _decimal "${_decimal} + 10")
61*f4ee7fbaSAndroid Build Coastguard Worker    elseif (_digit STREQUAL "B")
62*f4ee7fbaSAndroid Build Coastguard Worker      math(EXPR _decimal "${_decimal} + 11")
63*f4ee7fbaSAndroid Build Coastguard Worker    elseif (_digit STREQUAL "C")
64*f4ee7fbaSAndroid Build Coastguard Worker      math(EXPR _decimal "${_decimal} + 12")
65*f4ee7fbaSAndroid Build Coastguard Worker    elseif (_digit STREQUAL "D")
66*f4ee7fbaSAndroid Build Coastguard Worker      math(EXPR _decimal "${_decimal} + 13")
67*f4ee7fbaSAndroid Build Coastguard Worker    elseif (_digit STREQUAL "E")
68*f4ee7fbaSAndroid Build Coastguard Worker      math(EXPR _decimal "${_decimal} + 14")
69*f4ee7fbaSAndroid Build Coastguard Worker    elseif (_digit STREQUAL "F")
70*f4ee7fbaSAndroid Build Coastguard Worker      math(EXPR _decimal "${_decimal} + 15")
71*f4ee7fbaSAndroid Build Coastguard Worker    else()
72*f4ee7fbaSAndroid Build Coastguard Worker      math(EXPR _decimal "${_decimal} + ${_digit}")
73*f4ee7fbaSAndroid Build Coastguard Worker    endif()
74*f4ee7fbaSAndroid Build Coastguard Worker    string(LENGTH "${_tail}" _tail_length)
75*f4ee7fbaSAndroid Build Coastguard Worker  endwhile()
76*f4ee7fbaSAndroid Build Coastguard Worker  set(${DECIMAL} ${_decimal} PARENT_SCOPE)
77*f4ee7fbaSAndroid Build Coastguard Workerendfunction(hex_to_dec)
78*f4ee7fbaSAndroid Build Coastguard Worker
79*f4ee7fbaSAndroid Build Coastguard Worker# Version information
80*f4ee7fbaSAndroid Build Coastguard Workerfile(STRINGS "c/common/version.h" _brotli_version_line REGEX "^#define BROTLI_VERSION (0x[0-9a-fA-F]+)$")
81*f4ee7fbaSAndroid Build Coastguard Workerstring(REGEX REPLACE "^#define BROTLI_VERSION 0x([0-9a-fA-F]+)$" "\\1" _brotli_version_hex "${_brotli_version_line}")
82*f4ee7fbaSAndroid Build Coastguard Workerhex_to_dec("${_brotli_version_hex}" _brotli_version)
83*f4ee7fbaSAndroid Build Coastguard Workermath(EXPR BROTLI_VERSION_MAJOR "${_brotli_version} >> 24")
84*f4ee7fbaSAndroid Build Coastguard Workermath(EXPR BROTLI_VERSION_MINOR "(${_brotli_version} >> 12) & 4095")
85*f4ee7fbaSAndroid Build Coastguard Workermath(EXPR BROTLI_VERSION_PATCH "${_brotli_version} & 4095")
86*f4ee7fbaSAndroid Build Coastguard Workerset(BROTLI_VERSION "${BROTLI_VERSION_MAJOR}.${BROTLI_VERSION_MINOR}.${BROTLI_VERSION_PATCH}")
87*f4ee7fbaSAndroid Build Coastguard Workermark_as_advanced(BROTLI_VERSION BROTLI_VERSION_MAJOR BROTLI_VERSION_MINOR BROTLI_VERSION_PATCH)
88*f4ee7fbaSAndroid Build Coastguard Worker
89*f4ee7fbaSAndroid Build Coastguard Worker# ABI Version information
90*f4ee7fbaSAndroid Build Coastguard Workerfile(STRINGS "c/common/version.h" _brotli_abi_info_line REGEX "^#define BROTLI_ABI_VERSION (0x[0-9a-fA-F]+)$")
91*f4ee7fbaSAndroid Build Coastguard Workerstring(REGEX REPLACE "^#define BROTLI_ABI_VERSION 0x([0-9a-fA-F]+)$" "\\1" _brotli_abi_info_hex "${_brotli_abi_info_line}")
92*f4ee7fbaSAndroid Build Coastguard Workerhex_to_dec("${_brotli_abi_info_hex}" _brotli_abi_info)
93*f4ee7fbaSAndroid Build Coastguard Workermath(EXPR BROTLI_ABI_CURRENT "${_brotli_abi_info} >> 24")
94*f4ee7fbaSAndroid Build Coastguard Workermath(EXPR BROTLI_ABI_REVISION "(${_brotli_abi_info} >> 12) & 4095")
95*f4ee7fbaSAndroid Build Coastguard Workermath(EXPR BROTLI_ABI_AGE "${_brotli_abi_info} & 4095")
96*f4ee7fbaSAndroid Build Coastguard Workermath(EXPR BROTLI_ABI_COMPATIBILITY "${BROTLI_ABI_CURRENT} - ${BROTLI_ABI_AGE}")
97*f4ee7fbaSAndroid Build Coastguard Workermark_as_advanced(BROTLI_ABI_CURRENT BROTLI_ABI_REVISION BROTLI_ABI_AGE BROTLI_ABI_COMPATIBILITY)
98*f4ee7fbaSAndroid Build Coastguard Worker
99*f4ee7fbaSAndroid Build Coastguard Workerif (ENABLE_SANITIZER)
100*f4ee7fbaSAndroid Build Coastguard Worker  set(CMAKE_C_FLAGS " ${CMAKE_C_FLAGS} -fsanitize=${ENABLE_SANITIZER}")
101*f4ee7fbaSAndroid Build Coastguard Worker  set(CMAKE_CXX_FLAGS " ${CMAKE_CXX_FLAGS} -fsanitize=${ENABLE_SANITIZER}")
102*f4ee7fbaSAndroid Build Coastguard Worker  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=${ENABLE_SANITIZER}")
103*f4ee7fbaSAndroid Build Coastguard Worker
104*f4ee7fbaSAndroid Build Coastguard Worker  # By default, brotli depends on undefined behavior, but setting
105*f4ee7fbaSAndroid Build Coastguard Worker  # BROTLI_BUILD_PORTABLE should result in a build which does not.
106*f4ee7fbaSAndroid Build Coastguard Worker  if(ENABLE_SANITIZER STREQUAL "undefined")
107*f4ee7fbaSAndroid Build Coastguard Worker    add_definitions(-DBROTLI_BUILD_PORTABLE)
108*f4ee7fbaSAndroid Build Coastguard Worker  endif()
109*f4ee7fbaSAndroid Build Coastguard Workerendif ()
110*f4ee7fbaSAndroid Build Coastguard Worker
111*f4ee7fbaSAndroid Build Coastguard Workerinclude(CheckFunctionExists)
112*f4ee7fbaSAndroid Build Coastguard Workerset(LIBM_LIBRARY)
113*f4ee7fbaSAndroid Build Coastguard WorkerCHECK_FUNCTION_EXISTS(log2 LOG2_RES)
114*f4ee7fbaSAndroid Build Coastguard Workerif(NOT LOG2_RES)
115*f4ee7fbaSAndroid Build Coastguard Worker  set(orig_req_libs "${CMAKE_REQUIRED_LIBRARIES}")
116*f4ee7fbaSAndroid Build Coastguard Worker  set(CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES};m")
117*f4ee7fbaSAndroid Build Coastguard Worker  CHECK_FUNCTION_EXISTS(log2 LOG2_LIBM_RES)
118*f4ee7fbaSAndroid Build Coastguard Worker  if(LOG2_LIBM_RES)
119*f4ee7fbaSAndroid Build Coastguard Worker    set(LIBM_LIBRARY "m")
120*f4ee7fbaSAndroid Build Coastguard Worker    add_definitions(-DBROTLI_HAVE_LOG2=1)
121*f4ee7fbaSAndroid Build Coastguard Worker  else()
122*f4ee7fbaSAndroid Build Coastguard Worker    add_definitions(-DBROTLI_HAVE_LOG2=0)
123*f4ee7fbaSAndroid Build Coastguard Worker  endif()
124*f4ee7fbaSAndroid Build Coastguard Worker
125*f4ee7fbaSAndroid Build Coastguard Worker  set(CMAKE_REQUIRED_LIBRARIES "${orig_req_libs}")
126*f4ee7fbaSAndroid Build Coastguard Worker  unset(LOG2_LIBM_RES)
127*f4ee7fbaSAndroid Build Coastguard Worker  unset(orig_req_libs)
128*f4ee7fbaSAndroid Build Coastguard Workerelse()
129*f4ee7fbaSAndroid Build Coastguard Worker  add_definitions(-DBROTLI_HAVE_LOG2=1)
130*f4ee7fbaSAndroid Build Coastguard Workerendif()
131*f4ee7fbaSAndroid Build Coastguard Workerunset(LOG2_RES)
132*f4ee7fbaSAndroid Build Coastguard Worker
133*f4ee7fbaSAndroid Build Coastguard Workerset(BROTLI_INCLUDE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/c/include")
134*f4ee7fbaSAndroid Build Coastguard Workermark_as_advanced(BROTLI_INCLUDE_DIRS)
135*f4ee7fbaSAndroid Build Coastguard Worker
136*f4ee7fbaSAndroid Build Coastguard Workerset(BROTLI_LIBRARIES_CORE brotlienc brotlidec brotlicommon)
137*f4ee7fbaSAndroid Build Coastguard Workerset(BROTLI_LIBRARIES ${BROTLI_LIBRARIES_CORE} ${LIBM_LIBRARY})
138*f4ee7fbaSAndroid Build Coastguard Workermark_as_advanced(BROTLI_LIBRARIES)
139*f4ee7fbaSAndroid Build Coastguard Worker
140*f4ee7fbaSAndroid Build Coastguard Workerset(BROTLI_LIBRARIES_CORE_STATIC brotlienc-static brotlidec-static brotlicommon-static)
141*f4ee7fbaSAndroid Build Coastguard Workerset(BROTLI_LIBRARIES_STATIC ${BROTLI_LIBRARIES_CORE_STATIC} ${LIBM_LIBRARY})
142*f4ee7fbaSAndroid Build Coastguard Workermark_as_advanced(BROTLI_LIBRARIES_STATIC)
143*f4ee7fbaSAndroid Build Coastguard Worker
144*f4ee7fbaSAndroid Build Coastguard Workerif(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
145*f4ee7fbaSAndroid Build Coastguard Worker  add_definitions(-DOS_LINUX)
146*f4ee7fbaSAndroid Build Coastguard Workerelseif(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
147*f4ee7fbaSAndroid Build Coastguard Worker  add_definitions(-DOS_FREEBSD)
148*f4ee7fbaSAndroid Build Coastguard Workerelseif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
149*f4ee7fbaSAndroid Build Coastguard Worker  add_definitions(-DOS_MACOSX)
150*f4ee7fbaSAndroid Build Coastguard Workerendif()
151*f4ee7fbaSAndroid Build Coastguard Worker
152*f4ee7fbaSAndroid Build Coastguard Workerfunction(transform_sources_list INPUT_FILE OUTPUT_FILE)
153*f4ee7fbaSAndroid Build Coastguard Worker  file(READ ${INPUT_FILE} TEXT)
154*f4ee7fbaSAndroid Build Coastguard Worker  string(REGEX REPLACE "\\\\\n" "~continuation~" TEXT ${TEXT})
155*f4ee7fbaSAndroid Build Coastguard Worker  string(REGEX REPLACE "([a-zA-Z_][a-zA-Z0-9_]*)[\t ]*=[\t ]*([^\n]*)" "SET(\\1 \\2)" TEXT ${TEXT})
156*f4ee7fbaSAndroid Build Coastguard Worker  string(REPLACE "~continuation~" "\n" TEXT ${TEXT})
157*f4ee7fbaSAndroid Build Coastguard Worker  file(WRITE ${OUTPUT_FILE} ${TEXT})
158*f4ee7fbaSAndroid Build Coastguard Workerendfunction()
159*f4ee7fbaSAndroid Build Coastguard Worker
160*f4ee7fbaSAndroid Build Coastguard Workertransform_sources_list("scripts/sources.lst" "${CMAKE_CURRENT_BINARY_DIR}/sources.lst.cmake")
161*f4ee7fbaSAndroid Build Coastguard Workerinclude("${CMAKE_CURRENT_BINARY_DIR}/sources.lst.cmake")
162*f4ee7fbaSAndroid Build Coastguard Worker
163*f4ee7fbaSAndroid Build Coastguard Workerif(BROTLI_EMSCRIPTEN)
164*f4ee7fbaSAndroid Build Coastguard Worker  set(BROTLI_SHARED_LIBS "")
165*f4ee7fbaSAndroid Build Coastguard Workerelse()
166*f4ee7fbaSAndroid Build Coastguard Worker  set(BROTLI_SHARED_LIBS brotlicommon brotlidec brotlienc)
167*f4ee7fbaSAndroid Build Coastguard Worker  add_library(brotlicommon SHARED ${BROTLI_COMMON_C})
168*f4ee7fbaSAndroid Build Coastguard Worker  add_library(brotlidec SHARED ${BROTLI_DEC_C})
169*f4ee7fbaSAndroid Build Coastguard Worker  add_library(brotlienc SHARED ${BROTLI_ENC_C})
170*f4ee7fbaSAndroid Build Coastguard Workerendif()
171*f4ee7fbaSAndroid Build Coastguard Worker
172*f4ee7fbaSAndroid Build Coastguard Workerset(BROTLI_STATIC_LIBS brotlicommon-static brotlidec-static brotlienc-static)
173*f4ee7fbaSAndroid Build Coastguard Workeradd_library(brotlicommon-static STATIC ${BROTLI_COMMON_C})
174*f4ee7fbaSAndroid Build Coastguard Workeradd_library(brotlidec-static STATIC ${BROTLI_DEC_C})
175*f4ee7fbaSAndroid Build Coastguard Workeradd_library(brotlienc-static STATIC ${BROTLI_ENC_C})
176*f4ee7fbaSAndroid Build Coastguard Worker
177*f4ee7fbaSAndroid Build Coastguard Worker# Older CMake versions does not understand INCLUDE_DIRECTORIES property.
178*f4ee7fbaSAndroid Build Coastguard Workerinclude_directories(${BROTLI_INCLUDE_DIRS})
179*f4ee7fbaSAndroid Build Coastguard Worker
180*f4ee7fbaSAndroid Build Coastguard Workerforeach(lib IN LISTS BROTLI_SHARED_LIBS)
181*f4ee7fbaSAndroid Build Coastguard Worker  target_compile_definitions(${lib} PUBLIC "BROTLI_SHARED_COMPILATION" )
182*f4ee7fbaSAndroid Build Coastguard Worker  string(TOUPPER "${lib}" LIB)
183*f4ee7fbaSAndroid Build Coastguard Worker  set_target_properties (${lib} PROPERTIES DEFINE_SYMBOL "${LIB}_SHARED_COMPILATION")
184*f4ee7fbaSAndroid Build Coastguard Workerendforeach()
185*f4ee7fbaSAndroid Build Coastguard Worker
186*f4ee7fbaSAndroid Build Coastguard Workerforeach(lib IN LISTS BROTLI_SHARED_LIBS BROTLI_STATIC_LIBS)
187*f4ee7fbaSAndroid Build Coastguard Worker  target_link_libraries(${lib} ${LIBM_LIBRARY})
188*f4ee7fbaSAndroid Build Coastguard Worker  set_property(TARGET ${lib} APPEND PROPERTY INCLUDE_DIRECTORIES ${BROTLI_INCLUDE_DIRS})
189*f4ee7fbaSAndroid Build Coastguard Worker  set_target_properties(${lib} PROPERTIES
190*f4ee7fbaSAndroid Build Coastguard Worker    VERSION "${BROTLI_ABI_COMPATIBILITY}.${BROTLI_ABI_AGE}.${BROTLI_ABI_REVISION}"
191*f4ee7fbaSAndroid Build Coastguard Worker    SOVERSION "${BROTLI_ABI_COMPATIBILITY}")
192*f4ee7fbaSAndroid Build Coastguard Worker  if(NOT BROTLI_EMSCRIPTEN)
193*f4ee7fbaSAndroid Build Coastguard Worker    set_target_properties(${lib} PROPERTIES POSITION_INDEPENDENT_CODE TRUE)
194*f4ee7fbaSAndroid Build Coastguard Worker  endif()
195*f4ee7fbaSAndroid Build Coastguard Worker  set_property(TARGET ${lib} APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${BROTLI_INCLUDE_DIRS}")
196*f4ee7fbaSAndroid Build Coastguard Workerendforeach()
197*f4ee7fbaSAndroid Build Coastguard Worker
198*f4ee7fbaSAndroid Build Coastguard Workerif(NOT BROTLI_EMSCRIPTEN)
199*f4ee7fbaSAndroid Build Coastguard Workertarget_link_libraries(brotlidec brotlicommon)
200*f4ee7fbaSAndroid Build Coastguard Workertarget_link_libraries(brotlienc brotlicommon)
201*f4ee7fbaSAndroid Build Coastguard Workerendif()
202*f4ee7fbaSAndroid Build Coastguard Worker
203*f4ee7fbaSAndroid Build Coastguard Workertarget_link_libraries(brotlidec-static brotlicommon-static)
204*f4ee7fbaSAndroid Build Coastguard Workertarget_link_libraries(brotlienc-static brotlicommon-static)
205*f4ee7fbaSAndroid Build Coastguard Worker
206*f4ee7fbaSAndroid Build Coastguard Worker# For projects stuck on older versions of CMake, this will set the
207*f4ee7fbaSAndroid Build Coastguard Worker# BROTLI_INCLUDE_DIRS and BROTLI_LIBRARIES variables so they still
208*f4ee7fbaSAndroid Build Coastguard Worker# have a relatively easy way to use Brotli:
209*f4ee7fbaSAndroid Build Coastguard Worker#
210*f4ee7fbaSAndroid Build Coastguard Worker#   include_directories(${BROTLI_INCLUDE_DIRS})
211*f4ee7fbaSAndroid Build Coastguard Worker#   target_link_libraries(foo ${BROTLI_LIBRARIES})
212*f4ee7fbaSAndroid Build Coastguard Workerif(BROTLI_PARENT_DIRECTORY)
213*f4ee7fbaSAndroid Build Coastguard Worker  set(BROTLI_INCLUDE_DIRS "${BROTLI_INCLUDE_DIRS}" PARENT_SCOPE)
214*f4ee7fbaSAndroid Build Coastguard Worker  set(BROTLI_LIBRARIES "${BROTLI_LIBRARIES}" PARENT_SCOPE)
215*f4ee7fbaSAndroid Build Coastguard Workerendif()
216*f4ee7fbaSAndroid Build Coastguard Worker
217*f4ee7fbaSAndroid Build Coastguard Worker# Build the brotli executable
218*f4ee7fbaSAndroid Build Coastguard Workeradd_executable(brotli ${BROTLI_CLI_C})
219*f4ee7fbaSAndroid Build Coastguard Workertarget_link_libraries(brotli ${BROTLI_LIBRARIES_STATIC})
220*f4ee7fbaSAndroid Build Coastguard Worker
221*f4ee7fbaSAndroid Build Coastguard Worker# Installation
222*f4ee7fbaSAndroid Build Coastguard Workerif(NOT BROTLI_EMSCRIPTEN)
223*f4ee7fbaSAndroid Build Coastguard Workerif(NOT BROTLI_BUNDLED_MODE)
224*f4ee7fbaSAndroid Build Coastguard Worker  install(
225*f4ee7fbaSAndroid Build Coastguard Worker    TARGETS brotli
226*f4ee7fbaSAndroid Build Coastguard Worker    RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
227*f4ee7fbaSAndroid Build Coastguard Worker  )
228*f4ee7fbaSAndroid Build Coastguard Worker
229*f4ee7fbaSAndroid Build Coastguard Worker  install(
230*f4ee7fbaSAndroid Build Coastguard Worker    TARGETS ${BROTLI_LIBRARIES_CORE}
231*f4ee7fbaSAndroid Build Coastguard Worker    ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
232*f4ee7fbaSAndroid Build Coastguard Worker    LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
233*f4ee7fbaSAndroid Build Coastguard Worker    RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
234*f4ee7fbaSAndroid Build Coastguard Worker  )
235*f4ee7fbaSAndroid Build Coastguard Worker
236*f4ee7fbaSAndroid Build Coastguard Worker  install(
237*f4ee7fbaSAndroid Build Coastguard Worker    TARGETS ${BROTLI_LIBRARIES_CORE_STATIC}
238*f4ee7fbaSAndroid Build Coastguard Worker    ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
239*f4ee7fbaSAndroid Build Coastguard Worker    LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
240*f4ee7fbaSAndroid Build Coastguard Worker    RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
241*f4ee7fbaSAndroid Build Coastguard Worker  )
242*f4ee7fbaSAndroid Build Coastguard Worker
243*f4ee7fbaSAndroid Build Coastguard Worker  install(
244*f4ee7fbaSAndroid Build Coastguard Worker    DIRECTORY ${BROTLI_INCLUDE_DIRS}/brotli
245*f4ee7fbaSAndroid Build Coastguard Worker    DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
246*f4ee7fbaSAndroid Build Coastguard Worker  )
247*f4ee7fbaSAndroid Build Coastguard Workerendif()  # BROTLI_BUNDLED_MODE
248*f4ee7fbaSAndroid Build Coastguard Workerendif()  # BROTLI_EMSCRIPTEN
249*f4ee7fbaSAndroid Build Coastguard Worker
250*f4ee7fbaSAndroid Build Coastguard Worker# Tests
251*f4ee7fbaSAndroid Build Coastguard Worker
252*f4ee7fbaSAndroid Build Coastguard Worker# If we're targeting Windows but not running on Windows, we need Wine
253*f4ee7fbaSAndroid Build Coastguard Worker# to run the tests...
254*f4ee7fbaSAndroid Build Coastguard Workerif(NOT BROTLI_DISABLE_TESTS)
255*f4ee7fbaSAndroid Build Coastguard Worker  if(WIN32 AND NOT CMAKE_HOST_WIN32)
256*f4ee7fbaSAndroid Build Coastguard Worker    find_program(BROTLI_WRAPPER NAMES wine)
257*f4ee7fbaSAndroid Build Coastguard Worker
258*f4ee7fbaSAndroid Build Coastguard Worker    if(NOT BROTLI_WRAPPER)
259*f4ee7fbaSAndroid Build Coastguard Worker      message(STATUS "wine not found, disabling tests")
260*f4ee7fbaSAndroid Build Coastguard Worker      set(BROTLI_DISABLE_TESTS TRUE)
261*f4ee7fbaSAndroid Build Coastguard Worker    endif()
262*f4ee7fbaSAndroid Build Coastguard Worker  endif()
263*f4ee7fbaSAndroid Build Coastguard Workerendif()
264*f4ee7fbaSAndroid Build Coastguard Worker
265*f4ee7fbaSAndroid Build Coastguard Worker# If our compiler is a cross-compiler that we know about (arm/aarch64),
266*f4ee7fbaSAndroid Build Coastguard Worker# then we need to use qemu to execute the tests.
267*f4ee7fbaSAndroid Build Coastguard Workerif(NOT BROTLI_DISABLE_TESTS)
268*f4ee7fbaSAndroid Build Coastguard Worker  if ("${CMAKE_C_COMPILER}" MATCHES "^.*/arm-linux-gnueabihf-.*$")
269*f4ee7fbaSAndroid Build Coastguard Worker    message(STATUS "Detected arm-linux-gnueabihf cross-compilation")
270*f4ee7fbaSAndroid Build Coastguard Worker    set(BROTLI_WRAPPER "qemu-arm")
271*f4ee7fbaSAndroid Build Coastguard Worker    set(BROTLI_WRAPPER_LD_PREFIX "/usr/arm-linux-gnueabihf")
272*f4ee7fbaSAndroid Build Coastguard Worker  endif()
273*f4ee7fbaSAndroid Build Coastguard Worker
274*f4ee7fbaSAndroid Build Coastguard Worker  if ("${CMAKE_C_COMPILER}" MATCHES "^.*/arm-linux-gnueabi-.*$")
275*f4ee7fbaSAndroid Build Coastguard Worker    message(STATUS "Detected arm-linux-gnueabi cross-compilation")
276*f4ee7fbaSAndroid Build Coastguard Worker    set(BROTLI_WRAPPER "qemu-arm")
277*f4ee7fbaSAndroid Build Coastguard Worker    set(BROTLI_WRAPPER_LD_PREFIX "/usr/arm-linux-gnueabi")
278*f4ee7fbaSAndroid Build Coastguard Worker  endif()
279*f4ee7fbaSAndroid Build Coastguard Worker
280*f4ee7fbaSAndroid Build Coastguard Worker  if ("${CMAKE_C_COMPILER}" MATCHES "^.*/aarch64-linux-gnu-.*$")
281*f4ee7fbaSAndroid Build Coastguard Worker    message(STATUS "Detected aarch64-linux-gnu cross-compilation")
282*f4ee7fbaSAndroid Build Coastguard Worker    set(BROTLI_WRAPPER "qemu-aarch64")
283*f4ee7fbaSAndroid Build Coastguard Worker    set(BROTLI_WRAPPER_LD_PREFIX "/usr/aarch64-linux-gnu")
284*f4ee7fbaSAndroid Build Coastguard Worker  endif()
285*f4ee7fbaSAndroid Build Coastguard Workerendif()
286*f4ee7fbaSAndroid Build Coastguard Worker
287*f4ee7fbaSAndroid Build Coastguard Workerif(NOT BROTLI_DISABLE_TESTS)
288*f4ee7fbaSAndroid Build Coastguard Worker  include(CTest)
289*f4ee7fbaSAndroid Build Coastguard Worker  enable_testing()
290*f4ee7fbaSAndroid Build Coastguard Worker
291*f4ee7fbaSAndroid Build Coastguard Worker  set(ROUNDTRIP_INPUTS
292*f4ee7fbaSAndroid Build Coastguard Worker    tests/testdata/alice29.txt
293*f4ee7fbaSAndroid Build Coastguard Worker    tests/testdata/asyoulik.txt
294*f4ee7fbaSAndroid Build Coastguard Worker    tests/testdata/lcet10.txt
295*f4ee7fbaSAndroid Build Coastguard Worker    tests/testdata/plrabn12.txt
296*f4ee7fbaSAndroid Build Coastguard Worker    c/enc/encode.c
297*f4ee7fbaSAndroid Build Coastguard Worker    c/common/dictionary.h
298*f4ee7fbaSAndroid Build Coastguard Worker    c/dec/decode.c)
299*f4ee7fbaSAndroid Build Coastguard Worker
300*f4ee7fbaSAndroid Build Coastguard Worker  foreach(INPUT ${ROUNDTRIP_INPUTS})
301*f4ee7fbaSAndroid Build Coastguard Worker    get_filename_component(OUTPUT_NAME "${INPUT}" NAME)
302*f4ee7fbaSAndroid Build Coastguard Worker
303*f4ee7fbaSAndroid Build Coastguard Worker    set(OUTPUT_FILE "${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_NAME}")
304*f4ee7fbaSAndroid Build Coastguard Worker    set(INPUT_FILE "${CMAKE_CURRENT_SOURCE_DIR}/${INPUT}")
305*f4ee7fbaSAndroid Build Coastguard Worker
306*f4ee7fbaSAndroid Build Coastguard Worker    if (EXISTS "${INPUT_FILE}")
307*f4ee7fbaSAndroid Build Coastguard Worker      foreach(quality 1 6 9 11)
308*f4ee7fbaSAndroid Build Coastguard Worker        add_test(NAME "${BROTLI_TEST_PREFIX}roundtrip/${INPUT}/${quality}"
309*f4ee7fbaSAndroid Build Coastguard Worker          COMMAND "${CMAKE_COMMAND}"
310*f4ee7fbaSAndroid Build Coastguard Worker            -DBROTLI_WRAPPER=${BROTLI_WRAPPER}
311*f4ee7fbaSAndroid Build Coastguard Worker            -DBROTLI_WRAPPER_LD_PREFIX=${BROTLI_WRAPPER_LD_PREFIX}
312*f4ee7fbaSAndroid Build Coastguard Worker            -DBROTLI_CLI=$<TARGET_FILE:brotli>
313*f4ee7fbaSAndroid Build Coastguard Worker            -DQUALITY=${quality}
314*f4ee7fbaSAndroid Build Coastguard Worker            -DINPUT=${INPUT_FILE}
315*f4ee7fbaSAndroid Build Coastguard Worker            -DOUTPUT=${OUTPUT_FILE}.${quality}
316*f4ee7fbaSAndroid Build Coastguard Worker            -P ${CMAKE_CURRENT_SOURCE_DIR}/tests/run-roundtrip-test.cmake)
317*f4ee7fbaSAndroid Build Coastguard Worker      endforeach()
318*f4ee7fbaSAndroid Build Coastguard Worker    else()
319*f4ee7fbaSAndroid Build Coastguard Worker      message(WARNING "Test file ${INPUT} does not exist.")
320*f4ee7fbaSAndroid Build Coastguard Worker    endif()
321*f4ee7fbaSAndroid Build Coastguard Worker  endforeach()
322*f4ee7fbaSAndroid Build Coastguard Worker
323*f4ee7fbaSAndroid Build Coastguard Worker  file(GLOB_RECURSE
324*f4ee7fbaSAndroid Build Coastguard Worker    COMPATIBILITY_INPUTS
325*f4ee7fbaSAndroid Build Coastguard Worker    RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
326*f4ee7fbaSAndroid Build Coastguard Worker    tests/testdata/*.compressed*)
327*f4ee7fbaSAndroid Build Coastguard Worker
328*f4ee7fbaSAndroid Build Coastguard Worker  foreach(INPUT ${COMPATIBILITY_INPUTS})
329*f4ee7fbaSAndroid Build Coastguard Worker    add_test(NAME "${BROTLI_TEST_PREFIX}compatibility/${INPUT}"
330*f4ee7fbaSAndroid Build Coastguard Worker      COMMAND "${CMAKE_COMMAND}"
331*f4ee7fbaSAndroid Build Coastguard Worker        -DBROTLI_WRAPPER=${BROTLI_WRAPPER}
332*f4ee7fbaSAndroid Build Coastguard Worker        -DBROTLI_WRAPPER_LD_PREFIX=${BROTLI_WRAPPER_LD_PREFIX}
333*f4ee7fbaSAndroid Build Coastguard Worker        -DBROTLI_CLI=$<TARGET_FILE:brotli>
334*f4ee7fbaSAndroid Build Coastguard Worker        -DINPUT=${CMAKE_CURRENT_SOURCE_DIR}/${INPUT}
335*f4ee7fbaSAndroid Build Coastguard Worker        -P ${CMAKE_CURRENT_SOURCE_DIR}/tests/run-compatibility-test.cmake)
336*f4ee7fbaSAndroid Build Coastguard Worker  endforeach()
337*f4ee7fbaSAndroid Build Coastguard Workerendif()
338*f4ee7fbaSAndroid Build Coastguard Worker
339*f4ee7fbaSAndroid Build Coastguard Worker# Generate a pkg-config files
340*f4ee7fbaSAndroid Build Coastguard Worker
341*f4ee7fbaSAndroid Build Coastguard Workerfunction(generate_pkg_config_path outvar path)
342*f4ee7fbaSAndroid Build Coastguard Worker  string(LENGTH "${path}" path_length)
343*f4ee7fbaSAndroid Build Coastguard Worker
344*f4ee7fbaSAndroid Build Coastguard Worker  set(path_args ${ARGV})
345*f4ee7fbaSAndroid Build Coastguard Worker  list(REMOVE_AT path_args 0 1)
346*f4ee7fbaSAndroid Build Coastguard Worker  list(LENGTH path_args path_args_remaining)
347*f4ee7fbaSAndroid Build Coastguard Worker
348*f4ee7fbaSAndroid Build Coastguard Worker  set("${outvar}" "${path}")
349*f4ee7fbaSAndroid Build Coastguard Worker
350*f4ee7fbaSAndroid Build Coastguard Worker  while(path_args_remaining GREATER 1)
351*f4ee7fbaSAndroid Build Coastguard Worker    list(GET path_args 0 name)
352*f4ee7fbaSAndroid Build Coastguard Worker    list(GET path_args 1 value)
353*f4ee7fbaSAndroid Build Coastguard Worker
354*f4ee7fbaSAndroid Build Coastguard Worker    get_filename_component(value_full "${value}" ABSOLUTE)
355*f4ee7fbaSAndroid Build Coastguard Worker    string(LENGTH "${value}" value_length)
356*f4ee7fbaSAndroid Build Coastguard Worker
357*f4ee7fbaSAndroid Build Coastguard Worker    if(path_length EQUAL value_length AND path STREQUAL value)
358*f4ee7fbaSAndroid Build Coastguard Worker      set("${outvar}" "\${${name}}")
359*f4ee7fbaSAndroid Build Coastguard Worker      break()
360*f4ee7fbaSAndroid Build Coastguard Worker    elseif(path_length GREATER value_length)
361*f4ee7fbaSAndroid Build Coastguard Worker      # We might be in a subdirectory of the value, but we have to be
362*f4ee7fbaSAndroid Build Coastguard Worker      # careful about a prefix matching but not being a subdirectory
363*f4ee7fbaSAndroid Build Coastguard Worker      # (for example, /usr/lib64 is not a subdirectory of /usr/lib).
364*f4ee7fbaSAndroid Build Coastguard Worker      # We'll do this by making sure the next character is a directory
365*f4ee7fbaSAndroid Build Coastguard Worker      # separator.
366*f4ee7fbaSAndroid Build Coastguard Worker      string(SUBSTRING "${path}" ${value_length} 1 sep)
367*f4ee7fbaSAndroid Build Coastguard Worker      if(sep STREQUAL "/")
368*f4ee7fbaSAndroid Build Coastguard Worker        string(SUBSTRING "${path}" 0 ${value_length} s)
369*f4ee7fbaSAndroid Build Coastguard Worker        if(s STREQUAL value)
370*f4ee7fbaSAndroid Build Coastguard Worker          string(SUBSTRING "${path}" "${value_length}" -1 suffix)
371*f4ee7fbaSAndroid Build Coastguard Worker          set("${outvar}" "\${${name}}${suffix}")
372*f4ee7fbaSAndroid Build Coastguard Worker          break()
373*f4ee7fbaSAndroid Build Coastguard Worker        endif()
374*f4ee7fbaSAndroid Build Coastguard Worker      endif()
375*f4ee7fbaSAndroid Build Coastguard Worker    endif()
376*f4ee7fbaSAndroid Build Coastguard Worker
377*f4ee7fbaSAndroid Build Coastguard Worker    list(REMOVE_AT path_args 0 1)
378*f4ee7fbaSAndroid Build Coastguard Worker    list(LENGTH path_args path_args_remaining)
379*f4ee7fbaSAndroid Build Coastguard Worker  endwhile()
380*f4ee7fbaSAndroid Build Coastguard Worker
381*f4ee7fbaSAndroid Build Coastguard Worker  set("${outvar}" "${${outvar}}" PARENT_SCOPE)
382*f4ee7fbaSAndroid Build Coastguard Workerendfunction(generate_pkg_config_path)
383*f4ee7fbaSAndroid Build Coastguard Worker
384*f4ee7fbaSAndroid Build Coastguard Workerfunction(transform_pc_file INPUT_FILE OUTPUT_FILE VERSION)
385*f4ee7fbaSAndroid Build Coastguard Worker  file(READ ${INPUT_FILE} TEXT)
386*f4ee7fbaSAndroid Build Coastguard Worker
387*f4ee7fbaSAndroid Build Coastguard Worker  set(PREFIX "${CMAKE_INSTALL_PREFIX}")
388*f4ee7fbaSAndroid Build Coastguard Worker  string(REGEX REPLACE "@prefix@" "${PREFIX}" TEXT ${TEXT})
389*f4ee7fbaSAndroid Build Coastguard Worker  string(REGEX REPLACE "@exec_prefix@" "${PREFIX}" TEXT ${TEXT})
390*f4ee7fbaSAndroid Build Coastguard Worker
391*f4ee7fbaSAndroid Build Coastguard Worker  generate_pkg_config_path(LIBDIR "${CMAKE_INSTALL_FULL_LIBDIR}" prefix "${PREFIX}")
392*f4ee7fbaSAndroid Build Coastguard Worker  string(REGEX REPLACE "@libdir@" "${LIBDIR}" TEXT ${TEXT})
393*f4ee7fbaSAndroid Build Coastguard Worker
394*f4ee7fbaSAndroid Build Coastguard Worker  generate_pkg_config_path(INCLUDEDIR "${CMAKE_INSTALL_FULL_INCLUDEDIR}" prefix "${PREFIX}")
395*f4ee7fbaSAndroid Build Coastguard Worker  string(REGEX REPLACE "@includedir@" "${INCLUDEDIR}" TEXT ${TEXT})
396*f4ee7fbaSAndroid Build Coastguard Worker
397*f4ee7fbaSAndroid Build Coastguard Worker  string(REGEX REPLACE "@PACKAGE_VERSION@" "${VERSION}" TEXT ${TEXT})
398*f4ee7fbaSAndroid Build Coastguard Worker
399*f4ee7fbaSAndroid Build Coastguard Worker  file(WRITE ${OUTPUT_FILE} ${TEXT})
400*f4ee7fbaSAndroid Build Coastguard Workerendfunction()
401*f4ee7fbaSAndroid Build Coastguard Worker
402*f4ee7fbaSAndroid Build Coastguard Workertransform_pc_file("scripts/libbrotlicommon.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/libbrotlicommon.pc" "${BROTLI_VERSION}")
403*f4ee7fbaSAndroid Build Coastguard Worker
404*f4ee7fbaSAndroid Build Coastguard Workertransform_pc_file("scripts/libbrotlidec.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/libbrotlidec.pc" "${BROTLI_VERSION}")
405*f4ee7fbaSAndroid Build Coastguard Worker
406*f4ee7fbaSAndroid Build Coastguard Workertransform_pc_file("scripts/libbrotlienc.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/libbrotlienc.pc" "${BROTLI_VERSION}")
407*f4ee7fbaSAndroid Build Coastguard Worker
408*f4ee7fbaSAndroid Build Coastguard Workerif(NOT BROTLI_EMSCRIPTEN)
409*f4ee7fbaSAndroid Build Coastguard Workerif(NOT BROTLI_BUNDLED_MODE)
410*f4ee7fbaSAndroid Build Coastguard Worker  install(FILES "${CMAKE_CURRENT_BINARY_DIR}/libbrotlicommon.pc"
411*f4ee7fbaSAndroid Build Coastguard Worker    DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
412*f4ee7fbaSAndroid Build Coastguard Worker  install(FILES "${CMAKE_CURRENT_BINARY_DIR}/libbrotlidec.pc"
413*f4ee7fbaSAndroid Build Coastguard Worker    DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
414*f4ee7fbaSAndroid Build Coastguard Worker  install(FILES "${CMAKE_CURRENT_BINARY_DIR}/libbrotlienc.pc"
415*f4ee7fbaSAndroid Build Coastguard Worker    DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
416*f4ee7fbaSAndroid Build Coastguard Workerendif()  # BROTLI_BUNDLED_MODE
417*f4ee7fbaSAndroid Build Coastguard Workerendif()  # BROTLI_EMSCRIPTEN
418*f4ee7fbaSAndroid Build Coastguard Worker
419*f4ee7fbaSAndroid Build Coastguard Workerif (ENABLE_COVERAGE STREQUAL "yes")
420*f4ee7fbaSAndroid Build Coastguard Worker  SETUP_TARGET_FOR_COVERAGE(coverage test coverage)
421*f4ee7fbaSAndroid Build Coastguard Workerendif ()
422