@echo off setlocal enabledelayedexpansion :: ================================================================================================ :: Android dav1d Library Build Script :: ================================================================================================ :: Purpose: Build dav1d library for Android ARM64 platform :: Target: lib/android-arm64-v8a/dav1d/ :: Author: Generated with Claude Code :: :: Prerequisites: :: 1. Android NDK r25+ installed :: 2. Python with meson and ninja installed: pip install meson ninja :: 3. dav1d source code cloned in parent directory :: :: Usage: :: 1. Set Android NDK environment variable: :: set ANDROID_NDK_HOME=C:\Android\android-ndk-r25c :: 2. dav1d source should be available at: :: oss/dav1d/ :: 3. Run this script: :: build_dav1d_android.bat (for ARM64) :: build_dav1d_android.bat arm32 (for ARM32) :: :: Output: :: - lib/android-arm64-v8a/dav1d/libdav1d.a (ARM64) :: - lib/android-armeabi-v7a/dav1d/libdav1d.a (ARM32) :: - include/dav1d/*.h :: ================================================================================================ echo. echo ======================================== echo Android dav1d Library Build Script echo ======================================== echo. :: Set project root directory set "PROJECT_ROOT=%~dp0" set "PROJECT_ROOT=%PROJECT_ROOT:~0,-1%" :: Set Android build configuration (default to ARM64, can be overridden) if "%1"=="arm32" ( set "ANDROID_ABI=armeabi-v7a" set "ANDROID_TOOLCHAIN_PREFIX=armv7a-linux-androideabi" set "MESON_CPU_FAMILY=arm" set "MESON_CPU=armv7" ) else ( set "ANDROID_ABI=arm64-v8a" set "ANDROID_TOOLCHAIN_PREFIX=aarch64-linux-android" set "MESON_CPU_FAMILY=aarch64" set "MESON_CPU=aarch64" ) set "ANDROID_PLATFORM=android-29" set "ANDROID_API_LEVEL=29" :: Set output directory set "OUTPUT_DIR=%PROJECT_ROOT%\lib\android-%ANDROID_ABI%\dav1d" :: dav1d source directory set "DAV1D_SOURCE_DIR=%PROJECT_ROOT%\oss\dav1d" set "BUILD_DIR=%PROJECT_ROOT%\build-android\dav1d" echo Project Root: %PROJECT_ROOT% echo dav1d Source: %DAV1D_SOURCE_DIR% echo Build Directory: %BUILD_DIR% echo Output Directory: %OUTPUT_DIR% echo Android ABI: %ANDROID_ABI% echo Android API Level: %ANDROID_API_LEVEL% echo. :: Check if Android NDK is set if "%ANDROID_NDK_HOME%"=="" ( if "%ANDROID_NDK_ROOT%"=="" ( echo ❌ Error: Android NDK not found echo Please set ANDROID_NDK_HOME or ANDROID_NDK_ROOT environment variable echo Example: set ANDROID_NDK_HOME=C:\Android\android-ndk-r25c exit /b 1 ) else ( set "ANDROID_NDK_HOME=%ANDROID_NDK_ROOT%" ) ) echo ✅ Android NDK found: %ANDROID_NDK_HOME% :: Check if dav1d source directory exists if not exist "%DAV1D_SOURCE_DIR%" ( echo ❌ Error: dav1d source directory not found: %DAV1D_SOURCE_DIR% echo Please ensure dav1d source is available at: echo %PROJECT_ROOT%\oss\dav1d\ exit /b 1 ) echo ✅ dav1d source found: %DAV1D_SOURCE_DIR% :: Check for required tools where meson >nul 2>&1 if errorlevel 1 ( echo ❌ Error: meson not found in PATH echo Please install meson: pip install meson exit /b 1 ) where ninja >nul 2>&1 if errorlevel 1 ( echo ❌ Error: ninja not found in PATH echo Please install ninja: pip install ninja exit /b 1 ) echo ✅ Build tools found: meson, ninja :: Create build directory if exist "%BUILD_DIR%" ( echo 🧹 Cleaning existing build directory... rmdir /s /q "%BUILD_DIR%" ) mkdir "%BUILD_DIR%" if errorlevel 1 ( echo ❌ Error: Failed to create build directory exit /b 1 ) :: Create output directory if not exist "%OUTPUT_DIR%" ( mkdir "%OUTPUT_DIR%" if errorlevel 1 ( echo ❌ Error: Failed to create output directory exit /b 1 ) ) :: Set Android toolchain paths set "ANDROID_TOOLCHAIN_DIR=%ANDROID_NDK_HOME%\toolchains\llvm\prebuilt\windows-x86_64" set "ANDROID_SYSROOT=%ANDROID_TOOLCHAIN_DIR%\sysroot" :: Create meson cross-compilation file for Android set "CROSS_FILE=%BUILD_DIR%\android-%ANDROID_ABI%.txt" echo. echo 📝 Creating meson cross-compilation file for %ANDROID_ABI% (with 16 KB page alignment)... ( echo [binaries] echo c = '%ANDROID_TOOLCHAIN_DIR%\bin\%ANDROID_TOOLCHAIN_PREFIX%%ANDROID_API_LEVEL%-clang.cmd' echo cpp = '%ANDROID_TOOLCHAIN_DIR%\bin\%ANDROID_TOOLCHAIN_PREFIX%%ANDROID_API_LEVEL%-clang++.cmd' echo ar = '%ANDROID_TOOLCHAIN_DIR%\bin\llvm-ar.exe' echo strip = '%ANDROID_TOOLCHAIN_DIR%\bin\llvm-strip.exe' echo pkg-config = 'pkg-config' echo. echo [host_machine] echo system = 'android' echo cpu_family = '%MESON_CPU_FAMILY%' echo cpu = '%MESON_CPU%' echo endian = 'little' echo. echo [properties] echo sys_root = '%ANDROID_SYSROOT%' echo. echo [built-in options] echo c_args = ['-DANDROID', '-D__ANDROID_API__=%ANDROID_API_LEVEL%'] echo cpp_args = ['-DANDROID', '-D__ANDROID_API__=%ANDROID_API_LEVEL%'] echo c_link_args = ['-Wl,-z,max-page-size=16384', '-Wl,-z,common-page-size=16384'] echo cpp_link_args = ['-Wl,-z,max-page-size=16384', '-Wl,-z,common-page-size=16384'] ) > "%CROSS_FILE%" echo ✅ Created cross-compilation file: %CROSS_FILE% echo. echo 🔧 Configuring dav1d build with meson... echo. :: Change to dav1d source directory pushd "%DAV1D_SOURCE_DIR%" :: Configure meson cross-compilation for Android (static library for embedding) meson setup "%BUILD_DIR%" ^ --cross-file="%CROSS_FILE%" ^ --default-library=static ^ --buildtype=release ^ --strip ^ -Denable_tools=false ^ -Denable_tests=false ^ -Denable_examples=false ^ -Denable_docs=false ^ -Db_lto=true ^ -Db_ndebug=true if errorlevel 1 ( echo ❌ Error: meson configuration failed popd exit /b 1 ) echo. echo 🔨 Building dav1d library... echo. :: Build with ninja ninja -C "%BUILD_DIR%" -j%NUMBER_OF_PROCESSORS% if errorlevel 1 ( echo ❌ Error: Build failed popd exit /b 1 ) popd echo. echo 📦 Installing dav1d to output directory... echo. :: Copy built library and headers if exist "%BUILD_DIR%\src\libdav1d.a" ( copy "%BUILD_DIR%\src\libdav1d.a" "%OUTPUT_DIR%\" if errorlevel 1 ( echo ❌ Error: Failed to copy libdav1d.a exit /b 1 ) echo ✅ Copied: libdav1d.a ) else ( echo ❌ Error: libdav1d.a not found in build directory dir "%BUILD_DIR%\src" exit /b 1 ) :: Copy headers set "HEADER_OUTPUT_DIR=%PROJECT_ROOT%\include\dav1d" if not exist "%HEADER_OUTPUT_DIR%" ( mkdir "%HEADER_OUTPUT_DIR%" ) :: Copy public headers from dav1d source if exist "%DAV1D_SOURCE_DIR%\include\dav1d\*.h" ( copy "%DAV1D_SOURCE_DIR%\include\dav1d\*.h" "%HEADER_OUTPUT_DIR%\" if errorlevel 1 ( echo ❌ Error: Failed to copy dav1d headers exit /b 1 ) echo ✅ Copied: dav1d headers to include/dav1d/ ) :: Copy generated config header if exists if exist "%BUILD_DIR%\include\dav1d\version.h" ( copy "%BUILD_DIR%\include\dav1d\version.h" "%HEADER_OUTPUT_DIR%\" echo ✅ Copied: version.h ) :: Display build summary echo. echo ======================================== echo Build Summary echo ======================================== echo Library: %OUTPUT_DIR%\libdav1d.a echo Headers: %HEADER_OUTPUT_DIR%\*.h echo Platform: Android %ANDROID_ABI% (API %ANDROID_API_LEVEL%) echo Build Type: Release with LTO echo. :: Verify output files if exist "%OUTPUT_DIR%\libdav1d.a" ( echo ✅ Success: Android dav1d library built successfully :: Display library info using file command if available where file >nul 2>&1 if not errorlevel 1 ( echo. echo 📋 Library Information: file "%OUTPUT_DIR%\libdav1d.a" ) :: Display file size for %%F in ("%OUTPUT_DIR%\libdav1d.a") do ( echo Library Size: %%~zF bytes ) ) else ( echo ❌ Error: Build completed but libdav1d.a not found in output directory exit /b 1 ) echo. echo 🎯 Next Steps: echo 1. The Android dav1d library is ready for use in VavCore echo 2. Build VavCore Android library: platforms\android\vavcore\build.sh echo 3. Test the library with Android VavCore integration echo. endlocal exit /b 0