cmake_minimum_required(VERSION 3.20) project(FramelessHelper LANGUAGES CXX) option(FRAMELESSHELPER_BUILD_STATIC "Build FramelessHelper as a static library." OFF) option(FRAMELESSHELPER_BUILD_EXAMPLES "Build FramelessHelper demo applications." ON) if(NOT DEFINED CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Release) endif() if(NOT (CMAKE_BUILD_TYPE STREQUAL "Debug")) if(NOT DEFINED CMAKE_INTERPROCEDURAL_OPTIMIZATION) set(CMAKE_INTERPROCEDURAL_OPTIMIZATION ON) endif() endif() if(NOT DEFINED CMAKE_DEBUG_POSTFIX) if(WIN32) set(CMAKE_DEBUG_POSTFIX d) else() set(CMAKE_DEBUG_POSTFIX _debug) endif() endif() if(NOT DEFINED CMAKE_RUNTIME_OUTPUT_DIRECTORY) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin) endif() if(NOT DEFINED CMAKE_LIBRARY_OUTPUT_DIRECTORY) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) endif() if(NOT DEFINED CMAKE_ARCHIVE_OUTPUT_DIRECTORY) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) endif() set(CMAKE_POSITION_INDEPENDENT_CODE ON) set(CMAKE_C_VISIBILITY_PRESET hidden) set(CMAKE_CXX_VISIBILITY_PRESET hidden) set(CMAKE_VISIBILITY_INLINES_HIDDEN ON) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) find_package(QT NAMES Qt6 Qt5 COMPONENTS Core Gui REQUIRED) find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Gui REQUIRED) find_package(QT NAMES Qt6 Qt5 COMPONENTS Quick) find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Quick) set(SOURCES framelesshelper_global.h framelesshelper_qt.h framelesshelper_qt.cpp framelesswindowsmanager.h framelesswindowsmanager_p.h framelesswindowsmanager.cpp utilities.h utilities.cpp ) if(TARGET Qt${QT_VERSION_MAJOR}::Quick) list(APPEND SOURCES framelessquickhelper.h framelessquickhelper.cpp ) endif() if(WIN32) list(APPEND SOURCES framelesshelper_windows.h qwinregistry_p.h qwinregistry.cpp utilities_win.cpp framelesshelper_win.h framelesshelper_win.cpp ) elseif(APPLE) list(APPEND SOURCES utilities_mac.cpp) elseif(UNIX) list(APPEND SOURCES utilities_linux.cpp) endif() if(WIN32 AND NOT FRAMELESSHELPER_BUILD_STATIC) enable_language(RC) list(APPEND SOURCES framelesshelper.rc) endif() if(FRAMELESSHELPER_BUILD_STATIC) add_library(${PROJECT_NAME} STATIC ${SOURCES}) else() add_library(${PROJECT_NAME} SHARED ${SOURCES}) endif() if(FRAMELESSHELPER_BUILD_STATIC) target_compile_definitions(${PROJECT_NAME} PUBLIC FRAMELESSHELPER_STATIC ) endif() target_compile_definitions(${PROJECT_NAME} PRIVATE QT_NO_CAST_FROM_ASCII QT_NO_CAST_TO_ASCII QT_NO_KEYWORDS QT_USE_QSTRINGBUILDER QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060400 FRAMELESSHELPER_BUILD_LIBRARY ) if(MSVC) set(_WIN32_WINNT_WIN10 0x0A00) set(NTDDI_WIN10_CO 0x0A00000B) target_compile_definitions(${PROJECT_NAME} PRIVATE _CRT_NON_CONFORMING_SWPRINTFS _CRT_SECURE_NO_WARNINGS _ENABLE_EXTENDED_ALIGNED_STORAGE NOMINMAX UNICODE _UNICODE WIN32_LEAN_AND_MEAN WINRT_LEAN_AND_MEAN WINVER=${_WIN32_WINNT_WIN10} _WIN32_WINNT=${_WIN32_WINNT_WIN10} _WIN32_IE=${_WIN32_WINNT_WIN10} NTDDI_VERSION=${NTDDI_WIN10_CO} ) target_compile_options(${PROJECT_NAME} PRIVATE /utf-8 /W4 /WX ) else() target_compile_options(${PROJECT_NAME} PRIVATE -Wall -Wextra -Werror ) endif() target_link_libraries(${PROJECT_NAME} PRIVATE Qt${QT_VERSION_MAJOR}::CorePrivate Qt${QT_VERSION_MAJOR}::GuiPrivate ) if(TARGET Qt${QT_VERSION_MAJOR}::Quick) target_link_libraries(${PROJECT_NAME} PRIVATE Qt${QT_VERSION_MAJOR}::Quick ) endif() target_include_directories(${PROJECT_NAME} PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>" ) if(FRAMELESSHELPER_BUILD_EXAMPLES) add_subdirectory(examples) endif()