Improve icon generation

* Remove PNG_ICON_CROP
    * Not sure how that was supposed to be useful because even for projects
      without PNG_ICON_NO_CROP it does not make much sense
* Test multiple sizes to determine the PNG path automatically
* Locate PNG in basic config so the path is also automatically determined
  for the macOS bundle as well
* Log status message when ffmpeg/png2icns are not available
* Format CMake code more nicely
This commit is contained in:
Martchus 2020-08-11 23:12:17 +02:00
parent 7dab98b257
commit 60d9a80b6a
3 changed files with 61 additions and 45 deletions

View File

@ -60,25 +60,32 @@ set_target_properties(
LINK_SEARCH_START_STATIC ${STATIC_LINKAGE} LINK_SEARCH_END_STATIC ${STATIC_LINKAGE} AUTOGEN_TARGET_DEPENDS
"${AUTOGEN_DEPS}")
if ("${GUI_TYPE}" STREQUAL "MACOSX_BUNDLE")
# set properties for macOS bundle and generate icon for macOS bundle
if (GUI_TYPE STREQUAL "MACOSX_BUNDLE")
set_target_properties(
${META_TARGET_NAME}
PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME ${META_TARGET_NAME} MACOSX_BUNDLE_GUI_IDENTIFIER ${META_TARGET_NAME}
MACOSX_BUNDLE_BUNDLE_VERSION ${META_APP_VERSION} MACOSX_BUNDLE_LONG_VERSION_STRING ${META_APP_VERSION}
MACOSX_BUNDLE_SHORT_VERSION_STRING ${META_APP_VERSION})
find_program(PNG2ICNS_BIN png2icns)
if (PNG2ICNS_BIN AND EXISTS "${PNG_ICON_PATH}")
set(RESOURCES_DIR "${CMAKE_CURRENT_BINARY_DIR}/${META_TARGET_NAME}.app/Contents/Resources")
set(MACOSX_ICON_PATH "${RESOURCES_DIR}/${META_PROJECT_NAME}.icns")
add_custom_command(
OUTPUT "${MACOSX_ICON_PATH}"
COMMAND "${CMAKE_COMMAND}" -E make_directory "${RESOURCES_DIR}"
COMMAND ${PNG2ICNS_BIN} "${MACOSX_ICON_PATH}" "${PNG_ICON_PATH}"
DEPENDS "${PNG_ICON_PATH}")
message(STATUS "Generating macOS icon from \"${PNG_ICON_PATH}\" via ${PNG2ICNS_BIN}.")
set_target_properties(${META_TARGET_NAME} PROPERTIES MACOSX_BUNDLE_ICON_FILE ${META_PROJECT_NAME}.icns)
target_sources(${META_TARGET_NAME} PRIVATE "${MACOSX_ICON_PATH}")
"${META_TARGET_NAME}"
PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "${META_TARGET_NAME}"
MACOSX_BUNDLE_GUI_IDENTIFIER "${META_TARGET_NAME}"
MACOSX_BUNDLE_BUNDLE_VERSION "${META_APP_VERSION}"
MACOSX_BUNDLE_LONG_VERSION_STRING "${META_APP_VERSION}"
MACOSX_BUNDLE_SHORT_VERSION_STRING "${META_APP_VERSION}")
if (PNG_ICON_PATH)
find_program(PNG2ICNS_BIN png2icns)
if (PNG2ICNS_BIN)
set(RESOURCES_DIR "${CMAKE_CURRENT_BINARY_DIR}/${META_TARGET_NAME}.app/Contents/Resources")
set(MACOSX_ICON_PATH "${RESOURCES_DIR}/${META_PROJECT_NAME}.icns")
add_custom_command(
COMMENT "Generating icon for macOS bundle"
OUTPUT "${MACOSX_ICON_PATH}"
COMMAND "${CMAKE_COMMAND}" -E make_directory "${RESOURCES_DIR}"
COMMAND ${PNG2ICNS_BIN} "${MACOSX_ICON_PATH}" "${PNG_ICON_PATH}"
DEPENDS "${PNG_ICON_PATH}")
message(STATUS "Generating macOS icon from \"${PNG_ICON_PATH}\" via ${PNG2ICNS_BIN}.")
set_target_properties(${META_TARGET_NAME} PROPERTIES MACOSX_BUNDLE_ICON_FILE ${META_PROJECT_NAME}.icns)
target_sources(${META_TARGET_NAME} PRIVATE "${MACOSX_ICON_PATH}")
else ()
message(STATUS "Unable to find png2icns, not creating a macOS bundle icon")
endif ()
endif ()
endif ()

View File

