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:
parent
7dab98b257
commit
60d9a80b6a
|
@ -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 ()
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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 ()
|
||||
|
||||
|
|
Loading…
Reference in New Issue