fune/media/libvpx/generate_sources_mozbuild.sh
Chun-Min Chang 3e9e678d7e Bug 1880814 - Logs for libvpx configuration on various platforms r=glandium
This patch generates log files during the configuration of libvpx on
variouse platforms. These logs can be used for manual verification of
the correctness of settings. In this particular case, the log file for
win/aarch64 reveals the sve feature is disabled on win/aarch64.

The logs will be excluded to the repo, by .gitignore and .hgignore
settings.

Differential Revision: https://phabricator.services.mozilla.com/D204799
2024-03-19 23:22:51 +00:00

296 lines
9.8 KiB
Bash
Executable file

#!/bin/bash -e
#
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# Modified from chromium/src/third_party/libvpx/generate_gni.sh
# This script is used to generate sources.mozbuild and files in the
# config/platform directories needed to build libvpx.
# Every time libvpx source code is updated just run this script.
#
# Usage:
# $ ./generate_sources_mozbuild.sh
export LC_ALL=C
BASE_DIR=$(pwd)
LIBVPX_SRC_DIR="libvpx"
LIBVPX_CONFIG_DIR="config"
DISABLE_AVX="--disable-avx512"
# Print license header.
# $1 - Output base name
function write_license {
echo "# This file is generated. Do not edit." >> $1
echo "" >> $1
}
# Search for source files with the same basename in vp8, vp9, and vpx_dsp. The
# build does not support duplicate file names.
function find_duplicates {
local readonly duplicate_file_names=$(find \
$BASE_DIR/$LIBVPX_SRC_DIR/vp8 \
$BASE_DIR/$LIBVPX_SRC_DIR/vp9 \
$BASE_DIR/$LIBVPX_SRC_DIR/vpx_dsp \
-type f -name \*.c | xargs -I {} basename {} | sort | uniq -d \
)
if [ -n "${duplicate_file_names}" ]; then
echo "ERROR: DUPLICATE FILES FOUND"
for file in ${duplicate_file_names}; do
find \
$BASE_DIR/$LIBVPX_SRC_DIR/vp8 \
$BASE_DIR/$LIBVPX_SRC_DIR/vp9 \
$BASE_DIR/$LIBVPX_SRC_DIR/vpx_dsp \
-name $file
done
exit 1
fi
}
# Generate sources.mozbuild with a list of source files.
# $1 - Array name for file list. This is processed with 'declare' below to
# regenerate the array locally.
# $2 - Variable name.
# $3 - Output file.
function write_sources {
# Convert the first argument back in to an array.
declare -a file_list=("${!1}")
echo " '$2': [" >> "$3"
for f in $file_list
do
echo " 'libvpx/$f'," >> "$3"
done
echo "]," >> "$3"
}
# Convert a list of source files into sources.mozbuild.
# $1 - Input file.
# $2 - Output prefix.
function convert_srcs_to_project_files {
# Do the following here:
# 1. Filter .c, .h, .s, .S and .asm files.
# 3. Convert .asm.s to .asm because moz.build will do the conversion.
local source_list=$(grep -E '(\.c|\.h|\.S|\.s|\.asm)$' $1)
# Remove vpx_config.c.
# The platform-specific vpx_config.c will be added into in moz.build later.
source_list=$(echo "$source_list" | grep -v 'vpx_config\.c')
# Remove include-only asm files (no object code emitted)
source_list=$(echo "$source_list" | grep -v 'x86_abi_support\.asm')
source_list=$(echo "$source_list" | grep -v 'config\.asm')
# The actual ARM files end in .asm. We have rules to translate them to .S
source_list=$(echo "$source_list" | sed s/\.asm\.s$/.asm/)
# Exports - everything in vpx, vpx_mem, vpx_ports, vpx_scale
local exports_list=$(echo "$source_list" | \
egrep '^(vpx|vpx_mem|vpx_ports|vpx_scale)/.*h$')
# but not anything in one level down, like 'internal'
exports_list=$(echo "$exports_list" | egrep -v '/(internal|src)/')
# or any of the other internal-ish header files.
exports_list=$(echo "$exports_list" | egrep -v '/(emmintrin_compat.h|mem_.*|msvc.h|vpx_once.h)$')
# Remove these files from the main list.
source_list=$(comm -23 <(echo "$source_list") <(echo "$exports_list"))
# Write a single file that includes all source files for all archs.
local c_sources=$(echo "$source_list" | egrep '.(asm|c)$')
local exports_sources=$(echo "$exports_list" | egrep '.h$')
write_sources exports_sources ${2}_EXPORTS "$BASE_DIR/sources.mozbuild"
write_sources c_sources ${2}_SOURCES "$BASE_DIR/sources.mozbuild"
}
# Clean files from previous make.
function make_clean {
make clean > /dev/null
rm -f libvpx_srcs.txt
}
# Print the configuration.
# $1 - Header file directory.
function print_config {
$BASE_DIR/lint_config.sh -p \
-h $BASE_DIR/$LIBVPX_CONFIG_DIR/$1/vpx_config.h \
-a $BASE_DIR/$LIBVPX_CONFIG_DIR/$1/vpx_config.asm
}
# Generate *_rtcd.h files.
# $1 - Header file directory.
# $2 - Architecture.
# $3 - Optional - any additional arguments to pass through.
function gen_rtcd_header {
echo "Generate $LIBVPX_CONFIG_DIR/$1/*_rtcd.h files."
rm -rf $BASE_DIR/$TEMP_DIR/libvpx.config
$BASE_DIR/lint_config.sh -p \
-h $BASE_DIR/$LIBVPX_CONFIG_DIR/$1/vpx_config.h \
-a $BASE_DIR/$LIBVPX_CONFIG_DIR/$1/vpx_config.asm \
-o $BASE_DIR/$TEMP_DIR/libvpx.config
$BASE_DIR/$LIBVPX_SRC_DIR/build/make/rtcd.pl \
--arch=$2 \
--sym=vp8_rtcd $DISABLE_AVX $3 \
--config=$BASE_DIR/$TEMP_DIR/libvpx.config \
$BASE_DIR/$LIBVPX_SRC_DIR/vp8/common/rtcd_defs.pl \
> $BASE_DIR/$LIBVPX_CONFIG_DIR/$1/vp8_rtcd.h
$BASE_DIR/$LIBVPX_SRC_DIR/build/make/rtcd.pl \
--arch=$2 \
--sym=vp9_rtcd $DISABLE_AVX $3 \
--config=$BASE_DIR/$TEMP_DIR/libvpx.config \
$BASE_DIR/$LIBVPX_SRC_DIR/vp9/common/vp9_rtcd_defs.pl \
> $BASE_DIR/$LIBVPX_CONFIG_DIR/$1/vp9_rtcd.h
$BASE_DIR/$LIBVPX_SRC_DIR/build/make/rtcd.pl \
--arch=$2 \
--sym=vpx_scale_rtcd $DISABLE_AVX $3 \
--config=$BASE_DIR/$TEMP_DIR/libvpx.config \
$BASE_DIR/$LIBVPX_SRC_DIR/vpx_scale/vpx_scale_rtcd.pl \
> $BASE_DIR/$LIBVPX_CONFIG_DIR/$1/vpx_scale_rtcd.h
$BASE_DIR/$LIBVPX_SRC_DIR/build/make/rtcd.pl \
--arch=$2 \
--sym=vpx_dsp_rtcd $DISABLE_AVX $3 \
--config=$BASE_DIR/$TEMP_DIR/libvpx.config \
$BASE_DIR/$LIBVPX_SRC_DIR/vpx_dsp/vpx_dsp_rtcd_defs.pl \
> $BASE_DIR/$LIBVPX_CONFIG_DIR/$1/vpx_dsp_rtcd.h
rm -rf $BASE_DIR/$TEMP_DIR/libvpx.config
}
# Generate Config files. "--enable-external-build" must be set to skip
# detection of capabilities on specific targets.
# $1 - Header file directory.
# $2 - Config command line.
function gen_config_files {
./configure $2 --log=$BASE_DIR/$LIBVPX_CONFIG_DIR/$1/config.log > /dev/null
echo "Log file: $BASE_DIR/$LIBVPX_CONFIG_DIR/$1/config.log"
# Disable HAVE_UNISTD_H.
( echo '/HAVE_UNISTD_H'; echo 'd' ; echo 'w' ; echo 'q' ) | ed -s vpx_config.h
local ASM_CONV=ads2gas.pl
# Generate vpx_config.asm.
if [[ "$1" == *x64* ]] || [[ "$1" == *ia32* ]]; then
egrep "#define [A-Z0-9_]+ [01]" vpx_config.h | awk '{print "%define " $2 " " $3}' > vpx_config.asm
else
egrep "#define [A-Z0-9_]+ [01]" vpx_config.h | awk '{print $2 " EQU " $3}' | perl $BASE_DIR/$LIBVPX_SRC_DIR/build/make/$ASM_CONV > vpx_config.asm
fi
cp vpx_config.* $BASE_DIR/$LIBVPX_CONFIG_DIR/$1
make_clean
rm -rf vpx_config.*
}
find_duplicates
echo "Create temporary directory."
TEMP_DIR="$LIBVPX_SRC_DIR.temp"
rm -rf $TEMP_DIR
cp -R $LIBVPX_SRC_DIR $TEMP_DIR
cd $TEMP_DIR
echo "Generate config files."
all_platforms="--enable-external-build --disable-examples --disable-install-docs --disable-unit-tests"
all_platforms="${all_platforms} --enable-multi-res-encoding --size-limit=8192x4608 --enable-pic"
all_platforms="${all_platforms} --disable-avx512"
x86_platforms="--enable-postproc --enable-vp9-postproc --as=yasm"
arm_platforms="--enable-runtime-cpu-detect --enable-realtime-only"
arm64_platforms="--enable-realtime-only"
disable_sve="--disable-sve" # Bug 1885585
gen_config_files linux/x64 "--target=x86_64-linux-gcc ${all_platforms} ${x86_platforms}"
gen_config_files linux/ia32 "--target=x86-linux-gcc ${all_platforms} ${x86_platforms}"
gen_config_files mac/x64 "--target=x86_64-darwin9-gcc ${all_platforms} ${x86_platforms}"
gen_config_files mac/ia32 "--target=x86-darwin9-gcc ${all_platforms} ${x86_platforms}"
gen_config_files win/x64 "--target=x86_64-win64-vs15 ${all_platforms} ${x86_platforms}"
gen_config_files win/ia32 "--target=x86-win32-gcc ${all_platforms} ${x86_platforms}"
gen_config_files linux/arm "--target=armv7-linux-gcc ${all_platforms} ${arm_platforms}"
gen_config_files linux/arm64 "--target=arm64-linux-gcc ${all_platforms} ${arm64_platforms}"
gen_config_files win/aarch64 "--target=arm64-win64-vs15 ${all_platforms} ${arm64_platforms} ${disable_sve}" # Bug 1885585
gen_config_files generic "--target=generic-gnu ${all_platforms}"
echo "Remove temporary directory."
cd $BASE_DIR
rm -rf $TEMP_DIR
echo "Create temporary directory."
TEMP_DIR="$LIBVPX_SRC_DIR.temp"
rm -rf $TEMP_DIR
cp -R $LIBVPX_SRC_DIR $TEMP_DIR
cd $TEMP_DIR
gen_rtcd_header linux/x64 x86_64
gen_rtcd_header linux/ia32 x86
gen_rtcd_header mac/x64 x86_64
gen_rtcd_header mac/ia32 x86
gen_rtcd_header win/x64 x86_64
gen_rtcd_header win/ia32 x86
gen_rtcd_header linux/arm armv7
gen_rtcd_header linux/arm64 arm64
gen_rtcd_header win/aarch64 arm64 $disable_sve # Bug 1885585
gen_rtcd_header generic generic
echo "Prepare Makefile."
./configure --target=generic-gnu > /dev/null
make_clean
# Remove existing source files.
rm -rf $BASE_DIR/sources.mozbuild
write_license $BASE_DIR/sources.mozbuild
echo "files = {" >> $BASE_DIR/sources.mozbuild
echo "Generate X86_64 source list."
config=$(print_config linux/x64)
make_clean
make libvpx_srcs.txt target=libs $config > /dev/null
convert_srcs_to_project_files libvpx_srcs.txt X64
# Copy vpx_version.h once. The file is the same for all platforms.
cp vpx_version.h $BASE_DIR/$LIBVPX_CONFIG_DIR
echo "Generate IA32 source list."
config=$(print_config linux/ia32)
make_clean
make libvpx_srcs.txt target=libs $config > /dev/null
convert_srcs_to_project_files libvpx_srcs.txt IA32
echo "Generate ARM source list."
config=$(print_config linux/arm)
make_clean
make libvpx_srcs.txt target=libs $config > /dev/null
convert_srcs_to_project_files libvpx_srcs.txt ARM
echo "Generate ARM64 source list."
config=$(print_config linux/arm64)
make_clean
make libvpx_srcs.txt target=libs $config > /dev/null
convert_srcs_to_project_files libvpx_srcs.txt ARM64
# Bug 1885585: The sve files will be excluded from the win/aarch64 build in moz.build.
echo "Generate generic source list."
config=$(print_config generic)
make_clean
make libvpx_srcs.txt target=libs $config > /dev/null
convert_srcs_to_project_files libvpx_srcs.txt GENERIC
echo "}" >> $BASE_DIR/sources.mozbuild
echo "Remove temporary directory."
cd $BASE_DIR
rm -rf $TEMP_DIR
cd $BASE_DIR/$LIBVPX_SRC_DIR
cd $BASE_DIR