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:
parent
f5b8888686
commit
6244f9e3fd
14 changed files with 131 additions and 43 deletions
|
@ -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}"
|
||||||
|
|
|
@ -12,4 +12,4 @@ cmake .. -GNinja \
|
||||||
-DENABLE_COMPATIBILITY_LIST_DOWNLOAD=ON
|
-DENABLE_COMPATIBILITY_LIST_DOWNLOAD=ON
|
||||||
ninja
|
ninja
|
||||||
|
|
||||||
ccache -s
|
ccache -s -v
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
77
.ci/pack.sh
77
.ci/pack.sh
|
@ -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
|
||||||
|
|
|
@ -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"
|
||||||
|
|
22
.github/workflows/build.yml
vendored
22
.github/workflows/build.yml
vendored
|
@ -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:
|
||||||
|
|
|
@ -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)
|
||||||
|
|
3
externals/CMakeLists.txt
vendored
3
externals/CMakeLists.txt
vendored
|
@ -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()
|
||||||
|
|
|
@ -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"
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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"
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Loading…
Reference in a new issue