# ========================= eCAL LICENSE ================================= # # Copyright (C) 2016 - 2025 Continental Corporation # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # ========================= eCAL LICENSE ================================= cmake_minimum_required(VERSION 3.14) project(launcher) # Allow the install command to use generator expressions if(POLICY CMP0087) cmake_policy(SET CMP0087 NEW) endif() # Legacy Qt5 (pre 5.15) support as suggested by teh Qt Documentation: # https://doc.qt.io/qt-6/cmake-qt5-and-qt6-compatibility.html#supporting-older-qt-5-versions find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core Widgets) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Widgets) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC OFF) # Reason for being turned off: AutoUIC will prevent VS from detecting changes in .ui files set(CMAKE_AUTORCC OFF) # Reason for being turned off: AutoRCC will create an entirely new project in VS which clutters the solution appearance. Additionally, we cannot assign a source group to the generated .cpp files which will clutter the project. set(CMAKE_INCLUDE_CURRENT_DIR ON) set(source_files src/main_window.cpp src/main.cpp src/about_dialog.cpp ) set(header_files src/main_window.h src/about_dialog.h ) set(qt_resource_files resources/resources.qrc ) if(WIN32) set(win32_resource_files resources/resource.h resources/win32_resources.rc ) ENDIF(WIN32) set(ui_files src/main_window.ui src/about_dialog.ui ) # compile qt resource files and ui files if (${QT_VERSION_MAJOR} GREATER_EQUAL 6) qt_add_resources(autogen_resources ${qt_resource_files}) qt_wrap_ui (autogen_ui ${ui_files}) else() qt5_add_resources(autogen_resources ${qt_resource_files}) qt5_wrap_ui (autogen_ui ${ui_files}) endif() # Add all files. The resource files and ui files are not necessary, but we want them to show up in the IDE ecal_add_app_qt(${PROJECT_NAME} ${source_files} ${header_files} ${qt_resource_files} ${ui_files} ${win32_resource_files} ${autogen_resources} ${autogen_ui} ) target_link_libraries (${PROJECT_NAME} PRIVATE Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Widgets eCAL::apps eCAL::core ) target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_14) target_compile_definitions(${PROJECT_NAME} PRIVATE ECAL_VERSION="${eCAL_COMPLETE_VERSION}" ECAL_DATE="${eCAL_DATE}" ) if(MSVC) set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "/wd4127 /wd4714") ENDIF(MSVC) target_include_directories(${PROJECT_NAME} PRIVATE src) if(WIN32) target_compile_definitions(${PROJECT_NAME} PRIVATE BUILDTIMEUSER="$ENV{USERNAME}") else() target_compile_definitions(${PROJECT_NAME} PRIVATE BUILDTIMEUSER="$ENV{USER}") endif() if ((WIN32 OR APPLE) AND (${QT_VERSION_MAJOR} GREATER_EQUAL 6)) # Generate a script that will deploy all necessary Qt DLLs to the binary folder # https://doc.qt.io/qt-6/qt-deploy-runtime-dependencies.html # Available for Qt 6.3 and up (=> Not for Qt5!) # Executing it requires CMake 3.14 and up, due to policy https://cmake.org/cmake/help/latest/policy/CMP0087.html qt_generate_deploy_app_script( TARGET ${PROJECT_NAME} OUTPUT_SCRIPT qt_deploy_script NO_COMPILER_RUNTIME NO_UNSUPPORTED_PLATFORM_ERROR ) # Add a postbuild command that will also execute the created script via cmake -P. # On Windows we use a custom exclusive_command command, which prevents # different instances of windeployqt to access the same files at the same # time. # Running windeployqt is necessary to make the application startable / debuggable from the build directory. if (WIN32) add_exclusive_command_as_postbuild( ${PROJECT_NAME} ${CMAKE_COMMAND} -DQT_DEPLOY_PREFIX=$ -DQT_DEPLOY_BIN_DIR=. -P ${qt_deploy_script} ) else() add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -DQT_DEPLOY_PREFIX=$ -DQT_DEPLOY_BIN_DIR=. -P ${qt_deploy_script} ) endif() # Use the script for deploying the qt dlls in the install dir install(SCRIPT ${qt_deploy_script}) elseif(WIN32) # For Qt5 we use our legacy script. # Deploy Qt DLLs in the binary folder. This is necessary for starting the application from whithin the IDE without having to copy QtCore.dll, QtWidgets.dll etc. by hand each time qt_add_windeployqt_postbuild(--no-system-d3d-compiler --no-compiler-runtime --no-opengl-sw --pdb "$") endif() # Create a source tree that mirrors the filesystem source_group(TREE "${CMAKE_CURRENT_LIST_DIR}" FILES ${source_files} ${header_files} ${win32_resource_files} ${ui_files} ) source_group(resources FILES ${qt_resource_files} ) # Also create a group for autogenerated files. The autogenerated ui files are not necessary as they are only header files. We add them anyhow, just for completeness. source_group( autogen FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}_automoc.cpp ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}_autogen/mocs_compilation.cpp ${autogen_ui} ${autogen_resources} ) set_property(TARGET ${PROJECT_NAME} PROPERTY FOLDER app/util) ecal_install_app(${PROJECT_NAME} START_MENU_NAME "eCAL Launcher")