diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml new file mode 100644 index 0000000..e1e7cd6 --- /dev/null +++ b/.github/workflows/cmake.yml @@ -0,0 +1,94 @@ +name: CMake + +on: + push: + branches: + pull_request: + branches: + workflow_dispatch: + +jobs: + build: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + include: + - os: windows-latest + os-name: windows + qt-version: '5.12.12' + mingw-short-version: 73 + + - os: ubuntu-latest + os-name: linux + qt-version: '5.12.12' + + - os: macos-latest + os-name: mac + qt-version: '5.15.2' + + - os: ubuntu-latest + os-name: linux + qt-version: '6.2.*' + modules: 'qtmultimedia' + + defaults: + run: + shell: bash + + steps: + - name: Install Qt + uses: jurplel/install-qt-action@v3 + with: + version: ${{ matrix.qt-version }} + host: ${{ matrix.os-name }} + arch: ${{ startsWith(matrix.os-name, 'win') && format('win32_mingw{0}', matrix.mingw-short-version) || ''}} + tools: ${{ startsWith(matrix.os-name, 'win') && format('tools_mingw,qt.tools.win32_mingw{0}0', matrix.mingw-short-version) || '' }} + modules: ${{ matrix.modules }} + + - name: Install dependencies + if: matrix.os == 'ubuntu-latest' + run: sudo apt-get install -y gstreamer1.0-plugins-bad gstreamer1.0-libav gstreamer1.0-plugins-base + + - name: Update PATH + if: ${{ startsWith(matrix.os-name, 'win') }} + run: | + set -xue + cygpath -w /usr/bin >> $GITHUB_PATH + cygpath -w "${IQTA_TOOLS}/mingw${{matrix.mingw-short-version}}0_32/bin" >> $GITHUB_PATH + cygpath -w "${Qt5_Dir}/bin" >> $GITHUB_PATH + + - name: Check available tools + run: | + set -xueo pipefail + echo $PATH + uname -a + qmake --version + make --version + g++ --version + git --version + + - name: Configure git + run: | + git config --global core.symlinks true + git config --global core.autocrlf true + + - uses: actions/checkout@v2 + with: + submodules: recursive + fetch-depth: 0 + + - name: Create build directory + run: mkdir ../build + + - name: CMake configuration and generation + run: | + if ${{ startsWith(matrix.os-name, 'win') }}; then + cmake -G "MinGW Makefiles" -S . -B ../build + else + cmake -S . -B ../build + fi + + - name: CMake build + timeout-minutes: 10 + run: cmake --build ../build diff --git a/.gitmodules b/.gitmodules index 7e3070d..0562e86 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ -[submodule "thirdparty/SingleApplication"] - path = thirdparty/SingleApplication +[submodule "dependencies/singleapplication"] + path = dependencies/singleapplication url = https://github.com/itay-grudev/SingleApplication.git 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/connections.png b/connections.png deleted file mode 100644 index 573c4b1..0000000 Binary files a/connections.png and /dev/null differ 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/thirdparty/thirdparty.pro b/dependencies/dependencies.pro similarity index 93% rename from thirdparty/thirdparty.pro rename to dependencies/dependencies.pro index 1028f8c..b9625d9 100644 --- a/thirdparty/thirdparty.pro +++ b/dependencies/dependencies.pro @@ -15,4 +15,4 @@ TEMPLATE = subdirs SUBDIRS = \ - SingleApplication/singleapplication.pri + singleapplication/singleapplication.pri diff --git a/thirdparty/SingleApplication b/dependencies/singleapplication similarity index 100% rename from thirdparty/SingleApplication rename to dependencies/singleapplication diff --git a/thirdparty/singleApplication.pro b/dependencies/singleapplication.pro similarity index 92% rename from thirdparty/singleApplication.pro rename to dependencies/singleapplication.pro index 6217aa3..b726ee8 100644 --- a/thirdparty/singleApplication.pro +++ b/dependencies/singleapplication.pro @@ -14,5 +14,5 @@ DEFINES += QAPPLICATION_CLASS=QApplication -include (SingleApplication/singleapplication.pri) +include (singleapplication/singleapplication.pri) QMAKE_CXXFLAGS -= -Wold-style-cast diff --git a/uml.png b/doc/uml.png similarity index 100% rename from uml.png rename to doc/uml.png 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/fonts.qrc b/share/fonts.qrc similarity index 100% rename from fonts.qrc rename to share/fonts.qrc diff --git a/fonts/fontScrypt.py b/share/fonts/fontScrypt.py similarity index 100% rename from fonts/fontScrypt.py rename to share/fonts/fontScrypt.py diff --git a/fonts/freemono.ttf b/share/fonts/freemono.ttf similarity index 100% rename from fonts/freemono.ttf rename to share/fonts/freemono.ttf diff --git a/fonts/original_font/AUTHORS b/share/fonts/original_font/AUTHORS similarity index 100% rename from fonts/original_font/AUTHORS rename to share/fonts/original_font/AUTHORS diff --git a/fonts/original_font/COPYING b/share/fonts/original_font/COPYING similarity index 100% rename from fonts/original_font/COPYING rename to share/fonts/original_font/COPYING diff --git a/fonts/original_font/CREDITS b/share/fonts/original_font/CREDITS similarity index 100% rename from fonts/original_font/CREDITS rename to share/fonts/original_font/CREDITS diff --git a/fonts/original_font/ChangeLog b/share/fonts/original_font/ChangeLog similarity index 100% rename from fonts/original_font/ChangeLog rename to share/fonts/original_font/ChangeLog diff --git a/fonts/original_font/FreeMono.ttf b/share/fonts/original_font/FreeMono.ttf similarity index 100% rename from fonts/original_font/FreeMono.ttf rename to share/fonts/original_font/FreeMono.ttf diff --git a/fonts/original_font/INSTALL b/share/fonts/original_font/INSTALL similarity index 100% rename from fonts/original_font/INSTALL rename to share/fonts/original_font/INSTALL diff --git a/fonts/original_font/README b/share/fonts/original_font/README similarity index 100% rename from fonts/original_font/README rename to share/fonts/original_font/README diff --git a/images.qrc b/share/images.qrc similarity index 100% rename from images.qrc rename to share/images.qrc diff --git a/images/23-1.png b/share/images/23-1.png similarity index 100% rename from images/23-1.png rename to share/images/23-1.png diff --git a/images/23-2.png b/share/images/23-2.png similarity index 100% rename from images/23-2.png rename to share/images/23-2.png diff --git a/images/23-3.png b/share/images/23-3.png similarity index 100% rename from images/23-3.png rename to share/images/23-3.png diff --git a/images/23-4.png b/share/images/23-4.png similarity index 100% rename from images/23-4.png rename to share/images/23-4.png diff --git a/images/23-5.png b/share/images/23-5.png similarity index 100% rename from images/23-5.png rename to share/images/23-5.png diff --git a/images/arrowDown.png b/share/images/arrowDown.png similarity index 100% rename from images/arrowDown.png rename to share/images/arrowDown.png diff --git a/images/arrowLeft.png b/share/images/arrowLeft.png similarity index 100% rename from images/arrowLeft.png rename to share/images/arrowLeft.png diff --git a/images/arrowRight.png b/share/images/arrowRight.png similarity index 100% rename from images/arrowRight.png rename to share/images/arrowRight.png diff --git a/images/arrowUp.png b/share/images/arrowUp.png similarity index 100% rename from images/arrowUp.png rename to share/images/arrowUp.png diff --git a/images/arrow_down.jpg b/share/images/arrow_down.jpg similarity index 100% rename from images/arrow_down.jpg rename to share/images/arrow_down.jpg diff --git a/images/arrow_left.jpg b/share/images/arrow_left.jpg similarity index 100% rename from images/arrow_left.jpg rename to share/images/arrow_left.jpg diff --git a/images/arrow_right.jpg b/share/images/arrow_right.jpg similarity index 100% rename from images/arrow_right.jpg rename to share/images/arrow_right.jpg diff --git a/images/arrow_up.jpg b/share/images/arrow_up.jpg similarity index 100% rename from images/arrow_up.jpg rename to share/images/arrow_up.jpg diff --git a/images/blueBall.png b/share/images/blueBall.png similarity index 100% rename from images/blueBall.png rename to share/images/blueBall.png diff --git a/images/button1.png b/share/images/button1.png similarity index 100% rename from images/button1.png rename to share/images/button1.png diff --git a/images/button2.png b/share/images/button2.png similarity index 100% rename from images/button2.png rename to share/images/button2.png diff --git a/images/button3.png b/share/images/button3.png similarity index 100% rename from images/button3.png rename to share/images/button3.png diff --git a/images/button4.png b/share/images/button4.png similarity index 100% rename from images/button4.png rename to share/images/button4.png diff --git a/images/button5.png b/share/images/button5.png similarity index 100% rename from images/button5.png rename to share/images/button5.png diff --git a/images/greenBall.png b/share/images/greenBall.png similarity index 100% rename from images/greenBall.png rename to share/images/greenBall.png diff --git a/images/icon.png b/share/images/icon.png similarity index 100% rename from images/icon.png rename to share/images/icon.png diff --git a/images/loading.gif b/share/images/loading.gif similarity index 100% rename from images/loading.gif rename to share/images/loading.gif diff --git a/images/logo-eng.png b/share/images/logo-eng.png similarity index 100% rename from images/logo-eng.png rename to share/images/logo-eng.png diff --git a/images/noVideoSign.png b/share/images/noVideoSign.png similarity index 100% rename from images/noVideoSign.png rename to share/images/noVideoSign.png diff --git a/images/redBall.png b/share/images/redBall.png similarity index 100% rename from images/redBall.png rename to share/images/redBall.png 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/languages/trikDesktopGamepad_de.ts b/share/translations/trikDesktopGamepad_de.ts similarity index 100% rename from languages/trikDesktopGamepad_de.ts rename to share/translations/trikDesktopGamepad_de.ts diff --git a/languages/trikDesktopGamepad_en.ts b/share/translations/trikDesktopGamepad_en.ts similarity index 100% rename from languages/trikDesktopGamepad_en.ts rename to share/translations/trikDesktopGamepad_en.ts diff --git a/languages/trikDesktopGamepad_fr.ts b/share/translations/trikDesktopGamepad_fr.ts similarity index 100% rename from languages/trikDesktopGamepad_fr.ts rename to share/translations/trikDesktopGamepad_fr.ts diff --git a/languages/trikDesktopGamepad_ru.ts b/share/translations/trikDesktopGamepad_ru.ts similarity index 100% rename from languages/trikDesktopGamepad_ru.ts rename to share/translations/trikDesktopGamepad_ru.ts 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/accelerateStrategy.cpp b/src/accelerateStrategy.cpp similarity index 100% rename from accelerateStrategy.cpp rename to src/accelerateStrategy.cpp diff --git a/accelerateStrategy.h b/src/accelerateStrategy.h similarity index 100% rename from accelerateStrategy.h rename to src/accelerateStrategy.h diff --git a/connectForm.cpp b/src/connectForm.cpp similarity index 100% rename from connectForm.cpp rename to src/connectForm.cpp diff --git a/connectForm.h b/src/connectForm.h similarity index 100% rename from connectForm.h rename to src/connectForm.h diff --git a/connectForm.ui b/src/connectForm.ui similarity index 100% rename from connectForm.ui rename to src/connectForm.ui diff --git a/connectionManager.cpp b/src/connectionManager.cpp similarity index 100% rename from connectionManager.cpp rename to src/connectionManager.cpp diff --git a/connectionManager.h b/src/connectionManager.h similarity index 100% rename from connectionManager.h rename to src/connectionManager.h diff --git a/gamepadForm.cpp b/src/gamepadForm.cpp similarity index 100% rename from gamepadForm.cpp rename to src/gamepadForm.cpp diff --git a/gamepadForm.h b/src/gamepadForm.h similarity index 100% rename from gamepadForm.h rename to src/gamepadForm.h diff --git a/gamepadForm.ui b/src/gamepadForm.ui similarity index 100% rename from gamepadForm.ui rename to src/gamepadForm.ui diff --git a/main.cpp b/src/main.cpp similarity index 97% rename from main.cpp rename to src/main.cpp index 70278b5..0c1b95f 100644 --- a/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" diff --git a/standardStrategy.cpp b/src/standardStrategy.cpp similarity index 100% rename from standardStrategy.cpp rename to src/standardStrategy.cpp diff --git a/standardStrategy.h b/src/standardStrategy.h similarity index 100% rename from standardStrategy.h rename to src/standardStrategy.h diff --git a/strategy.cpp b/src/strategy.cpp similarity index 100% rename from strategy.cpp rename to src/strategy.cpp diff --git a/strategy.h b/src/strategy.h similarity index 100% rename from strategy.h rename to src/strategy.h diff --git a/trikDesktopGamepad.pri b/trikDesktopGamepad.pri index b32e49f..e2a510f 100644 --- a/trikDesktopGamepad.pri +++ b/trikDesktopGamepad.pri @@ -3,35 +3,35 @@ CONFIG += c++14 DEFINES += QT_NO_ACCESSIBILITY SOURCES += \ - $$PWD/main.cpp \ - $$PWD/gamepadForm.cpp \ - $$PWD/connectForm.cpp \ - $$PWD/connectionManager.cpp \ - $$PWD/standardStrategy.cpp \ - $$PWD/accelerateStrategy.cpp \ - $$PWD/strategy.cpp + $$PWD/src/main.cpp \ + $$PWD/src/gamepadForm.cpp \ + $$PWD/src/connectForm.cpp \ + $$PWD/src/connectionManager.cpp \ + $$PWD/src/standardStrategy.cpp \ + $$PWD/src/accelerateStrategy.cpp \ + $$PWD/src/strategy.cpp TRANSLATIONS += \ - $$PWD/languages/trikDesktopGamepad_ru.ts \ - $$PWD/languages/trikDesktopGamepad_en.ts \ - $$PWD/languages/trikDesktopGamepad_fr.ts \ - $$PWD/languages/trikDesktopGamepad_de.ts + $$PWD/share/translations/trikDesktopGamepad_ru.ts \ + $$PWD/share/translations/trikDesktopGamepad_en.ts \ + $$PWD/share/translations/trikDesktopGamepad_fr.ts \ + $$PWD/share/translations/trikDesktopGamepad_de.ts HEADERS += \ - $$PWD/gamepadForm.h \ - $$PWD/connectForm.h \ - $$PWD/connectionManager.h \ - $$PWD/standardStrategy.h \ - $$PWD/accelerateStrategy.h \ - $$PWD/strategy.h + $$PWD/src/gamepadForm.h \ + $$PWD/src/connectForm.h \ + $$PWD/src/connectionManager.h \ + $$PWD/src/standardStrategy.h \ + $$PWD/src/accelerateStrategy.h \ + $$PWD/src/strategy.h FORMS += \ - $$PWD/gamepadForm.ui \ - $$PWD/connectForm.ui + $$PWD/src/gamepadForm.ui \ + $$PWD/src/connectForm.ui RESOURCES += \ - $$PWD/images.qrc \ - $$PWD/fonts.qrc + $$PWD/share/images.qrc \ + $$PWD/share/fonts.qrc # Single Application implementation -include(thirdparty/singleApplication.pro) +include(dependencies/singleapplication.pro)