aboutsummaryrefslogtreecommitdiff
path: root/CMakeLists.txt
diff options
context:
space:
mode:
authorEugene Kliuchnikov <eustas@google.com>2017-11-28 15:37:28 +0100
committerGitHub <noreply@github.com>2017-11-28 15:37:28 +0100
commit0ad94eed00420bf1154cb16a289aa27efbb30c01 (patch)
tree8b20dcaadf99b2373d23a13cab99dc7d2f56098d /CMakeLists.txt
parent273de5a22f955ba84ad3d31025bff69054cc98ef (diff)
downloadbrotli-0ad94eed00420bf1154cb16a289aa27efbb30c01.zip
brotli-0ad94eed00420bf1154cb16a289aa27efbb30c01.tar.gz
brotli-0ad94eed00420bf1154cb16a289aa27efbb30c01.tar.bz2
Update (#620)v1.0.2
* add autotools build * separate semantic and ABI version * extract sources.lst (used by CMake and Automake) * share pkgconfig templates (used by CMake and Automake) * decoder: always set `total_out` * encoder: fix `BROTLI_ENSURE_CAPACITY` macro (no-op after preprocessor) * decoder/encoder: refine `free_func` contract
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r--CMakeLists.txt180
1 files changed, 50 insertions, 130 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index fcd0e96..ac55f6b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -72,8 +72,19 @@ string(REGEX REPLACE "^#define BROTLI_VERSION 0x([0-9a-fA-F]+)$" "\\1" _brotli_v
hex_to_dec("${_brotli_version_hex}" _brotli_version)
math(EXPR BROTLI_VERSION_MAJOR "${_brotli_version} >> 24")
math(EXPR BROTLI_VERSION_MINOR "(${_brotli_version} >> 12) & 4095")
-math(EXPR BROTLI_VERSION_REVISION "${_brotli_version} & 4095")
-mark_as_advanced(BROTLI_VERSION_MAJOR BROTLI_VERSION_MINOR BROTLI_VERSION_REVISION)
+math(EXPR BROTLI_VERSION_PATCH "${_brotli_version} & 4095")
+set(BROTLI_VERSION "${BROTLI_VERSION_MAJOR}.${BROTLI_VERSION_MINOR}.${BROTLI_VERSION_PATCH}")
+mark_as_advanced(BROTLI_VERSION BROTLI_VERSION_MAJOR BROTLI_VERSION_MINOR BROTLI_VERSION_PATCH)
+
+# ABI Version information
+file(STRINGS "c/common/version.h" _brotli_abi_info_line REGEX "^#define BROTLI_ABI_VERSION (0x[0-9a-fA-F]+)$")
+string(REGEX REPLACE "^#define BROTLI_ABI_VERSION 0x([0-9a-fA-F]+)$" "\\1" _brotli_abi_info_hex "${_brotli_abi_info_line}")
+hex_to_dec("${_brotli_abi_info_hex}" _brotli_abi_info)
+math(EXPR BROTLI_ABI_CURRENT "${_brotli_abi_info} >> 24")
+math(EXPR BROTLI_ABI_REVISION "(${_brotli_abi_info} >> 12) & 4095")
+math(EXPR BROTLI_ABI_AGE "${_brotli_abi_info} & 4095")
+math(EXPR BROTLI_ABI_COMPATIBILITY "${BROTLI_ABI_CURRENT} - ${BROTLI_ABI_AGE}")
+mark_as_advanced(BROTLI_ABI_CURRENT BROTLI_ABI_REVISION BROTLI_ABI_AGE BROTLI_ABI_COMPATIBILITY)
if (ENABLE_SANITIZER)
set(CMAKE_C_FLAGS " ${CMAKE_C_FLAGS} -fsanitize=${ENABLE_SANITIZER}")
@@ -125,39 +136,24 @@ elseif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
add_definitions(-DOS_MACOSX)
endif()
-set(BROTLICOMMON_SOURCES
- c/common/dictionary.c)
-set(BROTLIDEC_SOURCES
- c/dec/bit_reader.c
- c/dec/decode.c
- c/dec/huffman.c
- c/dec/state.c)
-set(BROTLIENC_SOURCES
- c/enc/backward_references.c
- c/enc/backward_references_hq.c
- c/enc/bit_cost.c
- c/enc/block_splitter.c
- c/enc/brotli_bit_stream.c
- c/enc/cluster.c
- c/enc/compress_fragment.c
- c/enc/compress_fragment_two_pass.c
- c/enc/dictionary_hash.c
- c/enc/encode.c
- c/enc/entropy_encode.c
- c/enc/histogram.c
- c/enc/literal_cost.c
- c/enc/memory.c
- c/enc/metablock.c
- c/enc/static_dict.c
- c/enc/utf8_util.c)
-
-add_library(brotlicommon SHARED ${BROTLICOMMON_SOURCES})
-add_library(brotlidec SHARED ${BROTLIDEC_SOURCES})
-add_library(brotlienc SHARED ${BROTLIENC_SOURCES})
-
-add_library(brotlicommon-static STATIC ${BROTLICOMMON_SOURCES})
-add_library(brotlidec-static STATIC ${BROTLIDEC_SOURCES})
-add_library(brotlienc-static STATIC ${BROTLIENC_SOURCES})
+function(transform_sources_list INPUT_FILE OUTPUT_FILE)
+ file(READ ${INPUT_FILE} TEXT)
+ string(REGEX REPLACE "\\\\\n" "~continuation~" TEXT ${TEXT})
+ string(REGEX REPLACE "([a-zA-Z_][a-zA-Z0-9_]*)[\t ]*=[\t ]*([^\n]*)" "SET(\\1 \\2)" TEXT ${TEXT})
+ string(REPLACE "~continuation~" "\n" TEXT ${TEXT})
+ file(WRITE ${OUTPUT_FILE} ${TEXT})
+endfunction()
+
+transform_sources_list("scripts/sources.lst" "${CMAKE_CURRENT_BINARY_DIR}/sources.lst.cmake")
+include("${CMAKE_CURRENT_BINARY_DIR}/sources.lst.cmake")
+
+add_library(brotlicommon SHARED ${BROTLI_COMMON_C})
+add_library(brotlidec SHARED ${BROTLI_DEC_C})
+add_library(brotlienc SHARED ${BROTLI_ENC_C})
+
+add_library(brotlicommon-static STATIC ${BROTLI_COMMON_C})
+add_library(brotlidec-static STATIC ${BROTLI_DEC_C})
+add_library(brotlienc-static STATIC ${BROTLI_ENC_C})
# Older CMake versions does not understand INCLUDE_DIRECTORIES property.
include_directories(${BROTLI_INCLUDE_DIRS})
@@ -172,8 +168,8 @@ foreach(lib brotlicommon brotlidec brotlienc brotlicommon-static brotlidec-stati
target_link_libraries(${lib} ${LIBM_LIBRARY})
set_property(TARGET ${lib} APPEND PROPERTY INCLUDE_DIRECTORIES ${BROTLI_INCLUDE_DIRS})
set_target_properties(${lib} PROPERTIES
- SOVERSION "${BROTLI_VERSION_MAJOR}.${BROTLI_VERSION_MINOR}.${BROTLI_VERSION_REVISION}"
- VERSION "${BROTLI_VERSION_MAJOR}.${BROTLI_VERSION_MINOR}.${BROTLI_VERSION_REVISION}"
+ VERSION "${BROTLI_ABI_COMPATIBILITY}.${BROTLI_ABI_AGE}.${BROTLI_ABI_REVISION}"
+ SOVERSION "${BROTLI_ABI_COMPATIBILITY}"
POSITION_INDEPENDENT_CODE TRUE)
set_property(TARGET ${lib} APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${BROTLI_INCLUDE_DIRS}")
endforeach()
@@ -196,7 +192,7 @@ if(BROTLI_PARENT_DIRECTORY)
endif()
# Build the brotli executable
-add_executable(brotli c/tools/brotli.c)
+add_executable(brotli ${BROTLI_CLI_C})
target_link_libraries(brotli ${BROTLI_LIBRARIES_STATIC})
# Installation
@@ -287,9 +283,7 @@ if(NOT BROTLI_DISABLE_TESTS)
endforeach()
endif()
-# Generate a pkg-config file
-
-include(CMakeParseArguments)
+# Generate a pkg-config files
function(generate_pkg_config_path outvar path)
string(LENGTH "${path}" path_length)
@@ -334,103 +328,29 @@ function(generate_pkg_config_path outvar path)
set("${outvar}" "${${outvar}}" PARENT_SCOPE)
endfunction(generate_pkg_config_path)
-function(generate_pkg_config output_file)
- set (options)
- set (oneValueArgs NAME DESCRIPTION URL VERSION PREFIX LIBDIR INCLUDEDIR)
- set (multiValueArgs DEPENDS_PRIVATE CFLAGS LIBRARIES)
- cmake_parse_arguments(GEN_PKG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
- unset (options)
- unset (oneValueArgs)
- unset (multiValueArgs)
-
- if(NOT GEN_PKG_PREFIX)
- set(GEN_PKG_PREFIX "${CMAKE_INSTALL_PREFIX}")
- endif()
+function(transform_pc_file INPUT_FILE OUTPUT_FILE VERSION)
+ file(READ ${INPUT_FILE} TEXT)
- if(NOT GEN_PKG_LIBDIR)
- set(GEN_PKG_LIBDIR "${CMAKE_INSTALL_FULL_LIBDIR}")
- endif()
- generate_pkg_config_path(GEN_PKG_LIBDIR "${GEN_PKG_LIBDIR}"
- prefix "${GEN_PKG_PREFIX}")
+ set(PREFIX "${CMAKE_INSTALL_PREFIX}")
+ string(REGEX REPLACE "@prefix@" "${PREFIX}" TEXT ${TEXT})
+ string(REGEX REPLACE "@exec_prefix@" "${PREFIX}" TEXT ${TEXT})
- if(NOT GEN_PKG_INCLUDEDIR)
- set(GEN_PKG_INCLUDEDIR "${CMAKE_INSTALL_FULL_INCLUDEDIR}")
- endif()
- generate_pkg_config_path(GEN_PKG_INCLUDEDIR "${GEN_PKG_INCLUDEDIR}"
- prefix "${GEN_PKG_PREFIX}")
+ generate_pkg_config_path(LIBDIR "${CMAKE_INSTALL_FULL_LIBDIR}" prefix "${PREFIX}")
+ string(REGEX REPLACE "@libdir@" "${LIBDIR}" TEXT ${TEXT})
- file(WRITE "${output_file}" "prefix=${GEN_PKG_PREFIX}\n")
- file(APPEND "${output_file}" "libdir=${GEN_PKG_LIBDIR}\n")
- file(APPEND "${output_file}" "includedir=${GEN_PKG_INCLUDEDIR}\n")
- file(APPEND "${output_file}" "\n")
+ generate_pkg_config_path(INCLUDEDIR "${CMAKE_INSTALL_FULL_INCLUDEDIR}" prefix "${PREFIX}")
+ string(REGEX REPLACE "@includedir@" "${INCLUDEDIR}" TEXT ${TEXT})
- if(GEN_PKG_NAME)
- file(APPEND "${output_file}" "Name: ${GEN_PKG_NAME}\n")
- else()
- file(APPEND "${output_file}" "Name: ${CMAKE_PROJECT_NAME}\n")
- endif()
+ string(REGEX REPLACE "@PACKAGE_VERSION@" "${VERSION}" TEXT ${TEXT})
- if(GEN_PKG_DESCRIPTION)
- file(APPEND "${output_file}" "Description: ${GEN_PKG_DESCRIPTION}\n")
- endif()
+ file(WRITE ${OUTPUT_FILE} ${TEXT})
+endfunction()
- if(GEN_PKG_URL)
- file(APPEND "${output_file}" "URL: ${GEN_PKG_URL}\n")
- endif()
+transform_pc_file("scripts/libbrotlicommon.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/libbrotlicommon.pc" "${BROTLI_VERSION}")
- if(GEN_PKG_VERSION)
- file(APPEND "${output_file}" "Version: ${GEN_PKG_VERSION}\n")
- endif()
-
- if(GEN_PKG_DEPENDS_PRIVATE)
- file(APPEND "${output_file}" "Requires.private:")
- foreach(lib ${GEN_PKG_DEPENDS_PRIVATE})
- file(APPEND "${output_file}" " ${lib}")
- endforeach()
- file(APPEND "${output_file}" "\n")
- endif()
-
- if(GEN_PKG_LIBRARIES)
- set(libs)
+transform_pc_file("scripts/libbrotlidec.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/libbrotlidec.pc" "${BROTLI_VERSION}")
- file(APPEND "${output_file}" "Libs: -L\${libdir}")
- foreach(lib ${GEN_PKG_LIBRARIES})
- file(APPEND "${output_file}" " -l${lib}")
- endforeach()
- file(APPEND "${output_file}" "\n")
- endif()
-
- file(APPEND "${output_file}" "Cflags: -I\${includedir}")
- if(GEN_PKG_CFLAGS)
- foreach(cflag ${GEN_PKG_CFLAGS})
- file(APPEND "${output_file}" " ${cflag}")
- endforeach()
- endif()
- file(APPEND "${output_file}" "\n")
-endfunction(generate_pkg_config)
-
-generate_pkg_config ("${CMAKE_CURRENT_BINARY_DIR}/libbrotlicommon.pc"
- NAME libbrotlicommon
- DESCRIPTION "Shared data used by libbrotlienc and libbrotlidec libraries"
- URL "https://github.com/google/brotli"
- VERSION "${BROTLI_VERSION_MAJOR}.${BROTLI_VERSION_MINOR}.${BROTLI_VERSION_REVISION}"
- LIBRARIES brotlicommon)
-
-generate_pkg_config ("${CMAKE_CURRENT_BINARY_DIR}/libbrotlidec.pc"
- NAME libbrotlidec
- DESCRIPTION "Brotli decoder library"
- VERSION "${BROTLI_VERSION_MAJOR}.${BROTLI_VERSION_MINOR}.${BROTLI_VERSION_REVISION}"
- URL "https://github.com/google/brotli"
- DEPENDS_PRIVATE libbrotlicommon
- LIBRARIES brotlidec)
-
-generate_pkg_config ("${CMAKE_CURRENT_BINARY_DIR}/libbrotlienc.pc"
- NAME libbrotlienc
- DESCRIPTION "Brotli encoder library"
- VERSION "${BROTLI_VERSION_MAJOR}.${BROTLI_VERSION_MINOR}.${BROTLI_VERSION_REVISION}"
- URL "https://github.com/google/brotli"
- DEPENDS_PRIVATE libbrotlicommon
- LIBRARIES brotlienc)
+transform_pc_file("scripts/libbrotlienc.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/libbrotlienc.pc" "${BROTLI_VERSION}")
if(NOT BROTLI_BUNDLED_MODE)
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/libbrotlicommon.pc"