| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382 |
- --- /dev/null
- +++ b/CMakeLists.txt
- @@ -0,0 +1,354 @@
- +cmake_minimum_required(VERSION 3.12)
- +
- +project(bzip2
- + VERSION 1.0.8
- + DESCRIPTION "This Bzip2/libbz2 a program and library for lossless block-sorting data compression."
- + LANGUAGES C)
- +
- +# See versioning rule:
- +# http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
- +#
- +# KEEP THESE IN SYNC WITH meson.build OR STUFF WILL BREAK!
- +set(LT_CURRENT 1)
- +set(LT_REVISION 8)
- +set(LT_AGE 0)
- +
- +set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH})
- +
- +include_directories(${PROJECT_BINARY_DIR})
- +
- +math(EXPR LT_SOVERSION "${LT_CURRENT} - ${LT_AGE}")
- +set(LT_VERSION "${LT_SOVERSION}.${LT_AGE}.${LT_REVISION}")
- +set(PACKAGE_VERSION ${PROJECT_VERSION})
- +
- +set(ENABLE_APP_DEFAULT ON)
- +set(ENABLE_EXAMPLES_DEFAULT OFF)
- +set(ENABLE_DOCS_DEFAULT OFF)
- +include(CMakeOptions.txt)
- +
- +if(ENABLE_LIB_ONLY AND (ENABLE_APP OR ENABLE_EXAMPLES))
- + # Remember when disabled options are disabled for later diagnostics.
- + set(ENABLE_LIB_ONLY_DISABLED_OTHERS 1)
- +else()
- + set(ENABLE_LIB_ONLY_DISABLED_OTHERS 0)
- +endif()
- +if(ENABLE_LIB_ONLY)
- + set(ENABLE_APP OFF)
- + set(ENABLE_EXAMPLES OFF)
- +endif()
- +
- +# Do not disable assertions based on CMAKE_BUILD_TYPE.
- +foreach(_build_type Release MinSizeRel RelWithDebInfo)
- + foreach(_lang C)
- + string(TOUPPER CMAKE_${_lang}_FLAGS_${_build_type} _var)
- + string(REGEX REPLACE "(^|)[/-]D *NDEBUG($|)" " " ${_var} "${${_var}}")
- + endforeach()
- +endforeach()
- +
- +# Support the latest c++ standard available.
- +include(CheckCCompilerFlag)
- +include(CheckCXXCompilerFlag)
- +
- +function(extract_valid_c_flags varname)
- + set(valid_flags)
- + foreach(flag IN LISTS ARGN)
- + string(REGEX REPLACE "[^a-zA-Z0-9_]+" "_" flag_var ${flag})
- + set(flag_var "C_FLAG_${flag_var}")
- + check_c_compiler_flag("${flag}" "${flag_var}")
- + if(${flag_var})
- + set(valid_flags "${valid_flags} ${flag}")
- + endif()
- + endforeach()
- + set(${varname} "${valid_flags}" PARENT_SCOPE)
- +endfunction()
- +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
- + set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose the build type" FORCE)
- +
- + # Include "None" as option to disable any additional (optimization) flags,
- + # relying on just CMAKE_C_FLAGS and CMAKE_CXX_FLAGS (which are empty by
- + # default). These strings are presented in cmake-gui.
- + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
- + None Debug Release MinSizeRel RelWithDebInfo)
- +endif()
- +
- +# Install a symlink of script to the "bin" directory.
- +# Not intended for use on Windows.
- +function(install_script_symlink original symlink)
- + add_custom_command(OUTPUT ${symlink}
- + COMMAND ${CMAKE_COMMAND} -E create_symlink ${original} ${symlink}
- + DEPENDS ${original}
- + COMMENT "Generating symbolic link ${symlink} of ${original}")
- + add_custom_target(${symlink}_tgt ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${symlink})
- + install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${symlink} DESTINATION ${CMAKE_INSTALL_BINDIR})
- +endfunction()
- +
- +# Install a symlink of binary target to the "bin" directory.
- +# On Windows, it will be a copy instead of a symlink.
- +function(install_target_symlink original symlink)
- + if(WIN32)
- + set(op copy)
- + set(symlink "${symlink}.exe")
- + else()
- + set(op create_symlink)
- + endif()
- + add_custom_command(TARGET ${original} POST_BUILD
- + COMMAND ${CMAKE_COMMAND} -E ${op} $<TARGET_FILE_NAME:${original}> ${symlink}
- + WORKING_DIRECTORY $<TARGET_FILE_DIR:${original}>
- + COMMENT "Generating symbolic link (or copy) ${symlink} of ${original}")
- + install(PROGRAMS $<TARGET_FILE_DIR:${original}>/${symlink} DESTINATION ${CMAKE_INSTALL_BINDIR})
- +endfunction()
- +
- +include(GNUInstallDirs)
- +
- +# Checks for header files.
- +include(CheckIncludeFile)
- +check_include_file(arpa/inet.h HAVE_ARPA_INET_H)
- +check_include_file(fcntl.h HAVE_FCNTL_H)
- +check_include_file(inttypes.h HAVE_INTTYPES_H)
- +check_include_file(limits.h HAVE_LIMITS_H)
- +check_include_file(netdb.h HAVE_NETDB_H)
- +check_include_file(netinet/in.h HAVE_NETINET_IN_H)
- +check_include_file(pwd.h HAVE_PWD_H)
- +check_include_file(sys/socket.h HAVE_SYS_SOCKET_H)
- +check_include_file(sys/time.h HAVE_SYS_TIME_H)
- +check_include_file(syslog.h HAVE_SYSLOG_H)
- +check_include_file(time.h HAVE_TIME_H)
- +check_include_file(unistd.h HAVE_UNISTD_H)
- +
- +include(CheckTypeSize)
- +# Checks for typedefs, structures, and compiler characteristics.
- +# AC_TYPE_SIZE_T
- +check_type_size("ssize_t" SIZEOF_SSIZE_T)
- +if(NOT SIZEOF_SSIZE_T)
- + # ssize_t is a signed type in POSIX storing at least -1.
- + # Set it to "int" to match the behavior of AC_TYPE_SSIZE_T (autotools).
- + set(ssize_t int)
- +endif()
- +
- +include(CheckStructHasMember)
- +check_struct_has_member("struct tm" tm_gmtoff time.h HAVE_STRUCT_TM_TM_GMTOFF)
- +
- +include(CheckSymbolExists)
- +# XXX does this correctly detect initgroups (un)availability on cygwin?
- +check_symbol_exists(initgroups grp.h HAVE_DECL_INITGROUPS)
- +if(NOT HAVE_DECL_INITGROUPS AND HAVE_UNISTD_H)
- + # FreeBSD declares initgroups() in unistd.h
- + check_symbol_exists(initgroups unistd.h HAVE_DECL_INITGROUPS2)
- + if(HAVE_DECL_INITGROUPS2)
- + set(HAVE_DECL_INITGROUPS 1)
- + endif()
- +endif()
- +
- +set(WARNCFLAGS)
- +if(CMAKE_C_COMPILER_ID MATCHES "MSVC")
- + if(ENABLE_WERROR)
- + set(WARNCFLAGS /WX)
- + endif()
- +else()
- + if(ENABLE_WERROR)
- + extract_valid_c_flags(WARNCFLAGS -Werror)
- + endif()
- +
- + # For C compiler
- + # Please keep this list in sync with meson.build
- + extract_valid_c_flags(WARNCFLAGS
- + -Wall
- + -Wextra
- + -Wmissing-prototypes
- + -Wstrict-prototypes
- + -Wmissing-declarations
- + -Wpointer-arith
- + -Wdeclaration-after-statement
- + -Wformat-security
- + -Wwrite-strings
- + -Wshadow
- + -Winline
- + -Wnested-externs
- + -Wfloat-equal
- + -Wundef
- + -Wendif-labels
- + -Wempty-body
- + -Wcast-align
- + -Wclobbered
- + -Wvla
- + -Wpragmas
- + -Wunreachable-code
- + -Waddress
- + -Wattributes
- + -Wdiv-by-zero
- + -Wshorten-64-to-32
- + -Wconversion
- + -Wextended-offsetof
- + -Wformat-nonliteral
- + -Wlanguage-extension-token
- + -Wmissing-field-initializers
- + -Wmissing-noreturn
- + -Wmissing-variable-declarations
- + # -Wpadded # Not used because we cannot change public structs
- + -Wsign-conversion
- + # -Wswitch-enum # Not used because this basically disallows default case
- + -Wunreachable-code-break
- + -Wunused-macros
- + -Wunused-parameter
- + -Wredundant-decls
- + -Wheader-guard
- + -Wno-format-nonliteral # This is required because we pass format string as "const char*.
- + )
- +endif()
- +
- +if(ENABLE_DEBUG)
- + set(DEBUGBUILD 1)
- +endif()
- +
- +#add_definitions(-DHAVE_CONFIG_H)
- +#configure_file(cmakeconfig.h.in config.h)
- +
- +# autotools-compatible names
- +# Sphinx expects relative paths in the .rst files. Use the fact that the files
- +# below are all one directory level deep.
- +file(RELATIVE_PATH top_srcdir ${CMAKE_CURRENT_BINARY_DIR}/dir ${CMAKE_CURRENT_SOURCE_DIR})
- +file(RELATIVE_PATH top_builddir ${CMAKE_CURRENT_BINARY_DIR}/dir ${CMAKE_CURRENT_BINARY_DIR})
- +set(abs_top_srcdir ${CMAKE_CURRENT_SOURCE_DIR})
- +set(abs_top_builddir ${CMAKE_CURRENT_BINARY_DIR})
- +# bzip2.pc (pkg-config file)
- +set(prefix ${CMAKE_INSTALL_PREFIX})
- +set(exec_prefix ${CMAKE_INSTALL_PREFIX})
- +set(bindir ${CMAKE_INSTALL_FULL_BINDIR})
- +set(sbindir ${CMAKE_INSTALL_FULL_SBINDIR})
- +set(libdir ${CMAKE_INSTALL_FULL_LIBDIR})
- +set(includedir ${CMAKE_INSTALL_FULL_INCLUDEDIR})
- +set(VERSION ${PACKAGE_VERSION})
- +
- +#
- +# The build targets.
- +# In a larger project, the following would be in subdirectories and
- +# These targets would be included with `add_subdirectory()`
- +#
- +set(BZ2_SOURCES
- + blocksort.c
- + huffman.c
- + crctable.c
- + randtable.c
- + compress.c
- + decompress.c
- + bzlib.c)
- +
- +# The bz2 OBJECT-library, required for bzip2, bzip2recover.
- +add_library(bz2_ObjLib OBJECT)
- +target_sources(bz2_ObjLib
- + PRIVATE ${BZ2_SOURCES}
- + PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/bzlib_private.h
- + INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/bzlib.h)
- +
- +if(ENABLE_SHARED_LIB)
- + # The libbz2 shared library.
- + add_library(bz2 SHARED ${BZ2_RES})
- + target_sources(bz2
- + PRIVATE ${BZ2_SOURCES}
- + ${CMAKE_CURRENT_SOURCE_DIR}/libbz2.def
- + PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/bzlib_private.h
- + INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/bzlib.h)
- + # Always use '-fPIC'/'-fPIE' option for shared libraries.
- + set_property(TARGET bz2 PROPERTY POSITION_INDEPENDENT_CODE ON)
- + set_target_properties(bz2 PROPERTIES
- + COMPILE_FLAGS "${WARNCFLAGS}"
- + VERSION ${LT_VERSION} SOVERSION ${LT_SOVERSION})
- + install(TARGETS bz2 DESTINATION ${CMAKE_INSTALL_LIBDIR})
- + install(FILES bzlib.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
- +
- + if(USE_OLD_SONAME)
- + # Hack to support the old libbz2.so.1.0 version by including an extra copy.
- + # Technically the old SONAME is not libtool compatible.
- + # This hack is to support binary compatibility with libbz2 in some distro packages.
- + if(UNIX AND NOT APPLE)
- + add_library(bz2_old_soname SHARED ${BZ2_RES})
- + target_sources(bz2_old_soname
- + PRIVATE ${BZ2_SOURCES}
- + ${CMAKE_CURRENT_SOURCE_DIR}/libbz2.def
- + PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/bzlib_private.h
- + INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/bzlib.h
- + )
- + set_target_properties(bz2_old_soname PROPERTIES
- + COMPILE_FLAGS "${WARNCFLAGS}"
- + VERSION ${LT_SOVERSION}.${LT_AGE} SOVERSION ${LT_SOVERSION}.${LT_AGE}
- + OUTPUT_NAME bz2
- + )
- + install(TARGETS bz2_old_soname DESTINATION ${CMAKE_INSTALL_LIBDIR})
- + endif()
- + endif()
- +endif()
- +
- +if(ENABLE_STATIC_LIB)
- + # The libbz2 static library.
- + add_library(bz2_static STATIC)
- + target_sources(bz2_static
- + PRIVATE ${BZ2_SOURCES}
- + PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/bzlib_private.h
- + INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/bzlib.h)
- + set_target_properties(bz2_static PROPERTIES
- + COMPILE_FLAGS "${WARNCFLAGS}"
- + VERSION ${LT_VERSION}
- + SOVERSION ${LT_SOVERSION}
- + ARCHIVE_OUTPUT_NAME bz2_static)
- + target_compile_definitions(bz2_static PUBLIC BZ2_STATICLIB)
- + install(TARGETS bz2_static DESTINATION ${CMAKE_INSTALL_LIBDIR})
- + install(FILES bzlib.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
- +endif()
- +
- +if(ENABLE_APP)
- + # The bzip2 executable.
- + add_executable(bzip2)
- + target_sources(bzip2
- + PRIVATE bzip2.c)
- + target_link_libraries(bzip2
- + PRIVATE bz2_ObjLib)
- + if(WIN32)
- + target_compile_definitions(bzip2 PUBLIC BZ_LCCWIN32 BZ_UNIX=0)
- + else()
- + target_compile_definitions(bzip2 PUBLIC BZ_LCCWIN32=0 BZ_UNIX)
- + endif()
- + install(TARGETS bzip2 DESTINATION ${CMAKE_INSTALL_BINDIR})
- +
- + # Create bzip2 copies bzcat and bunzip.
- + # The default behavior is altered in bzip2.c code by checking the program name.
- + install_target_symlink(bzip2 bzcat)
- + install_target_symlink(bzip2 bunzip)
- +
- + # The bzip2recover executable.
- + add_executable(bzip2recover)
- + target_sources(bzip2recover
- + PRIVATE bzip2recover.c)
- + target_link_libraries(bzip2recover
- + PRIVATE bz2_ObjLib)
- + if(WIN32)
- + target_compile_definitions(bzip2recover PUBLIC BZ_LCCWIN32 BZ_UNIX=0)
- + else()
- + target_compile_definitions(bzip2recover PUBLIC BZ_LCCWIN32=0 BZ_UNIX)
- + endif()
- + install(TARGETS bzip2recover DESTINATION ${CMAKE_INSTALL_BINDIR})
- +
- + if(ENABLE_EXAMPLES)
- + if(ENABLE_SHARED_LIB)
- + # The dlltest executable.
- + add_executable(dlltest)
- + target_sources(dlltest
- + PRIVATE dlltest.c)
- + target_link_libraries(dlltest bz2)
- + install(TARGETS dlltest DESTINATION ${CMAKE_INSTALL_BINDIR})
- + endif()
- + endif()
- +
- + if(NOT WIN32)
- + # Install shell scripts, and renamed copies.
- + install(PROGRAMS bzdiff bzgrep bzmore
- + DESTINATION ${CMAKE_INSTALL_BINDIR})
- +
- + install_script_symlink(bzdiff bzcmp)
- +
- + install_script_symlink(bzgrep bzegrep)
- + install_script_symlink(bzgrep bzfgrep)
- +
- + install_script_symlink(bzmore bzless)
- + endif()
- +
- +endif()
- --- /dev/null
- +++ b/CMakeOptions.txt
- @@ -0,0 +1,22 @@
- +# Features that can be enabled for cmake (see CMakeLists.txt)
- +
- +option(ENABLE_WERROR "Turn on compile time warnings")
- +
- +option(ENABLE_DEBUG "Turn on debug output")
- +
- +option(ENABLE_APP "Build applications (bzip2, and bzip2recover)"
- + ${ENABLE_APP_DEFAULT})
- +
- +option(ENABLE_DOCS "Generate documentation"
- + ${ENABLE_DOCS_DEFAULT})
- +
- +option(ENABLE_EXAMPLES "Build examples"
- + ${ENABLE_EXAMPLES_DEFAULT})
- +
- +option(ENABLE_LIB_ONLY "Build libbz2 only. This is a short hand for -DENABLE_APP=0 -DENABLE_EXAMPLES=0")
- +
- +option(ENABLE_STATIC_LIB "Build libbz2 in static mode also")
- +
- +option(ENABLE_SHARED_LIB "Build libbz2 as a shared library" ON)
- +
- +option(USE_OLD_SONAME "Use libbz2.so.1.0 for compatibility with old Makefiles" OFF)
|