AusweisApp2/cmake/Install.cmake

339 lines
15 KiB
CMake

################################################
# Implements install target!
# It will be included by ./src/CMakeLists.txt
################################################
SET(TRANSLATION_DESTINATION translations)
SET(DEFAULT_FILE_DESTINATION .)
IF(CMAKE_PREFIX_PATH)
STRING(REPLACE "\\" "/" TOOLCHAIN_PATH ${CMAKE_PREFIX_PATH})
SET(TOOLCHAIN_BIN_PATH ${TOOLCHAIN_PATH}/bin)
SET(TOOLCHAIN_LIB_PATH ${TOOLCHAIN_PATH}/lib)
ENDIF()
SET(SEARCH_ADDITIONAL_DIRS "
SET(CMAKE_MODULE_PATH \"${CMAKE_MODULE_PATH}\")
INCLUDE(Helper)
DIRLIST_OF_FILES(ADDITIONAL_DIRS ${CMAKE_BINARY_DIR}/src/*${CMAKE_SHARED_LIBRARY_SUFFIX})
")
SET(DEPENDENCY_CHECK "
FUNCTION(gp_resolved_file_type_override file type)
MESSAGE(STATUS \"Collect dependency: \${file}\")
IF(file MATCHES \"libstdc.+\.dll\"
OR file MATCHES \"libwinpthread-.+\.dll\"
OR file MATCHES \"libgcc_s_.+\.dll\"
OR file MATCHES \"libssp-.+\.dll\")
get_filename_component(path \"${CMAKE_CXX_COMPILER}\" DIRECTORY)
get_filename_component(pathDest \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}\" DIRECTORY)
IF(NOT file MATCHES \"\${path}\" AND NOT file MATCHES \"\${pathDest}\")
MESSAGE(FATAL_ERROR \"Wrong source path detected: \${file} | Should be: \${path} or \${pathDest}\")
ENDIF()
ENDIF()
ENDFUNCTION()
")
IF(WIN32)
IF(MSVC OR CMAKE_CXX_SIMULATE_ID STREQUAL "MSVC")
SET(CMAKE_INSTALL_SYSTEM_RUNTIME_DESTINATION .)
SET(CMAKE_INSTALL_UCRT_LIBRARIES TRUE)
INCLUDE(InstallRequiredSystemLibraries)
ENDIF()
IF(TARGET Qt5::Qml)
FETCH_TARGET_LOCATION(libEgl "Qt5::Gui_EGL")
FETCH_TARGET_LOCATION(libGLES "Qt5::Gui_GLESv2")
FETCH_TARGET_LOCATION(libQuickControls2 "Qt5::QuickControls2")
INSTALL(FILES ${libQuickControls2} DESTINATION . COMPONENT Runtime)
INSTALL(FILES ${libEgl} DESTINATION . COMPONENT Runtime)
INSTALL(FILES ${libGLES} DESTINATION . COMPONENT Runtime)
ENDIF()
FETCH_TARGET_LOCATION(libSvg "Qt5::Svg")
FETCH_TARGET_LOCATION(pluginSvg "Qt5::QSvgPlugin")
FETCH_TARGET_LOCATION(pluginGif "Qt5::QGifPlugin")
FETCH_TARGET_LOCATION(pluginJpeg "Qt5::QJpegPlugin")
IF(WINDOWS_STORE)
FETCH_TARGET_LOCATION(platformWin "Qt5::QWinRTIntegrationPlugin")
ELSE()
FETCH_TARGET_LOCATION(platformWin "Qt5::QWindowsIntegrationPlugin")
ENDIF()
FETCH_TARGET_LOCATION(styleVista "Qt5::QWindowsVistaStylePlugin")
INSTALL(TARGETS AusweisApp DESTINATION . COMPONENT Application)
INSTALL(FILES ${libSvg} DESTINATION . COMPONENT Runtime)
INSTALL(FILES ${pluginSvg} DESTINATION imageformats COMPONENT Runtime)
INSTALL(FILES ${pluginGif} DESTINATION imageformats COMPONENT Runtime)
INSTALL(FILES ${pluginJpeg} DESTINATION imageformats COMPONENT Runtime)
INSTALL(FILES ${platformWin} DESTINATION platforms COMPONENT Runtime)
INSTALL(FILES ${styleVista} DESTINATION styles COMPONENT Runtime)
INSTALL(CODE
"
${DEPENDENCY_CHECK}
${SEARCH_ADDITIONAL_DIRS}
INCLUDE(BundleUtilities)
FIXUP_BUNDLE(\"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${PROJECT_NAME}${CMAKE_EXECUTABLE_SUFFIX}\" \"${libQuickControls2}\" \"${TOOLCHAIN_BIN_PATH};\${ADDITIONAL_DIRS}\")
" COMPONENT Runtime)
ELSEIF(APPLE AND NOT IOS)
SET(MACOS_BUNDLE_MACOS_DIR ../MacOS)
SET(MACOS_BUNDLE_PLUGINS_DIR ../PlugIns)
SET(MACOS_BUNDLE_FRAMEWORKS_DIR ../Frameworks)
SET(MACOS_BUNDLE_RESOURCES_DIR ../Resources)
SET(MACOS_BUNDLE_LOGIN_ITEMS_DIR ../Library/LoginItems)
# We need to include the following (i.e. all) image format plug-ins,
# since those seem to be loaded upon program start-up. Not including
# them would cause the respective add-on from a Qt installation (if
# any) to be loaded, which would in turn cause the Qt libraries they
# depend on to be loaded as well, thus resulting in two sets of Qt
# libraries being loaded (ours from the bundle and the ones from the
# installation) and the program misbehaving (crashing).
FOREACH (qtComponent QtCore Qt5Gui Qt5Network Qt5Svg Qt5Widgets)
FOREACH(plugin ${${qtComponent}_PLUGINS})
GET_TARGET_PROPERTY(pluginPath ${plugin} LOCATION)
GET_FILENAME_COMPONENT(pluginDir ${pluginPath} DIRECTORY)
GET_FILENAME_COMPONENT(pluginName ${pluginPath} NAME)
GET_FILENAME_COMPONENT(pluginDirName ${pluginDir} NAME)
IF(pluginDirName STREQUAL "platforms" AND NOT plugin STREQUAL "Qt5::QCocoaIntegrationPlugin")
CONTINUE()
ENDIF()
INSTALL(FILES ${pluginPath} DESTINATION ${MACOS_BUNDLE_PLUGINS_DIR}/${pluginDirName} COMPONENT Runtime)
LIST(APPEND ADDITIONAL_BUNDLE_FILES_TO_SIGN "/Contents/PlugIns/${pluginDirName}/${pluginName}")
ENDFOREACH()
ENDFOREACH()
IF(TARGET Qt5::Qml)
FOREACH(entry QtQuick QtQuick.2 QtQml QtGraphicalEffects Qt)
SET(_dir "${QT_HOST_PREFIX}/qml")
FILE(GLOB_RECURSE DYLIB "${_dir}/${entry}/*.dylib")
FOREACH(_lib ${DYLIB})
FILE(RELATIVE_PATH _lib_dest "${_dir}" "${_lib}")
IF(NOT _lib_dest MATCHES "XmlListModel|Particles.2|LocalStorage") # blacklist not needed stuff
GET_FILENAME_COMPONENT(_lib_dest_dir ${_lib_dest} DIRECTORY)
INSTALL(FILES ${_lib} DESTINATION ${MACOS_BUNDLE_RESOURCES_DIR}/qml/${_lib_dest_dir} COMPONENT Runtime)
LIST(APPEND ADDITIONAL_BUNDLE_FILES_TO_SIGN "/Contents/Resources/qml/${_lib_dest}")
ENDIF()
ENDFOREACH()
ENDFOREACH()
ENDIF()
INSTALL(TARGETS AusweisApp DESTINATION ${MACOS_BUNDLE_MACOS_DIR} COMPONENT Application)
INSTALL(TARGETS AusweisApp2AutostartHelper DESTINATION ${MACOS_BUNDLE_LOGIN_ITEMS_DIR} COMPONENT Application)
INSTALL(CODE
"
${DEPENDENCY_CHECK}
${SEARCH_ADDITIONAL_DIRS}
file(GLOB_RECURSE QTPLUGINS \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${MACOS_BUNDLE_PLUGINS_DIR}/*${CMAKE_SHARED_LIBRARY_SUFFIX}\")
file(GLOB_RECURSE QtQuickPLUGINS \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${MACOS_BUNDLE_RESOURCES_DIR}/*${CMAKE_SHARED_LIBRARY_SUFFIX}\")
INCLUDE(BundleUtilities)
FIXUP_BUNDLE(\"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${MACOS_BUNDLE_MACOS_DIR}/${PROJECT_NAME}\" \"\${QTPLUGINS};\${QtQuickPLUGINS}\" \"${TOOLCHAIN_LIB_PATH};\${ADDITIONAL_DIRS}\")
" COMPONENT Runtime)
LIST(APPEND ADDITIONAL_BUNDLE_FILES_TO_SIGN "/Contents/Library/LoginItems/AusweisApp2AutostartHelper.app/Contents/MacOS/AusweisApp2AutostartHelper")
LIST(APPEND ADDITIONAL_BUNDLE_FILES_TO_SIGN "/Contents/Library/LoginItems/AusweisApp2AutostartHelper.app")
LIST(APPEND ADDITIONAL_BUNDLE_FILES_TO_SIGN "/Contents/Frameworks/QtCore.framework")
LIST(APPEND ADDITIONAL_BUNDLE_FILES_TO_SIGN "/Contents/Frameworks/QtGui.framework")
LIST(APPEND ADDITIONAL_BUNDLE_FILES_TO_SIGN "/Contents/Frameworks/QtNetwork.framework")
LIST(APPEND ADDITIONAL_BUNDLE_FILES_TO_SIGN "/Contents/Frameworks/QtSvg.framework")
LIST(APPEND ADDITIONAL_BUNDLE_FILES_TO_SIGN "/Contents/Frameworks/QtWidgets.framework")
LIST(APPEND ADDITIONAL_BUNDLE_FILES_TO_SIGN "/Contents/Frameworks/QtWebSockets.framework")
LIST(APPEND ADDITIONAL_BUNDLE_FILES_TO_SIGN "/Contents/Frameworks/QtConcurrent.framework")
IF(TARGET Qt5::Qml)
LIST(APPEND ADDITIONAL_BUNDLE_FILES_TO_SIGN "/Contents/Frameworks/QtQml.framework")
LIST(APPEND ADDITIONAL_BUNDLE_FILES_TO_SIGN "/Contents/Frameworks/QtQuick.framework")
LIST(APPEND ADDITIONAL_BUNDLE_FILES_TO_SIGN "/Contents/Frameworks/QtQuickControls2.framework")
LIST(APPEND ADDITIONAL_BUNDLE_FILES_TO_SIGN "/Contents/Frameworks/QtQuickTemplates2.framework")
IF(NOT "${Qt5Core_VERSION}" VERSION_LESS "5.12")
LIST(APPEND ADDITIONAL_BUNDLE_FILES_TO_SIGN "/Contents/Frameworks/QtQuickShapes.framework")
ENDIF()
ENDIF()
IF(TARGET Qt5::Bluetooth)
LIST(APPEND ADDITIONAL_BUNDLE_FILES_TO_SIGN "/Contents/Frameworks/QtBluetooth.framework")
ENDIF()
FETCH_TARGET_LOCATION(opensslCryptoName "OpenSSL::Crypto" NAME)
FETCH_TARGET_LOCATION(opensslSslName "OpenSSL::SSL" NAME)
IF(CMAKE_VERSION VERSION_LESS "3.13")
SET(OPENSSL_LIB_LOCATION "/Contents/MacOS")
ELSE()
SET(OPENSSL_LIB_LOCATION "/Contents/Frameworks")
ENDIF()
LIST(APPEND ADDITIONAL_BUNDLE_FILES_TO_SIGN "${OPENSSL_LIB_LOCATION}/${opensslCryptoName}")
LIST(APPEND ADDITIONAL_BUNDLE_FILES_TO_SIGN "${OPENSSL_LIB_LOCATION}/${opensslSslName}")
# set it to parent scope to be able to access it from Packaging.cmake
SET(ADDITIONAL_BUNDLE_FILES_TO_SIGN ${ADDITIONAL_BUNDLE_FILES_TO_SIGN} PARENT_SCOPE)
ELSEIF(IOS)
LIST(APPEND CMAKE_MODULE_PATH "${PACKAGING_DIR}/ios")
ELSEIF(ANDROID)
SET(ANDROID_PACKAGE_SRC_DIR ${PROJECT_BINARY_DIR}/package-src-dir)
SET(ANDROID_DEST libs/${CMAKE_ANDROID_ARCH_ABI})
SET(PERMISSIONS PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
INSTALL(TARGETS AusweisApp DESTINATION ${ANDROID_DEST} ${PERMISSIONS} COMPONENT Application)
SET(RESOURCES_IMG_ANDROID_DIR ${RESOURCES_DIR}/images/android)
IF(BUILD_PREVIEW)
SET(ANDROID_LAUNCHER_ICON "npa_preview.png")
SET(ANDROID_PACKAGE_NAME "com.governikus.ausweisapp2.dev")
ELSEIF(IS_DEVELOPER_VERSION)
SET(ANDROID_LAUNCHER_ICON "npa_beta.png")
SET(ANDROID_PACKAGE_NAME "com.governikus.ausweisapp2")
ELSE()
SET(ANDROID_LAUNCHER_ICON "npa.png")
SET(ANDROID_PACKAGE_NAME "com.governikus.ausweisapp2")
ENDIF()
IF(ANDROID_BUILD_AAR)
SET(ANDROID_MANIFEST AndroidManifest.xml.aar.in)
FOREACH(entry network/WifiInfo ui/aidl/AidlBinder activation/intent/AusweisApp2Service)
SET(_java_file "${SRC_DIR}/${entry}.java")
IF(NOT EXISTS "${_java_file}")
MESSAGE(FATAL_ERROR "Cannot find file: ${_java_file}")
ENDIF()
LIST(APPEND JAVA_FILES "${_java_file}")
ENDFOREACH()
INSTALL(FILES ${PACKAGING_DIR}/android/res/values/strings.xml DESTINATION ${ANDROID_PACKAGE_SRC_DIR}/res/values COMPONENT Runtime)
ELSE()
SET(ANDROID_MANIFEST AndroidManifest.xml.apk.in)
FOREACH(entry ldpi mdpi hdpi xhdpi xxhdpi xxxhdpi)
INSTALL(FILES ${RESOURCES_IMG_ANDROID_DIR}/${entry}/background_npa.png DESTINATION ${ANDROID_PACKAGE_SRC_DIR}/res/mipmap-${entry} COMPONENT Runtime RENAME npa_background.png)
INSTALL(FILES ${RESOURCES_IMG_ANDROID_DIR}/${entry}/foreground_${ANDROID_LAUNCHER_ICON} DESTINATION ${ANDROID_PACKAGE_SRC_DIR}/res/mipmap-${entry} COMPONENT Runtime RENAME npa_foreground.png)
INSTALL(FILES ${RESOURCES_IMG_ANDROID_DIR}/${entry}/${ANDROID_LAUNCHER_ICON} DESTINATION ${ANDROID_PACKAGE_SRC_DIR}/res/mipmap-${entry} COMPONENT Runtime RENAME npa.png)
ENDFOREACH()
INSTALL(DIRECTORY ${PACKAGING_DIR}/android/res DESTINATION ${ANDROID_PACKAGE_SRC_DIR} COMPONENT Runtime)
FILE(GLOB_RECURSE JAVA_FILES "${SRC_DIR}/*.java")
ENDIF()
INSTALL(FILES ${JAVA_FILES} DESTINATION ${ANDROID_PACKAGE_SRC_DIR}/src COMPONENT Runtime)
INSTALL(FILES ${PACKAGING_DIR}/android/IAusweisApp2Sdk.aidl DESTINATION ${ANDROID_PACKAGE_SRC_DIR}/src/com/governikus/ausweisapp2/ COMPONENT Runtime)
INSTALL(FILES ${PACKAGING_DIR}/android/IAusweisApp2SdkCallback.aidl DESTINATION ${ANDROID_PACKAGE_SRC_DIR}/src/com/governikus/ausweisapp2/ COMPONENT Runtime)
IF(VERSION_DVCS)
SET(ANDROID_VERSION_NAME ${VERSION_DVCS})
ELSE()
SET(ANDROID_VERSION_NAME ${PROJECT_VERSION})
ENDIF()
CONFIGURE_FILE(${PACKAGING_DIR}/android/${ANDROID_MANIFEST} ${ANDROID_PACKAGE_SRC_DIR}/AndroidManifest.xml @ONLY)
CONFIGURE_FILE(${PACKAGING_DIR}/android/backup_rules.xml ${ANDROID_PACKAGE_SRC_DIR}/res/xml/backup_rules.xml COPYONLY)
IF(NOT ANDROID_BUILD_AAR)
CONFIGURE_FILE(${PACKAGING_DIR}/android/fileprovider.xml ${ANDROID_PACKAGE_SRC_DIR}/res/xml/fileprovider.xml COPYONLY)
ENDIF()
SET(ANDROID_APP_BINARY "${CMAKE_INSTALL_PREFIX}/${ANDROID_DEST}/libAusweisApp2.so")
SET(SYMBOL_FOLDER "${CMAKE_BINARY_DIR}/debug.symbols/${CMAKE_ANDROID_ARCH_ABI}")
SET(ANDROID_APP_SYMBOLS "${SYMBOL_FOLDER}/libAusweisApp2.so")
INSTALL(CODE
"
EXECUTE_PROCESS(COMMAND \"${CMAKE_COMMAND}\" -E make_directory \"${SYMBOL_FOLDER}\")
EXECUTE_PROCESS(COMMAND \"${CMAKE_OBJCOPY}\" \"--only-keep-debug\" \"${ANDROID_APP_BINARY}\" \"${ANDROID_APP_SYMBOLS}\")
" COMPONENT Runtime CONFIGURATIONS RelWithDebInfo)
IF(CMAKE_COMPILER_IS_GNUCXX)
SET(ANDROID_STL_PATH gnu-libstdc++/${CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION})
ELSE()
SET(ANDROID_STL_PATH llvm-libc++)
ENDIF()
SET(ANDROID_DEPLOYMENT_SETTINGS ${PROJECT_BINARY_DIR}/libAusweisApp2.so-deployment-settings.json CACHE INTERNAL "apk deployment" FORCE)
CONFIGURE_FILE(${PACKAGING_DIR}/android/libAusweisApp2.so-deployment-settings.json.in ${ANDROID_DEPLOYMENT_SETTINGS} @ONLY)
SET(TRANSLATION_DESTINATION ${ANDROID_PACKAGE_SRC_DIR}/assets/translations)
SET(DEFAULT_FILE_DESTINATION ${ANDROID_PACKAGE_SRC_DIR}/assets)
ELSEIF(UNIX)
IF(BUILD_SHARED_LIBS)
SET(CMAKE_INSTALL_RPATH "\$ORIGIN")
ENDIF()
SET(DEFAULT_FILE_DESTINATION bin)
INSTALL(TARGETS AusweisApp DESTINATION ${DEFAULT_FILE_DESTINATION} COMPONENT Application)
INSTALL(CODE
"
${DEPENDENCY_CHECK}
${SEARCH_ADDITIONAL_DIRS}
INCLUDE(BundleUtilities)
FIXUP_BUNDLE(\"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${DEFAULT_FILE_DESTINATION}/${PROJECT_NAME}\" \"\" \"\${ADDITIONAL_DIRS}\")
" COMPONENT Runtime)
CONFIGURE_FILE(${PACKAGING_DIR}/linux/AusweisApp2.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/AusweisApp2.desktop @ONLY)
INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/AusweisApp2.desktop DESTINATION share/applications COMPONENT Application)
#INSTALL(FILES ${RESOURCES_DIR}/images/AusweisApp2.svg DESTINATION share/icons/hicolor/scalable/apps COMPONENT Application)
ENDIF()
IF(LINUX OR WIN32 OR MAC)
OPTION(SELFPACKER "Compress executable with self packer like UPX")
IF(SELFPACKER)
FIND_PACKAGE(SelfPackers)
IF(SELF_PACKER_FOR_EXECUTABLE)
MESSAGE(STATUS "Using SelfPacker: ${SELF_PACKER_FOR_EXECUTABLE} ${SELF_PACKER_FOR_EXECUTABLE_FLAGS}")
ELSE()
MESSAGE(FATAL_ERROR "Cannot find self packer")
ENDIF()
INSTALL(CODE
"
EXECUTE_PROCESS(COMMAND
${SELF_PACKER_FOR_EXECUTABLE} ${SELF_PACKER_FOR_EXECUTABLE_FLAGS} \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${DEFAULT_FILE_DESTINATION}/${PROJECT_NAME}${CMAKE_EXECUTABLE_SUFFIX}\")
" COMPONENT Application)
ENDIF()
ENDIF()
IF(WIN32)
IF(SIGNTOOL_CMD)
CONFIGURE_FILE(${CMAKE_DIR}/SignFiles.cmake.in ${CMAKE_BINARY_DIR}/SignFiles.cmake @ONLY)
INSTALL(CODE
"
EXECUTE_PROCESS(COMMAND \"${CMAKE_COMMAND}\" -DSIGN_EXT=*.exe -P \"${CMAKE_BINARY_DIR}/SignFiles.cmake\" WORKING_DIRECTORY \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${DEFAULT_FILE_DESTINATION}\")
" COMPONENT Application)
ENDIF()
ENDIF()
IF(LINUX)
INSTALL(FILES ${QM_FILES} DESTINATION ${TRANSLATION_DESTINATION} COMPONENT Translations)
ELSEIF(NOT ANDROID_BUILD_AAR)
INSTALL(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/translations/ DESTINATION ${TRANSLATION_DESTINATION} COMPONENT Translations)
ENDIF()
IF(NOT ANDROID_BUILD_AAR)
# resources file
INSTALL(FILES ${RCC} DESTINATION ${DEFAULT_FILE_DESTINATION} COMPONENT Runtime)
ENDIF()
# qt qml plugins
IF(DESKTOP AND TARGET Qt5::Qml)
FOREACH(entry QtQuick QtQuick.2 QtQml QtGraphicalEffects Qt)
INSTALL(DIRECTORY ${QT_HOST_PREFIX}/qml/${entry} DESTINATION ${DEFAULT_FILE_DESTINATION}/qml COMPONENT Runtime PATTERN "*.dylib" EXCLUDE)
ENDFOREACH()
ENDIF()
# secure storage file
INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/config.json DESTINATION ${DEFAULT_FILE_DESTINATION} COMPONENT Runtime)