CMakeLists.txt 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. cmake_minimum_required(VERSION 3.15)
  2. project(turbobase64 C)
  3. if(NOT CMAKE_BUILD_TYPE)
  4. set(CMAKE_BUILD_TYPE Release)
  5. endif()
  6. # Run cmake -D<OPTION>=ON|OFF to turn on/off options.
  7. # Usage example:
  8. # cmake -B build -S . -DNCHECK=ON
  9. # cmake --build build
  10. option(BUILD_SHARED_LIBS "Build shared libraries" OFF)
  11. option(NCHECK "Dinsable for checking for more fast decoding" OFF)
  12. # default=partial checking, detect allmost all errors
  13. option(FULLCHECK "Enable full base64 checking" OFF)
  14. option(USE_AVX512 "Enable AVX512" OFF)
  15. option(BUILD_APP "Build executables" OFF)
  16. message(STATUS "Configuring with CMAKE_SYSTEM_PROCESSOR ${CMAKE_SYSTEM_PROCESSOR}")
  17. if(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86_64")
  18. set(ARCH_AMD64 ON)
  19. elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64")
  20. set(ARCH_AARCH64 ON)
  21. elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "ppc64le")
  22. set(ARCH_PPC64LE ON)
  23. endif()
  24. set(CMAKE_C_FLAGS_RELEASE "-O3")
  25. set(CMAKE_C_FLAGS_DEBUG "-O0 -ggdb")
  26. # Set compiler options.
  27. if(NCHECK)
  28. add_compile_definitions(NB64CHECK)
  29. endif()
  30. if(FULLCHECK)
  31. add_compile_definitions(DB64CHECK)
  32. endif()
  33. if(USE_AVX512)
  34. add_compile_definitions(USE_AVX512)
  35. endif()
  36. if(ARCH_PPC64LE)
  37. set(MARCH "-march=power9 -mtune=power9")
  38. set(MSSE "-D__SSSE3__")
  39. elseif(ARCH_AARCH64)
  40. set(MARCH "-march=armv8-a")
  41. else()
  42. set(MARCH "-march=native")
  43. set(MSSE "-mssse3")
  44. endif()
  45. # Object library is just a bunch of object files.
  46. add_library(_b64_scalar OBJECT turbob64c.c turbob64d.c)
  47. target_compile_options(_b64_scalar PRIVATE ${MARCH} -falign-loops)
  48. # turbob64v128.c contains code for SSE, AVX, NEON, Power9.
  49. # It's compiled twice with different flags.
  50. add_library(_b64_v128 OBJECT turbob64v128.c)
  51. target_compile_options(_b64_v128 PRIVATE ${MSSE} -falign-loops)
  52. # Use a list to collect all object libraries.
  53. set(_b64_objs _b64_scalar _b64_v128)
  54. if(ARCH_AMD64)
  55. # Compile turbob64v128.c for the second time.
  56. add_library(_b64_avx OBJECT turbob64v128.c)
  57. target_compile_options(_b64_avx PRIVATE -march=corei7-avx -mtune=corei7-avx -mno-aes -fstrict-aliasing)
  58. list(APPEND _b64_objs _b64_avx)
  59. add_library(_b64_v256 OBJECT turbob64v256.c)
  60. target_compile_options(_b64_v256 PRIVATE -march=haswell -fstrict-aliasing -falign-loops)
  61. list(APPEND _b64_objs _b64_v256)
  62. endif()
  63. if(BUILD_SHARED_LIBS)
  64. add_library(base64 SHARED)
  65. else()
  66. add_library(base64 STATIC)
  67. endif()
  68. foreach(_obj ${_b64_objs})
  69. set_target_properties(${_obj} PROPERTIES POSITION_INDEPENDENT_CODE ${BUILD_SHARED_LIBS})
  70. target_sources(base64 PRIVATE $<TARGET_OBJECTS:${_obj}>)
  71. endforeach()
  72. # The XCODE fix is from https://github.com/ClickHouse/ClickHouse/blob/cf7d354a693f15fc5941edbf39e295d0bf8de21c/contrib%2Fbase64-cmake%2FCMakeLists.txt#L46-L54
  73. if(XCODE OR XCODE_VERSION)
  74. # https://gitlab.kitware.com/cmake/cmake/issues/17457
  75. # Some native build systems may not like targets that have only object files, so consider adding at least one real source file
  76. # This applies to Xcode.
  77. if(NOT EXISTS "${CMAKE_CURRENT_BINARY_DIR}/dummy.c")
  78. file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/dummy.c" "")
  79. endif()
  80. target_sources(base64 PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/dummy.c")
  81. endif()
  82. if(BUILD_APP)
  83. add_executable(tb64app tb64app.c)
  84. target_link_libraries(tb64app base64)
  85. endif()
  86. # Set package information.
  87. set(PACKAGE_NAME ${PROJECT_NAME})
  88. set(PACKAGE_NAMESPACE "turbo::")
  89. # For CMAKE_INSTALL_{INCLUDEDIR,LIBDIR} etc.
  90. include(GNUInstallDirs)
  91. set(CONFIG_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/${PACKAGE_NAME}")
  92. # Please refer "Modern CMake" on how to install a library.
  93. # https://cliutils.gitlab.io/modern-cmake/chapters/install/installing.html
  94. # Also refer to cmake documentation
  95. # https://cmake.org/cmake/help/latest/guide/importing-exporting/index.html
  96. # Set PUBLIC_HEADER property for install(TARGETS) to install header file.
  97. set_target_properties(base64 PROPERTIES PUBLIC_HEADER "${CMAKE_SOURCE_DIR}/turbob64.h")
  98. # Set includes destination for install(TARGETS), which will be added
  99. # to INTERFACE_INCLUDE_DIRECTORIES target property.
  100. # So user only need to call "target_link_libraries(turbo::base64)", without
  101. # needing to set include directories.
  102. target_include_directories(
  103. base64 SYSTEM PUBLIC
  104. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> # For being used from add_subdirectory.
  105. $<INSTALL_INTERFACE:include> # When being used from an installation.
  106. )
  107. # Installs library along with header files.
  108. # Also associates the installed target files with an export.
  109. install(
  110. TARGETS base64
  111. EXPORT ${PACKAGE_NAME}-targets
  112. PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${PACKAGE_NAME}"
  113. )
  114. # Generates and installs cmake config files containing exported targets.
  115. install(
  116. EXPORT ${PACKAGE_NAME}-targets
  117. DESTINATION "${CONFIG_INSTALL_DIR}"
  118. NAMESPACE ${PACKAGE_NAMESPACE}
  119. )
  120. # Generate cmake config-files from template.
  121. include(CMakePackageConfigHelpers)
  122. configure_package_config_file(
  123. "${CMAKE_CURRENT_SOURCE_DIR}/cmake/${PACKAGE_NAME}-config.cmake.in"
  124. ${PACKAGE_NAME}-config.cmake
  125. INSTALL_DESTINATION "${CONFIG_INSTALL_DIR}"
  126. #NO_CHECK_REQUIRED_COMPONENTS_MACRO
  127. # PATH_VARS can be referenced in config template file with PACKAGE_<var>.
  128. PATH_VARS CMAKE_INSTALL_INCLUDEDIR CMAKE_INSTALL_LIBDIR
  129. )
  130. install(
  131. FILES
  132. "${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_NAME}-config.cmake"
  133. DESTINATION "${CONFIG_INSTALL_DIR}"
  134. )