| 1 | cmake_minimum_required(VERSION 3.13 FATAL_ERROR) |
| 2 | |
| 3 | project( |
| 4 | bzip3 |
| 5 | VERSION 1.5.3 |
| 6 | DESCRIPTION "A better and stronger spiritual successor to BZip2" |
| 7 | HOMEPAGE_URL "https://github.com/iczelia/bzip3" |
| 8 | LANGUAGES C) |
| 9 | |
| 10 | set(CMAKE_C_STANDARD 99) |
| 11 | |
| 12 | option(BUILD_SHARED_LIBS "Build libbz3 as a shared library" ON) |
| 13 | option(BZIP3_BUILD_APPS "Build bzip3 applications" ON) |
| 14 | if(WIN32 AND NOT (MINGW OR CYGWIN)) |
| 15 | set(BZIP3_ENABLE_PTHREAD_DEFAULT OFF) |
| 16 | else() |
| 17 | set(BZIP3_ENABLE_PTHREAD_DEFAULT ON) |
| 18 | endif() |
| 19 | option(BZIP3_ENABLE_PTHREAD "Enable use of pthread library" "${BZIP3_ENABLE_PTHREAD_DEFAULT}") |
| 20 | option(BZIP3_ENABLE_ARCH_NATIVE "Enable CPU-specific optimizations" OFF) |
| 21 | option(BZIP3_ENABLE_STATIC_EXE "Enable static builds of the executable" OFF) |
| 22 | |
| 23 | include(CheckCCompilerFlag) |
| 24 | include(CheckSymbolExists) |
| 25 | include(GNUInstallDirs) |
| 26 | |
| 27 | set(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_FULL_LIBDIR}) |
| 28 | set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) |
| 29 | |
| 30 | set(prefix ${CMAKE_INSTALL_PREFIX}) |
| 31 | set(exec_prefix ${CMAKE_INSTALL_PREFIX}) |
| 32 | set(bindir ${CMAKE_INSTALL_FULL_BINDIR}) |
| 33 | set(libdir ${CMAKE_INSTALL_FULL_LIBDIR}) |
| 34 | set(includedir ${CMAKE_INSTALL_FULL_INCLUDEDIR}) |
| 35 | set(PACKAGE ${CMAKE_PROJECT_NAME}) |
| 36 | set(PACKAGE_VERSION ${PROJECT_VERSION}) |
| 37 | if(WIN32 AND BUILD_SHARED_LIBS) |
| 38 | set(extra_cflags " -DBZIP3_DLL_IMPORT=1") |
| 39 | else() |
| 40 | set(extra_cflags "") |
| 41 | endif() |
| 42 | configure_file(bzip3.pc.in ${CMAKE_CURRENT_BINARY_DIR}/bzip3.pc @ONLY) |
| 43 | install(FILES ${CMAKE_CURRENT_BINARY_DIR}/bzip3.pc |
| 44 | DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) |
| 45 | |
| 46 | if(BZIP3_ENABLE_PTHREAD) |
| 47 | set(THREADS_PREFER_PTHREAD_FLAG TRUE) |
| 48 | find_package(Threads REQUIRED) |
| 49 | endif() |
| 50 | |
| 51 | if(BUILD_SHARED_LIBS) |
| 52 | add_library(bz3 SHARED) |
| 53 | else() |
| 54 | add_library(bz3 STATIC) |
| 55 | endif() |
| 56 | target_sources(bz3 PRIVATE src/libbz3.c) |
| 57 | target_compile_definitions(bz3 PUBLIC VERSION="${PROJECT_VERSION}") |
| 58 | if(WIN32 AND BUILD_SHARED_LIBS) |
| 59 | target_compile_definitions(bz3 PRIVATE BZIP3_DLL_EXPORT=1) |
| 60 | target_compile_definitions(bz3 INTERFACE BZIP3_DLL_IMPORT=1) |
| 61 | endif() |
| 62 | target_include_directories( |
| 63 | bz3 |
| 64 | PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> |
| 65 | INTERFACE $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>) |
| 66 | if(BZIP3_ENABLE_PTHREAD) |
| 67 | target_compile_definitions(bz3 PUBLIC PTHREAD) |
| 68 | target_link_libraries(bz3 Threads::Threads) |
| 69 | endif() |
| 70 | if(BZIP3_ENABLE_ARCH_NATIVE) |
| 71 | check_c_compiler_flag(-march=native CC_SUPPORT_MARCH_NATIVE_FLAG) |
| 72 | check_c_compiler_flag(-mtune=native CC_SUPPORT_MTUNE_NATIVE_FLAG) |
| 73 | if(CC_SUPPORT_MARCH_NATIVE_FLAG AND CC_SUPPORT_MTUNE_NATIVE_FLAG) |
| 74 | target_link_options(bz3 PUBLIC -march=native -mtune=native) |
| 75 | else() |
| 76 | message( |
| 77 | FATAL_ERROR |
| 78 | "Compiler does not support native optimizations, disable `BZIP3_ENABLE_ARCH_NATIVE`" |
| 79 | ) |
| 80 | endif() |
| 81 | endif() |
| 82 | set_target_properties( |
| 83 | bz3 |
| 84 | PROPERTIES OUTPUT_NAME bzip3 |
| 85 | SOVERSION "1" |
| 86 | PUBLIC_HEADER include/libbz3.h |
| 87 | VERSION "1.0.0") |
| 88 | if(BUILD_SHARED_LIBS) |
| 89 | set_target_properties(bz3 PROPERTIES POSITION_INDEPENDENT_CODE ON) |
| 90 | endif() |
| 91 | install( |
| 92 | TARGETS bz3 |
| 93 | EXPORT ${CMAKE_PROJECT_NAME}-targets |
| 94 | RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} |
| 95 | ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} |
| 96 | LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} |
| 97 | PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) |
| 98 | install( |
| 99 | EXPORT ${CMAKE_PROJECT_NAME}-targets |
| 100 | DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${CMAKE_PROJECT_NAME}" |
| 101 | NAMESPACE ${CMAKE_PROJECT_NAME}::) |
| 102 | configure_file( |
| 103 | "${CMAKE_CURRENT_SOURCE_DIR}/${CMAKE_PROJECT_NAME}-config.cmake.in" |
| 104 | "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}-config.cmake" |
| 105 | @ONLY) |
| 106 | install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}-config.cmake" |
| 107 | DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${CMAKE_PROJECT_NAME}") |
| 108 | if(BZIP3_BUILD_APPS) |
| 109 | add_executable(bzip3) |
| 110 | target_sources(bzip3 PRIVATE src/main.c) |
| 111 | if(BZIP3_ENABLE_STATIC_EXE) |
| 112 | if(BUILD_SHARED_LIBS) |
| 113 | message( |
| 114 | FATAL_ERROR |
| 115 | "libbz3 is not built as a static library, disable `BUILD_SHARED_LIBS`" |
| 116 | ) |
| 117 | endif() |
| 118 | check_c_compiler_flag(-static CC_SUPPORT_STATIC_FLAG) |
| 119 | if(CC_SUPPORT_STATIC_FLAG) |
| 120 | target_link_options(bzip3 PRIVATE -static) |
| 121 | else() |
| 122 | message( |
| 123 | FATAL_ERROR |
| 124 | "Compiler does not support static linking, disable `BZIP3_ENABLE_STATIC_EXE`" |
| 125 | ) |
| 126 | endif() |
| 127 | endif() |
| 128 | target_link_libraries(bzip3 PRIVATE bz3) |
| 129 | install(TARGETS bzip3 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) |
| 130 | |
| 131 | set(BZIP3_APP_SCRIPTS bunzip3 bz3cat bz3grep bz3less bz3more bz3most) |
| 132 | install(PROGRAMS ${BZIP3_APP_SCRIPTS} DESTINATION ${CMAKE_INSTALL_BINDIR}) |
| 133 | |
| 134 | if(UNIX) |
| 135 | set(BZIP3_MANS |
| 136 | bunzip3.1 |
| 137 | bz3cat.1 |
| 138 | bz3grep.1 |
| 139 | bz3less.1 |
| 140 | bz3more.1 |
| 141 | bz3most.1 |
| 142 | bzip3.1) |
| 143 | foreach(BZIP3_MAN ${BZIP3_MANS}) |
| 144 | if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${BZIP3_MAN}.in) |
| 145 | string(TIMESTAMP MAN_DATE "%d %B %Y" UTC) |
| 146 | set(TRANSFORMED_PACKAGE_NAME ${CMAKE_PROJECT_NAME}) |
| 147 | set(MAN_DATE ${MAN_DATE}) |
| 148 | set(VERSION ${PROJECT_VERSION}) |
| 149 | configure_file(${CMAKE_CURRENT_SOURCE_DIR}/${BZIP3_MAN}.in |
| 150 | ${CMAKE_CURRENT_BINARY_DIR}/${BZIP3_MAN} |
| 151 | @ONLY) |
| 152 | else() |
| 153 | configure_file(${CMAKE_CURRENT_SOURCE_DIR}/${BZIP3_MAN} |
| 154 | ${CMAKE_CURRENT_BINARY_DIR}/${BZIP3_MAN} |
| 155 | COPYONLY) |
| 156 | endif() |
| 157 | install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${BZIP3_MAN} |
| 158 | DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) |
| 159 | endforeach() |
| 160 | endif() |
| 161 | endif() |