From 35a228f78f5b64f57e93ce8d108cec98d805b469 Mon Sep 17 00:00:00 2001 From: glx22 Date: Tue, 9 Mar 2021 18:00:37 +0100 Subject: [PATCH] Add: [CMake] Install menu and media files --- CMakeLists.txt | 3 +- cmake/InstallAndPackage.cmake | 14 ++- cmake/scripts/Desktop.cmake | 60 ++++++++++++ media/CMakeLists.txt | 98 +++++++++++++++++++ media/{openttd.desktop.in => openttd.desktop} | 10 +- media/openttd.desktop.filter.awk | 11 --- media/openttd.desktop.translation.awk | 13 --- 7 files changed, 177 insertions(+), 32 deletions(-) create mode 100644 cmake/scripts/Desktop.cmake create mode 100644 media/CMakeLists.txt rename media/{openttd.desktop.in => openttd.desktop} (69%) delete mode 100644 media/openttd.desktop.filter.awk delete mode 100644 media/openttd.desktop.translation.awk diff --git a/CMakeLists.txt b/CMakeLists.txt index 9a85bd581e..c5f1d11b50 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -221,7 +221,7 @@ if(MSVC) endif() add_subdirectory(${CMAKE_SOURCE_DIR}/src) -add_subdirectory(${CMAKE_SOURCE_DIR}/media/baseset) +add_subdirectory(${CMAKE_SOURCE_DIR}/media) add_dependencies(openttd find_version) @@ -229,6 +229,7 @@ add_dependencies(openttd target_link_libraries(openttd openttd::languages openttd::settings + openttd::media openttd::basesets openttd::script_api Threads::Threads diff --git a/cmake/InstallAndPackage.cmake b/cmake/InstallAndPackage.cmake index 5fd17cb037..0b1dc14933 100644 --- a/cmake/InstallAndPackage.cmake +++ b/cmake/InstallAndPackage.cmake @@ -58,8 +58,18 @@ if(OPTION_INSTALL_FHS) COMPONENT manual) endif() -# TODO -- Media files -# TODO -- Menu files +if(UNIX AND NOT APPLE) + install(DIRECTORY + ${CMAKE_BINARY_DIR}/media/icons + ${CMAKE_BINARY_DIR}/media/pixmaps + DESTINATION ${CMAKE_INSTALL_DATAROOTDIR} + COMPONENT media) + + install(FILES + ${CMAKE_BINARY_DIR}/media/${BINARY_NAME}.desktop + DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/applications + COMPONENT menu) +endif() if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") set(ARCHITECTURE "amd64") diff --git a/cmake/scripts/Desktop.cmake b/cmake/scripts/Desktop.cmake new file mode 100644 index 0000000000..7cec0b9afe --- /dev/null +++ b/cmake/scripts/Desktop.cmake @@ -0,0 +1,60 @@ +cmake_minimum_required(VERSION 3.5) + +# +# Create a desktop file with the correct translations. +# + +if(NOT DESKTOP_SOURCE_FILE) + message(FATAL_ERROR "Script needs DESKTOP_SOURCE_FILE defined") +endif() +if(NOT DESKTOP_BINARY_FILE) + message(FATAL_ERROR "Script needs DESKTOP_BINARY_FILE defined") +endif() +if(NOT BINARY_NAME) + message(FATAL_ERROR "Script needs BINARY_NAME defined") +endif() + +set(ARGC 1) +set(ARG_READ NO) + +# Read all the arguments given to CMake; we are looking for -- and everything +# that follows. Those are our language files. +while(ARGC LESS CMAKE_ARGC) + set(ARG ${CMAKE_ARGV${ARGC}}) + + if(ARG_READ) + list(APPEND LANG_SOURCE_FILES "${ARG}") + endif() + + if(ARG STREQUAL "--") + set(ARG_READ YES) + endif() + + math(EXPR ARGC "${ARGC} + 1") +endwhile() + +# Place holder format is @_@ +file(STRINGS "${DESKTOP_SOURCE_FILE}" PLACE_HOLDER REGEX "^@") +string(REGEX REPLACE "@([^_]+).*@" "\\1" INI_KEY "${PLACE_HOLDER}") +string(REGEX REPLACE "@[^_]+_(.*)@" "\\1" STR_ID "${PLACE_HOLDER}") +string(REGEX REPLACE "@(.*)@" "\\1" PLACE_HOLDER "${PLACE_HOLDER}") + +# Get the translations +foreach(LANGFILE IN LISTS LANG_SOURCE_FILES) + file(STRINGS "${LANGFILE}" LANGLINES REGEX "^(##isocode|${STR_ID})" ENCODING UTF-8) + string(FIND "${LANGLINES}" "${STR_ID}" HAS_STR_ID) + if(HAS_STR_ID LESS 0) + continue() + endif() + string(REGEX REPLACE "##isocode ([^;]+).*" "\\1" ISOCODE "${LANGLINES}") + if("${ISOCODE}" STREQUAL "en_GB") + string(REGEX REPLACE "[^:]*:(.*)" "${INI_KEY}=\\1" LANGLINES "${LANGLINES}") + else() + string(REGEX REPLACE "[^:]*:(.*)" "${INI_KEY}[${ISOCODE}]=\\1" LANGLINES "${LANGLINES}") + endif() + list(APPEND ${PLACE_HOLDER} ${LANGLINES}) +endforeach() +list(SORT ${PLACE_HOLDER}) +string(REPLACE ";" "\n" ${PLACE_HOLDER} "${${PLACE_HOLDER}}") + +configure_file(${DESKTOP_SOURCE_FILE} ${DESKTOP_BINARY_FILE}) diff --git a/media/CMakeLists.txt b/media/CMakeLists.txt new file mode 100644 index 0000000000..17b10b5ec8 --- /dev/null +++ b/media/CMakeLists.txt @@ -0,0 +1,98 @@ +add_subdirectory(baseset) + +add_library(media + INTERFACE +) +add_library(openttd::media ALIAS media) + +if(NOT UNIX OR APPLE) + return() +endif() + +set(MEDIA_PNG_SOURCE_FILES + ${CMAKE_CURRENT_SOURCE_DIR}/openttd.16.png + ${CMAKE_CURRENT_SOURCE_DIR}/openttd.32.png + ${CMAKE_CURRENT_SOURCE_DIR}/openttd.48.png + ${CMAKE_CURRENT_SOURCE_DIR}/openttd.64.png + ${CMAKE_CURRENT_SOURCE_DIR}/openttd.128.png + ${CMAKE_CURRENT_SOURCE_DIR}/openttd.256.png +) + +# Walk over all the png files, and generate a command to copy them +foreach(MEDIA_PNG_SOURCE_FILE IN LISTS MEDIA_PNG_SOURCE_FILES) + get_filename_component(MEDIA_PNG_FILE_NAME "${MEDIA_PNG_SOURCE_FILE}" NAME) + string(REGEX REPLACE "[^.]+.([0-9]*).*" "${CMAKE_CURRENT_BINARY_DIR}/icons/hicolor/\\1x\\1/apps/${BINARY_NAME}.png" MEDIA_PNG_BINARY_FILE "${MEDIA_PNG_FILE_NAME}") + + add_custom_command(OUTPUT ${MEDIA_PNG_BINARY_FILE} + COMMAND ${CMAKE_COMMAND} -E copy + ${MEDIA_PNG_SOURCE_FILE} + ${MEDIA_PNG_BINARY_FILE} + MAIN_DEPENDENCY ${MEDIA_PNG_SOURCE_FILE} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + COMMENT "Copying ${MEDIA_PNG_FILE_NAME} file" + ) + + list(APPEND MEDIA_BINARY_FILES ${MEDIA_PNG_BINARY_FILE}) +endforeach() + +set(MEDIA_XPM_SOURCE_FILES + ${CMAKE_CURRENT_SOURCE_DIR}/openttd.32.xpm + ${CMAKE_CURRENT_SOURCE_DIR}/openttd.64.xpm +) + +# Walk over all the xpm files, and generate a command to copy them +foreach(MEDIA_XPM_SOURCE_FILE IN LISTS MEDIA_XPM_SOURCE_FILES) + get_filename_component(MEDIA_XPM_FILE_NAME "${MEDIA_XPM_SOURCE_FILE}" NAME) + get_filename_component(MEDIA_XPM_FILE_EXT "${MEDIA_XPM_FILE_NAME}" EXT) + set(MEDIA_XPM_BINARY_FILE "${CMAKE_CURRENT_BINARY_DIR}/pixmaps/${BINARY_NAME}${MEDIA_XPM_FILE_EXT}") + + add_custom_command(OUTPUT ${MEDIA_XPM_BINARY_FILE} + COMMAND ${CMAKE_COMMAND} -E copy + ${MEDIA_XPM_SOURCE_FILE} + ${MEDIA_XPM_BINARY_FILE} + MAIN_DEPENDENCY ${MEDIA_XPM_SOURCE_FILE} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + COMMENT "Copying ${MEDIA_XPM_FILE_NAME} file" + ) + + list(APPEND MEDIA_BINARY_FILES ${MEDIA_XPM_BINARY_FILE}) +endforeach() + +# Create a new target which copies media files +add_custom_target(media_files + DEPENDS + ${MEDIA_BINARY_FILES} +) + +add_dependencies(media + media_files +) + +get_target_property(LANG_SOURCE_FILES language_files LANG_SOURCE_FILES) + +set(DESKTOP_BINARY_NAME ${BINARY_NAME}.desktop) + +add_custom_command_timestamp(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${DESKTOP_BINARY_NAME} + COMMAND ${CMAKE_COMMAND} + -DDESKTOP_SOURCE_FILE=${CMAKE_CURRENT_SOURCE_DIR}/openttd.desktop + -DDESKTOP_BINARY_FILE=${CMAKE_CURRENT_BINARY_DIR}/${DESKTOP_BINARY_NAME} + -DBINARY_NAME=${BINARY_NAME} + -P ${CMAKE_SOURCE_DIR}/cmake/scripts/Desktop.cmake + -- + ${LANG_SOURCE_FILES} + MAIN_DEPENDENCY ${CMAKE_CURRENT_SOURCE_DIR}/openttd.desktop + DEPENDS ${LANG_SOURCE_FILES} + ${CMAKE_SOURCE_DIR}/cmake/scripts/Desktop.cmake + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + COMMENT "Generating desktop file" +) + +# Create a new target which generates desktop file +add_custom_target_timestamp(desktop_file + DEPENDS + ${CMAKE_CURRENT_BINARY_DIR}/${DESKTOP_BINARY_NAME} +) + +add_dependencies(media + desktop_file +) diff --git a/media/openttd.desktop.in b/media/openttd.desktop similarity index 69% rename from media/openttd.desktop.in rename to media/openttd.desktop index 4a251114c4..e0aef004cd 100644 --- a/media/openttd.desktop.in +++ b/media/openttd.desktop @@ -2,10 +2,10 @@ [Desktop Entry] Type=Application Version=1.0 -Name=!!MENU_NAME!! -Icon=!!TTD!! -Exec=!!TTD!! +Name=OpenTTD +Icon=${BINARY_NAME} +Exec=${BINARY_NAME} Terminal=false -Categories=!!MENU_GROUP!! -Comment=A clone of Transport Tycoon Deluxe +Categories=Game; Keywords=game;simulation;transport;tycoon;deluxe;economics;multiplayer;money;train;ship;bus;truck;aircraft;cargo; +@Comment_STR_DESKTOP_SHORTCUT_COMMENT@ diff --git a/media/openttd.desktop.filter.awk b/media/openttd.desktop.filter.awk deleted file mode 100644 index 125e21b0d7..0000000000 --- a/media/openttd.desktop.filter.awk +++ /dev/null @@ -1,11 +0,0 @@ -# This file is part of OpenTTD. -# OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. -# OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . - -# -# Awk script to automatically remove duplicate Comment[i]= lines -# - -BEGIN { FS = "="; last = "" } -{ if (last != $1) { print $0 }; last = $1 } diff --git a/media/openttd.desktop.translation.awk b/media/openttd.desktop.translation.awk deleted file mode 100644 index 3187f9ddf1..0000000000 --- a/media/openttd.desktop.translation.awk +++ /dev/null @@ -1,13 +0,0 @@ -# This file is part of OpenTTD. -# OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. -# OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . - -# -# Awk script to automatically generate a comment lines for -# a translated desktop shortcut. If it does not exist there -# is no output. -# - -/##isocode/ { lang = $2; next } -/STR_DESKTOP_SHORTCUT_COMMENT/ { sub("^[^:]*:", "", $0); print "Comment[" lang "]=" $0; sub("_.*", "", lang); print "Comment[" lang "]=" $0; next}