diff --git a/CMakeLists.txt b/CMakeLists.txt --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,7 +10,7 @@ set_package_properties(ECM PROPERTIES TYPE REQUIRED DESCRIPTION "Extra CMake Modules." URL "https://projects.kde.org/projects/kdesupport/extra-cmake-modules") feature_summary(WHAT REQUIRED_PACKAGES_NOT_FOUND FATAL_ON_MISSING_REQUIRED_PACKAGES) -set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH}) +set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake) include(GenerateExportHeader) include(ECMGenerateHeaders) diff --git a/cmake/Findgzip.cmake b/cmake/Findgzip.cmake new file mode 100644 --- /dev/null +++ b/cmake/Findgzip.cmake @@ -0,0 +1,47 @@ +# Finds gzip. +# +# gzip_FOUND - True if gzip is found. +# gzip_EXECUTABLE - Path to executable + +#============================================================================= +# Copyright 2019 Friedrich W. H. Kossebau +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. The name of the author may not be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#============================================================================= + +find_program(gzip_EXECUTABLE NAMES gzip) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(gzip + FOUND_VAR + gzip_FOUND + REQUIRED_VARS + gzip_EXECUTABLE +) +mark_as_advanced(gzip_EXECUTABLE) + +set_package_properties(gzip PROPERTIES + URL "https://www.gnu.org/software/gzip" + DESCRIPTION "Data compression program for the gzip format" +) diff --git a/src/desktoptheme/CMakeLists.txt b/src/desktoptheme/CMakeLists.txt --- a/src/desktoptheme/CMakeLists.txt +++ b/src/desktoptheme/CMakeLists.txt @@ -1,3 +1,83 @@ + +option(GZIP_DESKTOPTHEME_SVG "Install Desktop Theme SVG files as .svgz." ON) + +if (GZIP_DESKTOPTHEME_SVG) + find_package(gzip) + set_package_properties(gzip PROPERTIES + TYPE REQUIRED + ) +endif() + +# Helper function, private for now +# Once it has matured and proven, add to public macros +function(PLASMA_INSTALL_DESKTOPTHEME_SVGS theme_name) + set(options + ) + set(oneValueArgs + SUBPATH + ) + set(multiValueArgs + FILES + ) + + cmake_parse_arguments(PIDS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + if(NOT DEFINED PIDS_SUBPATH) + message(FATAL_ERROR "SUBPATH needs to be defined when calling plasma_install_desktoptheme_svgs.") + endif() + + if(NOT PIDS_FILES) + message(FATAL_ERROR "No files passed when calling plasma_install_desktoptheme_svgs.") + endif() + + set(_target_name "${theme_name}_desktoptheme_graphics_${PIDS_SUBPATH}") + string(REPLACE "/" "_" _target_name "${_target_name}") + + set(desktoptheme_COMPONENTDIR "${theme_name}/${PIDS_SUBPATH}") + set(desktoptheme_INSTALLDIR ${PLASMA_DATA_INSTALL_DIR}/desktoptheme/${desktoptheme_COMPONENTDIR}) + + if (GZIP_DESKTOPTHEME_SVG) + set(desktoptheme_GZIPDIR "${theme_name}.gzipped/${PIDS_SUBPATH}") + file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${desktoptheme_GZIPDIR}") + endif() + + set(_install_files) + + foreach(_src_file ${PIDS_FILES}) + if (NOT IS_ABSOLUTE ${_src_file}) + set(_src_file "${CMAKE_CURRENT_SOURCE_DIR}/${_src_file}") + endif() + if (NOT EXISTS ${_src_file}) + message(FATAL_ERROR "No such file found: ${_src_file}") + endif() + get_filename_component(_fileName "${_src_file}" NAME) + + if (GZIP_DESKTOPTHEME_SVG) + set(_gzipped_file_displayname "${desktoptheme_COMPONENTDIR}/${_fileName}z") + set(_gzipped_file "${CMAKE_CURRENT_BINARY_DIR}/${desktoptheme_GZIPDIR}/${_fileName}z") + add_custom_command( + OUTPUT ${_gzipped_file} + COMMAND ${gzip_EXECUTABLE} + ARGS + -9 + -c + ${_src_file} > ${_gzipped_file} + DEPENDS ${_src_file} + COMMENT "Gzipping ${_gzipped_file_displayname}" + ) + else() + set(_gzipped_file "${_src_file}") + endif() + + list(APPEND _install_files "${_gzipped_file}") + endforeach() + + add_custom_target(${_target_name} ALL DEPENDS ${_install_files}) + + install(FILES ${_install_files} DESTINATION "${desktoptheme_INSTALLDIR}" ) +endfunction() + + add_subdirectory( oxygen ) add_subdirectory( air ) add_subdirectory( breeze ) diff --git a/src/desktoptheme/air/CMakeLists.txt b/src/desktoptheme/air/CMakeLists.txt --- a/src/desktoptheme/air/CMakeLists.txt +++ b/src/desktoptheme/air/CMakeLists.txt @@ -1,24 +1,24 @@ install(FILES colors metadata.desktop DESTINATION ${PLASMA_DATA_INSTALL_DIR}/desktoptheme/air/) -FILE(GLOB widgets widgets/*.svgz) -install( FILES ${widgets} DESTINATION ${PLASMA_DATA_INSTALL_DIR}/desktoptheme/air/widgets/ ) +FILE(GLOB widgets widgets/*.svg) +plasma_install_desktoptheme_svgs(air SUBPATH widgets FILES ${widgets}) -FILE(GLOB dialogs dialogs/*.svgz) -install( FILES ${dialogs} DESTINATION ${PLASMA_DATA_INSTALL_DIR}/desktoptheme/air/dialogs/ ) +FILE(GLOB dialogs dialogs/*.svg) +plasma_install_desktoptheme_svgs(air SUBPATH dialogs FILES ${dialogs}) -FILE(GLOB opaque_dialogs opaque/dialogs/*.svgz) -install( FILES ${opaque_dialogs} DESTINATION ${PLASMA_DATA_INSTALL_DIR}/desktoptheme/air/opaque/dialogs/ ) +FILE(GLOB opaque_dialogs opaque/dialogs/*.svg) +plasma_install_desktoptheme_svgs(air SUBPATH opaque/dialogs FILES ${opaque_dialogs}) -FILE(GLOB opaque_widgets opaque/widgets/*.svgz) -install( FILES ${opaque_widgets} DESTINATION ${PLASMA_DATA_INSTALL_DIR}/desktoptheme/air/opaque/widgets/ ) +FILE(GLOB opaque_widgets opaque/widgets/*.svg) +plasma_install_desktoptheme_svgs(air SUBPATH opaque/widgets FILES ${opaque_widgets}) -FILE(GLOB translucent_widgets translucent/widgets/*.svgz) -install( FILES ${translucent_widgets} DESTINATION ${PLASMA_DATA_INSTALL_DIR}/desktoptheme/air/translucent/widgets/ ) +FILE(GLOB translucent_widgets translucent/widgets/*.svg) +plasma_install_desktoptheme_svgs(air SUBPATH translucent/widgets FILES ${translucent_widgets}) -FILE(GLOB translucent_dialogs translucent/dialogs/*.svgz) -install( FILES ${translucent_dialogs} DESTINATION ${PLASMA_DATA_INSTALL_DIR}/desktoptheme/air/translucent/dialogs/ ) +FILE(GLOB translucent_dialogs translucent/dialogs/*.svg) +plasma_install_desktoptheme_svgs(air SUBPATH translucent/dialogs FILES ${translucent_dialogs}) -FILE(GLOB icons icons/*.svgz) -install( FILES ${icons} DESTINATION ${PLASMA_DATA_INSTALL_DIR}/desktoptheme/air/icons/ ) +FILE(GLOB icons icons/*.svg) +plasma_install_desktoptheme_svgs(air SUBPATH icons FILES ${icons}) diff --git a/src/desktoptheme/breeze/CMakeLists.txt b/src/desktoptheme/breeze/CMakeLists.txt --- a/src/desktoptheme/breeze/CMakeLists.txt +++ b/src/desktoptheme/breeze/CMakeLists.txt @@ -1,24 +1,24 @@ install(FILES metadata.desktop DESTINATION ${PLASMA_DATA_INSTALL_DIR}/desktoptheme/default/) -FILE(GLOB widgets widgets/*.svgz) -install( FILES ${widgets} DESTINATION ${PLASMA_DATA_INSTALL_DIR}/desktoptheme/default/widgets/ ) +FILE(GLOB widgets widgets/*.svg) +plasma_install_desktoptheme_svgs(default SUBPATH widgets FILES ${widgets}) -FILE(GLOB dialogs dialogs/*.svgz) -install( FILES ${dialogs} DESTINATION ${PLASMA_DATA_INSTALL_DIR}/desktoptheme/default/dialogs/ ) +FILE(GLOB dialogs dialogs/*.svg) +plasma_install_desktoptheme_svgs(default SUBPATH dialogs FILES ${dialogs}) -FILE(GLOB opaque_dialogs opaque/dialogs/*.svgz) -install( FILES ${opaque_dialogs} DESTINATION ${PLASMA_DATA_INSTALL_DIR}/desktoptheme/default/opaque/dialogs/ ) +FILE(GLOB opaque_dialogs opaque/dialogs/*.svg) +plasma_install_desktoptheme_svgs(default SUBPATH opaque/dialogs FILES ${opaque_dialogs}) -FILE(GLOB opaque_widgets opaque/widgets/*.svgz) -install( FILES ${opaque_widgets} DESTINATION ${PLASMA_DATA_INSTALL_DIR}/desktoptheme/default/opaque/widgets/ ) +FILE(GLOB opaque_widgets opaque/widgets/*.svg) +plasma_install_desktoptheme_svgs(default SUBPATH opaque/widgets FILES ${opaque_widgets}) -FILE(GLOB translucent_widgets translucent/widgets/*.svgz) -install( FILES ${translucent_widgets} DESTINATION ${PLASMA_DATA_INSTALL_DIR}/desktoptheme/default/translucent/widgets/ ) +FILE(GLOB translucent_widgets translucent/widgets/*.svg) +plasma_install_desktoptheme_svgs(default SUBPATH translucent/widgets FILES ${translucent_widgets}) -FILE(GLOB translucent_dialogs translucent/dialogs/*.svgz) -install( FILES ${translucent_dialogs} DESTINATION ${PLASMA_DATA_INSTALL_DIR}/desktoptheme/default/translucent/dialogs/ ) +FILE(GLOB translucent_dialogs translucent/dialogs/*.svg) +plasma_install_desktoptheme_svgs(default SUBPATH translucent/dialogs FILES ${translucent_dialogs}) -FILE(GLOB icons icons/*.svgz) -install( FILES ${icons} DESTINATION ${PLASMA_DATA_INSTALL_DIR}/desktoptheme/default/icons/ ) +FILE(GLOB icons icons/*.svg) +plasma_install_desktoptheme_svgs(default SUBPATH icons FILES ${icons}) diff --git a/src/desktoptheme/oxygen/CMakeLists.txt b/src/desktoptheme/oxygen/CMakeLists.txt --- a/src/desktoptheme/oxygen/CMakeLists.txt +++ b/src/desktoptheme/oxygen/CMakeLists.txt @@ -1,18 +1,18 @@ install(FILES colors metadata.desktop DESTINATION ${PLASMA_DATA_INSTALL_DIR}/desktoptheme/oxygen/) -FILE(GLOB widgets widgets/*.svgz) -install( FILES ${widgets} DESTINATION ${PLASMA_DATA_INSTALL_DIR}/desktoptheme/oxygen/widgets/ ) +FILE(GLOB widgets widgets/*.svg) +plasma_install_desktoptheme_svgs(oxygen SUBPATH widgets FILES ${widgets}) -FILE(GLOB dialogs dialogs/*.svgz) -install( FILES ${dialogs} DESTINATION ${PLASMA_DATA_INSTALL_DIR}/desktoptheme/oxygen/dialogs/ ) +FILE(GLOB dialogs dialogs/*.svg) +plasma_install_desktoptheme_svgs(oxygen SUBPATH dialogs FILES ${dialogs}) -FILE(GLOB opaque opaque/widgets/*.svgz) -install( FILES ${opaque} DESTINATION ${PLASMA_DATA_INSTALL_DIR}/desktoptheme/oxygen/opaque/widgets/ ) +FILE(GLOB opaque opaque/widgets/*.svg) +plasma_install_desktoptheme_svgs(oxygen SUBPATH opaque/widgets FILES ${opaque}) -FILE(GLOB opaque opaque/dialogs/*.svgz) -install( FILES ${opaque} DESTINATION ${PLASMA_DATA_INSTALL_DIR}/desktoptheme/oxygen/opaque/dialogs/ ) +FILE(GLOB opaque opaque/dialogs/*.svg) +plasma_install_desktoptheme_svgs(oxygen SUBPATH opaque/dialogs FILES ${opaque}) -FILE(GLOB icons ../air/icons/*.svgz) -install( FILES ${icons} DESTINATION ${PLASMA_DATA_INSTALL_DIR}/desktoptheme/oxygen/icons/ ) +FILE(GLOB icons ../air/icons/*.svg) +plasma_install_desktoptheme_svgs(oxygen SUBPATH icons FILES ${icons})