2025-02-26 20:58:16 +08:00
# SPDX-FileCopyrightText: 2022 - 2025 Gary Wang <git@blumia.net>
2022-06-19 16:17:38 +08:00
#
# SPDX-License-Identifier: MIT
2024-12-01 00:02:29 +08:00
cmake_minimum_required ( VERSION 3.16 )
2019-11-23 20:51:58 +08:00
2026-08-20 22:45:21 +08:00
project ( pineapple-pictures VERSION 1.6.0 ) # don't forget to update NEWS file and AppStream metadata.
2024-04-05 00:09:49 +08:00
2025-02-26 20:58:16 +08:00
include ( GNUInstallDirs )
include ( FeatureSummary )
2019-11-23 20:51:58 +08:00
2023-02-19 01:04:58 +08:00
option ( EXIV2_METADATA_SUPPORT "Better image metadata support via libexiv2" ON )
2024-12-24 22:37:16 +08:00
option ( TRANSLATION_RESOURCE_EMBEDDING "Embedding .qm translation files inside resource" OFF )
2023-02-19 01:04:58 +08:00
2023-11-25 02:18:37 +08:00
set ( CMAKE_CXX_STANDARD 17 )
set ( CMAKE_CXX_STANDARD_REQUIRED ON )
2019-11-23 20:51:58 +08:00
set ( CMAKE_AUTOMOC ON )
set ( CMAKE_AUTORCC ON )
2026-07-04 22:17:40 +08:00
set ( CMAKE_AUTOUIC ON )
2019-11-23 20:51:58 +08:00
2025-05-23 00:06:43 +08:00
find_package ( QT NAMES Qt6 REQUIRED COMPONENTS Core )
2020-11-15 19:53:47 +08:00
2026-07-08 20:15:22 +08:00
set ( QT_MINIMUM_VERSION "6.5" )
2023-02-19 01:04:58 +08:00
find_package ( Qt ${ QT_VERSION_MAJOR } ${ QT_MINIMUM_VERSION } REQUIRED
2025-05-23 00:06:43 +08:00
COMPONENTS Widgets Svg SvgWidgets LinguistTools
2022-10-29 23:35:30 +08:00
OPTIONAL_COMPONENTS DBus
)
2019-11-23 20:51:58 +08:00
2020-11-15 19:53:47 +08:00
if ( EXIV2_METADATA_SUPPORT )
2025-02-20 08:13:16 +01:00
find_package ( exiv2 )
set_package_properties ( exiv2 PROPERTIES
2020-11-15 19:53:47 +08:00
URL "https://www.exiv2.org"
DESCRIPTION "image metadata support"
2025-02-26 20:58:16 +08:00
TYPE RECOMMENDED
2020-11-15 19:53:47 +08:00
PURPOSE "Bring better image metadata support"
)
endif ()
2019-11-23 20:51:58 +08:00
set ( PPIC_CPP_FILES
2020-11-05 14:12:58 +08:00
app/main.cpp
app/mainwindow.cpp
2021-01-24 00:07:58 +08:00
app/actionmanager.cpp
2020-11-05 14:12:58 +08:00
app/graphicsview.cpp
app/graphicsscene.cpp
app/bottombuttongroup.cpp
app/navigatorview.cpp
app/settings.cpp
app/settingsdialog.cpp
app/aboutdialog.cpp
app/metadatamodel.cpp
app/metadatadialog.cpp
2020-11-15 19:53:47 +08:00
app/exiv2wrapper.cpp
2021-02-09 14:19:09 +08:00
app/playlistmanager.cpp
2024-12-31 10:57:21 +08:00
app/fileopeneventhandler.cpp
2026-07-25 12:06:11 +08:00
app/playlistscout.cpp
app/playlistscouts/qtscout.cpp
app/playlistscouts/explorerscout.cpp
2019-11-23 20:51:58 +08:00
)
set ( PPIC_HEADER_FILES
2020-11-05 14:12:58 +08:00
app/mainwindow.h
2021-01-24 00:07:58 +08:00
app/actionmanager.h
2020-11-05 14:12:58 +08:00
app/graphicsview.h
app/graphicsscene.h
app/bottombuttongroup.h
app/navigatorview.h
app/settings.h
app/settingsdialog.h
app/aboutdialog.h
app/metadatamodel.h
app/metadatadialog.h
2020-11-15 19:53:47 +08:00
app/exiv2wrapper.h
2021-02-09 14:19:09 +08:00
app/playlistmanager.h
2024-12-31 10:57:21 +08:00
app/fileopeneventhandler.h
2026-07-25 12:06:11 +08:00
app/playlistscout.h
app/playlistscouts/qtscout.h
app/playlistscouts/explorerscout.h
2019-11-23 20:51:58 +08:00
)
2026-07-04 22:17:40 +08:00
set ( PPIC_UI_FILES
app/settingsdialog.ui
2026-07-07 12:16:36 +08:00
app/aboutdialog.ui
app/metadatadialog.ui
2026-07-24 14:57:41 +08:00
app/mainwindow.ui
2026-07-04 22:17:40 +08:00
)
2019-11-23 20:51:58 +08:00
set ( PPIC_QRC_FILES
2020-12-25 13:36:34 +08:00
assets/resources.qrc
2019-11-23 20:51:58 +08:00
)
2019-11-24 14:52:17 +08:00
set ( PPIC_RC_FILES
# yeah, it's empty.
)
2019-11-23 20:51:58 +08:00
set ( EXE_NAME ppic )
# Translation
2026-09-10 09:58:53 +08:00
file ( GLOB PPIC_TS_FILES locales/app/*.ts )
2019-11-23 20:51:58 +08:00
set ( PPIC_CPP_FILES_FOR_I18N ${ PPIC_CPP_FILES } )
2026-09-22 13:53:16 +08:00
find_program ( UV_EXECUTABLE uv )
if ( NOT UV_EXECUTABLE )
message ( FATAL_ERROR "uv is required to run the metaglot tool, install it from https://docs.astral.sh/uv/" )
endif ()
2019-11-24 14:52:17 +08:00
if ( WIN32 )
2026-09-22 13:53:16 +08:00
set ( PPIC_RC_TEMPLATE_FILE ${ CMAKE_CURRENT_BINARY_DIR } /pineapple-pictures.rc.in )
execute_process (
COMMAND ${ UV_EXECUTABLE } tool run metaglot render rc
--manifest ${ CMAKE_SOURCE_DIR } /dist/pineapple-pictures.rc.in.toml
--po ${ CMAKE_SOURCE_DIR } /locales/winrc/*.po
--template ${ CMAKE_SOURCE_DIR } /dist/pineapple-pictures.rc.in.liquid
--output ${ PPIC_RC_TEMPLATE_FILE }
RESULT_VARIABLE METAGLOT_RESULT
)
if ( NOT METAGLOT_RESULT EQUAL 0 )
message ( FATAL_ERROR "Failed to generate pineapple-pictures.rc.in via MetaGlot (exit code: ${METAGLOT_RESULT}). If it is not installed yet, run: uv tool install git+https://github.com/SarasasChipWorkshop/metaglot.git" )
endif ()
configure_file ( ${ PPIC_RC_TEMPLATE_FILE } ${ CMAKE_CURRENT_BINARY_DIR } /pineapple-pictures.rc @ONLY )
list ( APPEND PPIC_RC_FILES ${ CMAKE_CURRENT_BINARY_DIR } /pineapple-pictures.rc )
2019-11-24 14:52:17 +08:00
endif ()
2024-12-02 00:25:48 +08:00
add_executable ( ${ EXE_NAME }
2019-11-23 20:51:58 +08:00
${ PPIC_HEADER_FILES }
${ PPIC_CPP_FILES }
2026-07-04 22:17:40 +08:00
${ PPIC_UI_FILES }
2019-11-23 20:51:58 +08:00
${ PPIC_QRC_FILES }
2019-11-24 14:52:17 +08:00
${ PPIC_RC_FILES }
2019-11-23 20:51:58 +08:00
)
2025-05-23 00:06:43 +08:00
set ( ADD_TRANSLATIONS_ADDITIONAL_ARGS )
2025-04-26 17:02:24 +08:00
2025-05-23 00:06:43 +08:00
if ( Qt6_VERSION VERSION_GREATER_EQUAL "6.9.0" )
set ( ADD_TRANSLATIONS_ADDITIONAL_ARGS MERGE_QT_TRANSLATIONS )
endif ()
2025-04-26 17:02:24 +08:00
2025-05-23 00:06:43 +08:00
if ( TRANSLATION_RESOURCE_EMBEDDING )
qt_add_translations ( ${ EXE_NAME } ${ ADD_TRANSLATIONS_ADDITIONAL_ARGS } TS_FILES ${ PPIC_TS_FILES } )
2024-04-20 16:40:07 +08:00
else ()
2025-05-23 00:06:43 +08:00
qt_add_translations ( ${ EXE_NAME } ${ ADD_TRANSLATIONS_ADDITIONAL_ARGS } TS_FILES ${ PPIC_TS_FILES } QM_FILES_OUTPUT_VARIABLE PPIC_QM_FILES )
2024-04-20 16:40:07 +08:00
endif ()
2024-04-05 00:09:49 +08:00
2026-07-24 14:57:41 +08:00
# YYC MARK:
# This is essential, otherwise Qt UIC generated UI header file
# can not find our header files if there are custom widgets inside UI file.
target_include_directories ( ${ EXE_NAME } PRIVATE app/ )
2024-04-05 00:09:49 +08:00
target_sources ( ${ EXE_NAME } PRIVATE ${ PPIC_QM_FILES } )
2025-05-23 00:06:43 +08:00
target_link_libraries ( ${ EXE_NAME } Qt ${ QT_VERSION_MAJOR } ::Widgets Qt ${ QT_VERSION_MAJOR } ::Svg Qt ${ QT_VERSION_MAJOR } ::SvgWidgets )
2019-11-23 20:51:58 +08:00
2025-02-20 08:13:16 +01:00
if ( exiv2_FOUND )
2025-05-24 23:19:26 +08:00
if ( NOT TARGET Exiv2::exiv2lib AND TARGET exiv2lib )
# for exiv2 0.27.x and (macOS?) conan build
add_library ( Exiv2::exiv2lib ALIAS exiv2lib )
endif ()
2020-11-15 19:53:47 +08:00
target_link_libraries ( ${ EXE_NAME }
2024-07-06 17:24:42 +08:00
Exiv2::exiv2lib
2020-11-15 19:53:47 +08:00
)
target_compile_definitions ( ${ EXE_NAME } PRIVATE
2025-02-20 08:13:16 +01:00
HAVE_EXIV2_VERSION= "${exiv2_VERSION}"
2020-11-15 19:53:47 +08:00
)
endif ()
2025-05-23 00:06:43 +08:00
if ( TARGET Qt6::DBus )
2022-10-29 23:35:30 +08:00
target_link_libraries ( ${ EXE_NAME }
2023-05-21 00:36:24 +08:00
Qt ${ QT_VERSION_MAJOR } ::DBus
2022-10-29 23:35:30 +08:00
)
target_compile_definitions ( ${ EXE_NAME } PRIVATE
HAVE_QTDBUS
)
endif ()
2019-11-24 23:31:45 +08:00
# Extra build settings
if ( WIN32 )
2020-08-10 23:41:59 +08:00
target_compile_definitions ( ${ EXE_NAME } PRIVATE
FLAG_PORTABLE_MODE_SUPPORT=1
)
2019-11-24 23:31:45 +08:00
endif ()
2020-08-13 19:45:38 +08:00
# Helper macros for parsing and setting project version from `git describe --long` result
macro ( ppic_set_version_via_describe _describe_long )
string (
REGEX REPLACE
"^([0-9a-z.]*)-[0-9]+-g[0-9a-f]*$"
"\\1"
_tag_parts
"${_describe_long}"
)
list ( GET _tag_parts 0 _matched_tag_version )
if ( "${_matched_tag_version}" MATCHES "^[0-9]+\\.[0-9]+\\.[0-9]+$" )
string (
REGEX REPLACE
"^([0-9]+)\\.([0-9]+)\\.([0-9]+).*$"
"\\1;\\2;\\3"
_ver_parts
"${_matched_tag_version}"
)
list ( GET _ver_parts 0 CPACK_PACKAGE_VERSION_MAJOR )
list ( GET _ver_parts 1 CPACK_PACKAGE_VERSION_MINOR )
list ( GET _ver_parts 2 CPACK_PACKAGE_VERSION_PATCH )
endif ()
endmacro ()
# Version setup
2024-09-17 19:28:05 +08:00
target_compile_definitions ( ${ EXE_NAME } PRIVATE PPIC_VERSION_STRING= "${CMAKE_PROJECT_VERSION}" )
2020-08-13 19:45:38 +08:00
if ( EXISTS "${CMAKE_SOURCE_DIR}/.git" )
find_package ( Git )
set_package_properties ( Git PROPERTIES TYPE OPTIONAL PURPOSE "Determine exact build version." )
if ( GIT_FOUND )
execute_process (
COMMAND ${ GIT_EXECUTABLE } describe --tags --always --long
WORKING_DIRECTORY ${ CMAKE_SOURCE_DIR }
OUTPUT_VARIABLE _git_describe_long
)
string ( REGEX REPLACE "\n" "" _git_describe_long "${_git_describe_long}" )
ppic_set_version_via_describe ( ${ _git_describe_long } )
2020-09-29 09:45:07 +08:00
target_compile_definitions ( ${ EXE_NAME } PRIVATE
GIT_DESCRIBE_VERSION_STRING= "${_git_describe_long}"
)
2020-08-13 19:45:38 +08:00
endif ()
endif ()
2019-11-23 20:51:58 +08:00
# Install settings
2020-01-03 23:01:12 +08:00
if ( WIN32 )
2024-12-02 00:25:48 +08:00
set_target_properties ( ${ EXE_NAME } PROPERTIES
WIN32_EXECUTABLE TRUE
)
elseif ( APPLE )
2026-09-22 13:53:16 +08:00
set_source_files_properties ( dist/sarasacw-picture.icns PROPERTIES
2024-12-02 00:25:48 +08:00
MACOSX_PACKAGE_LOCATION "Resources"
)
2026-09-22 13:53:16 +08:00
target_sources ( ${ EXE_NAME } PUBLIC dist/sarasacw-picture.icns )
2024-12-02 00:25:48 +08:00
# See https://cmake.org/cmake/help/v3.15/prop_tgt/MACOSX_BUNDLE_INFO_PLIST.html
set_target_properties ( ${ EXE_NAME } PROPERTIES
MACOSX_BUNDLE TRUE
MACOSX_BUNDLE_INFO_PLIST ${ CMAKE_CURRENT_SOURCE_DIR } /dist/MacOSXBundleInfo.plist.in
MACOSX_BUNDLE_BUNDLE_NAME "Pineapple Pictures"
MACOSX_BUNDLE_GUI_IDENTIFIER net.blumia.pineapple-pictures
2026-09-22 13:53:16 +08:00
MACOSX_BUNDLE_ICON_FILE sarasacw-picture.icns # contains the .icns file name, *without* the path.
2024-12-02 00:25:48 +08:00
MACOSX_BUNDLE_BUNDLE_VERSION ${ PROJECT_VERSION }
MACOSX_BUNDLE_SHORT_VERSION_STRING ${ PROJECT_VERSION_MAJOR } . ${ PROJECT_VERSION_MINOR }
)
2020-01-03 23:01:12 +08:00
elseif ( UNIX )
2019-11-23 20:51:58 +08:00
if ( CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT )
set ( CMAKE_INSTALL_PREFIX /usr )
endif ()
# install icon
install (
2026-09-22 16:43:04 +08:00
DIRECTORY dist/freedesktop-icons/
DESTINATION "${CMAKE_INSTALL_DATADIR}/icons/hicolor"
2019-11-23 20:51:58 +08:00
)
2026-09-22 15:28:52 +08:00
# generate and install desktop entry file
set ( PPIC_DESKTOP_FILE ${ CMAKE_CURRENT_BINARY_DIR } /net.blumia.pineapple-pictures.desktop )
execute_process (
COMMAND ${ UV_EXECUTABLE } tool run metaglot render desktop
--manifest ${ CMAKE_SOURCE_DIR } /dist/net.blumia.pineapple-pictures.desktop.toml
--po ${ CMAKE_SOURCE_DIR } /locales/desktop/*.po
--template ${ CMAKE_SOURCE_DIR } /dist/net.blumia.pineapple-pictures.desktop.liquid
--output ${ PPIC_DESKTOP_FILE }
RESULT_VARIABLE METAGLOT_DESKTOP_RESULT
)
if ( NOT METAGLOT_DESKTOP_RESULT EQUAL 0 )
message ( FATAL_ERROR "Failed to generate net.blumia.pineapple-pictures.desktop via MetaGlot (exit code: ${METAGLOT_DESKTOP_RESULT}). If it is not installed yet, run: uv tool install git+https://github.com/SarasasChipWorkshop/metaglot.git" )
endif ()
2019-11-23 20:51:58 +08:00
install (
2026-09-22 15:28:52 +08:00
FILES ${ PPIC_DESKTOP_FILE }
2019-11-23 20:51:58 +08:00
DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/applications"
)
2020-09-14 18:34:30 +08:00
2026-09-22 16:06:23 +08:00
# generate and install app metadata file for appstream (and some other stuff using this metadata like snapcraft)
set ( PPIC_METAINFO_FILE ${ CMAKE_CURRENT_BINARY_DIR } /net.blumia.pineapple-pictures.metainfo.xml )
execute_process (
COMMAND ${ UV_EXECUTABLE } tool run metaglot render appstream
--manifest ${ CMAKE_SOURCE_DIR } /dist/net.blumia.pineapple-pictures.metainfo.xml.toml
--po ${ CMAKE_SOURCE_DIR } /locales/appstream/*.po
--template ${ CMAKE_SOURCE_DIR } /dist/net.blumia.pineapple-pictures.metainfo.xml.liquid
--output ${ PPIC_METAINFO_FILE }
RESULT_VARIABLE METAGLOT_METAINFO_RESULT
)
if ( NOT METAGLOT_METAINFO_RESULT EQUAL 0 )
message ( FATAL_ERROR "Failed to generate net.blumia.pineapple-pictures.metainfo.xml via MetaGlot (exit code: ${METAGLOT_METAINFO_RESULT}). If it is not installed yet, run: uv tool install git+https://github.com/SarasasChipWorkshop/metaglot.git" )
endif ()
2020-09-14 18:34:30 +08:00
install (
2026-09-22 16:06:23 +08:00
FILES ${ PPIC_METAINFO_FILE }
2020-09-14 18:34:30 +08:00
DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/metainfo"
)
2020-01-03 23:01:12 +08:00
endif ()
2019-11-23 20:51:58 +08:00
2020-01-03 23:01:12 +08:00
set ( INSTALL_TARGETS_DEFAULT_ARGS
2024-12-02 00:25:48 +08:00
BUNDLE DESTINATION .
2023-06-04 13:50:34 +08:00
RUNTIME DESTINATION ${ CMAKE_INSTALL_BINDIR }
LIBRARY DESTINATION ${ CMAKE_INSTALL_LIBDIR }
ARCHIVE DESTINATION ${ CMAKE_INSTALL_LIBDIR } COMPONENT Devel
2020-01-03 23:01:12 +08:00
)
install (
TARGETS ${ EXE_NAME }
${ INSTALL_TARGETS_DEFAULT_ARGS }
)
2024-12-24 22:37:16 +08:00
if ( TRANSLATION_RESOURCE_EMBEDDING )
target_compile_definitions ( ${ EXE_NAME }
PRIVATE TRANSLATION_RESOURCE_EMBEDDING
)
elseif ( WIN32 )
2020-01-03 23:01:12 +08:00
set ( QM_FILE_INSTALL_DIR "${CMAKE_INSTALL_BINDIR}/translations" )
2024-12-24 22:37:16 +08:00
else ()
2020-01-03 23:01:12 +08:00
set ( QM_FILE_INSTALL_DIR "${CMAKE_INSTALL_FULL_DATADIR}/pineapple-pictures/translations" )
2020-01-05 14:30:33 +08:00
target_compile_definitions ( ${ EXE_NAME }
2024-12-24 22:37:16 +08:00
PRIVATE QM_FILE_INSTALL_ABSOLUTE_DIR= ${ QM_FILE_INSTALL_DIR }
2020-01-05 14:30:33 +08:00
)
2024-12-24 22:37:16 +08:00
endif ()
2020-01-03 23:01:12 +08:00
2024-12-24 22:37:16 +08:00
if ( DEFINED QM_FILE_INSTALL_DIR )
install (
FILES ${ PPIC_QM_FILES }
DESTINATION ${ QM_FILE_INSTALL_DIR }
)
endif ()
2020-11-15 19:53:47 +08:00
feature_summary ( WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAGES )
2020-01-03 23:01:12 +08:00
# CPACK: General Settings
set ( CPACK_GENERATOR "TBZ2" )
2020-04-20 10:57:27 +08:00
set ( CPACK_PACKAGE_NAME "pineapple-pictures" )
2020-01-03 23:01:12 +08:00
set ( CPACK_PACKAGE_DESCRIPTION_SUMMARY "Yet another image viewer" )
set ( CPACK_PACKAGE_VENDOR "Gary Wang" )
2020-09-30 23:54:24 +08:00
set ( CPACK_PACKAGE_CONTACT "https://github.com/BLumia/pineapple-pictures/issues/" )
2020-01-03 23:01:12 +08:00
if ( WIN32 )
# ...
elseif ( APPLE )
# ...
elseif ( UNIX )
2020-04-20 10:57:27 +08:00
set ( CPACK_SYSTEM_NAME "${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}" )
2024-04-28 00:12:44 +08:00
set ( CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON )
2025-12-17 00:01:30 +08:00
set ( CPACK_DEBIAN_PACKAGE_RECOMMENDS "kimageformat6-plugins" )
2020-01-03 23:01:12 +08:00
endif ()
include ( CPack )