Skip to content

Instantly share code, notes, and snippets.

@MichaelHeiser
Last active February 29, 2024 11:53
Show Gist options
  • Select an option

  • Save MichaelHeiser/22f9bfc71d007f6a45d2f77884c9432c to your computer and use it in GitHub Desktop.

Select an option

Save MichaelHeiser/22f9bfc71d007f6a45d2f77884c9432c to your computer and use it in GitHub Desktop.
Sample Qt-Application CMakeLists.txt
cmake_minimum_required(VERSION 3.21)
project(App_Name VERSION 3.1.1 LANGUAGES CXX)
set(APP_MAIN_VERSION 3)
set(APP_FEAT_VERSION 1)
set(APP_PATCH_VERSION 1)
set(APP_BUILD_VERSION 5)
set(APPLICATION_COPYRIGHT "2015-2023")
set(APPLICATION_NAME "EuroSoft live")
set(ORGANIZATION_DOMAIN "www.systronik.com")
set(ORGANIZATION_NAME "Systronik GmbH")
set(APPLICATION_VERSION "${APP_MAIN_VERSION}.${APP_FEAT_VERSION}.${APP_PATCH_VERSION}.${APP_BUILD_VERSION}")
message("Application version: ${APPLICATION_VERSION}")
set(CMAKE_INCLUDE_CURRENT_DIR ON)
if(ANDROID)
set(QT_ANDROID_APPLICATION_BINARY App_Name)
endif()
set(App_Name_src
main.cpp
App_Name.qrc
)
qt_add_resources(App_Name_src
../../libraries/3rdparty/3rdparty.qrc
)
qt_add_resources(App_Name_src
../../translations/compiled/EuroSoftProject_translations.qrc
)
if(MSVC)
enable_language("RC")
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/version.rc.in"
"${CMAKE_CURRENT_BINARY_DIR}/version.rc"
@ONLY
)
qt_add_executable(App_Name MANUAL_FINALIZATION WIN32
${App_Name_src}
${CMAKE_CURRENT_SOURCE_DIR}/windows/icon.rc
${CMAKE_CURRENT_BINARY_DIR}/version.rc
${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/EuroSoft/Win10Compatibility.manifest
)
elseif(ANDROID)
set(APP_MIN_SDK 26)
set(QT_ANDROID_MIN_SDK_VERSION CACHE INTERNAL ${APP_MIN_SDK})
set(QT_ANDROID_TARGET_SDK_VERSION CACHE INTERNAL 33)
set(ANDROID_PACKAGE_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/android CACHE INTERNAL "")
set(QT_ANDROID_APP_NAME CACHE INTERNAL "${APPLICATION_NAME}")
set(QT_ANDROID_VERSION_CODE "${APP_MIN_SDK}20${APP_MAIN_VERSION}${APP_FEAT_VERSION}${APP_PATCH_VERSION}0${APP_BUILD_VERSION}")
message("Android version code: ${QT_ANDROID_VERSION_CODE}")
set(QT_ANDROID_VERSION_NAME "${APPLICATION_VERSION}")
if(Qt${QT_VERSION_MAJOR} STREQUAL Qt5)
file(GLOB_RECURSE ANDROID_SOURCES
${QT_ANDROID_PACKAGE_SOURCE_DIR}/AndroidManifest.xml
${QT_ANDROID_PACKAGE_SOURCE_DIR}/build.gradle
${QT_ANDROID_PACKAGE_SOURCE_DIR}/gradle.properties
${QT_ANDROID_PACKAGE_SOURCE_DIR}/gradle/wrapper/gradle-wrapper.jar
${QT_ANDROID_PACKAGE_SOURCE_DIR}/gradle/wrapper/gradle-wrapper.properties
${QT_ANDROID_PACKAGE_SOURCE_DIR}/gradlew
${QT_ANDROID_PACKAGE_SOURCE_DIR}/res/values/libs.xml
${QT_ANDROID_PACKAGE_SOURCE_DIR}/src/*.java
)
add_library(App_Name SHARED
${App_Name_src}
${ANDROID_SOURCES})
else()
qt_add_executable(App_Name MANUAL_FINALIZATION ${App_Name_src})
set_property(TARGET App_Name APPEND PROPERTY QT_ANDROID_MIN_SDK_VERSION ${QT_ANDROID_MIN_SDK_VERSION})
set_property(TARGET App_Name APPEND PROPERTY QT_ANDROID_TARGET_SDK_VERSION ${QT_ANDROID_TARGET_SDK_VERSION})
set_property(TARGET App_Name APPEND PROPERTY QT_ANDROID_VERSION_CODE ${QT_ANDROID_VERSION_CODE})
set_property(TARGET App_Name APPEND PROPERTY QT_ANDROID_VERSION_NAME ${QT_ANDROID_VERSION_NAME})
set_target_properties(App_Name PROPERTIES
QT_ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android"
)
endif()
add_custom_command(
TARGET App_Name PRE_LINK
COMMAND ${CMAKE_COMMAND} -E copy_directory
${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/EuroSoft/nativetools/platforms/android
${CMAKE_CURRENT_SOURCE_DIR}/android/src/com/systronik/platforms/android)
#print_all_variables()
elseif(IOS)
qt_add_executable(App_Name MANUAL_FINALIZATION ${App_Name_src})
# Asset catalog root
set(asset_catalog_path "${CMAKE_CURRENT_SOURCE_DIR}/../../images/icons/ios/App_Name.xcassets")
target_sources(App_Name PRIVATE "${asset_catalog_path}")
set_source_files_properties(${asset_catalog_path} PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
# Asset catalog app icon set
list(APPEND app_icon_set "${asset_catalog_path}/AppIcon.appiconset")
set_source_files_properties(${app_icon_set} PROPERTIES
MACOSX_PACKAGE_LOCATION Resources/App_Name.xcassets
)
# Asset catalog icon files
file(GLOB_RECURSE app_icon_files CONFIGURE_DEPENDS "${asset_catalog_path}/AppIcon.appiconset/*.png")
list(APPEND app_icon_files "${asset_catalog_path}/AppIcon.appiconset/Contents.json")
set_source_files_properties(${app_icon_files} PROPERTIES
MACOSX_PACKAGE_LOCATION Resources/App_Name.xcassets/AppIcon.appiconset
)
set_target_properties(App_Name PROPERTIES
MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/ios/Info.plist"
QT_IOS_LAUNCH_SCREEN "${CMAKE_CURRENT_SOURCE_DIR}/../../images/launch/ios/App_Name.storyboard"
BUILD_WITH_INSTALL_RPATH YES
XCODE_ATTRIBUTE_SKIP_INSTALL NO
XCODE_ATTRIBUTE_INSTALL_PATH "$(LOCAL_APPS_DIR)"
XCODE_ATTRIBUTE_TARGETED_DEVICE_FAMILY 1,2
XCODE_ATTRIBUTE_VALIDATE_PRODUCT[variant=Release] YES
XCODE_ATTRIBUTE_ASSETCATALOG_COMPILER_APPICON_NAME AppIcon
XCODE_ATTRIBUTE_INFOPLIST_KEY_NSHumanReadableCopyright "(c)2023 SYSTRONIK GmbH"
XCODE_ATTRIBUTE_INFOPLIST_KEY_UILaunchStoryboardName LaunchScreen
XCODE_ATTRIBUTE_INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad
"UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"
XCODE_ATTRIBUTE_INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone
"UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"
)
endif()
target_include_directories(App_Name PRIVATE
${3rdparty_includeDirs}
)
target_compile_definitions(App_Name PRIVATE
DISABLE_LIBRARY_FEATURES
EXTERNAL_COMPILER
NCREPORT_IMPORT
NCREPORT_NO_QPRINTER
QT_DISABLE_DEPRECATED_BEFORE=0x050F00
APPLICATION_COPYRIGHT="${APPLICATION_COPYRIGHT}"
APPLICATION_NAME="${APPLICATION_NAME}"
ORGANIZATION_DOMAIN="${ORGANIZATION_DOMAIN}"
ORGANIZATION_NAME="${ORGANIZATION_NAME}"
APPLICATION_VERSION="${APPLICATION_VERSION}"
)
set(qzxing_target App_Name)
include(${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/3rdparty/QZXing/qzxing.cmake)
target_link_libraries(App_Name PRIVATE
Qt::Bluetooth
Qt::Charts
Qt::Concurrent
Qt::Core
Qt::Gui
Qt::Multimedia
Qt::Network
Qt::Qml
Qt::Quick
Qt::QuickControls2
Qt::Sql
Qt::WebSockets
Qt::Widgets
Qt::Xml
Qt::Core5Compat
)
if(QT_VERSION_MAJOR EQUAL 5)
target_link_libraries(App_Name PUBLIC Qt::Script)
endif()
if(CMAKE_BUILD_TYPE STREQUAL Release)
target_compile_definitions(App_Name PRIVATE
QT_NO_DEBUG_OUTPUT
)
endif()
if(NOT MACOS)
set_target_properties(App_Name PROPERTIES
MACOSX_BUNDLE FALSE
)
endif()
if(MSVC)
target_compile_definitions(App_Name PRIVATE
MP
)
target_link_libraries(App_Name PRIVATE
Qt::PrintSupport
Qt::WebChannel
SetupAPI
hid
user32
opengl32.lib
)
endif()
if(ANDROID)
target_link_directories(App_Name PRIVATE ${QATERIAL_ROOT_PATH}/install/android_${ANDROID_ABI}/${CMAKE_BUILD_TYPE}/lib)
target_link_libraries(App_Name PRIVATE
Qt::WebChannel
Qt::PrintSupport
EGL
GLESv2
)
list(APPEND CUSTOM_ANDROID_EXTRA_LIBS ${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/3rdparty/ncreport/lib/android_${ANDROID_ABI}/libNCReport${LIB_SUFFIX}_${ANDROID_ABI}.so)
list(APPEND CUSTOM_ANDROID_EXTRA_LIBS ${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/3rdparty/ncreport/lib/android_${ANDROID_ABI}/libzint${LIB_SUFFIX}_${ANDROID_ABI}.so)
list(REMOVE_DUPLICATES CUSTOM_ANDROID_EXTRA_LIBS)
string(REPLACE ";" "," CUSTOM_ANDROID_EXTRA_LIBS_STRING "${CUSTOM_ANDROID_EXTRA_LIBS}")
if(QT_VERSION_MAJOR EQUAL 5)
target_link_libraries(App_Name PUBLIC
Qt::AndroidExtras
)
set(ANDROID_EXTRA_LIBS "${CUSTOM_ANDROID_EXTRA_LIBS_STRING}" CACHE INTERNAL "")
endif()
if(QT_VERSION_MAJOR EQUAL 6)
set_target_properties(App_Name PROPERTIES
QT_ANDROID_EXTRA_LIBS
"${CUSTOM_ANDROID_EXTRA_LIBS_STRING}"
)
target_link_libraries(App_Name PUBLIC
Qt::CorePrivate
)
endif()
endif()
if(IOS)
target_compile_definitions(App_Name PUBLIC
QT_NO_PRINTER
)
qt_import_plugins(App_Name INCLUDE Qt::QIosOptionalPlugin_NSPhotoLibraryPlugin)
if(QT_VERSION_MAJOR EQUAL 6)
target_link_libraries(EuroSoft PRIVATE
$<LINK_LIBRARY:FRAMEWORK,UIKit>
)
endif()
endif()
if(MACOS)
target_compile_definitions(App_Name PRIVATE
QT_NO_PRINTER
)
target_link_libraries(App_Name PRIVATE
"-framework NCReport"
zint
)
endif()
if(MACOS OR MSVC)
target_link_libraries(App_Name PRIVATE
Qt::SerialPort
)
endif()
if(MSVC)
endif()
set_target_properties(App_Name PROPERTIES
MACOSX_BUNDLE_GUI_IDENTIFIER "com.systronik.EuroSoft-live"
MACOSX_BUNDLE_BUNDLE_VERSION "${PROJECT_VERSION}"
MACOSX_BUNDLE_SHORT_VERSION_STRING "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}"
MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/ios/Info.plist"
MACOSX_BUNDLE TRUE
WIN32_EXECUTABLE TRUE
)
target_compile_definitions(App_Name
PRIVATE $<$<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>:QT_QML_DEBUG>)
install(TARGETS App_Name
BUNDLE DESTINATION .
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
qt_import_qml_plugins(App_Name)
qt_finalize_executable(App_Name)
@ekke
Copy link

ekke commented Feb 29, 2024

Hi Michael,
does this work for you to set the Orientations as XCODE_ATTRIBUTE ?
From my experiences it doesn't work. It's listed under build settings, but the checkboxes on General Tab aren't syncchronized. Have set iPhone to LandscapeLeft and Right only and tried running on device in Xcode and all orientations are working. Doing the same directly in info.plist it's working. of course would be cool to do this as XCODE_ATTRIBUTE in CmakeLists.txt. (Had already asked at Qt Discord Server ;-)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment