CMakeLists.txt 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. # Copyright (C) 2008 by BogDan Vatra < bogdan@licentia.eu >
  2. # Copyright (C) 2009-2024 Robin Stuart <rstuart114@gmail.com>
  3. # vim: set ts=4 sw=4 et :
  4. cmake_minimum_required(VERSION 3.10)
  5. project(zint-package)
  6. set(CMAKE_INCLUDE_CURRENT_DIR ON)
  7. set(ZINT_VERSION_MAJOR 2)
  8. set(ZINT_VERSION_MINOR 13)
  9. set(ZINT_VERSION_RELEASE 0)
  10. set(ZINT_VERSION_BUILD 9) # Set to 0 before release, set to 9 after release
  11. set(ZINT_VERSION "${ZINT_VERSION_MAJOR}.${ZINT_VERSION_MINOR}.${ZINT_VERSION_RELEASE}.${ZINT_VERSION_BUILD}")
  12. add_definitions(-DZINT_VERSION=\"${ZINT_VERSION}\")
  13. option(ZINT_DEBUG "Set debug compile flags" OFF)
  14. option(ZINT_NOOPT "Set no optimize compile flags" OFF)
  15. option(ZINT_SANITIZE "Set sanitize compile/link flags" OFF)
  16. option(ZINT_TEST "Set test compile flag" OFF)
  17. option(ZINT_COVERAGE "Set code coverage flags" OFF)
  18. option(ZINT_SHARED "Build shared library" ON)
  19. option(ZINT_STATIC "Build static library" OFF)
  20. option(ZINT_USE_PNG "Build with PNG support" ON)
  21. option(ZINT_USE_QT "Build with Qt support" ON)
  22. option(ZINT_QT6 "If ZINT_USE_QT, use Qt6" OFF)
  23. option(ZINT_UNINSTALL "Add uninstall target" ON)
  24. option(ZINT_FRONTEND "Build frontend" ON)
  25. if(NOT ZINT_SHARED AND NOT ZINT_STATIC)
  26. message(SEND_ERROR "Either ZINT_SHARED or ZINT_STATIC or both must be set")
  27. endif()
  28. include(GNUInstallDirs)
  29. # Taken from old (2008) KDE "SetPaths.cmake"
  30. # Set a default build type for single-configuration CMake generators if no build type is set
  31. if(NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE)
  32. set(CMAKE_BUILD_TYPE RelWithDebInfo)
  33. endif()
  34. include(CheckCCompilerFlag)
  35. include(CheckFunctionExists)
  36. if(NOT MSVC) # Use default warnings if MSVC otherwise inundated
  37. check_c_compiler_flag("-Wall" C_COMPILER_FLAG_WALL)
  38. if(C_COMPILER_FLAG_WALL)
  39. add_compile_options("-Wall")
  40. endif()
  41. check_c_compiler_flag("-Wextra" C_COMPILER_FLAG_WEXTRA)
  42. if(C_COMPILER_FLAG_WEXTRA)
  43. add_compile_options("-Wextra")
  44. endif()
  45. # gcc complains about "%n$" `errtxtf()` arguments if "-Wpedantic" used, so only use for clang
  46. if(CMAKE_C_COMPILER_ID MATCHES "Clang")
  47. check_c_compiler_flag("-Wpedantic" C_COMPILER_FLAG_WPEDANTIC)
  48. if(C_COMPILER_FLAG_WPEDANTIC)
  49. add_compile_options("-Wpedantic")
  50. endif()
  51. endif()
  52. check_c_compiler_flag("-Wundef" C_COMPILER_FLAG_WUNDEF)
  53. if(C_COMPILER_FLAG_WUNDEF)
  54. add_compile_options("-Wundef")
  55. endif()
  56. endif()
  57. if(ZINT_DEBUG)
  58. check_c_compiler_flag("-g" C_COMPILER_FLAG_G)
  59. if(C_COMPILER_FLAG_G)
  60. add_compile_options("-g")
  61. endif()
  62. endif()
  63. if(ZINT_NOOPT)
  64. check_c_compiler_flag("-O0" C_COMPILER_FLAG_O0)
  65. if(C_COMPILER_FLAG_O0)
  66. add_compile_options("-O0")
  67. endif()
  68. endif()
  69. if(ZINT_SANITIZE)
  70. if(MSVC)
  71. if(MSVC_VERSION GREATER_EQUAL 1920)
  72. add_compile_options(-fsanitize=address)
  73. message(STATUS "ZINT_SANITIZE: setting -fsanitize=address for MSVC 2019")
  74. else()
  75. message(STATUS "ZINT_SANITIZE: ignoring for MSVC < 2019")
  76. endif()
  77. else()
  78. set(SANITIZERS address undefined)
  79. foreach(sanitizer IN ITEMS ${SANITIZERS})
  80. set(CMAKE_REQUIRED_LIBRARIES -fsanitize=${sanitizer})
  81. check_c_compiler_flag(-fsanitize=${sanitizer} C_COMPILER_FLAG_FSANITIZE_${sanitizer})
  82. if(C_COMPILER_FLAG_FSANITIZE_${sanitizer})
  83. add_compile_options(-fsanitize=${sanitizer})
  84. link_libraries(-fsanitize=${sanitizer})
  85. endif()
  86. unset(CMAKE_REQUIRED_LIBRARIES)
  87. endforeach()
  88. if(NOT ZINT_DEBUG AND CMAKE_C_COMPILER_ID MATCHES "GNU")
  89. # Gives warning on MainWindow::setupUI() and retries (& takes forever) if var-tracking-assignments enabled
  90. add_compile_options(-fno-var-tracking-assignments)
  91. endif()
  92. if(CMAKE_C_COMPILER_ID MATCHES "Clang")
  93. # Recent clangs added deprecation warnings for `sprintf()` that are only triggered on sanitize - suppress
  94. add_compile_options(-Wno-deprecated-declarations)
  95. endif()
  96. endif()
  97. endif()
  98. if(ZINT_TEST)
  99. enable_testing()
  100. endif()
  101. if(ZINT_COVERAGE)
  102. set(CMAKE_REQUIRED_LIBRARIES -fprofile-arcs)
  103. check_c_compiler_flag(--coverage C_COMPILER_FLAG_COVERAGE)
  104. unset(CMAKE_REQUIRED_LIBRARIES)
  105. if(C_COMPILER_FLAG_COVERAGE)
  106. add_compile_options(--coverage)
  107. link_libraries(-fprofile-arcs)
  108. check_c_compiler_flag(-O0 C_COMPILER_FLAG_O0)
  109. if(C_COMPILER_FLAG_O0)
  110. add_compile_options(-O0)
  111. endif()
  112. endif()
  113. endif()
  114. check_function_exists(getopt_long_only HAVE_GETOPT_LONG_ONLY)
  115. if(NOT HAVE_GETOPT_LONG_ONLY)
  116. add_subdirectory(getopt)
  117. endif()
  118. add_subdirectory(backend)
  119. if(ZINT_FRONTEND)
  120. add_subdirectory(frontend)
  121. endif()
  122. if(NOT ZINT_USE_QT)
  123. message(STATUS "Qt support was disabled for this build")
  124. elseif(ZINT_QT6 OR ($ENV{CMAKE_PREFIX_PATH} MATCHES "6[.][0-9][.][0-9]"))
  125. set(USE_QT6 TRUE)
  126. message(STATUS "Using Qt6")
  127. cmake_policy(SET CMP0012 NEW) # Recognize constants in if()
  128. cmake_policy(SET CMP0072 NEW) # Choose OpenGL over legacy GL
  129. find_package(Qt6Widgets)
  130. find_package(Qt6Gui)
  131. find_package(Qt6UiTools)
  132. find_package(Qt6Svg)
  133. if(Qt6Widgets_FOUND AND Qt6Gui_FOUND AND Qt6UiTools_FOUND AND Qt6Svg_FOUND)
  134. message(STATUS "Qt version: " ${Qt6Core_VERSION_MAJOR}.${Qt6Core_VERSION_MINOR}.${Qt6Core_VERSION_PATCH})
  135. add_subdirectory(backend_qt)
  136. add_subdirectory(frontend_qt)
  137. else()
  138. message(STATUS "Could NOT find Qt6")
  139. endif()
  140. else()
  141. message(STATUS "Using Qt5")
  142. find_package(Qt5Widgets)
  143. find_package(Qt5Gui)
  144. find_package(Qt5UiTools)
  145. find_package(Qt5Svg)
  146. if(Qt5Widgets_FOUND AND Qt5Gui_FOUND AND Qt5UiTools_FOUND AND Qt5Svg_FOUND)
  147. message(STATUS "Qt version: " ${Qt5Core_VERSION_STRING})
  148. # Old Qt does not provide QT_VERSION_MAJOR
  149. if (NOT QT_VERSION_MAJOR)
  150. string(SUBSTRING ${Qt5Core_VERSION_STRING} 0 1 QT_VERSION_MAJOR)
  151. endif()
  152. add_subdirectory(backend_qt)
  153. add_subdirectory(frontend_qt)
  154. else()
  155. message(STATUS "Could NOT find Qt5")
  156. endif()
  157. endif()
  158. if(ZINT_UNINSTALL)
  159. configure_file(
  160. "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
  161. "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
  162. IMMEDIATE @ONLY)
  163. add_custom_target(uninstall
  164. "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")
  165. endif()
  166. configure_file("zint-config.cmake.in" "zint-config.cmake" @ONLY)
  167. install(FILES "${CMAKE_CURRENT_BINARY_DIR}/zint-config.cmake" DESTINATION "${CMAKE_INSTALL_DATADIR}/zint")