overte-lubosz/cmake/macros/apk.cmake

146 lines
No EOL
6.6 KiB
CMake

#*********************************************************#
#* File: Apk.cmake *
#* Android apk tools
#*
#* Copyright (C) 2002-2013 The PixelLight Team (http://www.pixellight.org/)
#*
#* This file is part of PixelLight.
#*
#* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
#* and associated documentation files (the "Software"), to deal in the Software without
#* restriction, including without limitation the rights to use, copy, modify, merge, publish,
#* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
#* Software is furnished to do so, subject to the following conditions:
#*
#* The above copyright notice and this permission notice shall be included in all copies or
#* substantial portions of the Software.
#*
#* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
#* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
#* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
#* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
#* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#*********************************************************#
##################################################
## Options
##################################################
set(ANDROID_APK_API_LEVEL "19" CACHE STRING "Android APK API level")
set(ANDROID_APK_INSTALL "0" CACHE BOOL "Install created apk file on the device automatically?")
set(ANDROID_APK_RUN "0" CACHE BOOL "Run created apk file on the device automatically? (installs it automatically as well, \"ANDROID_APK_INSTALL\"-option is ignored)")
set(ANDROID_APK_SIGNER_KEYSTORE "~/my-release-key.keystore" CACHE STRING "Keystore for signing the apk file (only required for release apk)")
set(ANDROID_APK_SIGNER_ALIAS "myalias" CACHE STRING "Alias for signing the apk file (only required for release apk)")
##################################################
## Variables
##################################################
set(ANDROID_THIS_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}) # Directory this CMake file is in
##################################################
## MACRO: android_create_apk
##
## Create/copy Android apk related files
##
## @param name
## Name of the project (e.g. "MyProject"), this will also be the name of the created apk file
## @param apk_pacakge_name
## Pacakge name of the application
## @param apk_directory
## Directory were to construct the apk file in (e.g. "${CMAKE_BINARY_DIR}/apk")
## @param libs_directory
## Directory where the built android libraries will be POST_BUILD, e.g ${CMAKE_SOURCE_DIR}/libs
## @param assets_directory
## Directory where the assets for the application are locatated
##
## @remarks
## Requires the following tools to be found automatically
## - "android" (part of the Android SDK)
## - "adb" (part of the Android SDK)
## - "ant" (type e.g. "sudo apt-get install ant" on your Linux system to install Ant)
## - "jarsigner" (part of the JDK)
## - "zipalign" (part of the Android SDK)
##################################################
macro(android_create_apk name apk_package_name apk_directory libs_directory android_directory assets_directory)
set(ANDROID_NAME ${name})
set(ANDROID_APK_PACKAGE ${apk_package_name})
# Create the directory for the libraries
add_custom_command(TARGET ${ANDROID_NAME} PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E remove_directory "${apk_directory}/libs")
add_custom_command(TARGET ${ANDROID_NAME} PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory "${apk_directory}/libs")
add_custom_command(TARGET ${ANDROID_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${libs_directory}" "${apk_directory}/libs/")
# Create "build.xml", "default.properties", "local.properties" and "proguard.cfg" files
if(CMAKE_BUILD_TYPE MATCHES Release)
set(ANDROID_APK_DEBUGGABLE "false")
else()
set(ANDROID_APK_DEBUGGABLE "true")
endif()
add_custom_command(TARGET ${ANDROID_NAME} PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory "${apk_directory}/res")
add_custom_command(TARGET ${ANDROID_NAME} PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${android_directory}/res" "${apk_directory}/res/")
configure_file("${android_directory}/AndroidManifest.xml" "${apk_directory}/AndroidManifest.xml")
add_custom_command(TARGET ${ANDROID_NAME}
COMMAND android update project -t android-${ANDROID_APK_API_LEVEL} --name ${ANDROID_NAME} --path "${apk_directory}")
# Copy assets
add_custom_command(TARGET ${ANDROID_NAME} PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E remove_directory "${apk_directory}/assets")
add_custom_command(TARGET ${ANDROID_NAME} PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory "${apk_directory}/assets/")
add_custom_command(TARGET ${ANDROID_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${CMAKE_SOURCE_DIR}/assets" "${apk_directory}/assets/")
# Build the apk file
if(CMAKE_BUILD_TYPE MATCHES Release)
# Let Ant create the unsigned apk file
add_custom_command(TARGET ${ANDROID_NAME}
COMMAND ant release
WORKING_DIRECTORY "${apk_directory}")
# Sign the apk file
add_custom_command(TARGET ${ANDROID_NAME}
COMMAND jarsigner -verbose -keystore ${ANDROID_APK_SIGNER_KEYSTORE} bin/${ANDROID_NAME}-unsigned.apk ${ANDROID_APK_SIGNER_ALIAS}
WORKING_DIRECTORY "${apk_directory}")
# Align the apk file
add_custom_command(TARGET ${ANDROID_NAME}
COMMAND zipalign -v -f 4 bin/${ANDROID_NAME}-unsigned.apk bin/${ANDROID_NAME}.apk
WORKING_DIRECTORY "${apk_directory}")
# Install current version on the device/emulator
if(ANDROID_APK_INSTALL OR ANDROID_APK_RUN)
add_custom_command(TARGET ${ANDROID_NAME}
COMMAND adb install -r bin/${ANDROID_NAME}.apk
WORKING_DIRECTORY "${apk_directory}")
endif()
else()
# Let Ant create the unsigned apk file
add_custom_command(TARGET ${ANDROID_NAME}
COMMAND ant debug
WORKING_DIRECTORY "${apk_directory}")
# Install current version on the device/emulator
if(ANDROID_APK_INSTALL OR ANDROID_APK_RUN)
add_custom_command(TARGET ${ANDROID_NAME}
COMMAND adb install -r bin/${ANDROID_NAME}-debug.apk
WORKING_DIRECTORY "${apk_directory}")
endif()
endif()
# Start the application
if(ANDROID_APK_RUN)
add_custom_command(TARGET ${ANDROID_NAME}
COMMAND adb shell am start -n ${ANDROID_APK_PACKAGE}/android.app.NativeActivity)
endif()
endmacro(android_create_apk name apk_directory libs_directory assets_directory)