mirror of
https://github.com/LizardByte/tray.git
synced 2026-10-23 03:27:02 +09:00
163 lines
5.5 KiB
CMake
163 lines
5.5 KiB
CMake
#
|
|
# Project configuration
|
|
#
|
|
cmake_minimum_required(VERSION 3.13 FATAL_ERROR) # target_link_directories
|
|
project(tray VERSION 0.0.0
|
|
DESCRIPTION "A cross-platform system tray library"
|
|
HOMEPAGE_URL "https://app.lizardbyte.dev"
|
|
LANGUAGES C CXX)
|
|
|
|
set(PROJECT_LICENSE "MIT")
|
|
|
|
set(TRAY_IS_TOP_LEVEL OFF)
|
|
if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
|
|
set(TRAY_IS_TOP_LEVEL ON)
|
|
endif()
|
|
|
|
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
|
message(STATUS "Setting build type to 'Release' as none was specified.")
|
|
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build." FORCE)
|
|
endif()
|
|
|
|
# Add our custom CMake modules without overriding parent project settings.
|
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
|
|
|
|
#
|
|
# Project optional configuration
|
|
#
|
|
option(BUILD_DOCS "Build documentation" ${TRAY_IS_TOP_LEVEL})
|
|
option(BUILD_TESTS "Build tests" ${TRAY_IS_TOP_LEVEL})
|
|
option(BUILD_EXAMPLE "Build example app" ${TRAY_IS_TOP_LEVEL})
|
|
|
|
# Generate 'compile_commands.json' for clang_complete
|
|
set(CMAKE_COLOR_MAKEFILE ON)
|
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
|
|
|
file(GLOB TRAY_SOURCES
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/*.h"
|
|
)
|
|
|
|
if(TRAY_IS_TOP_LEVEL)
|
|
set(TRAY_ICON_ICO "${CMAKE_CURRENT_SOURCE_DIR}/icons/icon.ico")
|
|
set(TRAY_ICON_PNG "${CMAKE_CURRENT_SOURCE_DIR}/icons/icon.png")
|
|
set(TRAY_ICON_SVG "${CMAKE_CURRENT_SOURCE_DIR}/icons/icon.svg")
|
|
set(TRAY_ICON2_ICO "${CMAKE_CURRENT_SOURCE_DIR}/icons/icon2.ico")
|
|
set(TRAY_ICON2_PNG "${CMAKE_CURRENT_SOURCE_DIR}/icons/icon2.png")
|
|
set(TRAY_ICON2_SVG "${CMAKE_CURRENT_SOURCE_DIR}/icons/icon2.svg")
|
|
set(TRAY_ICON_FILES
|
|
"${TRAY_ICON_ICO}"
|
|
"${TRAY_ICON_PNG}"
|
|
"${TRAY_ICON_SVG}"
|
|
"${TRAY_ICON2_ICO}"
|
|
"${TRAY_ICON2_PNG}"
|
|
"${TRAY_ICON2_SVG}"
|
|
)
|
|
|
|
set(_TRAY_ICON_ICO "${TRAY_ICON_ICO}" CACHE INTERNAL "Default tray ICO icon path")
|
|
set(_TRAY_ICON_PNG "${TRAY_ICON_PNG}" CACHE INTERNAL "Default tray PNG icon path")
|
|
set(_TRAY_ICON_SVG "${TRAY_ICON_SVG}" CACHE INTERNAL "Default tray SVG icon path")
|
|
|
|
# Copy default tray icon files into the output directory of the specified target.
|
|
function(tray_copy_default_icons target_name)
|
|
if(NOT TARGET "${target_name}")
|
|
message(FATAL_ERROR "tray_copy_default_icons expected an existing target: ${target_name}")
|
|
endif()
|
|
|
|
foreach(icon_file IN LISTS TRAY_ICON_FILES)
|
|
add_custom_command(TARGET "${target_name}" POST_BUILD
|
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
|
"${icon_file}"
|
|
"$<TARGET_FILE_DIR:${target_name}>"
|
|
COMMENT "Copying ${icon_file} to $<TARGET_FILE_DIR:${target_name}>")
|
|
endforeach()
|
|
endfunction()
|
|
endif()
|
|
|
|
find_package(Qt6 COMPONENTS Widgets Svg)
|
|
if(Qt6_FOUND)
|
|
set(TRAY_QT_VERSION 6)
|
|
else()
|
|
find_package(Qt5 REQUIRED COMPONENTS Widgets Svg)
|
|
set(TRAY_QT_VERSION 5)
|
|
endif()
|
|
set(CMAKE_AUTOMOC ON)
|
|
list(APPEND TRAY_SOURCES
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/tray_qt.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/QtTrayMenu.cpp"
|
|
)
|
|
if(WIN32)
|
|
list(APPEND TRAY_SOURCES
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/WindowsAppearance.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/WindowsAppearance.h"
|
|
)
|
|
endif()
|
|
|
|
add_library(${PROJECT_NAME} STATIC ${TRAY_SOURCES})
|
|
set_property(TARGET ${PROJECT_NAME} PROPERTY C_STANDARD 99)
|
|
set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 17)
|
|
if(TRAY_IS_TOP_LEVEL AND BUILD_TESTS)
|
|
target_compile_definitions(${PROJECT_NAME} PRIVATE TRAY_ENABLE_TEST_HOOKS)
|
|
endif()
|
|
target_include_directories(${PROJECT_NAME}
|
|
PUBLIC
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
|
|
$<INSTALL_INTERFACE:include>)
|
|
|
|
if(WIN32 AND MSVC)
|
|
list(APPEND TRAY_COMPILE_OPTIONS "/MT$<$<CONFIG:Debug>:d>")
|
|
endif()
|
|
|
|
if(TRAY_QT_VERSION EQUAL 6)
|
|
list(APPEND TRAY_EXTERNAL_LIBRARIES Qt6::Widgets Qt6::Svg)
|
|
else()
|
|
list(APPEND TRAY_EXTERNAL_LIBRARIES Qt5::Widgets Qt5::Svg)
|
|
endif()
|
|
if(WIN32)
|
|
list(APPEND TRAY_EXTERNAL_LIBRARIES advapi32 Wtsapi32)
|
|
endif()
|
|
|
|
if(TRAY_COMPILE_DEFINITIONS)
|
|
target_compile_definitions(${PROJECT_NAME} PRIVATE ${TRAY_COMPILE_DEFINITIONS})
|
|
endif()
|
|
|
|
add_library(tray::tray ALIAS ${PROJECT_NAME})
|
|
|
|
if(TRAY_IS_TOP_LEVEL AND BUILD_EXAMPLE)
|
|
add_executable(tray_example "${CMAKE_CURRENT_SOURCE_DIR}/src/example.c")
|
|
target_link_libraries(tray_example tray::tray)
|
|
tray_copy_default_icons(tray_example)
|
|
endif()
|
|
|
|
if(TRAY_IS_TOP_LEVEL)
|
|
install(TARGETS tray DESTINATION lib)
|
|
install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/src/tray.h" DESTINATION include)
|
|
install(FILES ${TRAY_ICON_FILES} DESTINATION share/tray/icons)
|
|
endif()
|
|
|
|
target_compile_options(${PROJECT_NAME} PRIVATE ${TRAY_COMPILE_OPTIONS})
|
|
target_link_libraries(${PROJECT_NAME} PRIVATE ${TRAY_EXTERNAL_LIBRARIES})
|
|
|
|
#
|
|
# Testing and documentation are only available if this is the main project
|
|
#
|
|
if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
|
|
if(BUILD_DOCS)
|
|
include(third-party/dockle/cmake/Dockle.cmake)
|
|
dockle_add_docs(docs TARGETS api)
|
|
endif()
|
|
|
|
if(BUILD_TESTS)
|
|
#
|
|
# Additional setup for coverage
|
|
# https://gcovr.com/en/stable/guide/compiling.html#compiler-options
|
|
#
|
|
if(NOT CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
|
|
set(CMAKE_CXX_FLAGS "-fprofile-arcs -ftest-coverage -ggdb -O0")
|
|
set(CMAKE_C_FLAGS "-fprofile-arcs -ftest-coverage -ggdb -O0")
|
|
endif()
|
|
|
|
enable_testing()
|
|
add_subdirectory(tests)
|
|
endif()
|
|
endif()
|