AusweisApp2/cmake/Packaging.cmake

220 lines
8.5 KiB
CMake

# CPack
# http://www.cmake.org/Wiki/CMake:CPackConfiguration
SET(FILENAME ${PROJECT_NAME}-${PROJECT_VERSION})
IF(ANDROID)
SET(FILENAME ${FILENAME}-${ANDROID_ABI})
ENDIF()
IF(DEFINED dvcs_distance)
SET(FILENAME ${FILENAME}+${dvcs_distance})
ENDIF()
IF(DEFINED dvcs_branch)
SET(FILENAME ${FILENAME}-${dvcs_branch})
ENDIF()
IF(DEFINED dvcs_phase)
SET(FILENAME ${FILENAME}-${dvcs_phase})
ENDIF()
IF(DEFINED dvcs_revision)
SET(FILENAME ${FILENAME}-${dvcs_revision})
ENDIF()
SET(CPACK_PACKAGE_NAME ${PROJECT_NAME})
SET(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
SET(CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR})
SET(CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR})
SET(CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH})
SET(CPACK_PACKAGE_VERSION_TWEAK ${PROJECT_VERSION_TWEAK})
SET(CPACK_PACKAGE_VENDOR "Governikus GmbH & Co. KG")
SET(CPACK_PACKAGE_CONTACT "info@governikus.com")
SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Governikus AusweisApp2")
SET(CPACK_PACKAGE_DESCRIPTION_FILE "${PROJECT_SOURCE_DIR}/README.rst")
SET(CPACK_PACKAGE_FILE_NAME ${FILENAME})
SET(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE.txt")
IF(APPLE AND NOT IOS)
FIND_PROGRAM(ICONV iconv)
IF(NOT ICONV)
MESSAGE(FATAL_ERROR "Cannot find 'iconv' to convert LICENSE.txt")
ENDIF()
EXECUTE_PROCESS(COMMAND ${ICONV} -f UTF-8 -t MAC ${CPACK_RESOURCE_FILE_LICENSE} OUTPUT_FILE "${PROJECT_BINARY_DIR}/LICENSE.txt")
SET(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_BINARY_DIR}/LICENSE.txt")
ENDIF()
IF(${CMAKE_BUILD_TYPE} STREQUAL "RELEASE")
SET(CPACK_STRIP_FILES TRUE)
ENDIF()
SET(CPACK_SOURCE_GENERATOR TGZ)
SET(CPACK_SOURCE_PACKAGE_FILE_NAME ${FILENAME} CACHE INTERNAL "tarball basename")
SET(CPACK_SOURCE_IGNORE_FILES "\\\\.hgignore" "\\\\.hgtags" "/\\\\.hg/")
LIST(APPEND CPACK_SOURCE_IGNORE_FILES "vendor.txt")
LIST(APPEND CPACK_SOURCE_IGNORE_FILES "${CMAKE_CURRENT_BINARY_DIR}")
LIST(APPEND CPACK_SOURCE_IGNORE_FILES "CMakeCache.txt")
LIST(APPEND CPACK_SOURCE_IGNORE_FILES "CMakeFiles")
LIST(APPEND CPACK_SOURCE_IGNORE_FILES "CMakeLists\\\\.txt\\\\.user")
LIST(APPEND CPACK_SOURCE_IGNORE_FILES "\\\\.project")
LIST(APPEND CPACK_SOURCE_IGNORE_FILES "\\\\.cproject")
LIST(APPEND CPACK_SOURCE_IGNORE_FILES "\\\\.reviewboardrc")
LIST(APPEND CPACK_SOURCE_IGNORE_FILES "utils/tlscheck")
LIST(APPEND CPACK_SOURCE_IGNORE_FILES "utils/testbedtool")
SET(CPACK_MONOLITHIC_INSTALL true)
IF(WIN32)
SET(CPACK_PACKAGE_EXECUTABLES "AusweisApp2;AusweisApp2")
SET(CPACK_GENERATOR WIX)
SET(CPACK_WIX_UPGRADE_GUID 4EE0E467-EAB7-483E-AB45-87BD1DB6B037)
SET(CPACK_WIX_PRODUCT_ICON ${RESOURCES_DIR}/images/npa.ico)
SET(CPACK_WIX_CULTURES de-DE en-US)
# disable above line, enable beneath line to build MSI for english
# SET(CPACK_WIX_CULTURES en-US)
SET(CPACK_WIX_TEMPLATE ${PACKAGING_DIR}/win/WIX.template.in)
SET(CPACK_WIX_UI_BANNER ${RESOURCES_DIR}/images/wix_banner.jpg)
SET(CPACK_WIX_UI_DIALOG ${RESOURCES_DIR}/images/wix_dialog.jpg)
SET(CPACK_WIX_EXTENSIONS WixUtilExtension)
SET(CPACK_WIX_LIGHT_EXTRA_FLAGS -loc ${PACKAGING_DIR}/win/WIX.Texts.de-DE.wxl -loc ${PACKAGING_DIR}/win/WIX.Texts.en-US.wxl)
IF(SIGNTOOL_CMD)
MESSAGE(STATUS "MSI can be signed with 'make package.sign'")
ADD_CUSTOM_TARGET(package.sign COMMAND ${SIGNTOOL_CMD} ${SIGNTOOL_PARAMS} ${PROJECT_BINARY_DIR}/${CPACK_PACKAGE_FILE_NAME}.msi)
ENDIF()
ELSEIF(IOS)
FIND_PROGRAM(xcrun xcrun CMAKE_FIND_ROOT_PATH_BOTH)
IF(NOT xcrun)
MESSAGE(FATAL_ERROR "Cannot find xcrun to create IPAs")
ENDIF()
FILE(WRITE ${PROJECT_BINARY_DIR}/ipa.cmake "
SET(BUNDLE_DIRS \"\${CONFIG}-iphoneos;UninstalledProducts;UninstalledProducts/iphoneos\")
FOREACH(dir \${BUNDLE_DIRS})
SET(tmpBundleDir ${PROJECT_BINARY_DIR}/src/\${dir}/${PROJECT_NAME}.app)
IF(EXISTS \"\${tmpBundleDir}\")
SET(BundleDir \"\${tmpBundleDir}\")
BREAK()
ENDIF()
ENDFOREACH()
IF(BundleDir)
MESSAGE(STATUS \"Use bundle: \${BundleDir}\")
ELSE()
MESSAGE(FATAL_ERROR \"Bundle directory does not exist\")
ENDIF()
EXECUTE_PROCESS(COMMAND ${xcrun} -sdk iphoneos PackageApplication \${BundleDir} -o ${PROJECT_BINARY_DIR}/${CPACK_PACKAGE_FILE_NAME}.ipa)
")
ADD_CUSTOM_TARGET(ipa COMMAND ${CMAKE_COMMAND} -DCONFIG=$<CONFIGURATION> -P ${CMAKE_BINARY_DIR}/ipa.cmake)
ELSEIF(APPLE)
SET(MACOS_PACKAGING_DIR ${PACKAGING_DIR}/macos)
SET(CPACK_GENERATOR Bundle)
SET(CPACK_INSTALL_CMAKE_PROJECTS ${CMAKE_BINARY_DIR};${PROJECT_NAME};ALL;/)
SET(CPACK_BUNDLE_NAME ${PROJECT_NAME})
SET(CPACK_BUNDLE_ICON ${RESOURCES_DIR}/images/bundle_icons.icns)
SET(CPACK_BUNDLE_APPLE_CERT_APP "Developer ID Application: Governikus GmbH & Co. KG (G7EQCJU4BR)")
SET(CPACK_BUNDLE_APPLE_CODESIGN_FILES ${ADDITIONAL_BUNDLE_FILES_TO_SIGN})
SET(CPACK_APPLE_BUNDLE_ID "com.governikus.AusweisApp2")
SET(CPACK_BUNDLE_APPLE_CODESIGN_PARAMETER "--force")
OPTION(OSX_TIMESTAMP "Timestamp the application bundle" ON)
IF(OSX_TIMESTAMP)
SET(CPACK_BUNDLE_APPLE_CODESIGN_PARAMETER "${CPACK_BUNDLE_APPLE_CODESIGN_PARAMETER} --timestamp")
ELSE()
SET(CPACK_BUNDLE_APPLE_CODESIGN_PARAMETER "${CPACK_BUNDLE_APPLE_CODESIGN_PARAMETER} --timestamp=none")
ENDIF()
SET(CPACK_PACKAGE_ICON ${RESOURCES_DIR}/images/dmg_icons.icns)
SET(CPACK_DMG_VOLUME_NAME ${CPACK_PACKAGE_NAME})
SET(CPACK_DMG_FORMAT UDBZ)
SET(CPACK_DMG_BACKGROUND_IMAGE ${RESOURCES_DIR}/images/dmg_background.png)
SET(CPACK_DMG_SLA_DIR ${MACOS_PACKAGING_DIR}/sla)
SET(CPACK_DMG_SLA_LANGUAGES English German)
# We can not generate the DS_STORE on each build since jenkins runs headless
#SET(CPACK_DMG_DS_STORE_SETUP_SCRIPT ${MACOS_PACKAGING_DIR}/prepare-ds_store.applescript)
SET(CPACK_DMG_DS_STORE ${MACOS_PACKAGING_DIR}/DS_STORE)
SET(INFO_PLIST_FILE_NAME Info.plist)
CONFIGURE_FILE(${MACOS_PACKAGING_DIR}/${INFO_PLIST_FILE_NAME} ${INFO_PLIST_FILE_NAME} @ONLY)
SET(CPACK_BUNDLE_PLIST ${INFO_PLIST_FILE_NAME})
SET(STARTUP_FILE_NAME start-ausweisapp2.sh)
CONFIGURE_FILE(${MACOS_PACKAGING_DIR}/${STARTUP_FILE_NAME} ${STARTUP_FILE_NAME} @ONLY)
SET(CPACK_BUNDLE_STARTUP_COMMAND ${STARTUP_FILE_NAME})
ELSEIF(ANDROID)
FIND_PROGRAM(androiddeployqt androiddeployqt CMAKE_FIND_ROOT_PATH_BOTH)
IF(NOT androiddeployqt)
MESSAGE(FATAL_ERROR "Cannot find androiddeployqt to create APKs")
ENDIF()
MESSAGE(STATUS "Using androiddeployqt: ${androiddeployqt}")
SET(ANDROID_APK_DIR ${CMAKE_INSTALL_PREFIX})
SET(DEPLOYMENT_SETTINGS ${PROJECT_BINARY_DIR}/libAusweisApp2.so-deployment-settings.json)
SET(PACKAGE_SRC_DIR ${PROJECT_BINARY_DIR}/package-src-dir)
IF("${ANDROID_ABI}" STREQUAL "x86")
SET(ANDROID_TOOLCHAIN_PREFIX x86)
SET(ANDROID_TOOL_PREFIX i686-linux-android)
ELSEIF("${ANDROID_ABI}" STREQUAL "armeabi-v7a")
SET(ANDROID_TOOLCHAIN_PREFIX arm-linux-androideabi)
SET(ANDROID_TOOL_PREFIX arm-linux-androideabi)
ELSEIF("${ANDROID_ABI}" STREQUAL "arm64-v8a")
SET(ANDROID_TOOLCHAIN_PREFIX aarch64-linux-android)
SET(ANDROID_TOOL_PREFIX aarch64-linux-android)
ELSE()
MESSAGE(FATAL_ERROR "Unsupported ANDROID_ABI: ${ANDROID_ABI}")
ENDIF()
CONFIGURE_FILE(${PACKAGING_DIR}/android/AndroidManifest.xml.in ${PACKAGE_SRC_DIR}/AndroidManifest.xml @ONLY)
CONFIGURE_FILE(${PACKAGING_DIR}/android/libAusweisApp2.so-deployment-settings.json.in ${DEPLOYMENT_SETTINGS} @ONLY)
IF(${CMAKE_BUILD_TYPE} STREQUAL "RELEASE")
IF(APK_SIGN_KEYSTORE AND APK_SIGN_KEYSTORE_ALIAS AND APK_SIGN_KEYSTORE_PSW)
MESSAGE(STATUS "Release build will be signed using: ${APK_SIGN_KEYSTORE} | Alias: ${APK_SIGN_KEYSTORE_ALIAS}")
SET(DEPLOY_CMD_SIGN --sign ${APK_SIGN_KEYSTORE} ${APK_SIGN_KEYSTORE_ALIAS} --storepass ${APK_SIGN_KEYSTORE_PSW} --digestalg SHA-256 --sigalg SHA256WithRSA)
SET(APK_FILE QtApp-release-signed.apk)
ELSE()
MESSAGE(FATAL_ERROR "Cannot sign release build! Set APK_SIGN_KEYSTORE, APK_SIGN_KEYSTORE_ALIAS and APK_SIGN_KEYSTORE_PSW!")
ENDIF()
ELSE()
SET(APK_FILE QtApp-debug.apk)
ENDIF()
SET(DEPLOY_CMD ${androiddeployqt} --verbose --input ${DEPLOYMENT_SETTINGS} --output ${ANDROID_APK_DIR} ${DEPLOY_CMD_SIGN})
SET(DESTINATION_APK_FILE ${CMAKE_INSTALL_PREFIX}/bin/${CPACK_PACKAGE_FILE_NAME}.apk)
# Add DEPENDS install someday
# http://public.kitware.com/Bug/view.php?id=8438
ADD_CUSTOM_TARGET(apk
COMMAND ${DEPLOY_CMD}
COMMAND ${CMAKE_COMMAND} -E rename ${CMAKE_INSTALL_PREFIX}/bin/${APK_FILE} ${DESTINATION_APK_FILE})
FIND_PROGRAM(jarsigner jarsigner CMAKE_FIND_ROOT_PATH_BOTH)
IF(jarsigner)
IF(APK_SIGN_KEYSTORE)
SET(jarsigner_keystore -keystore ${APK_SIGN_KEYSTORE})
ENDIF()
ADD_CUSTOM_TARGET(verify.signature
COMMAND ${jarsigner} -verify -verbose -certs ${jarsigner_keystore} ${DESTINATION_APK_FILE})
ENDIF()
ELSEIF(UNIX)
SET(CPACK_GENERATOR STGZ)
ENDIF()
INCLUDE(CPack)