cmake_minimum_required(VERSION 3.10) # ========== Main Project Settings =============== project(CablesDatabaseServer LANGUAGES CXX) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++17 /bigobj") elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -flto") endif() set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) # ========= Compile Definitions =================== if(WIN32) add_compile_definitions(WIN_COMPILER) set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_RELEASE} /Zi /MTd /DDEBUG /DWIN_COMPILER") elseif(UNIX) add_compile_definitions(UNIX_COMPILER) endif() add_compile_definitions(PROJECT_PATH="${CMAKE_CURRENT_SOURCE_DIR}") # ========= Set Variables =========== set(PROJECT_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}) set(PROJECT_DIR_PATH ${CMAKE_CURRENT_SOURCE_DIR}) set(PROJECT_INCLUDE_DIR_PATH ${CMAKE_CURRENT_SOURCE_DIR}/include) set(PROJECT_SRC_DIR_PATH ${CMAKE_CURRENT_SOURCE_DIR}/src) set(PROJECT_LIB_DIR_PATH ${CMAKE_CURRENT_SOURCE_DIR}/lib) set(OUTDIR_PATH ${PROJECT_ROOT_PATH}/build/${CMAKE_PROJECT_NAME}) set(DESTDIR_PATH ${OUTDIR_PATH}/${CMAKE_BUILD_TYPE}) #set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${DESTDIR_PATH}) if(CMAKE_BUILD_TYPE STREQUAL "Debug") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${DESTDIR_PATH}) elseif(CMAKE_BUILD_TYPE STREQUAL "Release") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${DESTDIR_PATH}) endif() file(READ "version.txt" APP_VERSION) message(APP_VERSION="${APP_VERSION}") configure_file(version.h.in version.h @ONLY) set(CMAKE_PROJECT_VERSION ${APP_VERSION}) # =========== Include Directories ========= include_directories(${PROJECT_INCLUDE_DIR_PATH} ${PROJECT_LIB_DIR_PATH}/asio ${PROJECT_LIB_DIR_PATH}/nlohmann-json-3.11.2/include ${PROJECT_LIB_DIR_PATH}/tinyxml2-9.0.0 ${PROJECT_LIB_DIR_PATH} ) # ============== Add subdirectories ========================= add_subdirectory(${PROJECT_LIB_DIR_PATH}/nlohmann-json-3.11.2 nlohmann-json-3.11.2) add_subdirectory(${PROJECT_LIB_DIR_PATH}/CppCommon CppCommon) # =========== Project Headers ========= set(PROJECT_HEADERS ${PROJECT_INCLUDE_DIR_PATH}/Http/ParsingQuery.h ${PROJECT_INCLUDE_DIR_PATH}/Http/PrepareAnswer.h ${PROJECT_INCLUDE_DIR_PATH}/Http/SimpleServer.h ${PROJECT_INCLUDE_DIR_PATH}/Sql/DBHelper.h ${PROJECT_LIB_DIR_PATH}/CppCommon/Common/Basic/FileProxy.h ${PROJECT_LIB_DIR_PATH}/tinyxml2-9.0.0/tinyxml2.h ${Json_HEADERS} ) # =========== Project Sources ========= set(PROJECT_SOURCES ${PROJECT_SRC_DIR_PATH}/Http/ParsingQuery.cpp ${PROJECT_SRC_DIR_PATH}/Http/PrepareAnswer.cpp ${PROJECT_SRC_DIR_PATH}/Http/SimpleServer.cpp ${PROJECT_SRC_DIR_PATH}/Sql/DBHelper.cpp ${PROJECT_LIB_DIR_PATH}/tinyxml2-9.0.0/tinyxml2.cpp ${PROJECT_SRC_DIR_PATH}/main.cpp ) # Поиск всех необходимых Qt модулей find_package(Qt6 COMPONENTS Core Network Sql Core5Compat) if(Qt6Core_FOUND) add_compile_definitions(QT_VERSION_6_OR_HIGHER) set(IS_OLD_QT false) else() find_package(Qt5 COMPONENTS Core Network Sql) if(Qt5Core_FOUND) set(IS_OLD_QT true) if(Qt6Core_VERSION VERSION_LESS 5.15) add_compile_definitions(OLD_QT_VERSION) endif() else() message(SEND_ERROR "The Qt6 or Qt5 library could not be found!") endif() endif() # ============== Create Project ========================= if(WIN32) add_executable(${PROJECT_NAME} ${PROJECT_SOURCES} ${PROJECT_HEADERS} ${CMAKE_CURRENT_SOURCE_DIR}/app.rc ) elseif(UNIX) add_executable(${PROJECT_NAME} ${PROJECT_SOURCES} ${PROJECT_HEADERS}) endif() target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_17) set_target_properties(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${DESTDIR_PATH}" ) # ============== Link Libraries ========================= target_link_libraries(${CMAKE_PROJECT_NAME} ${Libusb_LIB} ) if(IS_OLD_QT) target_link_libraries(${CMAKE_PROJECT_NAME} Qt5::Core Qt5::Network Qt5::Sql) else() target_link_libraries(${CMAKE_PROJECT_NAME} Qt6::Core Qt6::Network Qt6::Sql Qt6::Core5Compat) endif() if(WIN32) if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") target_link_libraries(${PROJECT_NAME} wsock32) target_link_libraries(${PROJECT_NAME} ws2_32) endif() elseif(UNIX) target_link_libraries(${PROJECT_NAME} pthread) endif() # ======= Post Build Commands ================= message(PROJECT_DIR_PATH="${PROJECT_DIR_PATH}") message(DESTDIR_PATH="${DESTDIR_PATH}") # copy files to output directory if(NOT ${PROJECT_DIR_PATH} STREQUAL ${DESTDIR_PATH}) add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_DIR_PATH}/version.txt ${DESTDIR_PATH}/version.txt ) add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_DIR_PATH}/resources/CablesSQLite.db ${DESTDIR_PATH}/CablesSQLite.db ) add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_DIR_PATH}/resources/CablesV2.xml ${DESTDIR_PATH}/CablesV2.xml ) add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_DIR_PATH}/DatabaseSettings.json ${DESTDIR_PATH}/DatabaseSettings.json ) endif() # Deployment - Automatically Detect and Copy Dependencies to Build Folder if(WIN32) if(IS_OLD_QT) get_target_property(_qmake_executable Qt5::qmake IMPORTED_LOCATION) else() get_target_property(_qmake_executable Qt6::qmake IMPORTED_LOCATION) endif() get_filename_component(_qt_bin_dir "${_qmake_executable}" DIRECTORY) find_program(WINDEPLOYQT_EXECUTABLE windeployqt HINTS "${_qt_bin_dir}") add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E env PATH="${_qt_bin_dir}" "${WINDEPLOYQT_EXECUTABLE}" "$" COMMENT "Running windeployqt..." ) endif()