cmake_minimum_required(VERSION 3.16) project(ARC LANGUAGES CXX) #mkdir build #cd build #cmake .. -A x64 -DCMAKE_PREFIX_PATH="C:/Qt/6.9.0/msvc2022_64" -DCMAKE_BUILD_TYPE=Release #cmake .. -G "Visual Studio 17 2022" -A x64 -DCMAKE_PREFIX_PATH="C:/Qt/6.9.0/msvc2022_64" -DCMAKE_BUILD_TYPE=Release #cmake --build . --config Release #"C:\Qt\6.9.0\msvc2022_64\bin\windeployqt.exe" .\Release\ARC.exe set(CMAKE_CXX_STANDARD 17) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) add_compile_definitions(QT_MESSAGELOGCONTEXT) if (WIN32) # Определяем целевую архитектуру. # CMAKE_GENERATOR_PLATFORM (-A flag) — самый надёжный способ определения при кросс-компиляции. # На ARM64 хосте CMAKE_SYSTEM_PROCESSOR может быть "ARM64" даже при сборке под x64, # поэтому сначала проверяем явные x64-признаки. if (CMAKE_GENERATOR_PLATFORM STREQUAL "x64" OR CMAKE_GENERATOR_PLATFORM STREQUAL "Win64" OR VCPKG_TARGET_TRIPLET MATCHES "x64") message(STATUS "Detected x64 target architecture") set(CMAKE_PREFIX_PATH "C:/Qt/6.9.0/msvc2022_64") list(APPEND CMAKE_PREFIX_PATH "C:/Users/User/.vcpkg-clion/vcpkg/installed/x64-windows") set(Tesseract_DIR "C:/Users/User/.vcpkg-clion/vcpkg/installed/x64-windows/share/tesseract") set(VCPKG_BIN_DIR "C:/Users/User/.vcpkg-clion/vcpkg/installed/x64-windows/bin") elseif (VCPKG_TARGET_TRIPLET MATCHES "arm64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64" OR CMAKE_GENERATOR_PLATFORM STREQUAL "ARM64" OR CMAKE_CXX_COMPILER MATCHES "arm64") message(STATUS "Detected ARM64 target architecture") set(CMAKE_PREFIX_PATH "C:/Qt/6.9.0/msvc2022_arm64") list(APPEND CMAKE_PREFIX_PATH "C:/Users/User/.vcpkg-clion/vcpkg/installed/arm64-windows") set(Tesseract_DIR "C:/Users/User/.vcpkg-clion/vcpkg/installed/arm64-windows/share/tesseract") set(VCPKG_BIN_DIR "C:/Users/User/.vcpkg-clion/vcpkg/installed/arm64-windows/bin") else () message(STATUS "Detected x64 target architecture (default)") set(CMAKE_PREFIX_PATH "C:/Qt/6.9.0/msvc2022_64") list(APPEND CMAKE_PREFIX_PATH "C:/Users/User/.vcpkg-clion/vcpkg/installed/x64-windows") set(Tesseract_DIR "C:/Users/User/.vcpkg-clion/vcpkg/installed/x64-windows/share/tesseract") set(VCPKG_BIN_DIR "C:/Users/User/.vcpkg-clion/vcpkg/installed/x64-windows/bin") endif () find_package(Tesseract CONFIG REQUIRED) elseif (APPLE) # Укажи путь к Qt6 set(CMAKE_PREFIX_PATH "/opt/homebrew/opt/qt") include_directories("/opt/homebrew/include") link_directories("/opt/homebrew/lib") endif () find_package(Qt6 REQUIRED COMPONENTS Network Widgets Sql Xml Concurrent ) file(GLOB_RECURSE DB_SOURCES CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/database/*.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/database/*.h" ) file(GLOB_RECURSE VIEW_SOURCES CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/views/*.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/views/*.h" ) file(GLOB_RECURSE SERVICES_SOURCES CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/services/*.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/services/*.h" ) file(GLOB_RECURSE MODELS_SOURCES CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/models/*.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/models/*.h" ) file(GLOB_RECURSE ANDROID_SOURCES CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/android/*.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/android/*.h" ) if (WIN32) add_executable(ARC WIN32 main.cpp app.rc ${VIEW_SOURCES} ${SERVICES_SOURCES} ${DB_SOURCES} ${MODELS_SOURCES} ${ANDROID_SOURCES} views/bank/BankSettingsWindow.cpp views/bank/BankSettingsWindow.h views/bank/BankSetupWizard.cpp views/bank/BankSetupWizard.h views/log/FileLogWindow.cpp views/log/FileLogWindow.h views/log/LogDetailWindow.cpp views/log/LogDetailWindow.h database/dao/GeneralLogDAO.cpp database/dao/GeneralLogDAO.h android/dushanbe/AppVersionTrack.h android/dushanbe/CommonScript.cpp android/dushanbe/CommonScript.h android/dushanbe/GetCardInfoScript.cpp android/dushanbe/GetCardInfoScript.h android/dushanbe/GetLastTransactionsScript.cpp android/dushanbe/GetLastTransactionsScript.h android/dushanbe/GetProfileInfoScript.cpp android/dushanbe/GetProfileInfoScript.h android/dushanbe/LoginAndCheckAccountsScript.cpp android/dushanbe/LoginAndCheckAccountsScript.h android/dushanbe/ScreenXmlParser.cpp android/dushanbe/ScreenXmlParser.h ) elseif (APPLE) add_executable(ARC main.cpp ${VIEW_SOURCES} ${SERVICES_SOURCES} ${DB_SOURCES} ${MODELS_SOURCES} ${ANDROID_SOURCES} views/bank/BankSettingsWindow.cpp views/bank/BankSettingsWindow.h views/bank/BankSetupWizard.cpp views/bank/BankSetupWizard.h views/log/FileLogWindow.cpp views/log/FileLogWindow.h views/log/LogDetailWindow.cpp views/log/LogDetailWindow.h database/dao/GeneralLogDAO.cpp database/dao/GeneralLogDAO.h android/dushanbe/AppVersionTrack.h android/dushanbe/CommonScript.cpp android/dushanbe/CommonScript.h android/dushanbe/GetCardInfoScript.cpp android/dushanbe/GetCardInfoScript.h android/dushanbe/GetLastTransactionsScript.cpp android/dushanbe/GetLastTransactionsScript.h android/dushanbe/GetProfileInfoScript.cpp android/dushanbe/GetProfileInfoScript.h android/dushanbe/LoginAndCheckAccountsScript.cpp android/dushanbe/LoginAndCheckAccountsScript.h android/dushanbe/ScreenXmlParser.cpp android/dushanbe/ScreenXmlParser.h ) endif () if (WIN32) target_link_libraries(ARC Qt6::Widgets Qt6::Xml Qt6::Sql Qt6::Network Qt6::Concurrent Tesseract::libtesseract ) # Копирование изображений в директорию сборки # file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/database/app_data.db" DESTINATION "${CMAKE_BINARY_DIR}/database") file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/tutorials" DESTINATION "${CMAKE_BINARY_DIR}") file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/images" DESTINATION "${CMAKE_BINARY_DIR}") file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/rus.traineddata" DESTINATION "${CMAKE_BINARY_DIR}") file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/eng.traineddata" DESTINATION "${CMAKE_BINARY_DIR}") # tessdata/ — канонический путь, ожидаемый Tesseract 5+ через TESSDATA_PREFIX/datapath file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/rus.traineddata" DESTINATION "${CMAKE_BINARY_DIR}/tessdata") file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/eng.traineddata" DESTINATION "${CMAKE_BINARY_DIR}/tessdata") file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/config.ini" DESTINATION "${CMAKE_BINARY_DIR}") file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/no_devices.png" DESTINATION "${CMAKE_BINARY_DIR}") file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/assets/ADBKeyboard.apk" DESTINATION "${CMAKE_BINARY_DIR}/assets") # adb копируется в post-build чтобы не падать при configure если adb.exe занят file(GLOB _adb_files "${CMAKE_CURRENT_SOURCE_DIR}/tools/adb/windows/*") foreach(_adb_file ${_adb_files}) get_filename_component(_adb_fname "${_adb_file}" NAME) add_custom_command(TARGET ARC POST_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory "$/tools/adb/windows" COMMAND ${CMAKE_COMMAND} -E copy_if_different "${_adb_file}" "$/tools/adb/windows/${_adb_fname}" ) endforeach() add_custom_command(TARGET ARC POST_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory "$/database" COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/tutorials" "$/tutorials" COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/images" "$/images" COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/rus.traineddata" "$/rus.traineddata" COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/eng.traineddata" "$/eng.traineddata" COMMAND ${CMAKE_COMMAND} -E make_directory "$/tessdata" COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/rus.traineddata" "$/tessdata/rus.traineddata" COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/eng.traineddata" "$/tessdata/eng.traineddata" COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/config.ini" "$/config.ini" COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/no_devices.png" "$/no_devices.png" COMMAND ${CMAKE_COMMAND} -E make_directory "$/assets" COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/assets/ADBKeyboard.apk" "$/assets/ADBKeyboard.apk" ) # Copy OpenSSL DLLs required for HTTPS (Qt SSL backend) file(GLOB _openssl_dlls "${VCPKG_BIN_DIR}/libssl*.dll" "${VCPKG_BIN_DIR}/libcrypto*.dll") foreach(_dll ${_openssl_dlls}) add_custom_command(TARGET ARC POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${_dll}" "$" ) endforeach() # Copy mock-server test scripts into the build so they ship with the archive add_custom_command(TARGET ARC POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/tests/mock_server" "$/tests/mock_server" ) # Copy Tesseract, Leptonica, and their transitive dependency DLLs file(GLOB _tesseract_dlls "${VCPKG_BIN_DIR}/tesseract*.dll" "${VCPKG_BIN_DIR}/leptonica*.dll" "${VCPKG_BIN_DIR}/libpng*.dll" "${VCPKG_BIN_DIR}/jpeg*.dll" "${VCPKG_BIN_DIR}/tiff*.dll" "${VCPKG_BIN_DIR}/zlib*.dll" "${VCPKG_BIN_DIR}/gif*.dll" "${VCPKG_BIN_DIR}/libwebp*.dll" "${VCPKG_BIN_DIR}/libsharpyuv*.dll" "${VCPKG_BIN_DIR}/openjp2*.dll" "${VCPKG_BIN_DIR}/archive*.dll" "${VCPKG_BIN_DIR}/libcurl*.dll" "${VCPKG_BIN_DIR}/lz4*.dll" "${VCPKG_BIN_DIR}/zstd*.dll" "${VCPKG_BIN_DIR}/liblzma*.dll" "${VCPKG_BIN_DIR}/bz2*.dll" "${VCPKG_BIN_DIR}/iconv*.dll" "${VCPKG_BIN_DIR}/charset*.dll" "${VCPKG_BIN_DIR}/libxml2*.dll") foreach(_dll ${_tesseract_dlls}) add_custom_command(TARGET ARC POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${_dll}" "$" ) endforeach() elseif (APPLE) target_link_libraries(ARC Qt6::Widgets Qt6::Sql Qt6::Xml Qt6::Network Qt6::Concurrent tesseract leptonica ) # Копирование изображений в директорию сборки file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/tutorials" DESTINATION "${CMAKE_BINARY_DIR}") file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/images" DESTINATION "${CMAKE_BINARY_DIR}") file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/rus.traineddata" DESTINATION "${CMAKE_BINARY_DIR}") file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/eng.traineddata" DESTINATION "${CMAKE_BINARY_DIR}") # tessdata/ — канонический путь, ожидаемый Tesseract 5+ через TESSDATA_PREFIX/datapath file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/rus.traineddata" DESTINATION "${CMAKE_BINARY_DIR}/tessdata") file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/eng.traineddata" DESTINATION "${CMAKE_BINARY_DIR}/tessdata") file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/config.ini" DESTINATION "${CMAKE_BINARY_DIR}") file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/no_devices.png" DESTINATION "${CMAKE_BINARY_DIR}") file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/assets/ADBKeyboard.apk" DESTINATION "${CMAKE_BINARY_DIR}/assets") endif () target_include_directories(ARC PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/views ${CMAKE_CURRENT_SOURCE_DIR}/database ${CMAKE_CURRENT_SOURCE_DIR}/services ${CMAKE_CURRENT_SOURCE_DIR}/models ${CMAKE_CURRENT_SOURCE_DIR}/android )