parent
716d747b5a
commit
9be4ca334d
@ -0,0 +1,66 @@ |
|||||||
|
source scripts/parse-arguments.sh |
||||||
|
source scripts/export-host-variables.sh |
||||||
|
|
||||||
|
function prepareOutput() { |
||||||
|
OUTPUT_LIB=${OUTPUT_DIR}/lib/${ANDROID_ABI} |
||||||
|
mkdir -p ${OUTPUT_LIB} |
||||||
|
# CURRENT_INSTALL_PATH ! |
||||||
|
cp ${BUILD_DIR_FFMPEG}/${ANDROID_ABI}/lib/*.so ${OUTPUT_LIB} |
||||||
|
|
||||||
|
OUTPUT_HEADERS=${OUTPUT_DIR}/include/${ANDROID_ABI} |
||||||
|
mkdir -p ${OUTPUT_HEADERS} |
||||||
|
cp -r ${BUILD_DIR_FFMPEG}/${ANDROID_ABI}/include/* ${OUTPUT_HEADERS} |
||||||
|
} |
||||||
|
|
||||||
|
function checkTextRelocations() { |
||||||
|
# Saving stats about text relocation presence. |
||||||
|
# If the result file doesn't have 'TEXTREL' at all, then we are good. |
||||||
|
TEXT_REL_STATS_FILE=${STATS_DIR}/text-relocations.txt |
||||||
|
${CROSS_PREFIX}readelf --dynamic ${BUILD_DIR_FFMPEG}/${ABI}/lib/*.so | grep 'TEXTREL\|File' >> ${TEXT_REL_STATS_FILE} |
||||||
|
|
||||||
|
if grep -q TEXTREL ${TEXT_REL_STATS_FILE}; then |
||||||
|
echo "There are text relocations in output files:" |
||||||
|
cat ${TEXT_REL_STATS_FILE} |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
} |
||||||
|
|
||||||
|
rm -rf ${BUILD_DIR} |
||||||
|
rm -rf ${STATS_DIR} |
||||||
|
rm -rf ${OUTPUT_DIR} |
||||||
|
mkdir -p ${STATS_DIR} |
||||||
|
mkdir -p ${OUTPUT_DIR} |
||||||
|
|
||||||
|
COMPONENTS_TO_BUILD=${EXTERNAL_LIBRARIES[@]} |
||||||
|
COMPONENTS_TO_BUILD+=( "ffmpeg" ) |
||||||
|
|
||||||
|
for COMPONENT in ${COMPONENTS_TO_BUILD[@]} |
||||||
|
do |
||||||
|
export ENSURE_SOURCE_DIR=$SOURCES_DIR/$COMPONENT |
||||||
|
mkdir -p ${ENSURE_SOURCE_DIR} |
||||||
|
source scripts/${COMPONENT}/download.sh |
||||||
|
done |
||||||
|
|
||||||
|
# Build all libraries for each enabled arch |
||||||
|
# ABIS_TO_BUILD=("armeabi-v7a" "arm64-v8a" "x86" "x86_64") |
||||||
|
ABIS_TO_BUILD=("armeabi-v7a") |
||||||
|
|
||||||
|
for ABI in ${ABIS_TO_BUILD[@]} |
||||||
|
do |
||||||
|
source scripts/export-build-variables.sh ${ABI} |
||||||
|
|
||||||
|
for COMPONENT in ${COMPONENTS_TO_BUILD[@]} |
||||||
|
do |
||||||
|
echo "Building the component: ${COMPONENT}" |
||||||
|
COMPONENT_SOURCES_DIR_VARIABLE=SOURCES_DIR_${COMPONENT} |
||||||
|
echo ${!COMPONENT_SOURCES_DIR_VARIABLE} |
||||||
|
cd ${!COMPONENT_SOURCES_DIR_VARIABLE} |
||||||
|
${SCRIPTS_DIR}/${COMPONENT}/build.sh |
||||||
|
cd $BASE_DIR |
||||||
|
done |
||||||
|
|
||||||
|
# Check for text rels |
||||||
|
checkTextRelocations |
||||||
|
|
||||||
|
prepareOutput |
||||||
|
done |
@ -0,0 +1,55 @@ |
|||||||
|
function max() { |
||||||
|
[ $1 -ge $2 ] && echo "$1" || echo "$2" |
||||||
|
} |
||||||
|
|
||||||
|
export ANDROID_ABI=$1 |
||||||
|
|
||||||
|
if [ $ANDROID_ABI = "arm64-v8a" ] || [ $ANDROID_ABI = "x86_64" ] ; then |
||||||
|
export ANDROID_PLATFORM=$(max ${MIN_SDK_ARG} 21) |
||||||
|
else |
||||||
|
export ANDROID_PLATFORM=${MIN_SDK_ARG} |
||||||
|
fi |
||||||
|
|
||||||
|
export TOOLCHAIN_PATH=${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/${HOST_TAG} |
||||||
|
export SYSROOT=${TOOLCHAIN_PATH}/sysroot |
||||||
|
|
||||||
|
export TARGET_TRIPLE_MACHINE_BINUTILS= |
||||||
|
TARGET_TRIPLE_MACHINE_CC= |
||||||
|
export TARGET_TRIPLE_OS="android" |
||||||
|
|
||||||
|
case $ANDROID_ABI in |
||||||
|
armeabi-v7a) |
||||||
|
#cc armv7a-linux-androideabi16-clang |
||||||
|
#binutils arm -linux-androideabi -ld |
||||||
|
export TARGET_TRIPLE_MACHINE_BINUTILS=arm |
||||||
|
TARGET_TRIPLE_MACHINE_CC=armv7a |
||||||
|
export TARGET_TRIPLE_OS=androideabi |
||||||
|
;; |
||||||
|
arm64-v8a) |
||||||
|
#cc aarch64-linux-android21-clang |
||||||
|
#binutils aarch64-linux-android -ld |
||||||
|
export TARGET_TRIPLE_MACHINE_BINUTILS=aarch64 |
||||||
|
;; |
||||||
|
x86) |
||||||
|
#cc i686-linux-android16-clang |
||||||
|
#binutils i686-linux-android -ld |
||||||
|
export TARGET_TRIPLE_MACHINE_BINUTILS=i686 |
||||||
|
;; |
||||||
|
x86_64) |
||||||
|
#cc x86_64-linux-android21-clang |
||||||
|
#binutils x86_64-linux-android -ld |
||||||
|
export TARGET_TRIPLE_MACHINE_BINUTILS=x86_64 |
||||||
|
;; |
||||||
|
esac |
||||||
|
|
||||||
|
# If the cc-specific variable isn't set, we fallback to binutils version |
||||||
|
[ -z "${TARGET_TRIPLE_MACHINE_CC}" ] && TARGET_TRIPLE_MACHINE_CC=${TARGET_TRIPLE_MACHINE_BINUTILS} |
||||||
|
export TARGET_TRIPLE_MACHINE_CC=$TARGET_TRIPLE_MACHINE_CC |
||||||
|
|
||||||
|
# Common prefix for ld, as, etc. |
||||||
|
export CROSS_PREFIX=${TOOLCHAIN_PATH}/bin/${TARGET_TRIPLE_MACHINE_BINUTILS}-linux-${TARGET_TRIPLE_OS}- |
||||||
|
|
||||||
|
# The name for compiler is slightly different, so it is defined separatly. |
||||||
|
export CC=${TOOLCHAIN_PATH}/bin/${TARGET_TRIPLE_MACHINE_CC}-linux-${TARGET_TRIPLE_OS}${ANDROID_PLATFORM}-clang |
||||||
|
|
||||||
|
export PKG_CONFIG_LIBDIR=/Users/javernaut/Development/FFmpeg/AOM/aom_build/output/lib/pkgconfig |
@ -0,0 +1,21 @@ |
|||||||
|
# Defining a toolchain directory's name according to the current OS. |
||||||
|
# Assume that proper version of NDK is installed. |
||||||
|
case "$OSTYPE" in |
||||||
|
darwin*) HOST_TAG="darwin-x86_64" ;; |
||||||
|
linux*) HOST_TAG="linux-x86_64" ;; |
||||||
|
msys) |
||||||
|
case "$(uname -m)" in |
||||||
|
x86_64) HOST_TAG="windows-x86_64" ;; |
||||||
|
i686) HOST_TAG="windows" ;; |
||||||
|
esac |
||||||
|
;; |
||||||
|
esac |
||||||
|
|
||||||
|
if [[ $OSTYPE == "darwin"* ]]; then |
||||||
|
HOST_NPROC=$(sysctl -n hw.physicalcpu) |
||||||
|
else |
||||||
|
HOST_NPROC=$(nproc) |
||||||
|
fi |
||||||
|
|
||||||
|
export HOST_TAG=$HOST_TAG |
||||||
|
export HOST_NPROC=$HOST_NPROC |
@ -0,0 +1,49 @@ |
|||||||
|
case $ANDROID_ABI in |
||||||
|
armeabi-v7a) |
||||||
|
EXTRA_BUILD_CONFIGURATION_FLAGS=--enable-thumb |
||||||
|
;; |
||||||
|
x86) |
||||||
|
# Disabling assembler optimizations, because they have text relocations |
||||||
|
EXTRA_BUILD_CONFIGURATION_FLAGS=--disable-asm |
||||||
|
;; |
||||||
|
x86_64) |
||||||
|
EXTRA_BUILD_CONFIGURATION_FLAGS=--x86asmexe=${TOOLCHAIN_PATH}/bin/yasm |
||||||
|
;; |
||||||
|
esac |
||||||
|
|
||||||
|
# Everything that goes below ${EXTRA_BUILD_CONFIGURATION_FLAGS} is my project-specific. |
||||||
|
# You are free to enable/disable whatever you actually need. |
||||||
|
|
||||||
|
# Path for prefix should come as a single argument from ffmpeg-android-maker istself |
||||||
|
./configure \ |
||||||
|
--prefix=${BUILD_DIR_FFMPEG}/${ANDROID_ABI} \ |
||||||
|
--enable-cross-compile \ |
||||||
|
--target-os=android \ |
||||||
|
--arch=${TARGET_TRIPLE_MACHINE_BINUTILS} \ |
||||||
|
--sysroot=${SYSROOT} \ |
||||||
|
--cross-prefix=${CROSS_PREFIX} \ |
||||||
|
--cc=${CC} \ |
||||||
|
--extra-cflags="-O3 -fPIC" \ |
||||||
|
--enable-shared \ |
||||||
|
--disable-static \ |
||||||
|
${EXTRA_BUILD_CONFIGURATION_FLAGS} \ |
||||||
|
--disable-runtime-cpudetect \ |
||||||
|
--disable-programs \ |
||||||
|
--disable-muxers \ |
||||||
|
--disable-encoders \ |
||||||
|
--disable-avdevice \ |
||||||
|
--disable-postproc \ |
||||||
|
--disable-swresample \ |
||||||
|
--disable-avfilter \ |
||||||
|
--disable-doc \ |
||||||
|
--disable-debug \ |
||||||
|
--disable-pthreads \ |
||||||
|
--disable-network \ |
||||||
|
--disable-bsfs \ |
||||||
|
--pkg-config=$(which pkg-config) |
||||||
|
|
||||||
|
# Add --enable-xxx flags here |
||||||
|
|
||||||
|
make clean |
||||||
|
make -j${HOST_NPROC} |
||||||
|
make install |
@ -0,0 +1,73 @@ |
|||||||
|
# Expecting FFMPEG_SOURCE_TYPE and FFMPEG_SOURCE_VALUE variables |
||||||
|
|
||||||
|
# Think of that names |
||||||
|
|
||||||
|
# Expecting ENSURE_SOURCE_DIR - where source code has to be downloaded |
||||||
|
# Exports SOURCES_DIR_FFMPEG - path where actual sources are stored |
||||||
|
|
||||||
|
echo "Downloading sources for FFmpeg" |
||||||
|
|
||||||
|
echo ${FFMPEG_SOURCE_TYPE} |
||||||
|
echo ${FFMPEG_SOURCE_VALUE} |
||||||
|
|
||||||
|
# Utility function |
||||||
|
# Getting sources of a particular ffmpeg release. |
||||||
|
# Same argument (ffmpeg version) produces the same source set. |
||||||
|
function ensureSourcesTar() { |
||||||
|
FFMPEG_SOURCES=${ENSURE_SOURCE_DIR}/ffmpeg-${FFMPEG_SOURCE_VALUE} |
||||||
|
|
||||||
|
if [[ ! -d "$FFMPEG_SOURCES" ]]; then |
||||||
|
TARGET_FILE_NAME=ffmpeg-${FFMPEG_SOURCE_VALUE}.tar.bz2 |
||||||
|
TARGET_FILE_PATH=${ENSURE_SOURCE_DIR}/${TARGET_FILE_NAME} |
||||||
|
|
||||||
|
curl https://www.ffmpeg.org/releases/${TARGET_FILE_NAME} --output ${TARGET_FILE_PATH} |
||||||
|
tar xzf ${TARGET_FILE_PATH} -C ${ENSURE_SOURCE_DIR} |
||||||
|
rm ${TARGET_FILE_PATH} |
||||||
|
fi |
||||||
|
|
||||||
|
export SOURCES_DIR_ffmpeg=$FFMPEG_SOURCES |
||||||
|
} |
||||||
|
|
||||||
|
# Utility function |
||||||
|
# Getting sources of a particular branch of ffmpeg's git repository. |
||||||
|
# Same argument (branch name) may produce different source set, |
||||||
|
# as the branch in origin repository may be updated in future. |
||||||
|
# function ensureSourcesBranch() { |
||||||
|
# BRANCH=$1 |
||||||
|
# |
||||||
|
# GIT_DIRECTORY=ffmpeg-git |
||||||
|
# |
||||||
|
# FFMPEG_SOURCES=${SOURCES_DIR}/${GIT_DIRECTORY} |
||||||
|
# |
||||||
|
# cd ${SOURCES_DIR} |
||||||
|
# |
||||||
|
# if [[ ! -d "$FFMPEG_SOURCES" ]]; then |
||||||
|
# git clone https://git.ffmpeg.org/ffmpeg.git ${GIT_DIRECTORY} |
||||||
|
# fi |
||||||
|
# |
||||||
|
# cd ${GIT_DIRECTORY} |
||||||
|
# git checkout $BRANCH |
||||||
|
# # Forcing the update of a branch |
||||||
|
# git pull origin $BRANCH |
||||||
|
# |
||||||
|
# # Additional logging to keep track of an exact commit to build |
||||||
|
# echo "Commit to build:" |
||||||
|
# git rev-parse HEAD |
||||||
|
# |
||||||
|
# cd ${BASE_DIR} |
||||||
|
# } |
||||||
|
|
||||||
|
case ${FFMPEG_SOURCE_TYPE} in |
||||||
|
# GIT_TAG) |
||||||
|
# echo "Using FFmpeg ${SECOND_ARGUMENT}" |
||||||
|
# ensureSourcesTag ${SECOND_ARGUMENT} |
||||||
|
# ;; |
||||||
|
# GIT_BRANCH) |
||||||
|
# echo "Using FFmpeg git repository and its branch ${SECOND_ARGUMENT}" |
||||||
|
# ensureSourcesBranch ${SECOND_ARGUMENT} |
||||||
|
# ;; |
||||||
|
TAR) |
||||||
|
echo "Using FFmpeg source archive ${FFMPEG_FALLBACK_VERSION}" |
||||||
|
ensureSourcesTar |
||||||
|
;; |
||||||
|
esac |
@ -0,0 +1,64 @@ |
|||||||
|
# TODO Add desctiption of in and out params |
||||||
|
|
||||||
|
EXTERNAL_LIBRARIES=() |
||||||
|
|
||||||
|
SOURCE_TYPE=TAR |
||||||
|
SOURCE_VALUE="4.2.1" |
||||||
|
|
||||||
|
MIN_SDK=16 |
||||||
|
|
||||||
|
for i in "$@" |
||||||
|
do |
||||||
|
case $i in |
||||||
|
--min-sdk=*) |
||||||
|
MIN_SDK="${i#*=}" |
||||||
|
shift |
||||||
|
;; |
||||||
|
--source-git-tag=*) |
||||||
|
SOURCE_TYPE=GIT_TAG |
||||||
|
SOURCE_VALUE="${i#*=}" |
||||||
|
shift |
||||||
|
;; |
||||||
|
--source-git-branch=*) |
||||||
|
SOURCE_TYPE=GIT_BRANCH |
||||||
|
SOURCE_VALUE="${i#*=}" |
||||||
|
shift |
||||||
|
;; |
||||||
|
--source-tar=*) |
||||||
|
SOURCE_TYPE=TAR |
||||||
|
SOURCE_VALUE="${i#*=}" |
||||||
|
shift |
||||||
|
;; |
||||||
|
--enable-libaom) |
||||||
|
EXTERNAL_LIBRARIES+=( "libaom" ) |
||||||
|
shift |
||||||
|
;; |
||||||
|
--enable-libdav1d) |
||||||
|
EXTERNAL_LIBRARIES+=( "libdav1d" ) |
||||||
|
shift |
||||||
|
;; |
||||||
|
--enable-libmp3lame) |
||||||
|
EXTERNAL_LIBRARIES+=( "libmp3lame" ) |
||||||
|
shift |
||||||
|
;; |
||||||
|
*) |
||||||
|
echo "Unknown argument $i" |
||||||
|
;; |
||||||
|
esac |
||||||
|
done |
||||||
|
|
||||||
|
export FFMPEG_SOURCE_TYPE=$SOURCE_TYPE |
||||||
|
export FFMPEG_SOURCE_VALUE=$SOURCE_VALUE |
||||||
|
export FFMPEG_EXTERNAL_LIBRARIES=${EXTERNAL_LIBRARIES[@]} |
||||||
|
|
||||||
|
export MIN_SDK_ARG=${MIN_SDK} |
||||||
|
|
||||||
|
# Download sources for all libraries |
||||||
|
export BASE_DIR="$( cd "$( dirname "$0" )" && pwd )" |
||||||
|
export SOURCES_DIR=${BASE_DIR}/sources |
||||||
|
export STATS_DIR=${BASE_DIR}/stats |
||||||
|
export SCRIPTS_DIR=${BASE_DIR}/scripts |
||||||
|
export OUTPUT_DIR=${BASE_DIR}/output |
||||||
|
BUILD_DIR=${BASE_DIR}/build |
||||||
|
export BUILD_DIR_FFMPEG=$BUILD_DIR/ffmpeg |
||||||
|
export BUILD_DIR_EXTERNAL=$BUILD_DIR/external |
Loading…
Reference in new issue