AusweisApp2/cmake/Packaging.cmake

260 lines
10 KiB
CMake

# CPack
# http://www.cmake.org/Wiki/CMake:CPackConfiguration
SET(FILENAME ${PROJECT_NAME}-${PROJECT_VERSION})
IF(ANDROID_BUILD_AAR)
STRING(TOLOWER "${FILENAME}" FILENAME)
STRING(REGEX REPLACE "[0-9]*-" "-" FILENAME "${FILENAME}")
ELSEIF(ANDROID)
SET(FILENAME ${FILENAME}-${CMAKE_ANDROID_ARCH_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})
IF(VENDOR_GOVERNIKUS)
SET(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE.officially.txt")
ELSE()
SET(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE.txt")
ENDIF()
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" OR ${CMAKE_BUILD_TYPE} STREQUAL "MINSIZEREL")
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 "\\\\.gitignore" "/\\\\.git/")
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")
SET(CPACK_MONOLITHIC_INSTALL true)
IF(WIN32)
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_EXTRA_SOURCES ${PACKAGING_DIR}/win/install_settings.wxs ${PACKAGING_DIR}/win/runtime_settings.wxs)
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)
FILE(WRITE ${PROJECT_BINARY_DIR}/ipa.cmake "
SET(BUNDLE_DIRS \"\${CONFIG}-iphoneos;\${CONFIG};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 ${CMAKE_COMMAND} -E copy_directory \${BundleDir} Payload/AusweisApp2.app)
EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E tar cf \"${CPACK_PACKAGE_FILE_NAME}.ipa\" --format=zip Payload)
EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E remove_directory Payload)
")
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_COPYRIGHT ${COPYRIGHT_TEXT})
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})
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}")
OPTION(ANDROID_USE_GRADLE "Use gradle for androiddeployqt" ON)
IF(ANDROID_USE_GRADLE)
FILE(READ "${QT_HOST_PREFIX}/src/android/templates/build.gradle" BUILD_GRADLE)
IF(ANDROID_BUILD_AAR)
STRING(REPLACE "apply plugin: 'com.android.application'" "apply plugin: 'com.android.library'" BUILD_GRADLE "${BUILD_GRADLE}")
ENDIF()
FILE(WRITE "${CMAKE_INSTALL_PREFIX}/build.gradle" "${BUILD_GRADLE}")
FILE(READ "${PACKAGING_DIR}/android/build.gradle.append" BUILD_GRADLE)
FILE(APPEND "${CMAKE_INSTALL_PREFIX}/build.gradle" "${BUILD_GRADLE}")
ENDIF()
IF(ANDROID_BUILD_AAR)
SET(ANDROID_FILE_EXT aar)
CONFIGURE_FILE(${PACKAGING_DIR}/android/pom.xml.in ${CMAKE_INSTALL_PREFIX}/${CPACK_PACKAGE_FILE_NAME}.pom @ONLY)
ELSE()
SET(ANDROID_FILE_EXT apk)
ENDIF()
MESSAGE(STATUS "Prepare ${ANDROID_FILE_EXT} file generation")
IF(${CMAKE_BUILD_TYPE} STREQUAL "RELEASE" OR ${CMAKE_BUILD_TYPE} STREQUAL "RELWITHDEBINFO" OR ${CMAKE_BUILD_TYPE} STREQUAL "MINSIZEREL")
IF(ANDROID_BUILD_AAR)
SET(ANDROID_FILE dist-release.aar)
SET(DEPLOY_CMD_SIGN --release)
ELSEIF(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)
IF(ANDROID_USE_GRADLE)
SET(ANDROID_FILE dist-release-signed.apk)
ELSE()
SET(ANDROID_FILE QtApp-release-signed.apk)
ENDIF()
ELSE()
MESSAGE(FATAL_ERROR "Cannot sign release build! Set APK_SIGN_KEYSTORE, APK_SIGN_KEYSTORE_ALIAS and APK_SIGN_KEYSTORE_PSW!")
ENDIF()
ELSE()
IF(ANDROID_USE_GRADLE)
SET(ANDROID_FILE dist-debug.${ANDROID_FILE_EXT})
ELSE()
SET(ANDROID_FILE QtApp-debug.apk)
ENDIF()
ENDIF()
SET(DEPLOY_CMD ${androiddeployqt} --verbose --input ${ANDROID_DEPLOYMENT_SETTINGS} --output ${CMAKE_INSTALL_PREFIX} ${DEPLOY_CMD_SIGN})
IF(ANDROID_USE_GRADLE)
SET(DEPLOY_CMD ${DEPLOY_CMD} --gradle)
SET(SOURCE_ANDROID_FILE ${CMAKE_INSTALL_PREFIX}/build/outputs/${ANDROID_FILE_EXT})
IF("${Qt5Core_VERSION}" VERSION_GREATER_EQUAL "5.12.0" AND NOT ANDROID_BUILD_AAR)
IF(${CMAKE_BUILD_TYPE} STREQUAL "DEBUG")
SET(SOURCE_ANDROID_FILE ${SOURCE_ANDROID_FILE}/debug)
ELSE()
SET(SOURCE_ANDROID_FILE ${SOURCE_ANDROID_FILE}/release)
ENDIF()
ENDIF()
SET(SOURCE_ANDROID_FILE ${SOURCE_ANDROID_FILE}/${ANDROID_FILE})
ELSE()
IF(ANDROID_BUILD_AAR)
MESSAGE(FATAL_ERROR "Use gradle to build an AAR")
ENDIF()
SET(SOURCE_ANDROID_FILE ${CMAKE_INSTALL_PREFIX}/bin/${ANDROID_FILE})
ENDIF()
SET(DESTINATION_ANDROID_FILE ${CMAKE_INSTALL_PREFIX}/${CPACK_PACKAGE_FILE_NAME}.${ANDROID_FILE_EXT})
# Add DEPENDS install someday
# http://public.kitware.com/Bug/view.php?id=8438
ADD_CUSTOM_TARGET(${ANDROID_FILE_EXT}
COMMAND ${DEPLOY_CMD}
COMMAND ${CMAKE_COMMAND} -E copy ${SOURCE_ANDROID_FILE} ${DESTINATION_ANDROID_FILE})
IF(ANDROID_USE_GRADLE)
ADD_CUSTOM_COMMAND(TARGET ${ANDROID_FILE_EXT} POST_BUILD
COMMAND ${CMAKE_INSTALL_PREFIX}/gradlew sourcesJar lint
COMMAND ${CMAKE_COMMAND} -E copy build/libs/dist-sources.jar ${CPACK_PACKAGE_FILE_NAME}-sources.jar
WORKING_DIRECTORY ${CMAKE_INSTALL_PREFIX})
ENDIF()
IF(NOT ANDROID_BUILD_AAR)
FIND_PROGRAM(apksigner apksigner HINTS ${ANDROID_SDK}/build-tools/${ANDROID_BUILD_TOOLS_REVISION} CMAKE_FIND_ROOT_PATH_BOTH)
IF(apksigner)
ADD_CUSTOM_TARGET(verify.signature COMMAND ${apksigner} verify --verbose --print-certs -Werr ${DESTINATION_ANDROID_FILE})
ENDIF()
ENDIF()
ELSEIF(UNIX)
SET(CPACK_GENERATOR STGZ)
ENDIF()
INCLUDE(CPack)