From 33b11ec1a5280c893d7594df83e5d7f3b7ce43bb Mon Sep 17 00:00:00 2001 From: Nikita Talalai Date: Mon, 11 Dec 2023 18:57:31 +0300 Subject: [PATCH] build: init cmake --- CMakeLists.txt | 34 +++++++++++++++++++++++++++++ cmake/NoInSourceBuilds.cmake | 11 ++++++++++ cmake/QtHelper.cmake | 27 +++++++++++++++++++++++ cmake/TranslationUtils.cmake | 12 +++++++++++ dependencies/CMakeLists.txt | 3 +++ packaging/CMakeLists.txt | 36 +++++++++++++++++++++++++++++++ share/CMakeLists.txt | 7 ++++++ share/translations/CMakeLists.txt | 20 +++++++++++++++++ src/CMakeLists.txt | 29 +++++++++++++++++++++++++ src/main.cpp | 2 +- 10 files changed, 180 insertions(+), 1 deletion(-) create mode 100644 CMakeLists.txt create mode 100644 cmake/NoInSourceBuilds.cmake create mode 100644 cmake/QtHelper.cmake create mode 100644 cmake/TranslationUtils.cmake create mode 100644 dependencies/CMakeLists.txt create mode 100644 packaging/CMakeLists.txt create mode 100644 share/CMakeLists.txt create mode 100644 share/translations/CMakeLists.txt create mode 100644 src/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..6ba145d --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,34 @@ +# Preamble +cmake_minimum_required(VERSION 3.20) +project(trik-desktop-gamepad VERSION 1.0.0 LANGUAGES CXX) + +# Project wide setup +list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/cmake) + +set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) + +set(CMAKE_AUTOUIC ON) +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) + +# Prevent from build in source dir +include(NoInSourceBuilds) + +# Externally provided content +include(QtHelper) +add_subdirectory(dependencies) + +# Main targets built by this project +add_subdirectory(src) + +# Process fonts, images, translations +add_subdirectory(share) + +# TO DO: +# add_subdirectory(tests) + +if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) + add_subdirectory(packaging) +endif() diff --git a/cmake/NoInSourceBuilds.cmake b/cmake/NoInSourceBuilds.cmake new file mode 100644 index 0000000..85665e0 --- /dev/null +++ b/cmake/NoInSourceBuilds.cmake @@ -0,0 +1,11 @@ +if(PROJECT_SOURCE_DIR STREQUAL PROJECT_BINARY_DIR) + message(FATAL_ERROR + "\n" + "In-source builds are not allowed.\n" + "Instead, provide a path to build tree like so:\n" + "cmake -B \n" + "\n" + "To remove files you accidentally created execute:\n" + "rm -rf CMakeFiles CMakeCache.txt\n" +) +endif() diff --git a/cmake/QtHelper.cmake b/cmake/QtHelper.cmake new file mode 100644 index 0000000..83d803a --- /dev/null +++ b/cmake/QtHelper.cmake @@ -0,0 +1,27 @@ +set(QT_COMPONENTS + Core + Gui + Network + Widgets + Multimedia + MultimediaWidgets + LinguistTools) + +#find_package(Qt6 COMPONENTS ${QT_COMPONENTS}) +#if (NOT Qt6_FOUND) +# find_package(Qt5 5.15 REQUIRED ${QT_COMPONENTS}) +#endif() + +find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS ${QT_COMPONENTS}) +find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS ${QT_COMPONENTS}) + +message("FOUND QT (default): ${QT_DEFAULT_MAJOR_VERSION}") +message("FOUND QT: ${QT_VERSION_MAJOR}") + +set(QT_LIBRARIES + Qt${QT_VERSION_MAJOR}::Core + Qt${QT_VERSION_MAJOR}::Gui + Qt${QT_VERSION_MAJOR}::Network + Qt${QT_VERSION_MAJOR}::Widgets + Qt${QT_VERSION_MAJOR}::Multimedia + Qt${QT_VERSION_MAJOR}::MultimediaWidgets) diff --git a/cmake/TranslationUtils.cmake b/cmake/TranslationUtils.cmake new file mode 100644 index 0000000..811c825 --- /dev/null +++ b/cmake/TranslationUtils.cmake @@ -0,0 +1,12 @@ +function(ADD_TRANSLATIONS_RESOURCE res_file) + set(QM_FILES ${ARGN}) + set(RES_FILE ${CMAKE_CURRENT_BINARY_DIR}/translations.qrc) + + file(WRITE ${RES_FILE} "\n \n") + foreach(LANG ${QM_FILES}) + get_filename_component(FILENAME ${LANG} NAME) + file(APPEND ${RES_FILE} " ${FILENAME}\n") + endforeach() + file(APPEND ${RES_FILE} " \n\n") + set(${res_file} ${RES_FILE} PARENT_SCOPE) +endfunction() diff --git a/dependencies/CMakeLists.txt b/dependencies/CMakeLists.txt new file mode 100644 index 0000000..38c4860 --- /dev/null +++ b/dependencies/CMakeLists.txt @@ -0,0 +1,3 @@ +# SingleApplication +set(QAPPLICATION_CLASS QApplication CACHE STRING "Inheritance class for SingleApplication") +add_subdirectory(singleapplication) diff --git a/packaging/CMakeLists.txt b/packaging/CMakeLists.txt new file mode 100644 index 0000000..51f1a6a --- /dev/null +++ b/packaging/CMakeLists.txt @@ -0,0 +1,36 @@ +set(CPACK_PACKAGE_NAME ${PROJECT_NAME}) +set(CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR}) +set(CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR}) +set(CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH}) + +# Generate file name in deb format: +# _-_.deb +set(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT) + +set(CPACK_PACKAGE_DESCRIPTION_SUMMARY + "A remote control for controlling TRIK programmable educational robots") +set(CPACK_PACKAGE_VENDOR "TRIK") + +set(CPACK_PACKAGE_INSTALL_DIRECTORY ${CPACK_PACKAGE_NAME}) +set(CPACK_PACKAGING_INSTALL_PREFIX "/opt/${PROJECT_NAME}") + +set(CPACK_PACKAGE_CONTACT $ENV{DEBMAIL}) +set(CPACK_DEBIAN_PACKAGE_MAINTAINER $ENV{DEBFULLNAME}) + +set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON) + +set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE") +set(CPACK_RESOURCE_FILE_README "${CMAKE_SOURCE_DIR}/README.md") + +# Values of variables prefixed with CPACK_ will be escaped before being written to the configuration files, +# so that the cpack program receives them exactly as they were specified +set(CPACK_VERBATIM_VARIABLES YES) + +# Generate defined format of packages in case running cpack without arguments +if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + set(CPACK_GENERATOR DEB) +else() + set(CPACK_GENERATOR TGZ) +endif() + +include(CPack) diff --git a/share/CMakeLists.txt b/share/CMakeLists.txt new file mode 100644 index 0000000..0589a3e --- /dev/null +++ b/share/CMakeLists.txt @@ -0,0 +1,7 @@ +include(GNUInstallDirs) +install( + DIRECTORY fonts images + DESTINATION ${CMAKE_INSTALL_DATAROOTDIR} +) + +add_subdirectory(translations) diff --git a/share/translations/CMakeLists.txt b/share/translations/CMakeLists.txt new file mode 100644 index 0000000..fe1d365 --- /dev/null +++ b/share/translations/CMakeLists.txt @@ -0,0 +1,20 @@ +set(TS_FILES + trikDesktopGamepad_de.ts + trikDesktopGamepad_en.ts + trikDesktopGamepad_ru.ts + trikDesktopGamepad_fr.ts) + +if(Qt6_FOUND) + qt_add_translations(${PROJECT_NAME} TS_FILES ${TS_FILES}) +else() + qt5_add_translation(QM_FILES ${TS_FILES}) + include(TranslationUtils) + add_translations_resource(QRC_FILE ${QM_FILES}) + add_custom_target(create_qm ALL DEPENDS ${QM_FILES}) + add_custom_target(create_qrc ALL DEPENDS ${QRC_FILE}) + add_dependencies(create_qrc create_qm) + add_dependencies(${PROJECT_NAME} create_qrc) + target_sources(${PROJECT_NAME} PRIVATE ${QRC_FILE}) +endif() + +install(FILES ${QM_FILES} DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/translations) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..3b4cc12 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,29 @@ +set(SOURCES + accelerateStrategy.cpp + connectForm.cpp + connectionManager.cpp + gamepadForm.cpp + main.cpp + standardStrategy.cpp + strategy.cpp + ../share/fonts.qrc + ../share/images.qrc) + +add_executable(${PROJECT_NAME} ${SOURCES}) + +target_link_libraries(${PROJECT_NAME} + PRIVATE + ${QT_LIBRARIES} + SingleApplication +) + +if(Qt6_FOUND) + target_compile_definitions(${PROJECT_NAME} PRIVATE TRIK_USE_QT6) +endif() + +set_target_properties(${PROJECT_NAME} + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin +) + +install(TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_BIN}) diff --git a/src/main.cpp b/src/main.cpp index 70278b5..0c1b95f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -32,7 +32,7 @@ * "pad 1 0 -100\n", excluding quotes. * */ -#include "thirdparty/SingleApplication/singleapplication.h" +#include "../dependencies/singleapplication/singleapplication.h" #include "gamepadForm.h"