@ -587,4 +587,28 @@ function (append_user_defined_additional_libraries)
PARENT_SCOPE)
endfunction ()
# locate PNG icon which used for generating icons for the Windows executable and the macOS bundle
if (PNG_ICON_PATH)
if (NOT EXISTS "${PNG_ICON_PATH}")
message(FATAL_ERROR "The specified PNG_ICON_PATH \"${PNG_ICON_PATH}\" is invalid.")
endif ()
else ()
if (PNG_ICON_SIZE)
set(PNG_ICON_SIZES_TO_TEST "${PNG_ICON_SIZE}")
else ()
set(PNG_ICON_SIZES_TO_TEST 256 128 64 32 16)
endif ()
foreach (POSSIBLE_PNG_ICON_SIZE ${PNG_ICON_SIZES_TO_TEST})
set(PNG_ICON_PATH
"${CMAKE_CURRENT_SOURCE_DIR}/resources/icons/hicolor/${POSSIBLE_PNG_ICON_SIZE}x${POSSIBLE_PNG_ICON_SIZE}/apps/${META_PROJECT_NAME}.png"
)
if (EXISTS "${PNG_ICON_PATH}")
set(PNG_ICON_SIZE "${POSSIBLE_PNG_ICON_SIZE}")
message(STATUS "Using PNG icon from \"${PNG_ICON_PATH}\".")
break()
endif ()
unset(PNG_ICON_PATH)
endforeach ()
endif ()
set(BASIC_PROJECT_CONFIG_DONE YES)

View File

@ -25,35 +25,20 @@ set(WINDOWS_RC_FILE "${CMAKE_CURRENT_BINARY_DIR}/resources/windows")
# create Windows icon from png with ffmpeg if available
unset(WINDOWS_ICON_PATH)
unset(WINDOWS_ICON_RC_ENTRY)
if (WINDOWS_ICON_ENABLED)
if (WINDOWS_ICON_ENABLED AND PNG_ICON_PATH)
find_program(FFMPEG_BIN ffmpeg avconv)
if (FFMPEG_BIN)
if (NOT PNG_ICON_PATH)
set(PNG_ICON_PATH "${CMAKE_CURRENT_SOURCE_DIR}/resources/icons/hicolor/128x128/apps/${META_PROJECT_NAME}.png")
set(USING_DEFAULT_PNG_ICON_PATH true)
endif ()
if (PNG_ICON_NO_CROP)
unset(PNG_ICON_CROP)
elseif (NOT PNG_ICON_CROP)
# default cropping
set(PNG_ICON_CROP "iw-20:ih-20:10:10")
endif ()
if (NOT WINDOWS_ICON_SIZE)
set (WINDOWS_ICON_SIZE "256:256")
endif ()
if (EXISTS "${PNG_ICON_PATH}")
set(WINDOWS_ICON_PATH "${CMAKE_CURRENT_BINARY_DIR}/resources/${META_PROJECT_NAME}.ico")
set(WINDOWS_ICON_RC_ENTRY "IDI_ICON1 ICON DISCARDABLE \"${WINDOWS_ICON_PATH}\"")
add_custom_command(
OUTPUT "${WINDOWS_ICON_PATH}"
COMMAND ${FFMPEG_BIN} -y -i "${PNG_ICON_PATH}" -vf "crop=${PNG_ICON_CROP},scale=${WINDOWS_ICON_SIZE}" "${WINDOWS_ICON_PATH}"
DEPENDS "${PNG_ICON_PATH}")
set_source_files_properties("${WINDOWS_RC_FILE}" PROPERTIES OBJECT_DEPENDS "${WINDOWS_ICON_PATH}")
message(STATUS "Generating Windows icon from \"${PNG_ICON_PATH}\" via ${FFMPEG_BIN}.")
elseif (NOT USING_DEFAULT_PNG_ICON_PATH)
message(FATAL_ERROR "The specified PNG_ICON_PATH \"${PNG_ICON_PATH}\" is invalid.")
endif ()
unset(USING_DEFAULT_PNG_ICON_PATH)
set(WINDOWS_ICON_PATH "${CMAKE_CURRENT_BINARY_DIR}/resources/${META_PROJECT_NAME}.ico")
set(WINDOWS_ICON_RC_ENTRY "IDI_ICON1 ICON DISCARDABLE \"${WINDOWS_ICON_PATH}\"")
add_custom_command(
COMMENT "Generating icon for Windows executable"
OUTPUT "${WINDOWS_ICON_PATH}"
COMMAND ${FFMPEG_BIN} -y -i "${PNG_ICON_PATH}" "${WINDOWS_ICON_PATH}"
DEPENDS "${PNG_ICON_PATH}")
set_source_files_properties("${WINDOWS_RC_FILE}" PROPERTIES OBJECT_DEPENDS "${WINDOWS_ICON_PATH}")
message(STATUS "Generating Windows icon from \"${PNG_ICON_PATH}\" via ${FFMPEG_BIN}.")
else ()
message(STATUS "Unable to find ffmpeg, not creating a Windows icon")
endif ()
endif ()