Home | History | Annotate | Download | only in cmake_unofficial
      1 # CMake support for LZ4
      2 #
      3 # To the extent possible under law, the author(s) have dedicated all
      4 # copyright and related and neighboring rights to this software to
      5 # the public domain worldwide. This software is distributed without
      6 # any warranty.
      7 #
      8 # For details, see <http://creativecommons.org/publicdomain/zero/1.0/>.
      9 #
     10 # LZ4's CMake support is maintained by Evan Nemerson; when filing
     11 # bugs please mention @nemequ to make sure I see it.
     12 
     13 set(LZ4_TOP_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../..")
     14 
     15 # Parse version information
     16 file(STRINGS "${LZ4_TOP_SOURCE_DIR}/lib/lz4.h" LZ4_VERSION_MAJOR REGEX "^#define LZ4_VERSION_MAJOR +([0-9]+) +.*$")
     17 string(REGEX REPLACE "^#define LZ4_VERSION_MAJOR +([0-9]+) +.*$" "\\1" LZ4_VERSION_MAJOR "${LZ4_VERSION_MAJOR}")
     18 file(STRINGS "${LZ4_TOP_SOURCE_DIR}/lib/lz4.h" LZ4_VERSION_MINOR REGEX "^#define LZ4_VERSION_MINOR +([0-9]+) +.*$")
     19 string(REGEX REPLACE "^#define LZ4_VERSION_MINOR +([0-9]+) +.*$" "\\1" LZ4_VERSION_MINOR "${LZ4_VERSION_MINOR}")
     20 file(STRINGS "${LZ4_TOP_SOURCE_DIR}/lib/lz4.h" LZ4_VERSION_RELEASE REGEX "^#define LZ4_VERSION_RELEASE +([0-9]+) +.*$")
     21 string(REGEX REPLACE "^#define LZ4_VERSION_RELEASE +([0-9]+) +.*$" "\\1" LZ4_VERSION_RELEASE "${LZ4_VERSION_RELEASE}")
     22 set(LZ4_VERSION_STRING "${LZ4_VERSION_MAJOR}.${LZ4_VERSION_MINOR}.${LZ4_VERSION_RELEASE}")
     23 mark_as_advanced(LZ4_VERSION_STRING LZ4_VERSION_MAJOR LZ4_VERSION_MINOR LZ4_VERSION_RELEASE)
     24 
     25 if("${CMAKE_VERSION}" VERSION_LESS "3.0")
     26   project(LZ4 C)
     27 else()
     28   cmake_policy (SET CMP0048 NEW)
     29   project(LZ4
     30     VERSION ${LZ4_VERSION_STRING}
     31     LANGUAGES C)
     32 endif()
     33 
     34 cmake_minimum_required (VERSION 2.8.6)
     35 
     36 # If LZ4 is being bundled in another project, we don't want to
     37 # install anything.  However, we want to let people override this, so
     38 # we'll use the LZ4_BUNDLED_MODE variable to let them do that; just
     39 # set it to OFF in your project before you add_subdirectory(lz4/contrib/cmake_unofficial).
     40 get_directory_property(LZ4_PARENT_DIRECTORY PARENT_DIRECTORY)
     41 if("${LZ4_BUNDLED_MODE}" STREQUAL "")
     42   # Bundled mode hasn't been set one way or the other, set the default
     43   # depending on whether or not we are the top-level project.
     44   if("${LZ4_PARENT_DIRECTORY}" STREQUAL "")
     45     set(LZ4_BUNDLED_MODE OFF)
     46   else()
     47     set(LZ4_BUNDLED_MODE ON)
     48   endif()
     49 endif()
     50 mark_as_advanced(LZ4_BUNDLED_MODE)
     51 
     52 # CPack
     53 if(NOT LZ4_BUNDLED_MODE AND NOT CPack_CMake_INCLUDED)
     54   set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "LZ4 compression library")
     55   set(CPACK_PACKAGE_DESCRIPTION_FILE "${LZ4_TOP_SOURCE_DIR}/README.md")
     56   set(CPACK_RESOURCE_FILE_LICENSE "${LZ4_TOP_SOURCE_DIR}/LICENSE")
     57   set(CPACK_PACKAGE_VERSION_MAJOR ${LZ4_VERSION_MAJOR})
     58   set(CPACK_PACKAGE_VERSION_MINOR ${LZ4_VERSION_MINOR})
     59   set(CPACK_PACKAGE_VERSION_PATCH ${LZ4_VERSION_RELEASE})
     60   include(CPack)
     61 endif(NOT LZ4_BUNDLED_MODE AND NOT CPack_CMake_INCLUDED)
     62 
     63 # Allow people to choose whether to build shared or static libraries
     64 # via the BUILD_SHARED_LIBS option unless we are in bundled mode, in
     65 # which case we always use static libraries.
     66 include(CMakeDependentOption)
     67 CMAKE_DEPENDENT_OPTION(BUILD_SHARED_LIBS "Build shared libraries" ON "NOT LZ4_BUNDLED_MODE" OFF)
     68 CMAKE_DEPENDENT_OPTION(BUILD_STATIC_LIBS "Build static libraries" OFF "BUILD_SHARED_LIBS" ON)
     69 
     70 if(NOT BUILD_SHARED_LIBS AND NOT BUILD_STATIC_LIBS)
     71   message(FATAL_ERROR "Both BUILD_SHARED_LIBS and BUILD_STATIC_LIBS have been disabled")
     72 endif()
     73 
     74 set(LZ4_LIB_SOURCE_DIR "${LZ4_TOP_SOURCE_DIR}/lib")
     75 set(LZ4_PROG_SOURCE_DIR "${LZ4_TOP_SOURCE_DIR}/programs")
     76 
     77 include_directories("${LZ4_LIB_SOURCE_DIR}")
     78 
     79 # CLI sources
     80 set(LZ4_SOURCES
     81   "${LZ4_LIB_SOURCE_DIR}/lz4.c"
     82   "${LZ4_LIB_SOURCE_DIR}/lz4hc.c"
     83   "${LZ4_LIB_SOURCE_DIR}/lz4.h"
     84   "${LZ4_LIB_SOURCE_DIR}/lz4hc.h"
     85   "${LZ4_LIB_SOURCE_DIR}/lz4frame.c"
     86   "${LZ4_LIB_SOURCE_DIR}/lz4frame.h"
     87   "${LZ4_LIB_SOURCE_DIR}/xxhash.c")
     88 set(LZ4_CLI_SOURCES
     89   "${LZ4_PROG_SOURCE_DIR}/bench.c"
     90   "${LZ4_PROG_SOURCE_DIR}/lz4cli.c"
     91   "${LZ4_PROG_SOURCE_DIR}/lz4io.c"
     92   "${LZ4_PROG_SOURCE_DIR}/datagen.c")
     93 
     94 # Whether to use position independent code for the static library.  If
     95 # we're building a shared library this is ignored and PIC is always
     96 # used.
     97 option(LZ4_POSITION_INDEPENDENT_LIB "Use position independent code for static library (if applicable)" ON)
     98 
     99 # liblz4
    100 set(LZ4_LIBRARIES_BUILT)
    101 if(BUILD_SHARED_LIBS)
    102   add_library(lz4_shared SHARED ${LZ4_SOURCES})
    103   set_target_properties(lz4_shared PROPERTIES
    104     OUTPUT_NAME lz4
    105     SOVERSION "${LZ4_VERSION_MAJOR}"
    106     VERSION "${LZ4_VERSION_STRING}")
    107   list(APPEND LZ4_LIBRARIES_BUILT lz4_shared)
    108 endif()
    109 if(BUILD_STATIC_LIBS)
    110   add_library(lz4_static STATIC ${LZ4_SOURCES})
    111   set_target_properties(lz4_static PROPERTIES
    112     OUTPUT_NAME lz4
    113     POSITION_INDEPENDENT_CODE ${LZ4_POSITION_INDEPENDENT_LIB})
    114   list(APPEND LZ4_LIBRARIES_BUILT lz4_static)
    115 endif()
    116 
    117 # link to shared whenever possible, to static otherwise
    118 if(BUILD_SHARED_LIBS)
    119   set(LZ4_LINK_LIBRARY lz4_shared)
    120 else()
    121   set(LZ4_LINK_LIBRARY lz4_static)
    122 endif()
    123 
    124 # lz4
    125 add_executable(lz4cli ${LZ4_CLI_SOURCES})
    126 set_target_properties(lz4cli PROPERTIES OUTPUT_NAME lz4)
    127 target_link_libraries(lz4cli ${LZ4_LINK_LIBRARY})
    128 
    129 # lz4c
    130 add_executable(lz4c ${LZ4_CLI_SOURCES})
    131 set_target_properties(lz4c PROPERTIES COMPILE_DEFINITIONS "ENABLE_LZ4C_LEGACY_OPTIONS")
    132 target_link_libraries(lz4c ${LZ4_LINK_LIBRARY})
    133 
    134 # Extra warning flags
    135 include (CheckCCompilerFlag)
    136 foreach (flag
    137     # GCC-style
    138     -Wall
    139     -Wextra
    140     -Wundef
    141     -Wcast-qual
    142     -Wcast-align
    143     -Wshadow
    144     -Wswitch-enum
    145     -Wdeclaration-after-statement
    146     -Wstrict-prototypes
    147     -Wpointer-arith
    148 
    149     # MSVC-style
    150     /W4)
    151   # Because https://gcc.gnu.org/wiki/FAQ#wnowarning
    152   string(REGEX REPLACE "\\-Wno\\-(.+)" "-W\\1" flag_to_test "${flag}")
    153   string(REGEX REPLACE "[^a-zA-Z0-9]+" "_" test_name "CFLAG_${flag_to_test}")
    154 
    155   check_c_compiler_flag("${ADD_COMPILER_FLAGS_PREPEND} ${flag_to_test}" ${test_name})
    156 
    157   if(${test_name})
    158     set(CMAKE_C_FLAGS "${flag} ${CMAKE_C_FLAGS}")
    159   endif()
    160 
    161   unset(test_name)
    162   unset(flag_to_test)
    163 endforeach (flag)
    164 
    165 if(NOT LZ4_BUNDLED_MODE)
    166   include(GNUInstallDirs)
    167 
    168   install(TARGETS lz4cli lz4c
    169     RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
    170   install(TARGETS ${LZ4_LIBRARIES_BUILT}
    171     LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
    172     ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}")
    173   install(FILES
    174     "${LZ4_LIB_SOURCE_DIR}/lz4.h"
    175     "${LZ4_LIB_SOURCE_DIR}/lz4frame.h"
    176     "${LZ4_LIB_SOURCE_DIR}/lz4hc.h"
    177     DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
    178   install(FILES "${LZ4_PROG_SOURCE_DIR}/lz4.1"
    179     DESTINATION "${CMAKE_INSTALL_MANDIR}/man1")
    180   install(FILES "${CMAKE_CURRENT_BINARY_DIR}/liblz4.pc"
    181     DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
    182 
    183   # install lz4cat and unlz4 symlinks on *nix
    184   if(UNIX)
    185     install(CODE "
    186       foreach(f lz4cat unlz4)
    187         set(dest \"\$ENV{DESTDIR}${CMAKE_INSTALL_FULL_BINDIR}/\${f}\")
    188         message(STATUS \"Symlinking: \${dest} -> lz4\")
    189         execute_process(
    190           COMMAND \"${CMAKE_COMMAND}\" -E create_symlink lz4 \"\${dest}\")
    191       endforeach()
    192     ")
    193 
    194     # create manpage aliases
    195     foreach(f lz4cat unlz4)
    196       file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${f}.1" ".so man1/lz4.1\n")
    197       install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${f}.1"
    198         DESTINATION "${CMAKE_INSTALL_MANDIR}/man1")
    199     endforeach()
    200   endif(UNIX)
    201 endif(NOT LZ4_BUNDLED_MODE)
    202 
    203 # pkg-config
    204 set(PREFIX "${CMAKE_INSTALL_PREFIX}")
    205 
    206 if("${CMAKE_INSTALL_FULL_LIBDIR}" STREQUAL "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}")
    207   set(LIBDIR "\${prefix}/${CMAKE_INSTALL_LIBDIR}")
    208 else()
    209   set(LIBDIR "${CMAKE_INSTALL_FULL_LIBDIR}")
    210 endif()
    211 
    212 if("${CMAKE_INSTALL_FULL_INCLUDEDIR}" STREQUAL "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}")
    213   set(INCLUDEDIR "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}")
    214 else()
    215   set(INCLUDEDIR "${CMAKE_INSTALL_FULL_INCLUDEDIR}")
    216 endif()
    217 
    218 configure_file(${LZ4_LIB_SOURCE_DIR}/liblz4.pc.in liblz4.pc @ONLY)
    219