aboutsummaryrefslogtreecommitdiff
path: root/CMakeLists.txt
diff options
context:
space:
mode:
authorEvan Nemerson <evan@nemerson.com>2016-06-20 13:07:35 -0700
committerEvan Nemerson <evan@nemerson.com>2016-07-26 08:53:26 -0700
commit93ef13f8235b48f80964c6da092fb5aec514c3d9 (patch)
treef05c392678367f766c076b31e85f2ee0d77e6891 /CMakeLists.txt
parent8b7e3c7ba54df4b1edf59069b54e92aa79ed8f46 (diff)
downloadbrotli-93ef13f8235b48f80964c6da092fb5aec514c3d9.zip
brotli-93ef13f8235b48f80964c6da092fb5aec514c3d9.tar.gz
brotli-93ef13f8235b48f80964c6da092fb5aec514c3d9.tar.bz2
Add CMake build system.
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r--CMakeLists.txt140
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()