diff options
author | Evan Nemerson <evan@nemerson.com> | 2016-06-20 13:07:35 -0700 |
---|---|---|
committer | Evan Nemerson <evan@nemerson.com> | 2016-07-26 08:53:26 -0700 |
commit | 93ef13f8235b48f80964c6da092fb5aec514c3d9 (patch) | |
tree | f05c392678367f766c076b31e85f2ee0d77e6891 /CMakeLists.txt | |
parent | 8b7e3c7ba54df4b1edf59069b54e92aa79ed8f46 (diff) | |
download | brotli-93ef13f8235b48f80964c6da092fb5aec514c3d9.zip brotli-93ef13f8235b48f80964c6da092fb5aec514c3d9.tar.gz brotli-93ef13f8235b48f80964c6da092fb5aec514c3d9.tar.bz2 |
Add CMake build system.
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r-- | CMakeLists.txt | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..3eadeba --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,140 @@ +# Ubuntu 12.04 LTS has CMake 2.8.7, and is an important target since +# several CI services, such as Travis and Drone, use it. Solaris 11 +# has 2.8.6, and it's not difficult to support if you already have to +# support 2.8.7. +cmake_minimum_required(VERSION 2.8.6) + +project(brotli) + +# If Brotli is being bundled in another project, we don't want to +# install anything. However, we want to let people override this, so +# we'll use the BROTLI_BUNDLED_MODE variable to let them do that; just +# set it to OFF in your project before you add_subdirectory(brotli). +get_directory_property(BROTLI_PARENT_DIRECTORY PARENT_DIRECTORY) +if(BROTLI_BUNDLED_MODE STREQUAL "") + # Bundled mode hasn't been set one way or the other, set the default + # depending on whether or not we are the top-level project. + if(BROTLI_PARENT_DIRECTORY) + set(BROTLI_BUNDLED_MODE OFF) + else() + set(BROTLI_BUNDLED_MODE ON) + endif() +endif() +mark_as_advanced(BROTLI_BUNDLED_MODE) + +# Parse version information from tools/version.h. Normally we would +# define these values here and write them out to configuration file(s) +# (i.e., config.h), but in this case we parse them from +# tools/version.h to be less intrusive. +file(STRINGS "tools/version.h" BROTLI_VERSION REGEX "^#define BROTLI_VERSION \"+([0-9]+)\\.([0-9]+)\\.([0-9]+)\"") +string(REGEX REPLACE "^#define BROTLI_VERSION \"([0-9]+)\\.([0-9]+)\\.([0-9]+)\"$" "\\1" BROTLI_VERSION_MAJOR "${BROTLI_VERSION}") +string(REGEX REPLACE "^#define BROTLI_VERSION \"([0-9]+)\\.([0-9]+)\\.([0-9]+)\"$" "\\2" BROTLI_VERSION_MINOR "${BROTLI_VERSION}") +string(REGEX REPLACE "^#define BROTLI_VERSION \"([0-9]+)\\.([0-9]+)\\.([0-9]+)\"$" "\\3" BROTLI_VERSION_REVISION "${BROTLI_VERSION}") +mark_as_advanced(BROTLI_VERSION_MAJOR BROTLI_VERSION_MINOR BROTLI_VERSION_REVISION) + +set(BROTLI_INCLUDE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}") +set(BROTLI_LIBRARIES brotli_enc brotli_dec brotli_common m) +mark_as_advanced(BROTLI_INCLUDE_DIRS BROTLI_LIBRARIES) + +if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") + add_definitions(-DOS_LINUX) +elseif(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") + add_definitions(-DOS_FREEBSD) +elseif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + add_definitions(-DOS_MACOSX) +endif() + +add_library(brotli_common STATIC + common/dictionary.c) +add_library(brotli_dec STATIC + dec/bit_reader.c + dec/decode.c + dec/huffman.c + dec/state.c) +add_library(brotli_enc STATIC + enc/backward_references.c + enc/bit_cost.c + enc/block_splitter.c + enc/brotli_bit_stream.c + enc/cluster.c + enc/compress_fragment.c + enc/compress_fragment_two_pass.c + enc/encode.c + enc/entropy_encode.c + enc/histogram.c + enc/literal_cost.c + enc/memory.c + enc/metablock.c + enc/static_dict.c + enc/utf8_util.c) + +foreach(lib brotli_common brotli_dec brotli_enc) + target_link_libraries(${lib} m) + set_property(TARGET ${lib} APPEND PROPERTY INCLUDE_DIRECTORIES ${BROTLI_INCLUDE_DIRS}) + set_target_properties(${lib} PROPERTIES + VERSION ${BROTLI_VERSION_MAJOR}.${BROTLI_VERSION_MINOR}.${BROTLI_VERSION_REVISION} + POSITION_INDEPENDENT_CODE TRUE) + + set_property(TARGET ${lib} APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${BROTLI_INCLUDE_DIRS}") +endforeach() + +# For projects stuck on older versions of CMake, this will set the +# BROTLI_INCLUDE_DIRS and BROTLI_LIBRARIES variables so they still +# have a relatively easy way to use Brotli: +# +# include_directories(${BROTLI_INCLUDE_DIRS}) +# target_link_libraries(foo ${BROTLI_LIBRARIES}) +if(BROTLI_PARENT_DIRECTORY) + set(BROTLI_INCLUDE_DIRS "${BROTLI_INCLUDE_DIRS}" PARENT_SCOPE) + set(BROTLI_LIBRARIES "${BROTLI_LIBRARIES}" PARENT_SCOPE) +endif() + +# Build the bro executable +add_executable(bro tools/bro.c) +target_link_libraries(bro ${BROTLI_LIBRARIES}) + +# Installation +if(NOT BROTLI_BUNDLE_MODE) + include(GNUInstallDirs) + + install (TARGETS bro RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") +endif() + +# Tests +if(NOT BROTLI_DISABLE_TESTS) + include(CTest) + enable_testing() + + set(ROUNDTRIP_INPUTS + tests/testdata/alice29.txt + tests/testdata/asyoulik.txt + tests/testdata/lcet10.txt + tests/testdata/plrabn12.txt + enc/encode.c + common/dictionary.h + dec/decode.c) + + foreach(INPUT ${ROUNDTRIP_INPUTS}) + foreach(quality 1 6 9 11) + add_test(NAME "${BROTLI_TEST_PREFIX}roundtrip/${INPUT}/${quality}" + COMMAND "${CMAKE_COMMAND}" + -DBROTLI_CLI=$<TARGET_FILE:bro> + -DQUALITY=${quality} + -DINPUT=${CMAKE_CURRENT_SOURCE_DIR}/${INPUT} + -P ${CMAKE_CURRENT_SOURCE_DIR}/tests/run-roundtrip-test.cmake) + endforeach() + endforeach() + + file(GLOB_RECURSE + COMPATIBILITY_INPUTS + RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} + tests/testdata/*.compressed*) + + foreach(INPUT ${COMPATIBILITY_INPUTS}) + add_test(NAME "${BROTLI_TEST_PREFIX}compatibility/${INPUT}" + COMMAND "${CMAKE_COMMAND}" + -DBROTLI_CLI=$<TARGET_FILE:bro> + -DINPUT=${CMAKE_CURRENT_SOURCE_DIR}/${INPUT} + -P ${CMAKE_CURRENT_SOURCE_DIR}/tests/run-compatibility-test.cmake) + endforeach() +endif() |