--- /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)
