cpp-utilities/cmake/modules/AppTarget.cmake

198 lines
8.3 KiB
CMake
Raw Normal View History

2020-01-10 17:58:41 +01:00
cmake_minimum_required(VERSION 3.3.0 FATAL_ERROR)
2019-02-06 17:30:52 +01:00
if (NOT BASIC_PROJECT_CONFIG_DONE)
2017-02-11 02:30:46 +01:00
message(FATAL_ERROR "Before including the AppTarget module, the BasicConfig module must be included.")
2019-02-06 17:30:52 +01:00
endif ()
if (TARGET_CONFIG_DONE)
2017-02-11 02:30:46 +01:00
message(FATAL_ERROR "Can not include AppTarget module when targets are already configured.")
2019-02-06 17:30:52 +01:00
endif ()
# check whether project type is set correctly
2019-02-06 17:30:52 +01:00
if (NOT "${META_PROJECT_TYPE}" STREQUAL "application")
message(
FATAL_ERROR
"The AppTarget CMake module is intended to be used for building application projects only (and not for libraries)."
2019-11-30 17:58:01 +01:00
)
2019-02-06 17:30:52 +01:00
endif ()
# define relevant files
2019-02-06 17:30:52 +01:00
set(ALL_FILES
${HEADER_FILES}
${SRC_FILES}
${GENERATED_DBUS_FILES}
${WIDGETS_FILES}
${QML_FILES}
${RES_FILES}
${WINDOWS_ICON_PATH})
if (NOT BUILTIN_TRANSLATIONS)
list(APPEND ALL_FILES ${QM_FILES})
2019-02-06 17:30:52 +01:00
endif ()
# add custom libraries
append_user_defined_additional_libraries()
# add target for building the application
if (ANDROID)
# create a shared library which can be loaded from the Java-side, needs to be a module target to avoid
# "QT_ANDROID_GENERATE_DEPLOYMENT_SETTINGS only works on Module targets" when using
# `qt_android_generate_deployment_settings`.
add_library(${META_TARGET_NAME} MODULE ${ALL_FILES})
# set suffix to avoid "Cannot find application binary in build dir …/lib…_arm64-v8a.so." when using
# `qt_android_add_apk_target`.
if (ANDROID_ABI)
set_target_properties(${META_TARGET_NAME} PROPERTIES SUFFIX "_${ANDROID_ABI}.so")
endif ()
set_target_properties(${META_TARGET_NAME} PROPERTIES QT_ANDROID_VERSION_NAME "${META_VERSION_MAJOR}.${META_VERSION_MINOR}.${META_VERSION_PATCH}")
else ()
2019-04-22 22:19:08 +02:00
add_executable(${META_TARGET_NAME} ${GUI_TYPE} ${ALL_FILES})
2019-02-06 17:30:52 +01:00
endif ()
2019-11-30 17:58:01 +01:00
target_link_libraries(
${META_TARGET_NAME}
PUBLIC ${META_ADDITIONAL_LINK_FLAGS} "${PUBLIC_LIBRARIES}"
PRIVATE "${PRIVATE_LIBRARIES}")
target_include_directories(
${META_TARGET_NAME}
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> ${PUBLIC_INCLUDE_DIRS}
PRIVATE "${PRIVATE_INCLUDE_DIRS}")
2019-12-27 01:45:30 +01:00
target_compile_definitions(
${META_TARGET_NAME}
PUBLIC "${META_PUBLIC_COMPILE_DEFINITIONS}"
PRIVATE "${META_PRIVATE_COMPILE_DEFINITIONS}")
2019-11-30 17:58:01 +01:00
target_compile_options(
${META_TARGET_NAME}
PUBLIC "${META_PUBLIC_COMPILE_OPTIONS}"
PRIVATE "${META_PRIVATE_COMPILE_OPTIONS}")
set_target_properties(
${META_TARGET_NAME}
PROPERTIES C_VISIBILITY_PRESET hidden
2020-10-10 01:07:06 +02:00
CXX_VISIBILITY_PRESET hidden
LINK_SEARCH_START_STATIC ${STATIC_LINKAGE}
LINK_SEARCH_END_STATIC ${STATIC_LINKAGE}
AUTOGEN_TARGET_DEPENDS "${AUTOGEN_DEPS}"
QT_DEFAULT_PLUGINS "${META_QT_DEFAULT_PLUGINS}")
if (NOT META_CXX_STANDARD STREQUAL "any")
2022-12-24 23:15:47 +01:00
set_target_properties(${META_TARGET_NAME} PROPERTIES CXX_STANDARD "${META_CXX_STANDARD}")
endif ()
# set properties for macOS bundle and generate icon for macOS bundle
if (GUI_TYPE STREQUAL "MACOSX_BUNDLE")
2019-11-30 17:58:01 +01:00
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}")
if (MACOSX_ICON_PATH)
target_sources(${META_TARGET_NAME} PRIVATE "${MACOSX_ICON_PATH}")
elseif (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 ()
2019-08-06 00:02:38 +02:00
endif ()
# add install targets
2019-02-06 17:30:52 +01:00
if (NOT META_NO_INSTALL_TARGETS AND ENABLE_INSTALL_TARGETS)
# add install target for binary
2019-02-06 17:30:52 +01:00
if (APPLE)
2019-11-30 17:58:01 +01:00
set(BUNDLE_INSTALL_DESTINATION
"${CMAKE_INSTALL_BINDIR}"
2019-11-30 17:58:01 +01:00
CACHE STRING "specifies the install destination for bundles")
install(
TARGETS ${META_TARGET_NAME}
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
2019-11-30 17:58:01 +01:00
BUNDLE DESTINATION "${BUNDLE_INSTALL_DESTINATION}" COMPONENT binary)
2019-02-06 17:30:52 +01:00
elseif (ANDROID)
2019-11-30 17:58:01 +01:00
install(
TARGETS ${META_TARGET_NAME}
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT binary
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}${SELECTED_LIB_SUFFIX}" COMPONENT binary
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}${SELECTED_LIB_SUFFIX}" COMPONENT binary)
2019-02-06 17:30:52 +01:00
else ()
2019-04-22 22:19:08 +02:00
install(TARGETS ${META_TARGET_NAME} RUNTIME DESTINATION bin COMPONENT binary)
2019-02-06 17:30:52 +01:00
endif ()
2019-02-06 17:30:52 +01:00
if (NOT TARGET install-binary)
2019-11-30 17:58:01 +01:00
add_custom_target(install-binary COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=binary -P
"${CMAKE_BINARY_DIR}/cmake_install.cmake")
2019-02-06 17:30:52 +01:00
endif ()
2019-04-22 22:19:08 +02:00
add_dependencies(install-binary ${META_TARGET_NAME})
2017-08-31 02:14:09 +02:00
# add mingw-w64 specific install target
2019-02-06 17:30:52 +01:00
if (NOT TARGET install-mingw-w64)
add_custom_target(install-mingw-w64)
add_dependencies(install-mingw-w64 install-binary)
2019-02-06 17:30:52 +01:00
endif ()
2019-04-22 22:19:08 +02:00
add_dependencies(install-mingw-w64 ${META_TARGET_NAME})
# add install target for desktop entries and icons
2019-02-06 17:30:52 +01:00
foreach (DESKTOP_FILE ${DESKTOP_FILES})
2019-11-30 17:58:01 +01:00
install(
FILES "${DESKTOP_FILE}"
DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/applications"
2019-11-30 17:58:01 +01:00
COMPONENT desktop)
2019-02-06 17:30:52 +01:00
endforeach ()
2019-02-06 17:30:52 +01:00
foreach (ICON_FILE ${ICON_FILES})
get_filename_component(ICON_FILE_NAME "${ICON_FILE}" NAME_WE)
get_filename_component(ICON_FILE_EXT "${ICON_FILE}" EXT)
2019-11-30 17:58:01 +01:00
install(
FILES "${ICON_FILE}"
2021-10-01 00:47:41 +02:00
RENAME "${NAMESPACE_PREFIX}${ICON_FILE_NAME}${META_CONFIG_SUFFIX}${ICON_FILE_EXT}"
DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/scalable/apps"
2019-11-30 17:58:01 +01:00
COMPONENT desktop)
2019-02-06 17:30:52 +01:00
endforeach ()
if (NOT TARGET install-desktop)
2019-11-30 17:58:01 +01:00
add_custom_target(install-desktop COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=desktop -P
"${CMAKE_BINARY_DIR}/cmake_install.cmake")
2019-02-06 17:30:52 +01:00
endif ()
2019-04-22 22:19:08 +02:00
add_dependencies(install-desktop ${META_TARGET_NAME})
2019-02-06 17:30:52 +01:00
if (NOT TARGET install-appimage)
2019-11-30 17:58:01 +01:00
add_custom_target(install-appimage COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=appimage -P
"${CMAKE_BINARY_DIR}/cmake_install.cmake")
2019-02-06 17:30:52 +01:00
endif ()
2019-04-22 22:19:08 +02:00
add_dependencies(install-appimage ${META_TARGET_NAME})
# add install target for stripped binaries
2019-02-06 17:30:52 +01:00
if (NOT TARGET install-binary-strip)
2019-11-30 17:58:01 +01:00
add_custom_target(
install-binary-strip COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_DO_STRIP=1 -DCMAKE_INSTALL_COMPONENT=binary -P
"${CMAKE_BINARY_DIR}/cmake_install.cmake")
2019-02-06 17:30:52 +01:00
endif ()
2019-04-22 22:19:08 +02:00
add_dependencies(install-binary-strip ${META_TARGET_NAME})
2017-08-31 02:14:09 +02:00
# add mingw-w64 specific install targets
2019-02-06 17:30:52 +01:00
if (MINGW)
if (NOT TARGET install-mingw-w64)
add_custom_target(install-mingw-w64)
add_dependencies(install-mingw-w64 install-binary)
2019-02-06 17:30:52 +01:00
endif ()
if (NOT TARGET install-mingw-w64-strip)
add_custom_target(install-mingw-w64-strip)
add_dependencies(install-mingw-w64-strip install-binary-strip)
2019-02-06 17:30:52 +01:00
endif ()
if (LOCALIZATION_TARGET)
add_dependencies(install-mingw-w64 ${LOCALIZATION_TARGET})
add_dependencies(install-mingw-w64-strip ${LOCALIZATION_TARGET})
2019-02-06 17:30:52 +01:00
endif ()
endif ()
endif ()
include(AppUtilities)
2017-02-11 02:30:46 +01:00
set(TARGET_CONFIG_DONE YES)