1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
|
set(sources renderdoccmd.cpp ${CMAKE_SOURCE_DIR}/renderdoc/api/replay/version.cpp)
set(includes PRIVATE ${CMAKE_SOURCE_DIR}/renderdoc/api)
set(libraries PRIVATE renderdoc)
if(APPLE)
list(APPEND sources renderdoccmd_apple.cpp)
elseif(ANDROID)
list(APPEND sources renderdoccmd_android.cpp)
include_directories(${ANDROID_NDK}/sources/android/native_app_glue)
list(APPEND libraries PRIVATE -llog -landroid)
set(LINKER_FLAGS "-Wl,--no-as-needed")
set_source_files_properties(renderdoccmd.cpp PROPERTIES COMPILE_FLAGS "-fexceptions -frtti")
set_source_files_properties(renderdoccmd_android.cpp PROPERTIES COMPILE_FLAGS "-fexceptions")
elseif(UNIX)
list(APPEND sources renderdoccmd_linux.cpp)
if(ENABLE_XLIB)
list(APPEND libraries PRIVATE -lX11)
endif()
if(ENABLE_XCB)
list(APPEND libraries PRIVATE -lxcb)
endif()
if(ENABLE_XLIB AND ENABLE_XCB)
list(APPEND libraries PRIVATE -lX11-xcb)
endif()
# Make sure that for the target executable we don't throw away
# any shared libraries.
set(LINKER_FLAGS "-Wl,--no-as-needed")
endif()
if(ANDROID)
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${LINKER_FLAGS}")
add_library(renderdoccmd SHARED ${sources})
else()
set(CMAKE_SKIP_BUILD_RPATH TRUE)
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
set(CMAKE_INSTALL_RPATH "$ORIGIN/:$ORIGIN/../lib${LIB_SUFFIX}/${LIB_SUBFOLDER_TRAIL_SLASH}")
set(CMAKE_EXE_LINKER_FLAGS "${LINKER_FLAGS}")
add_executable(renderdoccmd ${sources})
endif()
target_include_directories(renderdoccmd ${includes})
target_link_libraries(renderdoccmd ${libraries})
install (TARGETS renderdoccmd DESTINATION bin)
if(ANDROID)
if(NOT DEFINED ENV{JAVA_HOME})
message(FATAL_ERROR "JAVA_HOME environment variable must be defined for Android build")
endif()
message(STATUS "Using JAVA_HOME = $ENV{JAVA_HOME}")
if(NOT DEFINED ENV{ANDROID_SDK})
message(FATAL_ERROR "ANDROID_SDK environment variable must be defined for Android build")
endif()
message(STATUS "Using ANDROID_SDK = $ENV{ANDROID_SDK}")
if(NOT DEFINED ENV{ANDROID_NDK})
message(FATAL_ERROR "ANDROID_NDK environment variable must be defined for Android build")
endif()
message(STATUS "Using ANDROID_NDK = $ENV{ANDROID_NDK}")
#############################
# We need to check that 'java' in PATH is new enough. Temporarily unset the JAVA_HOME env,
# then invoke FindJava.cmake which will search just the PATH, then re-set it.
set(SAVE_JAVA_HOME $ENV{JAVA_HOME})
set(ENV{JAVA_HOME} "")
find_package(Java)
set(ENV{JAVA_HOME} ${SAVE_JAVA_HOME})
if(${Java_VERSION} VERSION_LESS 1.8)
message(FATAL_ERROR "Building Android requires the 'java' program in your PATH to be at least Java 8 (1.8)")
endif()
if(STRIP_ANDROID_LIBRARY AND CMAKE_STRIP AND CMAKE_BUILD_TYPE STREQUAL "Release")
add_custom_command(TARGET renderdoccmd POST_BUILD
COMMAND echo Stripping $<TARGET_FILE:renderdoccmd>
COMMAND ${CMAKE_STRIP} --strip-unneeded $<TARGET_FILE:renderdoccmd>)
endif()
set(ANDROID_BUILD_TOOLS_VERSION "" CACHE STRING "Version of Android build-tools to use instead of the default")
if(ANDROID_BUILD_TOOLS_VERSION STREQUAL "")
# Enumerate the build tools versions available, and pick the most recent
file(GLOB __buildTools RELATIVE "$ENV{ANDROID_SDK}/build-tools" "$ENV{ANDROID_SDK}/build-tools/*")
list(SORT __buildTools)
list(GET __buildTools -1 ANDROID_BUILD_TOOLS_VERSION)
unset(__buildTools)
endif()
message(STATUS "Using Android build-tools version ${ANDROID_BUILD_TOOLS_VERSION}")
set(APK_TARGET_ID "" CACHE STRING "The Target ID to build the APK for like 'android-99', use <android list targets> to choose another one.")
if(APK_TARGET_ID STREQUAL "")
# This seems different from the platform we're targetting,
# default to the latest available that's greater or equal to our target platform
file(GLOB __platforms RELATIVE "$ENV{ANDROID_SDK}/platforms" "$ENV{ANDROID_SDK}/platforms/*")
list(SORT __platforms)
# In case we don't find one, target the latest platform
list(GET __platforms -1 APK_TARGET_ID)
string(REPLACE "android-" "" __targetPlat "${ANDROID_PLATFORM}")
# We require at least android 23 for Activity.requestPermissions
if(__targetPlat LESS 23)
set(__targetPlat 23)
endif()
foreach( __plat ${__platforms})
string(REPLACE "android-" "" __curPlat "${__plat}")
if(NOT (__curPlat LESS __targetPlat) )
set(APK_TARGET_ID "android-${__curPlat}")
break()
endif()
endforeach()
unset(__platforms)
unset(__targetPlat)
unset(__curPlat)
endif()
message(STATUS "Using android.jar from platform ${APK_TARGET_ID}")
# Suffix for scripts rather than binaries, which is needed explicitly on windows
set(TOOL_SCRIPT_EXTENSION "")
if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
set(TOOL_SCRIPT_EXTENSION ".bat")
endif()
set(BUILD_TOOLS "$ENV{ANDROID_SDK}/build-tools/${ANDROID_BUILD_TOOLS_VERSION}")
set(RT_JAR "$ENV{JAVA_HOME}/jre/lib/rt.jar")
set(JAVA_BIN "$ENV{JAVA_HOME}/bin")
set(ANDROID_JAR "$ENV{ANDROID_SDK}/platforms/${APK_TARGET_ID}/android.jar")
if(CMAKE_HOST_WIN32)
set(CLASS_PATH "${ANDROID_JAR}\;obj")
else()
set(CLASS_PATH "${ANDROID_JAR}:obj")
endif()
set(KEYSTORE ${CMAKE_CURRENT_BINARY_DIR}/debug.keystore)
add_custom_command(OUTPUT ${KEYSTORE}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMAND ${JAVA_BIN}/keytool -genkey -keystore ${KEYSTORE} -storepass android -alias androiddebugkey -keypass android -keyalg RSA -keysize 2048 -validity 10000 -dname "CN=, OU=, O=, L=, S=, C=")
# APK_VERSION_CODE corresponds to android:versionCode, an internal integer value that can be queried. Higher numbers indicate more recent versions.
# APK_VERSION_NAME corresponds to android:versionName, a string value that is displayed to the user.
set(APK_VERSION_CODE "${RENDERDOC_VERSION_MAJOR}${RENDERDOC_VERSION_MINOR}")
set(APK_VERSION_NAME ${GIT_COMMIT_HASH})
message(STATUS "Building APK versionCode ${APK_VERSION_CODE}, versionName ${APK_VERSION_NAME}")
# Set the package name based on the ABI
if(ANDROID_ABI STREQUAL "armeabi-v7a")
set(RENDERDOC_ANDROID_PACKAGE_NAME "org.renderdoc.renderdoccmd.arm32")
elseif(ANDROID_ABI STREQUAL "arm64-v8a")
set(RENDERDOC_ANDROID_PACKAGE_NAME "org.renderdoc.renderdoccmd.arm64")
else()
message(FATAL_ERROR "ABI ${ANDROID_ABI} is not supported.")
endif()
set(APK_FILE ${CMAKE_BINARY_DIR}/bin/${RENDERDOC_ANDROID_PACKAGE_NAME}.apk)
add_custom_target(apk ALL
DEPENDS ${APK_FILE}
DEPENDS ${KEYSTORE})
# Copy in android package files, replacing the package name with the architecture-specific package name
configure_file(android/Loader.java ${CMAKE_CURRENT_BINARY_DIR}/src/org/renderdoc/renderdoccmd/Loader.java)
configure_file(android/AndroidManifest.xml ${CMAKE_CURRENT_BINARY_DIR}/AndroidManifest.xml)
configure_file(android/icon.png ${CMAKE_CURRENT_BINARY_DIR}/res/drawable/icon.png COPYONLY)
add_custom_command(OUTPUT ${APK_FILE}
DEPENDS renderdoc
DEPENDS renderdoccmd
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMAND ${CMAKE_COMMAND} -E make_directory libs/lib/${ANDROID_ABI}
COMMAND ${CMAKE_COMMAND} -E make_directory obj
COMMAND ${CMAKE_COMMAND} -E make_directory bin
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:renderdoc> libs/lib/${ANDROID_ABI}/$<TARGET_FILE_NAME:renderdoc>
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:renderdoccmd> libs/lib/${ANDROID_ABI}/$<TARGET_FILE_NAME:renderdoccmd>
COMMAND ${BUILD_TOOLS}/aapt package -f -m -S res -J src -M AndroidManifest.xml -I ${ANDROID_JAR}
COMMAND ${JAVA_BIN}/javac -d ./obj -source 1.7 -target 1.7 -bootclasspath ${RT_JAR} -classpath "${CLASS_PATH}" -sourcepath src src/org/renderdoc/renderdoccmd/*.java
COMMAND ${BUILD_TOOLS}/dx${TOOL_SCRIPT_EXTENSION} --dex --output=bin/classes.dex ./obj
COMMAND ${BUILD_TOOLS}/aapt package -f -M AndroidManifest.xml --version-code ${APK_VERSION_CODE} --version-name ${APK_VERSION_NAME} -S res -I ${ANDROID_JAR} -F RenderDocCmd-unaligned.apk bin libs
COMMAND ${BUILD_TOOLS}/zipalign -f 4 RenderDocCmd-unaligned.apk RenderDocCmd.apk
COMMAND ${BUILD_TOOLS}/apksigner${TOOL_SCRIPT_EXTENSION} sign --ks ${KEYSTORE} --ks-pass pass:android --key-pass pass:android --ks-key-alias androiddebugkey RenderDocCmd.apk
COMMAND ${CMAKE_COMMAND} -E copy RenderDocCmd.apk ${APK_FILE})
endif()
|