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