Files
video-v1/build_dav1d_android.bat
2025-09-29 02:42:26 +09:00

290 lines
8.0 KiB
Batchfile

@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