CMakeLists.txt 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. cmake_minimum_required(VERSION 3.21)
  2. project(DupFind VERSION 0.3.2 LANGUAGES CXX)
  3. set(CMAKE_CXX_STANDARD 20)
  4. set(CMAKE_CXX_STANDARD_REQUIRED ON)
  5. option(USE_NATIVE_OPTIMIZATION "Optimize for the local machine" OFF)
  6. # WIndows用アイコン
  7. set(app_icon "${CMAKE_CURRENT_SOURCE_DIR}/icons/DupFind.ico")
  8. if(MSVC)
  9. set(X_VCPKG_APPLOCAL_DEPS_INSTALL ON)
  10. endif()
  11. # Qt 6
  12. find_package(Qt6 COMPONENTS Widgets Concurrent Linguist Network REQUIRED)
  13. set(CMAKE_AUTOMOC ON)
  14. set(CMAKE_AUTOUIC ON)
  15. set(CMAKE_AUTORCC ON)
  16. # OpenCVの前にProtobufを自力で見つけさせる
  17. find_package(Protobuf REQUIRED)
  18. # OpenCV
  19. find_package(OpenCV REQUIRED)
  20. # SQLite3
  21. find_package(SQLite3 REQUIRED)
  22. include_directories(include)
  23. file(GLOB_RECURSE SOURCES src/*.cpp)
  24. file(GLOB_RECURSE HEADERS include/*.hpp)
  25. add_library(DupFindCore STATIC ${SOURCES} ${HEADERS})
  26. target_link_libraries(DupFindCore
  27. PUBLIC
  28. Qt6::Widgets
  29. Qt6::Concurrent
  30. Qt6::Network
  31. ${OpenCV_LIBS}
  32. SQLite::SQLite3
  33. )
  34. # Filter out mains from the core library sources if possible, but CMake GLOB can't filter easily inline.
  35. # Better approach: remove them explicitly.
  36. get_target_property(CORE_SOURCES DupFindCore SOURCES)
  37. list(REMOVE_ITEM CORE_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp")
  38. list(REMOVE_ITEM CORE_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/CmdMain.cpp")
  39. set_target_properties(DupFindCore PROPERTIES SOURCES "${CORE_SOURCES}")
  40. # GUI target
  41. #add_executable(${PROJECT_NAME} src/main.cpp)
  42. qt_add_executable(${PROJECT_NAME}
  43. src/main.cpp
  44. ${app_icon}
  45. resources.qrc
  46. )
  47. # CLI target
  48. add_executable(DupFindCmd src/CmdMain.cpp)
  49. target_link_libraries(DupFindCmd PRIVATE DupFindCore)
  50. # 最適化オプション
  51. set(ALL_TARGETS ${PROJECT_NAME} DupFindCmd DupFindCore)
  52. if(MSVC)
  53. foreach(target IN LISTS ALL_TARGETS)
  54. target_compile_options(${target} PRIVATE /arch:AVX2)
  55. target_compile_options(${target} PRIVATE
  56. $<$<NOT:$<CONFIG:Debug>>:
  57. /O2 /Oi /GL /fp:fast
  58. >
  59. )
  60. target_link_options(${target} PRIVATE
  61. $<$<NOT:$<CONFIG:Debug>>:
  62. /LTCG /OPT:REF /OPT:ICF
  63. >
  64. )
  65. endforeach()
  66. elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
  67. if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|amd64")
  68. foreach(target IN LISTS ALL_TARGETS)
  69. target_compile_options(${target} PRIVATE -mpopcnt -msse4.2)
  70. endforeach()
  71. endif()
  72. if(USE_NATIVE_OPTIMIZATION)
  73. foreach(target IN LISTS ALL_TARGETS)
  74. target_compile_options(${target} PRIVATE -march=native)
  75. endforeach()
  76. endif()
  77. endif()
  78. target_link_libraries(${PROJECT_NAME} PRIVATE DupFindCore)
  79. set_target_properties(${PROJECT_NAME} PROPERTIES
  80. WIN32_EXECUTABLE ON
  81. MACOSX_BUNDLE ON
  82. )
  83. # Translations
  84. qt_add_translations(${PROJECT_NAME}
  85. TS_FILES
  86. translations/dupfind_en.ts
  87. translations/dupfind_ja.ts
  88. translations/dupfind_zh_CN.ts
  89. translations/dupfind_zh_TW.ts
  90. translations/dupfind_es.ts
  91. translations/dupfind_de.ts
  92. translations/dupfind_ru.ts
  93. translations/dupfind_pt.ts
  94. translations/dupfind_pl.ts
  95. translations/dupfind_ko.ts
  96. RESOURCE i18n
  97. )
  98. # -----------------------------------------------------------------------------
  99. # Installation
  100. # -----------------------------------------------------------------------------
  101. include(GNUInstallDirs)
  102. install(TARGETS ${PROJECT_NAME} DupFindCmd
  103. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  104. )
  105. # Desktop file and Icon (only for Linux)
  106. if(NOT WIN32)
  107. install(FILES debian/dupfind.desktop DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/applications)
  108. install(FILES Deploy/Assets/Square150x150Logo.png
  109. DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pixmaps
  110. RENAME dupfind.png)
  111. endif()
  112. # -----------------------------------------------------------------------------
  113. # Deployment Configuration (Windows)
  114. # -----------------------------------------------------------------------------
  115. if(WIN32)
  116. # UCRTライブラリを自動的に含める
  117. set(CMAKE_INSTALL_UCRT_LIBRARIES TRUE)
  118. include(InstallRequiredSystemLibraries)
  119. # vc_redist.x64.exeを外す
  120. if(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS)
  121. list(FILTER CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS EXCLUDE REGEX "\\.exe$")
  122. endif()
  123. # Qt6::qmake 経由で bin ディレクトリを特定し windeployqt を探す
  124. get_target_property(_qmake_exe Qt6::qmake IMPORTED_LOCATION)
  125. get_filename_component(_qt_bin_dir "${_qmake_exe}" DIRECTORY)
  126. find_program(WINDEPLOYQT_EXECUTABLE windeployqt HINTS "${_qt_bin_dir}")
  127. set(DEPLOY_DIR "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/DupFind")
  128. # Appx Manifest Generation
  129. configure_file(
  130. "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/AppxManifest.xml.in"
  131. "${CMAKE_CURRENT_BINARY_DIR}/AppxManifest.xml"
  132. @ONLY
  133. )
  134. # Path to makeappx.exe (Windows SDK Build Tools)
  135. set(MAKEAPPX_EXECUTABLE "C:/Program Files (x86)/Microsoft Visual Studio/Shared/NuGetPackages/microsoft.windows.sdk.buildtools/10.0.26100.1742/bin/10.0.26100.0/x64/makeappx.exe")
  136. # `cmake --build build --target deploy` で起動する専用ターゲット
  137. add_custom_target(deploy
  138. # 1. 展開用ディレクトリの作成
  139. COMMAND ${CMAKE_COMMAND} -E make_directory "${DEPLOY_DIR}"
  140. # 2. 実行ファイル本体のコピー
  141. COMMAND ${CMAKE_COMMAND} -E copy "$<TARGET_FILE:${PROJECT_NAME}>" "${DEPLOY_DIR}/"
  142. COMMAND ${CMAKE_COMMAND} -E copy "$<TARGET_FILE:DupFindCmd>" "${DEPLOY_DIR}/"
  143. # 3. リソースディレクトリのコピーは不要になったため削除
  144. # 4. vcpkgがビルドディレクトリに出力した サードパーティDLL (OpenCV, SQLiteなど) の収集
  145. COMMAND powershell -NoProfile -Command "Copy-Item -Path '$<TARGET_FILE_DIR:${PROJECT_NAME}>/*.dll' -Destination '${DEPLOY_DIR}/' -Force -ErrorAction SilentlyContinue"
  146. # UCRTライブラリのコピー
  147. COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} "${DEPLOY_DIR}/"
  148. # 5. windeployqt による Qt DLL (--compiler-runtime) の自動収集
  149. COMMAND "${WINDEPLOYQT_EXECUTABLE}" --dir "${DEPLOY_DIR}" "${DEPLOY_DIR}/$<TARGET_FILE_NAME:${PROJECT_NAME}>"
  150. # 6. vc_redist.x64.exe の削除 (Appxには不要)
  151. COMMAND ${CMAKE_COMMAND} -E rm -f "${DEPLOY_DIR}/vc_redist.x64.exe"
  152. # 7. Appx用リソースとManifestのコピー
  153. COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_BINARY_DIR}/AppxManifest.xml" "${DEPLOY_DIR}/"
  154. COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/Assets" "${DEPLOY_DIR}/Assets"
  155. # 8. Appxパッケージの作成
  156. COMMAND "${MAKEAPPX_EXECUTABLE}" pack /d "${DEPLOY_DIR}" /p "${CMAKE_CURRENT_SOURCE_DIR}/Deploy/DupFind.appx" /l /o
  157. DEPENDS ${PROJECT_NAME} DupFindCmd
  158. COMMENT "Deploying and creating Appx package in ${CMAKE_CURRENT_SOURCE_DIR}/Deploy/DupFind.appx..."
  159. )
  160. endif()