From 15c24ace5af0f6ba8c2ae97e2f4c6327783cd19a Mon Sep 17 00:00:00 2001 From: Javernaut Date: Wed, 27 Nov 2019 13:59:53 +0200 Subject: [PATCH] Documenting the ffmpeg-android-maker-2.sh --- ffmpeg-android-maker-2.sh | 88 +++++++++++++++++++++++++++++++------- scripts/ffmpeg/download.sh | 29 +++++-------- scripts/parse-arguments.sh | 24 +++++------ 3 files changed, 95 insertions(+), 46 deletions(-) diff --git a/ffmpeg-android-maker-2.sh b/ffmpeg-android-maker-2.sh index 7d447ef..5f1f889 100755 --- a/ffmpeg-android-maker-2.sh +++ b/ffmpeg-android-maker-2.sh @@ -1,12 +1,34 @@ -source scripts/export-core-variables.sh -source scripts/export-host-variables.sh -source scripts/parse-arguments.sh +# Defining essential directories +# The root of the project +export BASE_DIR="$( cd "$( dirname "$0" )" && pwd )" +# Directory that contains source code for FFmpeg and its dependencies +# Each library has its own subdirectory +# Multiple versions of the same library can be stored inside librarie's directory +export SOURCES_DIR=${BASE_DIR}/sources +# Directory to place some statistics about the build. +# Currently - the info about Text Relocations +export STATS_DIR=${BASE_DIR}/stats +# Directory that contains helper scripts and +# scripts to download and build FFmpeg and each dependency separated by subdirectories +export SCRIPTS_DIR=${BASE_DIR}/scripts +# The directory to use by Android project +# All FFmpeg's libraries and headers are copied there +export OUTPUT_DIR=${BASE_DIR}/output +# Directory to use as a place to build/install FFmpeg and its dependencies +BUILD_DIR=${BASE_DIR}/build +# Separate directory to build FFmpeg to +export BUILD_DIR_FFMPEG=$BUILD_DIR/ffmpeg +# All external libraries are installed to a single root +# to make easier referencing them when FFmpeg is being built. +export BUILD_DIR_EXTERNAL=$BUILD_DIR/external + +# Function that copies *.so files and headers of the current ANDROID_ABI +# to the proper place inside OUTPUT_DIR 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} @@ -14,11 +36,12 @@ function prepareOutput() { cp -r ${BUILD_DIR_FFMPEG}/${ANDROID_ABI}/include/* ${OUTPUT_HEADERS} } +# Saving stats about text relocation presence. +# If the result file doesn't have 'TEXTREL' at all, then we are good. +# Otherwise the whole script is interrupted 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} + ${CROSS_PREFIX}readelf --dynamic ${BUILD_DIR_FFMPEG}/${ANDROID_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:" @@ -27,41 +50,74 @@ function checkTextRelocations() { fi } +# Actual work of the script + +# Clearing previously created binaries rm -rf ${BUILD_DIR} rm -rf ${STATS_DIR} rm -rf ${OUTPUT_DIR} mkdir -p ${STATS_DIR} mkdir -p ${OUTPUT_DIR} +# Exporting more necessary variabls +source ${SCRIPTS_DIR}/export-host-variables.sh +source ${SCRIPTS_DIR}/parse-arguments.sh + +# Treating FFmpeg as just a module to build after its dependencies COMPONENTS_TO_BUILD=${EXTERNAL_LIBRARIES[@]} COMPONENTS_TO_BUILD+=( "ffmpeg" ) +# Get the source code of component to build for COMPONENT in ${COMPONENTS_TO_BUILD[@]} do - export ENSURE_SOURCE_DIR=$SOURCES_DIR/$COMPONENT - mkdir -p ${ENSURE_SOURCE_DIR} - source scripts/${COMPONENT}/download.sh + echo "Getting source code of the component: ${COMPONENT}" + SOURCE_DIR_FOR_COMPONENT=${SOURCES_DIR}/${COMPONENT} + + mkdir -p ${SOURCE_DIR_FOR_COMPONENT} + cd ${SOURCE_DIR_FOR_COMPONENT} + + # Executing the component-specific script for downloading the source code + source ${SCRIPTS_DIR}/${COMPONENT}/download.sh + + # The download.sh script has to export SOURCES_DIR_$COMPONENT variable + # with actual path of the source code. This is done for possiblity to switch + # between different verions of a component. + # If it isn't set, consider SOURCE_DIR_FOR_COMPONENT as the proper value + COMPONENT_SOURCES_DIR_VARIABLE=SOURCES_DIR_${COMPONENT} + if [[ -z "${!COMPONENT_SOURCES_DIR_VARIABLE}" ]]; then + export SOURCES_DIR_${COMPONENT}=${SOURCE_DIR_FOR_COMPONENT} + fi + + # Returning to the rood directory. Just in case. + cd ${BASE_DIR} done -# Build all libraries for each enabled arch -# ABIS_TO_BUILD=("armeabi-v7a" "arm64-v8a" "x86" "x86_64") +# ABIs to build FFmpeg for. +# x86 is the first, because it is likely to have Text Relocations. +# In this case the rest ABIs will not be assembled at all. +# ABIS_TO_BUILD=( "x86" "x86_64" "armeabi-v7a" "arm64-v8a" ) ABIS_TO_BUILD=("armeabi-v7a") for ABI in ${ABIS_TO_BUILD[@]} do - source scripts/export-build-variables.sh ${ABI} + # Exporting variables for the current ABI + source ${SCRIPTS_DIR}/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} + + # Going to the actual source code directory of the current component cd ${!COMPONENT_SOURCES_DIR_VARIABLE} + + # and executing the component-specific build script ${SCRIPTS_DIR}/${COMPONENT}/build.sh - cd $BASE_DIR + + # Returning to the root directory. Just in case. + cd ${BASE_DIR} done - # Check for text rels checkTextRelocations prepareOutput diff --git a/scripts/ffmpeg/download.sh b/scripts/ffmpeg/download.sh index e18932b..c0d59d6 100755 --- a/scripts/ffmpeg/download.sh +++ b/scripts/ffmpeg/download.sh @@ -1,31 +1,24 @@ -# Expecting FFMPEG_SOURCE_TYPE and FFMPEG_SOURCE_VALUE variables +# Script to download FFmpeg's source code +# Relies on FFMPEG_SOURCE_TYPE and FFMPEG_SOURCE_VALUE variables +# to choose the valid origin and version -# 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} +# Exports SOURCES_DIR_ffmpeg - path where actual sources are stored # Utility function -# Getting sources of a particular ffmpeg release. -# Same argument (ffmpeg version) produces the same source set. +# 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} + FFMPEG_SOURCES=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} + curl https://www.ffmpeg.org/releases/${TARGET_FILE_NAME} --output ${TARGET_FILE_NAME} + tar xzf ${TARGET_FILE_NAME} -C . + rm ${TARGET_FILE_NAME} fi - export SOURCES_DIR_ffmpeg=$FFMPEG_SOURCES + export SOURCES_DIR_ffmpeg=$(pwd)/${FFMPEG_SOURCES} } # Utility function diff --git a/scripts/parse-arguments.sh b/scripts/parse-arguments.sh index cbabd28..5fa1fd1 100755 --- a/scripts/parse-arguments.sh +++ b/scripts/parse-arguments.sh @@ -35,18 +35,18 @@ do shift ;; # Arguments below enable certain external libraries to build into FFmpeg - --enable-libaom) - EXTERNAL_LIBRARIES+=( "libaom" ) - shift - ;; - --enable-libdav1d) - EXTERNAL_LIBRARIES+=( "libdav1d" ) - shift - ;; - --enable-libmp3lame) - EXTERNAL_LIBRARIES+=( "libmp3lame" ) - shift - ;; + # --enable-libaom) + # EXTERNAL_LIBRARIES+=( "libaom" ) + # shift + # ;; + # --enable-libdav1d) + # EXTERNAL_LIBRARIES+=( "libdav1d" ) + # shift + # ;; + # --enable-libmp3lame) + # EXTERNAL_LIBRARIES+=( "libmp3lame" ) + # shift + # ;; *) echo "Unknown argument $artument" ;;