ci: Support Android x86_64 and optimize build caching. (#7045)

* android: Support x86_64 devices.

* ci: Improve ccache hits and stats.

* ci: Compress Android artifacts.

* ci: Re-enable PCH and set ccache sloppiness appropriately.
This commit is contained in:
Steveice10 2023-10-08 23:56:01 -07:00 committed by GitHub
parent f5b8888686
commit 6244f9e3fd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
14 changed files with 131 additions and 43 deletions

View file

@ -15,7 +15,7 @@ chmod +x ./gradlew
./gradlew assemble${BUILD_FLAVOR}Release ./gradlew assemble${BUILD_FLAVOR}Release
./gradlew bundle${BUILD_FLAVOR}Release ./gradlew bundle${BUILD_FLAVOR}Release
ccache -s ccache -s -v
if [ ! -z "${ANDROID_KEYSTORE_B64}" ]; then if [ ! -z "${ANDROID_KEYSTORE_B64}" ]; then
rm "${ANDROID_KEYSTORE_FILE}" rm "${ANDROID_KEYSTORE_FILE}"

View file

@ -12,4 +12,4 @@ cmake .. -GNinja \
-DENABLE_COMPATIBILITY_LIST_DOWNLOAD=ON -DENABLE_COMPATIBILITY_LIST_DOWNLOAD=ON
ninja ninja
ccache -s ccache -s -v

View file

@ -13,8 +13,10 @@ ninja
if [ "$TARGET" = "appimage" ]; then if [ "$TARGET" = "appimage" ]; then
ninja bundle ninja bundle
# TODO: Our AppImage environment currently uses an older ccache version without the verbose flag.
ccache -s
else
ccache -s -v
fi fi
ccache -s
ctest -VV -C Release ctest -VV -C Release

View file

@ -13,7 +13,7 @@ cmake .. -GNinja \
ninja ninja
ninja bundle ninja bundle
ccache -s ccache -s -v
CURRENT_ARCH=`arch` CURRENT_ARCH=`arch`
if [ "$TARGET" = "$CURRENT_ARCH" ]; then if [ "$TARGET" = "$CURRENT_ARCH" ]; then

View file

@ -1,41 +1,72 @@
#!/bin/bash -ex #!/bin/bash -ex
# Determine the full revision name.
GITDATE="`git show -s --date=short --format='%ad' | sed 's/-//g'`" GITDATE="`git show -s --date=short --format='%ad' | sed 's/-//g'`"
GITREV="`git show -s --format='%h'`" GITREV="`git show -s --format='%h'`"
REV_NAME="citra-${OS}-${TARGET}-${GITDATE}-${GITREV}" REV_NAME="citra-$OS-$TARGET-$GITDATE-$GITREV"
# Find out what release we are building # Determine the name of the release being built.
if [[ "$GITHUB_REF_NAME" =~ ^canary- ]] || [[ "$GITHUB_REF_NAME" =~ ^nightly- ]]; then if [[ "$GITHUB_REF_NAME" =~ ^canary- ]] || [[ "$GITHUB_REF_NAME" =~ ^nightly- ]]; then
RELEASE_NAME=$(echo $GITHUB_REF_NAME | cut -d- -f1) RELEASE_NAME=$(echo $GITHUB_REF_NAME | cut -d- -f1)
else else
RELEASE_NAME=head RELEASE_NAME=head
fi fi
mkdir -p artifacts # Archive and upload the artifacts.
mkdir artifacts
if [ -z "${UPLOAD_RAW}" ]; then function pack_artifacts() {
# Archive and upload the artifacts. ARTIFACTS_PATH="$1"
# Set up root directory for archive.
mkdir "$REV_NAME" mkdir "$REV_NAME"
mv build/bundle/* "$REV_NAME" if [ -f "$ARTIFACTS_PATH" ]; then
mv "$ARTIFACTS_PATH" "$REV_NAME"
if [ "$OS" = "windows" ]; then # Use file extension to differentiate archives.
ARCHIVE_NAME="${REV_NAME}.zip"
powershell Compress-Archive "$REV_NAME" "$ARCHIVE_NAME"
else
ARCHIVE_NAME="${REV_NAME}.tar.gz"
tar czvf "$ARCHIVE_NAME" "$REV_NAME"
fi
mv "$REV_NAME" $RELEASE_NAME
7z a "$REV_NAME.7z" $RELEASE_NAME
mv "$ARCHIVE_NAME" artifacts/
mv "$REV_NAME.7z" artifacts/
else
# Directly upload the raw artifacts, renamed with the revision.
for ARTIFACT in build/bundle/*; do
FILENAME=$(basename "$ARTIFACT") FILENAME=$(basename "$ARTIFACT")
EXTENSION="${FILENAME##*.}" EXTENSION="${FILENAME##*.}"
mv "$ARTIFACT" "artifacts/$REV_NAME.$EXTENSION" ARCHIVE_NAME="$REV_NAME.$EXTENSION"
else
mv "$ARTIFACTS_PATH"/* "$REV_NAME"
ARCHIVE_NAME="$REV_NAME"
fi
# Create .zip/.tar.gz
if [ "$OS" = "windows" ]; then
ARCHIVE_FULL_NAME="$ARCHIVE_NAME.zip"
powershell Compress-Archive "$REV_NAME" "$ARCHIVE_FULL_NAME"
elif [ "$OS" = "android" ]; then
ARCHIVE_FULL_NAME="$ARCHIVE_NAME.zip"
zip -r "$ARCHIVE_FULL_NAME" "$REV_NAME"
else
ARCHIVE_FULL_NAME="$ARCHIVE_NAME.tar.gz"
tar czvf "$ARCHIVE_FULL_NAME" "$REV_NAME"
fi
mv "$ARCHIVE_FULL_NAME" artifacts/
if [ -z "$SKIP_7Z" ]; then
# Create .7z
ARCHIVE_FULL_NAME="$ARCHIVE_NAME.7z"
mv "$REV_NAME" "$RELEASE_NAME"
7z a "$ARCHIVE_FULL_NAME" "$RELEASE_NAME"
mv "$ARCHIVE_FULL_NAME" artifacts/
# Clean up created release artifacts directory.
rm -rf "$RELEASE_NAME"
else
# Clean up created rev artifacts directory.
rm -rf "$REV_NAME"
fi
}
if [ -z "$PACK_INDIVIDUALLY" ]; then
# Pack all of the artifacts at once.
pack_artifacts build/bundle
else
# Pack and upload the artifacts one-by-one.
for ARTIFACT in build/bundle/*; do
pack_artifacts "$ARTIFACT"
done done
fi fi

View file

@ -12,6 +12,6 @@ cmake .. -G Ninja \
ninja ninja
ninja bundle ninja bundle
ccache -s ccache -s -v
ctest -VV -C Release || echo "::error ::Test error occurred on Windows build" ctest -VV -C Release || echo "::error ::Test error occurred on Windows build"

View file

@ -32,6 +32,8 @@ jobs:
options: -u 1001 options: -u 1001
env: env:
CCACHE_DIR: ${{ github.workspace }}/.ccache CCACHE_DIR: ${{ github.workspace }}/.ccache
CCACHE_COMPILERCHECK: content
CCACHE_SLOPPINESS: pch_defines,time_macros
OS: linux OS: linux
TARGET: ${{ matrix.target }} TARGET: ${{ matrix.target }}
steps: steps:
@ -62,9 +64,9 @@ jobs:
matrix: matrix:
target: ["x86_64", "arm64"] target: ["x86_64", "arm64"]
env: env:
CCACHE_CPP2: yes
CCACHE_SLOPPINESS: time_macros
CCACHE_DIR: ${{ github.workspace }}/.ccache CCACHE_DIR: ${{ github.workspace }}/.ccache
CCACHE_COMPILERCHECK: content
CCACHE_SLOPPINESS: pch_defines,time_macros
OS: macos OS: macos
TARGET: ${{ matrix.target }} TARGET: ${{ matrix.target }}
steps: steps:
@ -97,8 +99,6 @@ jobs:
TARGET: universal TARGET: universal
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
with:
submodules: recursive
- name: Download x86_64 build from cache - name: Download x86_64 build from cache
uses: actions/cache/restore@v3 uses: actions/cache/restore@v3
with: with:
@ -132,6 +132,8 @@ jobs:
shell: ${{ (matrix.target == 'msys2' && 'msys2') || 'bash' }} {0} shell: ${{ (matrix.target == 'msys2' && 'msys2') || 'bash' }} {0}
env: env:
CCACHE_DIR: ${{ github.workspace }}/.ccache CCACHE_DIR: ${{ github.workspace }}/.ccache
CCACHE_COMPILERCHECK: content
CCACHE_SLOPPINESS: pch_defines,time_macros
OS: windows OS: windows
TARGET: ${{ matrix.target }} TARGET: ${{ matrix.target }}
steps: steps:
@ -184,6 +186,9 @@ jobs:
android: android:
runs-on: ubuntu-latest runs-on: ubuntu-latest
env: env:
CCACHE_DIR: ${{ github.workspace }}/.ccache
CCACHE_COMPILERCHECK: content
CCACHE_SLOPPINESS: pch_defines,time_macros
OS: android OS: android
TARGET: universal TARGET: universal
steps: steps:
@ -196,7 +201,7 @@ jobs:
path: | path: |
~/.gradle/caches ~/.gradle/caches
~/.gradle/wrapper ~/.gradle/wrapper
~/.ccache ${{ env.CCACHE_DIR }}
key: ${{ runner.os }}-android-${{ github.sha }} key: ${{ runner.os }}-android-${{ github.sha }}
restore-keys: | restore-keys: |
${{ runner.os }}-android- ${{ runner.os }}-android-
@ -221,7 +226,8 @@ jobs:
run: ../../../.ci/pack.sh run: ../../../.ci/pack.sh
working-directory: src/android/app working-directory: src/android/app
env: env:
UPLOAD_RAW: 1 PACK_INDIVIDUALLY: 1
SKIP_7Z: 1
- name: Upload - name: Upload
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v3
with: with:
@ -231,9 +237,9 @@ jobs:
runs-on: macos-latest runs-on: macos-latest
if: ${{ !startsWith(github.ref, 'refs/tags/') }} if: ${{ !startsWith(github.ref, 'refs/tags/') }}
env: env:
CCACHE_CPP2: yes
CCACHE_SLOPPINESS: time_macros
CCACHE_DIR: ${{ github.workspace }}/.ccache CCACHE_DIR: ${{ github.workspace }}/.ccache
CCACHE_COMPILERCHECK: content
CCACHE_SLOPPINESS: pch_defines,time_macros
OS: ios OS: ios
TARGET: arm64 TARGET: arm64
steps: steps:

View file

@ -103,6 +103,11 @@ option(USE_SYSTEM_FMT "Use the system fmt (instead of the bundled one)" OFF)
if (CITRA_USE_PRECOMPILED_HEADERS) if (CITRA_USE_PRECOMPILED_HEADERS)
message(STATUS "Using Precompiled Headers.") message(STATUS "Using Precompiled Headers.")
set(CMAKE_PCH_INSTANTIATE_TEMPLATES ON) set(CMAKE_PCH_INSTANTIATE_TEMPLATES ON)
# This ensures that pre-compiled headers won't invalidate build caches for every fresh checkout.
if(NOT MSVC AND CMAKE_CXX_COMPILER_ID MATCHES "Clang")
list(APPEND CMAKE_CXX_COMPILE_OPTIONS_CREATE_PCH -Xclang -fno-pch-timestamp)
endif()
endif() endif()
if(NOT EXISTS ${PROJECT_SOURCE_DIR}/.git/hooks/pre-commit) if(NOT EXISTS ${PROJECT_SOURCE_DIR}/.git/hooks/pre-commit)

View file

@ -97,6 +97,7 @@ if ("x86_64" IN_LIST ARCHITECTURE OR "arm64" IN_LIST ARCHITECTURE)
else() else()
set(DYNARMIC_TESTS OFF CACHE BOOL "") set(DYNARMIC_TESTS OFF CACHE BOOL "")
set(DYNARMIC_FRONTENDS "A32" CACHE STRING "") set(DYNARMIC_FRONTENDS "A32" CACHE STRING "")
set(DYNARMIC_USE_PRECOMPILED_HEADERS ${CITRA_USE_PRECOMPILED_HEADERS} CACHE BOOL "")
add_subdirectory(dynarmic EXCLUDE_FROM_ALL) add_subdirectory(dynarmic EXCLUDE_FROM_ALL)
endif() endif()
endif() endif()
@ -293,6 +294,6 @@ if (APPLE)
endif() endif()
# adrenotools # adrenotools
if (ANDROID) if (ANDROID AND "arm64" IN_LIST ARCHITECTURE)
add_subdirectory(libadrenotools) add_subdirectory(libadrenotools)
endif() endif()

View file

@ -2,20 +2,24 @@
// Licensed under GPLv2 or any later version // Licensed under GPLv2 or any later version
// Refer to the license.txt file included. // Refer to the license.txt file included.
import android.databinding.tool.ext.capitalizeUS
plugins { plugins {
id("com.android.application") id("com.android.application")
id("org.jetbrains.kotlin.android") id("org.jetbrains.kotlin.android")
id("de.undercouch.download") version "5.5.0"
} }
import android.databinding.tool.ext.capitalizeUS
import de.undercouch.gradle.tasks.download.Download
/** /**
* Use the number of seconds/10 since Jan 1 2016 as the versionCode. * Use the number of seconds/10 since Jan 1 2016 as the versionCode.
* This lets us upload a new build at most every 10 seconds for the * This lets us upload a new build at most every 10 seconds for the
* next 680 years. * next 680 years.
*/ */
val autoVersion = (((System.currentTimeMillis() / 1000) - 1451606400) / 10).toInt() val autoVersion = (((System.currentTimeMillis() / 1000) - 1451606400) / 10).toInt()
val abiFilter = listOf("arm64-v8a"/*, "x86", "x86_64"*/) val abiFilter = listOf("arm64-v8a", "x86_64")
val downloadedJniLibsPath = "${buildDir}/downloadedJniLibs"
@Suppress("UnstableApiUsage") @Suppress("UnstableApiUsage")
android { android {
@ -131,6 +135,13 @@ android {
path = file("../../../CMakeLists.txt") path = file("../../../CMakeLists.txt")
} }
} }
sourceSets {
named("main") {
// Set up path for downloaded native libraries
jniLibs.srcDir(downloadedJniLibsPath)
}
}
} }
dependencies { dependencies {
@ -158,6 +169,30 @@ dependencies {
implementation("com.android.billingclient:billing:2.0.3") implementation("com.android.billingclient:billing:2.0.3")
} }
// Download Vulkan Validation Layers from the KhronosGroup GitHub.
val downloadVulkanValidationLayers = tasks.register<Download>("downloadVulkanValidationLayers") {
src("https://github.com/KhronosGroup/Vulkan-ValidationLayers/releases/download/sdk-1.3.261.1/android-binaries-sdk-1.3.261.1-android.zip")
dest(file("${buildDir}/tmp/Vulkan-ValidationLayers.zip"))
onlyIfModified(true)
}
// Extract Vulkan Validation Layers into the downloaded native libraries directory.
val unzipVulkanValidationLayers = tasks.register<Copy>("unzipVulkanValidationLayers") {
dependsOn(downloadVulkanValidationLayers)
from(zipTree(downloadVulkanValidationLayers.get().dest)) {
// Exclude the top level directory in the zip as it violates the expected jniLibs directory structure.
eachFile {
relativePath = RelativePath(true, *relativePath.segments.drop(1).toTypedArray())
}
includeEmptyDirs = false
}
into(downloadedJniLibsPath)
}
tasks.named("preBuild") {
dependsOn(unzipVulkanValidationLayers)
}
fun getGitVersion(): String { fun getGitVersion(): String {
var versionName = "0.0" var versionName = "0.0"

View file

@ -34,7 +34,11 @@ add_library(citra-android SHARED
ndk_motion.h ndk_motion.h
) )
target_link_libraries(citra-android PRIVATE audio_core citra_common citra_core input_common network adrenotools) target_link_libraries(citra-android PRIVATE audio_core citra_common citra_core input_common network)
target_link_libraries(citra-android PRIVATE android camera2ndk EGL glad inih jnigraphics log mediandk yuv) target_link_libraries(citra-android PRIVATE android camera2ndk EGL glad inih jnigraphics log mediandk yuv)
if ("arm64" IN_LIST ARCHITECTURE)
target_link_libraries(citra-android PRIVATE adrenotools)
endif()
set(CPACK_PACKAGE_EXECUTABLES ${CPACK_PACKAGE_EXECUTABLES} citra-android) set(CPACK_PACKAGE_EXECUTABLES ${CPACK_PACKAGE_EXECUTABLES} citra-android)

View file

@ -10,8 +10,12 @@
#include <android/native_window_jni.h> #include <android/native_window_jni.h>
#include "audio_core/dsp_interface.h" #include "audio_core/dsp_interface.h"
#include "common/aarch64/cpu_detect.h"
#include "common/arch.h" #include "common/arch.h"
#if CITRA_ARCH(arm64)
#include "common/aarch64/cpu_detect.h"
#elif CITRA_ARCH(x86_64)
#include "common/x64/cpu_detect.h"
#endif
#include "common/common_paths.h" #include "common/common_paths.h"
#include "common/dynamic_library/dynamic_library.h" #include "common/dynamic_library/dynamic_library.h"
#include "common/file_util.h" #include "common/file_util.h"