mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-31 05:54:26 -04:00 
			
		
		
		
	Fixes portability issues on macOS. CMakeLists.txt is a stripped-down backport from bzip2 upstream Signed-off-by: Felix Fietkau <nbd@nbd.name>
		
			
				
	
	
		
			383 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			383 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| --- /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)
 |