From 23c72e1eae4d0d055b45cb4755a1696c78efac11 Mon Sep 17 00:00:00 2001 From: Pedro Diaz Date: Sat, 21 Dec 2024 19:37:57 +0100 Subject: [PATCH] Initial support for visionOS --- apple.sh | 9 + scripts/function-apple.sh | 57 ++++ scripts/function-xros.sh | 533 ++++++++++++++++++++++++++++++++++++++ scripts/function.sh | 71 +++-- scripts/main-xros.sh | 246 ++++++++++++++++++ scripts/variable.sh | 8 +- xros.sh | 285 ++++++++++++++++++++ 7 files changed, 1182 insertions(+), 27 deletions(-) create mode 100755 scripts/function-xros.sh create mode 100755 scripts/main-xros.sh create mode 100755 xros.sh diff --git a/apple.sh b/apple.sh index 38c21c8..80a0cb8 100755 --- a/apple.sh +++ b/apple.sh @@ -6,6 +6,8 @@ enable_default_architecture_variants() { ENABLED_ARCHITECTURE_VARIANTS[ARCH_VAR_MAC_CATALYST]=1 ENABLED_ARCHITECTURE_VARIANTS[ARCH_VAR_APPLETVOS]=1 ENABLED_ARCHITECTURE_VARIANTS[ARCH_VAR_APPLETVSIMULATOR]=1 + ENABLED_ARCHITECTURE_VARIANTS[ARCH_VAR_XROS]=1 + ENABLED_ARCHITECTURE_VARIANTS[ARCH_VAR_XRSIMULATOR]=1 ENABLED_ARCHITECTURE_VARIANTS[ARCH_VAR_MACOS]=1 } @@ -98,6 +100,12 @@ disable_arch_variant() { appletvsimulator) ENABLED_ARCHITECTURE_VARIANTS[ARCH_VAR_APPLETVSIMULATOR]=0 ;; + xros) + ENABLED_ARCHITECTURE_VARIANTS[ARCH_VAR_XROS]=0 + ;; + xrsimulator) + ENABLED_ARCHITECTURE_VARIANTS[ARCH_VAR_XRSIMULATOR]=0 + ;; macosx) ENABLED_ARCHITECTURE_VARIANTS[ARCH_VAR_MACOS]=0 ;; @@ -136,6 +144,7 @@ fi # DETECT SDK VERSIONS DETECTED_IOS_SDK_VERSION="$(xcrun --sdk iphoneos --show-sdk-version 2>>"${BASEDIR}"/build.log)" DETECTED_TVOS_SDK_VERSION="$(xcrun --sdk appletvos --show-sdk-version 2>>"${BASEDIR}"/build.log)" +DETECTED_XROS_SDK_VERSION="$(xcrun --sdk xros --show-sdk-version 2>>"${BASEDIR}"/build.log)" DETECTED_MACOS_SDK_VERSION="$(xcrun --sdk macosx --show-sdk-version 2>>"${BASEDIR}"/build.log)" echo -e "INFO: Using iOS SDK: ${DETECTED_IOS_SDK_VERSION}, tvOS SDK: ${DETECTED_TVOS_SDK_VERSION}, macOS SDK: ${DETECTED_MACOS_SDK_VERSION} by Xcode provided at $(xcode-select -p)\n" 1>>"${BASEDIR}"/build.log 2>&1 echo -e "INFO: Build options: $*\n" 1>>"${BASEDIR}"/build.log 2>&1 diff --git a/scripts/function-apple.sh b/scripts/function-apple.sh index 28238d9..09d291b 100755 --- a/scripts/function-apple.sh +++ b/scripts/function-apple.sh @@ -114,6 +114,27 @@ disable_tvos_architecture_not_supported_on_detected_sdk_version() { fi } +# +# 1. architecture index +# +disable_xros_architecture_not_supported_on_detected_sdk_version() { + local ARCH_NAME=$(get_arch_name $1) + + # No need to disable for any architecture at the moment, left as placeholder for the future + case ${ARCH_NAME} in + *) + local SUPPORTED=1 + ;; + esac + + if [[ ${SUPPORTED} -ne 1 ]]; then + if [[ -z ${BUILD_FORCE} ]]; then + echo -e "INFO: Disabled ${ARCH_NAME} architecture which is not supported on visionOS SDK $DETECTED_XROS_SDK_VERSION\n" 1>>"${BASEDIR}"/build.log 2>&1 + disable_arch "${ARCH_NAME}" + fi + fi +} + # # 1. architecture index # @@ -160,6 +181,8 @@ build_apple_architecture_variant_strings() { export ALL_TVOS_ARCHITECTURES="$(get_apple_architectures_for_variant "${ARCH_VAR_TVOS}")" export APPLETVOS_ARCHITECTURES="$(get_apple_architectures_for_variant "${ARCH_VAR_APPLETVOS}")" export APPLETV_SIMULATOR_ARCHITECTURES="$(get_apple_architectures_for_variant "${ARCH_VAR_APPLETVSIMULATOR}")" + export XROS_ARCHITECTURES="$(get_apple_architectures_for_variant "${ARCH_VAR_XROS}")" + export XR_SIMULATOR_ARCHITECTURES="$(get_apple_architectures_for_variant "${ARCH_VAR_XRSIMULATOR}")" export MACOSX_ARCHITECTURES="$(get_apple_architectures_for_variant "${ARCH_VAR_MACOS}")" } @@ -647,6 +670,12 @@ get_framework_directory() { "${ARCH_VAR_TVOS}") echo "bundle-apple-framework-tvos${LTS_POSTFIX}" ;; + "${ARCH_VAR_XROS}") + echo "bundle-apple-framework-xros${LTS_POSTFIX}" + ;; + "${ARCH_VAR_XRSIMULATOR}") + echo "bundle-apple-framework-xrsimulator${LTS_POSTFIX}" + ;; "${ARCH_VAR_APPLETVOS}") echo "bundle-apple-framework-appletvos${LTS_POSTFIX}" ;; @@ -709,6 +738,12 @@ get_universal_library_directory() { "${ARCH_VAR_APPLETVSIMULATOR}") echo "bundle-apple-universal-appletvsimulator${LTS_POSTFIX}" ;; + "${ARCH_VAR_XROS}") + echo "bundle-apple-universal-xros${LTS_POSTFIX}" + ;; + "${ARCH_VAR_XRSIMULATOR}") + echo "bundle-apple-universal-xrsimulator${LTS_POSTFIX}" + ;; "${ARCH_VAR_MACOS}") echo "bundle-apple-universal-macos${LTS_POSTFIX}" ;; @@ -797,6 +832,16 @@ get_apple_architectures_for_variant() { ARCHITECTURES+=" $(get_full_arch_name "${index}") " done ;; + "${ARCH_VAR_XROS}") + for index in ${ARCH_ARM64} ${ARCH_ARM64_SIMULATOR}; do + ARCHITECTURES+=" $(get_full_arch_name "${index}") " + done + ;; + "${ARCH_VAR_XRSIMULATOR}") + for index in ${ARCH_ARM64_SIMULATOR}; do + ARCHITECTURES+=" $(get_full_arch_name "${index}") " + done + ;; "${ARCH_VAR_MACOS}") for index in ${ARCH_ARM64} ${ARCH_X86_64}; do ARCHITECTURES+=" $(get_full_arch_name "${index}") " @@ -977,6 +1022,9 @@ get_default_sdk_name() { tvos) echo "appletvos" ;; + xros) + echo "xros" + ;; macos) echo "macosx" ;; @@ -996,6 +1044,9 @@ get_sdk_name() { tvos) echo "appletvos" ;; + xros) + echo "xros" + ;; macos) echo "macosx" ;; @@ -1025,6 +1076,9 @@ get_sdk_name() { tvos) echo "appletvsimulator" ;; + xros) + echo "xrsimulator" + ;; esac ;; *-mac-catalyst) @@ -1096,6 +1150,9 @@ get_min_sdk_version() { tvos) echo "${TVOS_MIN_VERSION}" ;; + xros) + echo "${XROS_MIN_VERSION}" + ;; macos) echo "${MACOS_MIN_VERSION}" ;; diff --git a/scripts/function-xros.sh b/scripts/function-xros.sh new file mode 100755 index 0000000..1d6e3ce --- /dev/null +++ b/scripts/function-xros.sh @@ -0,0 +1,533 @@ +#!/bin/bash + +source "${BASEDIR}/scripts/function-apple.sh" + +prepare_inline_sed + +enable_default_xros_architectures() { + ENABLED_ARCHITECTURES[ARCH_ARM64]=1 + ENABLED_ARCHITECTURES[ARCH_ARM64_SIMULATOR]=1 +} + +display_help() { + COMMAND=$(echo "$0" | sed -e 's/\.\///g') + + echo -e "\n'$COMMAND' builds FFmpegKit for visionOS platform. By default three architectures (arm64, arm64-simulator) are enabled without any external libraries. Options can be used to disable architectures and/or enable \ +external libraries. Please note that GPL libraries (external libraries with GPL license) need --enable-gpl flag to be \ +set explicitly. When compilation ends, libraries are created under the prebuilt folder.\n" + echo -e "Usage: ./$COMMAND [OPTION]...\n" + echo -e "Specify environment variables as VARIABLE=VALUE to override default build options.\n" + + display_help_options " -x, --xcframework\t\tbuild xcframework bundles instead of framework bundles" " -l, --lts build lts packages to support sdk 1.0+ devices" " --target=xros sdk version\toverride minimum deployment target [1.0]" + display_help_licensing + + echo -e "Architectures:" + + echo -e " --disable-arm64\t\tdo not build arm64 architecture [yes]" + echo -e " --disable-arm64-simulator\tdo not build arm64-simulator architecture [yes]" + + echo -e "Libraries:" + echo -e " --full\t\t\tenables all non-GPL external libraries" + echo -e " --enable-xros-audiotoolbox\tbuild with built-in Apple AudioToolbox support [no]" + echo -e " --enable-xros-bzip2\t\tbuild with built-in bzip2 support [no]" + if [[ -z ${FFMPEG_KIT_LTS_BUILD} ]]; then + echo -e " --enable-xros-videotoolbox\tbuild with built-in Apple VideoToolbox support [no]" + fi + echo -e " --enable-xros-zlib\t\tbuild with built-in zlib [no]" + echo -e " --enable-xros-libiconv\tbuild with built-in libiconv [no]" + + display_help_common_libraries + display_help_gpl_libraries + display_help_custom_libraries + if [[ -n ${FFMPEG_KIT_XCF_BUILD} ]]; then + display_help_advanced_options " --no-framework\t\tdo not build xcframework bundles [no]" " --no-bitcode\t\t\tdo not enable bitcode in bundles [no]" + else + display_help_advanced_options " --no-framework\t\tdo not build framework bundles [no]" " --no-bitcode\t\t\tdo not enable bitcode in bundles [no]" + fi +} + +enable_main_build() { + if [[ $(compare_versions "$DETECTED_XROS_SDK_VERSION" "1.0") -le 0 ]]; then + export XROS_MIN_VERSION=$DETECTED_XROS_SDK_VERSION + else + export XROS_MIN_VERSION=1.0 + fi +} + +enable_lts_build() { + export FFMPEG_KIT_LTS_BUILD="1" + + if [[ $(compare_versions "$DETECTED_XROS_SDK_VERSION" "1.0") -le 0 ]]; then + export XROS_MIN_VERSION=$DETECTED_XROS_SDK_VERSION + else + export XROS_MIN_VERSION=1.0 + fi +} + +get_common_includes() { + echo "-I${SDK_PATH}/usr/include" +} + +get_common_cflags() { + if [[ -n ${FFMPEG_KIT_LTS_BUILD} ]]; then + local LTS_BUILD_FLAG="-DFFMPEG_KIT_LTS " + fi + + local BUILD_DATE="-DFFMPEG_KIT_BUILD_DATE=$(date +%Y%m%d 2>>"${BASEDIR}"/build.log)" + if [ -z $NO_BITCODE ]; then + local BITCODE_FLAGS="-fembed-bitcode" + fi + + case ${ARCH} in + arm64) + echo "-fstrict-aliasing ${BITCODE_FLAGS} -DXROS ${LTS_BUILD_FLAG}${BUILD_DATE} -isysroot ${SDK_PATH}" + ;; + arm64-simulator) + echo "-fstrict-aliasing -DXROS ${LTS_BUILD_FLAG}${BUILD_DATE} -isysroot ${SDK_PATH}" + ;; + esac +} + +get_arch_specific_cflags() { + case ${ARCH} in + arm64) + echo "-arch arm64 -target $(get_target) -march=armv8-a+crc+crypto -mcpu=generic -DFFMPEG_KIT_ARM64" + ;; + arm64-simulator) + echo "-arch arm64 -target $(get_target) -march=armv8-a+crc+crypto -mcpu=generic -DFFMPEG_KIT_ARM64_SIMULATOR" + ;; + esac +} + +get_size_optimization_cflags() { + + local ARCH_OPTIMIZATION="" + case ${ARCH} in + arm64) + case $1 in + x264 | x265) + ARCH_OPTIMIZATION="-Oz -Wno-ignored-optimization-argument" + ;; + ffmpeg | ffmpeg-kit) + ARCH_OPTIMIZATION="-Oz -Wno-ignored-optimization-argument" + ;; + *) + ARCH_OPTIMIZATION="-Oz -Wno-ignored-optimization-argument" + ;; + esac + ;; + arm64-simulator) + case $1 in + x264 | ffmpeg) + ARCH_OPTIMIZATION="-O2 -Wno-ignored-optimization-argument" + ;; + x265) + ARCH_OPTIMIZATION="-O2 -Wno-ignored-optimization-argument" + ;; + *) + ARCH_OPTIMIZATION="-O2 -Wno-ignored-optimization-argument" + ;; + esac + ;; + esac + + echo "${ARCH_OPTIMIZATION}" +} + +get_size_optimization_asm_cflags() { + + local ARCH_OPTIMIZATION="" + case $1 in + jpeg | ffmpeg) + case ${ARCH} in + arm64) + ARCH_OPTIMIZATION="-Oz" + ;; + arm64-simulator) + ARCH_OPTIMIZATION="-O2" + ;; + esac + ;; + *) + ARCH_OPTIMIZATION=$(get_size_optimization_cflags "$1") + ;; + esac + + echo "${ARCH_OPTIMIZATION}" +} + +get_app_specific_cflags() { + + local APP_FLAGS="" + case $1 in + fontconfig) + case ${ARCH} in + arm64) + APP_FLAGS="-std=c99 -Wno-unused-function -D__IPHONE_OS_MIN_REQUIRED -D__IPHONE_VERSION_MIN_REQUIRED=30000" + ;; + *) + APP_FLAGS="-std=c99 -Wno-unused-function" + ;; + esac + ;; + ffmpeg) + APP_FLAGS="-Wno-unused-function -Wno-deprecated-declarations" + ;; + gnutls) + APP_FLAGS="-std=c99 -Wno-unused-function -D_GL_USE_STDLIB_ALLOC=1" + ;; + jpeg) + APP_FLAGS="-Wno-nullability-completeness" + ;; + kvazaar) + APP_FLAGS="-std=gnu99 -Wno-unused-function" + ;; + leptonica) + APP_FLAGS="-std=c99 -Wno-unused-function -DOS_IOS" + ;; + libwebp | xvidcore) + APP_FLAGS="-fno-common -DPIC" + ;; + ffmpeg-kit) + APP_FLAGS="-std=c99 -Wno-unused-function -Wall -Wno-deprecated-declarations -Wno-pointer-sign -Wno-switch -Wno-unused-result -Wno-unused-variable -DPIC -fobjc-arc" + ;; + sdl) + APP_FLAGS="-DPIC -Wno-unused-function -D__XROS__" + ;; + shine) + APP_FLAGS="-Wno-unused-function" + ;; + soxr | snappy) + APP_FLAGS="-std=gnu99 -Wno-unused-function -DPIC" + ;; + openh264 | x265) + APP_FLAGS="-Wno-unused-function" + ;; + *) + APP_FLAGS="-std=c99 -Wno-unused-function" + ;; + esac + + echo "${APP_FLAGS}" +} + +get_cflags() { + local ARCH_FLAGS=$(get_arch_specific_cflags) + local APP_FLAGS=$(get_app_specific_cflags "$1") + local COMMON_FLAGS=$(get_common_cflags) + if [[ -z ${FFMPEG_KIT_DEBUG} ]]; then + local OPTIMIZATION_FLAGS=$(get_size_optimization_cflags "$1") + else + local OPTIMIZATION_FLAGS="${FFMPEG_KIT_DEBUG}" + fi + local MIN_VERSION_FLAGS=$(get_min_version_cflags "$1") + local COMMON_INCLUDES=$(get_common_includes) + + echo "${ARCH_FLAGS} ${APP_FLAGS} ${COMMON_FLAGS} ${OPTIMIZATION_FLAGS} ${MIN_VERSION_FLAGS} ${COMMON_INCLUDES}" +} + +get_asmflags() { + local ARCH_FLAGS=$(get_arch_specific_cflags) + local APP_FLAGS=$(get_app_specific_cflags "$1") + local COMMON_FLAGS=$(get_common_cflags) + if [[ -z ${FFMPEG_KIT_DEBUG} ]]; then + local OPTIMIZATION_FLAGS=$(get_size_optimization_asm_cflags "$1") + else + local OPTIMIZATION_FLAGS="${FFMPEG_KIT_DEBUG}" + fi + local MIN_VERSION_FLAGS=$(get_min_version_cflags "$1") + local COMMON_INCLUDES=$(get_common_includes) + + echo "${ARCH_FLAGS} ${APP_FLAGS} ${COMMON_FLAGS} ${OPTIMIZATION_FLAGS} ${MIN_VERSION_FLAGS} ${COMMON_INCLUDES}" +} + +get_cxxflags() { + local COMMON_CFLAGS="$(get_common_cflags "$1") $(get_common_includes "$1") $(get_arch_specific_cflags) $(get_min_version_cflags "$1")" + if [[ -z ${FFMPEG_KIT_DEBUG} ]]; then + local OPTIMIZATION_FLAGS="-Oz" + else + local OPTIMIZATION_FLAGS="${FFMPEG_KIT_DEBUG}" + fi + + local BITCODE_FLAGS="" + case ${ARCH} in + arm64) + if [ -z $NO_BITCODE ]; then + local BITCODE_FLAGS="-fembed-bitcode" + fi + ;; + esac + + case $1 in + x265) + echo "-std=c++11 -fno-exceptions ${BITCODE_FLAGS} ${COMMON_CFLAGS}" + ;; + gnutls) + echo "-std=c++11 -fno-rtti ${BITCODE_FLAGS} ${COMMON_CFLAGS} ${OPTIMIZATION_FLAGS}" + ;; + libaom) + echo "-std=c++11 -fno-exceptions ${BITCODE_FLAGS} ${COMMON_CFLAGS} ${OPTIMIZATION_FLAGS}" + ;; + libilbc) + echo "-std=c++14 -fno-exceptions ${BITCODE_FLAGS} ${COMMON_CFLAGS} ${OPTIMIZATION_FLAGS}" + ;; + libwebp | xvidcore) + echo "-std=c++11 -fno-exceptions -fno-rtti ${BITCODE_FLAGS} -fno-common -DPIC ${COMMON_CFLAGS} ${OPTIMIZATION_FLAGS}" + ;; + opencore-amr) + echo "-fno-rtti ${BITCODE_FLAGS} ${COMMON_CFLAGS} ${OPTIMIZATION_FLAGS}" + ;; + rubberband) + echo "-fno-rtti ${BITCODE_FLAGS} ${COMMON_CFLAGS} ${OPTIMIZATION_FLAGS}" + ;; + srt | tesseract | zimg) + echo "-std=c++11 ${BITCODE_FLAGS} ${COMMON_CFLAGS} ${OPTIMIZATION_FLAGS}" + ;; + *) + echo "-std=c++11 -fno-exceptions -fno-rtti ${BITCODE_FLAGS} ${COMMON_CFLAGS} ${OPTIMIZATION_FLAGS}" + ;; + esac +} + +get_common_linked_libraries() { + echo "-L${SDK_PATH}/usr/lib -lc++" +} + +get_common_ldflags() { + echo "-isysroot ${SDK_PATH} $(get_min_version_cflags)" +} + +get_size_optimization_ldflags() { + case ${ARCH} in + arm64) + case $1 in + ffmpeg | ffmpeg-kit) + echo "-Oz -dead_strip" + ;; + *) + echo "-Oz -dead_strip" + ;; + esac + ;; + *) + case $1 in + ffmpeg) + echo "-O2" + ;; + *) + echo "-O2" + ;; + esac + ;; + esac +} + +get_arch_specific_ldflags() { + if [ -z $NO_BITCODE ]; then + local BITCODE_FLAGS="-fembed-bitcode" + fi + + case ${ARCH} in + arm64) + echo "-arch arm64 -march=armv8-a+crc+crypto ${BITCODE_FLAGS}" + ;; + arm64-simulator) + echo "-arch arm64 -march=armv8-a+crc+crypto" + ;; + esac +} + +get_ldflags() { + local ARCH_FLAGS=$(get_arch_specific_ldflags) + local LINKED_LIBRARIES=$(get_common_linked_libraries) + if [[ -z ${FFMPEG_KIT_DEBUG} ]]; then + local OPTIMIZATION_FLAGS="$(get_size_optimization_ldflags "$1")" + else + local OPTIMIZATION_FLAGS="${FFMPEG_KIT_DEBUG}" + fi + local COMMON_FLAGS=$(get_common_ldflags) + if [ -z $NO_BITCODE ]; then + local BITCODE_FLAGS="-fembed-bitcode -Wc,-fembed-bitcode" + fi + + case $1 in + ffmpeg-kit) + case ${ARCH} in + arm64) + echo "${ARCH_FLAGS} ${LINKED_LIBRARIES} ${COMMON_FLAGS} ${BITCODE_FLAGS} ${OPTIMIZATION_FLAGS}" + ;; + *) + echo "${ARCH_FLAGS} ${LINKED_LIBRARIES} ${COMMON_FLAGS} ${OPTIMIZATION_FLAGS}" + ;; + esac + ;; + *) + # NOTE THAT ffmpeg ALSO NEEDS BITCODE, IT IS ENABLED IN ffmpeg.sh + echo "${ARCH_FLAGS} ${LINKED_LIBRARIES} ${COMMON_FLAGS} ${OPTIMIZATION_FLAGS}" + ;; + esac +} + +set_toolchain_paths() { + if [ ! -f "${FFMPEG_KIT_TMPDIR}/gas-preprocessor.pl" ]; then + DOWNLOAD_RESULT=$(download "https://github.com/arthenica/gas-preprocessor/raw/v20210917/gas-preprocessor.pl" "gas-preprocessor.pl" "exit") + if [[ ${DOWNLOAD_RESULT} -ne 0 ]]; then + exit 1 + fi + (chmod +x "${FFMPEG_KIT_TMPDIR}"/gas-preprocessor.pl 1>>"${BASEDIR}"/build.log 2>&1) || return 1 + + # patch gas-preprocessor.pl against the following warning + # Unescaped left brace in regex is deprecated here (and will be fatal in Perl 5.32), passed through in regex; marked by <-- HERE in m/(?:ld|st)\d\s+({ <-- HERE \s*v(\d+)\.(\d[bhsdBHSD])\s*-\s*v(\d+)\.(\d[bhsdBHSD])\s*})/ at /Users/taner/Projects/ffmpeg-kit/.tmp/gas-preprocessor.pl line 1065. + sed -i .tmp "s/s\+({/s\+(\\\\{/g;s/s\*})/s\*\\\\})/g" "${FFMPEG_KIT_TMPDIR}"/gas-preprocessor.pl + fi + + LOCAL_GAS_PREPROCESSOR="${FFMPEG_KIT_TMPDIR}/gas-preprocessor.pl" + if [ "$1" == "x264" ]; then + LOCAL_GAS_PREPROCESSOR="${BASEDIR}/src/x264/tools/gas-preprocessor.pl" + fi + + HOST=$(get_host) + + export AR="$(xcrun --sdk "$(get_sdk_name)" -f ar 2>>"${BASEDIR}"/build.log)" + export CC="clang" + export OBJC="$(xcrun --sdk "$(get_sdk_name)" -f clang 2>>"${BASEDIR}"/build.log)" + export CXX="clang++" + + LOCAL_ASMFLAGS="$(get_asmflags "$1")" + case ${ARCH} in + arm64*) + if [ "$1" == "x265" ] || [ "$1" == "libilbc" ]; then + export AS="${LOCAL_GAS_PREPROCESSOR}" + export AS_ARGUMENTS="-arch aarch64" + export ASM_FLAGS="${LOCAL_ASMFLAGS}" + else + export AS="${LOCAL_GAS_PREPROCESSOR} -arch aarch64 -- ${CC} ${LOCAL_ASMFLAGS}" + fi + ;; + *) + export AS="${CC} ${LOCAL_ASMFLAGS}" + ;; + esac + + export LD="$(xcrun --sdk "$(get_sdk_name)" -f ld 2>>"${BASEDIR}"/build.log)" + export RANLIB="$(xcrun --sdk "$(get_sdk_name)" -f ranlib 2>>"${BASEDIR}"/build.log)" + export STRIP="$(xcrun --sdk "$(get_sdk_name)" -f strip 2>>"${BASEDIR}"/build.log)" + export NM="$(xcrun --sdk "$(get_sdk_name)" -f nm 2>>"${BASEDIR}"/build.log)" + + export INSTALL_PKG_CONFIG_DIR="${BASEDIR}/prebuilt/$(get_build_directory)/pkgconfig" + export ZLIB_PACKAGE_CONFIG_PATH="${INSTALL_PKG_CONFIG_DIR}/zlib.pc" + export BZIP2_PACKAGE_CONFIG_PATH="${INSTALL_PKG_CONFIG_DIR}/bzip2.pc" + export LIB_ICONV_PACKAGE_CONFIG_PATH="${INSTALL_PKG_CONFIG_DIR}/libiconv.pc" + export LIB_UUID_PACKAGE_CONFIG_PATH="${INSTALL_PKG_CONFIG_DIR}/uuid.pc" + + if [ ! -d "${INSTALL_PKG_CONFIG_DIR}" ]; then + mkdir -p "${INSTALL_PKG_CONFIG_DIR}" + fi + + if [ ! -f "${ZLIB_PACKAGE_CONFIG_PATH}" ]; then + create_zlib_system_package_config + fi + + if [ ! -f "${LIB_ICONV_PACKAGE_CONFIG_PATH}" ]; then + create_libiconv_system_package_config + fi + + if [ ! -f "${BZIP2_PACKAGE_CONFIG_PATH}" ]; then + create_bzip2_system_package_config + fi + + if [ ! -f "${LIB_UUID_PACKAGE_CONFIG_PATH}" ]; then + create_libuuid_system_package_config + fi +} + +initialize_prebuilt_xros_folders() { + if [[ -n ${FFMPEG_KIT_XCF_BUILD} ]]; then + + echo -e "DEBUG: Initializing universal directories and frameworks for xcf builds\n" 1>>"${BASEDIR}"/build.log 2>&1 + + if [[ $(is_apple_architecture_variant_supported "${ARCH_VAR_XROS}") -eq 1 ]]; then + initialize_folder "${BASEDIR}/.tmp/$(get_universal_library_directory "${ARCH_VAR_XROS}")" + initialize_folder "${BASEDIR}/prebuilt/$(get_framework_directory "${ARCH_VAR_XROS}")" + fi + if [[ $(is_apple_architecture_variant_supported "${ARCH_VAR_XRSIMULATOR}") -eq 1 ]]; then + initialize_folder "${BASEDIR}/.tmp/$(get_universal_library_directory "${ARCH_VAR_XRSIMULATOR}")" + initialize_folder "${BASEDIR}/prebuilt/$(get_framework_directory "${ARCH_VAR_XRSIMULATOR}")" + fi + + echo -e "DEBUG: Initializing xcframework directory at ${BASEDIR}/prebuilt/$(get_xcframework_directory)\n" 1>>"${BASEDIR}"/build.log 2>&1 + + # XCF BUILDS GENERATE XCFFRAMEWORKS + initialize_folder "${BASEDIR}/prebuilt/$(get_xcframework_directory)" + else + + echo -e "DEBUG: Initializing default universal directory at ${BASEDIR}/.tmp/$(get_universal_library_directory "${ARCH_VAR_XROS}")\n" 1>>"${BASEDIR}"/build.log 2>&1 + + # DEFAULT BUILDS GENERATE UNIVERSAL LIBRARIES AND FRAMEWORKS + initialize_folder "${BASEDIR}/.tmp/$(get_universal_library_directory "${ARCH_VAR_XROS}")" + + echo -e "DEBUG: Initializing framework directory at ${BASEDIR}/prebuilt/$(get_framework_directory "${ARCH_VAR_XROS}")\n" 1>>"${BASEDIR}"/build.log 2>&1 + + initialize_folder "${BASEDIR}/prebuilt/$(get_framework_directory "${ARCH_VAR_XROS}")" + fi +} + +# +# DEPENDS TARGET_ARCH_LIST VARIABLE +# +create_universal_libraries_for_xros_default_frameworks() { + local ROOT_UNIVERSAL_DIRECTORY_PATH="${BASEDIR}/.tmp/$(get_universal_library_directory "${ARCH_VAR_XROS}")" + + echo -e "INFO: Building universal libraries in ${ROOT_UNIVERSAL_DIRECTORY_PATH} for default frameworks using ${TARGET_ARCH_LIST[@]}\n" 1>>"${BASEDIR}"/build.log 2>&1 + + create_ffmpeg_universal_library "${ARCH_VAR_XROS}" + + create_ffmpeg_kit_universal_library "${ARCH_VAR_XROS}" + + echo -e "INFO: Universal libraries for default frameworks built successfully\n" 1>>"${BASEDIR}"/build.log 2>&1 +} + +create_xros_default_frameworks() { + echo -e "INFO: Building default frameworks\n" 1>>"${BASEDIR}"/build.log 2>&1 + + create_ffmpeg_framework "${ARCH_VAR_XROS}" + + create_ffmpeg_kit_framework "${ARCH_VAR_XROS}" + + echo -e "INFO: Default frameworks built successfully\n" 1>>"${BASEDIR}"/build.log 2>&1 +} + +create_universal_libraries_for_xros_xcframeworks() { + echo -e "INFO: Building universal libraries for xcframeworks using ${TARGET_ARCH_LIST[@]}\n" 1>>"${BASEDIR}"/build.log 2>&1 + + create_ffmpeg_universal_library "${ARCH_VAR_XROS}" + create_ffmpeg_universal_library "${ARCH_VAR_XRSIMULATOR}" + + create_ffmpeg_kit_universal_library "${ARCH_VAR_XROS}" + create_ffmpeg_kit_universal_library "${ARCH_VAR_XRSIMULATOR}" + + echo -e "INFO: Universal libraries for xcframeworks built successfully\n" 1>>"${BASEDIR}"/build.log 2>&1 +} + +create_frameworks_for_xros_xcframeworks() { + echo -e "INFO: Building frameworks for xcframeworks\n" 1>>"${BASEDIR}"/build.log 2>&1 + + create_ffmpeg_framework "${ARCH_VAR_XROS}" + create_ffmpeg_framework "${ARCH_VAR_XRSIMULATOR}" + + create_ffmpeg_kit_framework "${ARCH_VAR_XROS}" + create_ffmpeg_kit_framework "${ARCH_VAR_XRSIMULATOR}" + + echo -e "INFO: Frameworks for xcframeworks built successfully\n" 1>>"${BASEDIR}"/build.log 2>&1 +} + +create_xros_xcframeworks() { + export ARCHITECTURE_VARIANT_ARRAY=("${ARCH_VAR_XROS}" "${ARCH_VAR_XRSIMULATOR}") + echo -e "INFO: Building xcframeworks\n" 1>>"${BASEDIR}"/build.log 2>&1 + + create_ffmpeg_xcframework + + create_ffmpeg_kit_xcframework + + echo -e "INFO: xcframeworks built successfully\n" 1>>"${BASEDIR}"/build.log 2>&1 +} \ No newline at end of file diff --git a/scripts/function.sh b/scripts/function.sh index 06e3565..bb7c972 100755 --- a/scripts/function.sh +++ b/scripts/function.sh @@ -9,14 +9,14 @@ get_arch_name() { 2) echo "armv7" ;; # ios 3) echo "armv7s" ;; # ios 4) echo "arm64-v8a" ;; # android - 5) echo "arm64" ;; # ios, tvos, macos + 5) echo "arm64" ;; # ios, tvos, macos, and xros 6) echo "arm64e" ;; # ios 7) echo "i386" ;; # ios 8) echo "x86" ;; # android 9) echo "x86-64" ;; # android, ios, linux, macos, tvos 10) echo "x86-64-mac-catalyst" ;; # ios 11) echo "arm64-mac-catalyst" ;; # ios - 12) echo "arm64-simulator" ;; # ios, tvos + 12) echo "arm64-simulator" ;; # ios, tvos and xros esac } @@ -35,14 +35,14 @@ from_arch_name() { armv7) echo 2 ;; # ios armv7s) echo 3 ;; # ios arm64-v8a) echo 4 ;; # android - arm64) echo 5 ;; # ios, tvos, macos + arm64) echo 5 ;; # ios, tvos, macos and xros arm64e) echo 6 ;; # ios i386) echo 7 ;; # ios x86) echo 8 ;; # android x86-64) echo 9 ;; # android, ios, linux, macos, tvos x86-64-mac-catalyst) echo 10 ;; # ios arm64-mac-catalyst) echo 11 ;; # ios - arm64-simulator) echo 12 ;; # ios + arm64-simulator) echo 12 ;; # ios and xros esac } @@ -109,6 +109,8 @@ get_library_name() { echo "macos-zlib" elif [[ ${FFMPEG_KIT_BUILD_TYPE} == "tvos" ]]; then echo "tvos-zlib" + elif [[ ${FFMPEG_KIT_BUILD_TYPE} == "xros" ]]; then + echo "xros-zlib" fi ;; 51) echo "linux-alsa" ;; @@ -120,6 +122,8 @@ get_library_name() { echo "macos-audiotoolbox" elif [[ ${FFMPEG_KIT_BUILD_TYPE} == "tvos" ]]; then echo "tvos-audiotoolbox" + elif [[ ${FFMPEG_KIT_BUILD_TYPE} == "xros" ]]; then + echo "xros-audiotoolbox" fi ;; 54) @@ -129,6 +133,8 @@ get_library_name() { echo "macos-bzip2" elif [[ ${FFMPEG_KIT_BUILD_TYPE} == "tvos" ]]; then echo "tvos-bzip2" + elif [[ ${FFMPEG_KIT_BUILD_TYPE} == "xros" ]]; then + echo "xros-bzip2" fi ;; 55) @@ -138,6 +144,8 @@ get_library_name() { echo "macos-videotoolbox" elif [[ ${FFMPEG_KIT_BUILD_TYPE} == "tvos" ]]; then echo "tvos-videotoolbox" + elif [[ ${FFMPEG_KIT_BUILD_TYPE} == "xros" ]]; then + echo "xros-videotoolbox" fi ;; 56) @@ -154,6 +162,8 @@ get_library_name() { echo "macos-libiconv" elif [[ ${FFMPEG_KIT_BUILD_TYPE} == "tvos" ]]; then echo "tvos-libiconv" + elif [[ ${FFMPEG_KIT_BUILD_TYPE} == "xros" ]]; then + echo "xros-libiconv" fi ;; 58) @@ -163,6 +173,8 @@ get_library_name() { echo "macos-libuuid" elif [[ ${FFMPEG_KIT_BUILD_TYPE} == "tvos" ]]; then echo "tvos-libuuid" + elif [[ ${FFMPEG_KIT_BUILD_TYPE} == "xros" ]]; then + echo "xros-libuuid" fi ;; 59) @@ -265,15 +277,15 @@ from_library_name() { libsamplerate) echo 47 ;; harfbuzz) echo 48 ;; cpu-features) echo 49 ;; - android-zlib | ios-zlib | linux-zlib | macos-zlib | tvos-zlib) echo 50 ;; + android-zlib | ios-zlib | linux-zlib | macos-zlib | tvos-zlib | xros-zlib) echo 50 ;; linux-alsa) echo 51 ;; android-media-codec) echo 52 ;; - ios-audiotoolbox | macos-audiotoolbox | tvos-audiotoolbox) echo 53 ;; - ios-bzip2 | macos-bzip2 | tvos-bzip2) echo 54 ;; - ios-videotoolbox | macos-videotoolbox | tvos-videotoolbox) echo 55 ;; + ios-audiotoolbox | macos-audiotoolbox | tvos-audiotoolbox | xros-audiotoolbox) echo 53 ;; + ios-bzip2 | macos-bzip2 | tvos-bzip2 | xros-bzip2) echo 54 ;; + ios-videotoolbox | macos-videotoolbox | tvos-videotoolbox | xros-videotoolbox) echo 55 ;; ios-avfoundation | macos-avfoundation) echo 56 ;; - ios-libiconv | macos-libiconv | tvos-libiconv) echo 57 ;; - ios-libuuid | macos-libuuid | tvos-libuuid) echo 58 ;; + ios-libiconv | macos-libiconv | tvos-libiconv | xros-libiconv) echo 57 ;; + ios-libuuid | macos-libuuid | tvos-libuuid | xros-libuuid) echo 58 ;; macos-coreimage) echo 59 ;; macos-opencl) echo 60 ;; macos-opengl) echo 61 ;; @@ -359,9 +371,9 @@ is_library_supported_on_platform() { fi ;; - # IOS, MACOS AND TVOS + # IOS, MACOS, TVOS AND XROS 53 | 54 | 55 | 57 | 58) - if [[ ${FFMPEG_KIT_BUILD_TYPE} == "ios" ]] || [[ ${FFMPEG_KIT_BUILD_TYPE} == "tvos" ]] || [[ ${FFMPEG_KIT_BUILD_TYPE} == "macos" ]]; then + if [[ ${FFMPEG_KIT_BUILD_TYPE} == "ios" ]] || [[ ${FFMPEG_KIT_BUILD_TYPE} == "tvos" ]] || [[ ${FFMPEG_KIT_BUILD_TYPE} == "xros" ]] || [[ ${FFMPEG_KIT_BUILD_TYPE} == "macos" ]]; then echo "0" else echo "1" @@ -419,18 +431,18 @@ is_arch_supported_on_platform() { fi ;; - # IOS OR TVOS + # IOS, TVOS OR XROS $ARCH_ARM64_SIMULATOR) - if [[ ${FFMPEG_KIT_BUILD_TYPE} == "ios" ]] || [[ ${FFMPEG_KIT_BUILD_TYPE} == "tvos" ]]; then + if [[ ${FFMPEG_KIT_BUILD_TYPE} == "ios" ]] || [[ ${FFMPEG_KIT_BUILD_TYPE} == "tvos" ]] || [[ ${FFMPEG_KIT_BUILD_TYPE} == "xros" ]]; then echo 1 else echo 0 fi ;; - # IOS, MACOS OR TVOS + # IOS, MACOS, TVOS OR XROS $ARCH_ARM64) - if [[ ${FFMPEG_KIT_BUILD_TYPE} == "ios" ]] || [[ ${FFMPEG_KIT_BUILD_TYPE} == "macos" ]] || [[ ${FFMPEG_KIT_BUILD_TYPE} == "tvos" ]]; then + if [[ ${FFMPEG_KIT_BUILD_TYPE} == "ios" ]] || [[ ${FFMPEG_KIT_BUILD_TYPE} == "macos" ]] || [[ ${FFMPEG_KIT_BUILD_TYPE} == "tvos" ]] || [[ ${FFMPEG_KIT_BUILD_TYPE} == "xros" ]]; then echo 1 else echo 0 @@ -515,6 +527,8 @@ get_target() { echo "$(get_target_cpu)-apple-macos$(get_min_sdk_version)" elif [[ ${FFMPEG_KIT_BUILD_TYPE} == "tvos" ]]; then echo "$(get_target_cpu)-apple-tvos$(get_min_sdk_version)" + elif [[ ${FFMPEG_KIT_BUILD_TYPE} == "xros" ]]; then + echo "$(get_target_cpu)-apple-xros$(get_min_sdk_version)" fi ;; arm64-simulator) @@ -522,6 +536,8 @@ get_target() { echo "$(get_target_cpu)-apple-ios$(get_min_sdk_version)-simulator" elif [[ ${FFMPEG_KIT_BUILD_TYPE} == "tvos" ]]; then echo "$(get_target_cpu)-apple-tvos$(get_min_sdk_version)-simulator" + elif [[ ${FFMPEG_KIT_BUILD_TYPE} == "xros" ]]; then + echo "$(get_target_cpu)-apple-xros$(get_min_sdk_version)-simulator" fi ;; x86-64) @@ -556,6 +572,8 @@ get_host() { echo "$(get_target_cpu)-ios-darwin" elif [[ ${FFMPEG_KIT_BUILD_TYPE} == "tvos" ]]; then echo "$(get_target_cpu)-tvos-darwin" + elif [[ ${FFMPEG_KIT_BUILD_TYPE} == "xros" ]]; then + echo "$(get_target_cpu)-xros-darwin" fi ;; arm64-v8a) @@ -568,6 +586,8 @@ get_host() { echo "$(get_target_cpu)-apple-darwin" elif [[ ${FFMPEG_KIT_BUILD_TYPE} == "tvos" ]]; then echo "$(get_target_cpu)-tvos-darwin" + elif [[ ${FFMPEG_KIT_BUILD_TYPE} == "xros" ]]; then + echo "$(get_target_cpu)-xros-darwin" fi ;; x86) @@ -1046,7 +1066,7 @@ set_library() { fi case $1 in - android-zlib | ios-zlib | linux-zlib | macos-zlib | tvos-zlib) + android-zlib | ios-zlib | linux-zlib | macos-zlib | tvos-zlib | xros-zlib) ENABLED_LIBRARIES[LIBRARY_SYSTEM_ZLIB]=$2 ;; linux-alsa) @@ -1055,22 +1075,22 @@ set_library() { android-media-codec) ENABLED_LIBRARIES[LIBRARY_ANDROID_MEDIA_CODEC]=$2 ;; - ios-audiotoolbox | macos-audiotoolbox | tvos-audiotoolbox) + ios-audiotoolbox | macos-audiotoolbox | tvos-audiotoolbox | xros-audiotoolbox) ENABLED_LIBRARIES[LIBRARY_APPLE_AUDIOTOOLBOX]=$2 ;; - ios-bzip2 | macos-bzip2 | tvos-bzip2) + ios-bzip2 | macos-bzip2 | tvos-bzip2 | xros-bzip2) ENABLED_LIBRARIES[LIBRARY_APPLE_BZIP2]=$2 ;; - ios-videotoolbox | macos-videotoolbox | tvos-videotoolbox) + ios-videotoolbox | macos-videotoolbox | tvos-videotoolbox | xros-videotoolbox) ENABLED_LIBRARIES[LIBRARY_APPLE_VIDEOTOOLBOX]=$2 ;; ios-avfoundation | macos-avfoundation) ENABLED_LIBRARIES[LIBRARY_APPLE_AVFOUNDATION]=$2 ;; - ios-libiconv | macos-libiconv | tvos-libiconv) + ios-libiconv | macos-libiconv | tvos-libiconv | xros-libiconv) ENABLED_LIBRARIES[LIBRARY_APPLE_LIBICONV]=$2 ;; - ios-libuuid | macos-libuuid | tvos-libuuid) + ios-libuuid | macos-libuuid | tvos-libuuid | xros-libuuid) ENABLED_LIBRARIES[LIBRARY_APPLE_LIBUUID]=$2 ;; macos-coreimage) @@ -1379,14 +1399,14 @@ set_library() { set_virtual_library() { case $1 in libiconv) - if [[ ${FFMPEG_KIT_BUILD_TYPE} == "ios" ]] || [[ ${FFMPEG_KIT_BUILD_TYPE} == "tvos" ]] || [[ ${FFMPEG_KIT_BUILD_TYPE} == "macos" ]] || [[ ${FFMPEG_KIT_BUILD_TYPE} == "apple" ]]; then + if [[ ${FFMPEG_KIT_BUILD_TYPE} == "ios" ]] || [[ ${FFMPEG_KIT_BUILD_TYPE} == "tvos" ]] || [[ ${FFMPEG_KIT_BUILD_TYPE} == "xros" ]] || [[ ${FFMPEG_KIT_BUILD_TYPE} == "macos" ]] || [[ ${FFMPEG_KIT_BUILD_TYPE} == "apple" ]]; then ENABLED_LIBRARIES[LIBRARY_APPLE_LIBICONV]=$2 else ENABLED_LIBRARIES[LIBRARY_LIBICONV]=$2 fi ;; libuuid) - if [[ ${FFMPEG_KIT_BUILD_TYPE} == "ios" ]] || [[ ${FFMPEG_KIT_BUILD_TYPE} == "tvos" ]] || [[ ${FFMPEG_KIT_BUILD_TYPE} == "macos" ]] || [[ ${FFMPEG_KIT_BUILD_TYPE} == "apple" ]]; then + if [[ ${FFMPEG_KIT_BUILD_TYPE} == "ios" ]] || [[ ${FFMPEG_KIT_BUILD_TYPE} == "tvos" ]] || [[ ${FFMPEG_KIT_BUILD_TYPE} == "xros" ]] || [[ ${FFMPEG_KIT_BUILD_TYPE} == "macos" ]] || [[ ${FFMPEG_KIT_BUILD_TYPE} == "apple" ]]; then ENABLED_LIBRARIES[LIBRARY_APPLE_LIBUUID]=$2 else ENABLED_LIBRARIES[LIBRARY_LIBUUID]=$2 @@ -1831,6 +1851,9 @@ get_apple_cmake_system_name() { tvos) echo "tvOS" ;; + xros) + echo "visionOS" + ;; *) case ${ARCH} in *-mac-catalyst) diff --git a/scripts/main-xros.sh b/scripts/main-xros.sh new file mode 100755 index 0000000..be870e9 --- /dev/null +++ b/scripts/main-xros.sh @@ -0,0 +1,246 @@ +#!/bin/bash + +if [[ -z ${ARCH} ]]; then + echo -e "\n(*) ARCH not defined\n" + exit 1 +fi + +if [[ -z ${XROS_MIN_VERSION} ]]; then + echo -e "\n(*) XROS_MIN_VERSION not defined\n" + exit 1 +fi + +if [[ -z ${BASEDIR} ]]; then + echo -e "\n(*) BASEDIR not defined\n" + exit 1 +fi + +if [[ -z ${SDK_PATH} ]]; then + echo -e "\n(*) SDK_PATH not defined\n" + exit 1 +fi + +echo -e "\nBuilding ${ARCH} platform targeting visionOS SDK ${XROS_MIN_VERSION}\n" +echo -e "\nINFO: Starting new build for ${ARCH} targeting visionOS SDK ${XROS_MIN_VERSION} at $(date)\n" 1>>"${BASEDIR}"/build.log 2>&1 + +# SET BASE INSTALLATION DIRECTORY FOR THIS ARCHITECTURE +export LIB_INSTALL_BASE="${BASEDIR}/prebuilt/$(get_build_directory)" + +# CREATE PACKAGE CONFIG DIRECTORY FOR THIS ARCHITECTURE +PKG_CONFIG_DIRECTORY="${LIB_INSTALL_BASE}/pkgconfig" +if [ ! -d "${PKG_CONFIG_DIRECTORY}" ]; then + mkdir -p "${PKG_CONFIG_DIRECTORY}" || return 1 +fi + +# FILTER WHICH EXTERNAL LIBRARIES WILL BE BUILT +# NOTE THAT BUILT-IN LIBRARIES ARE FORWARDED TO FFMPEG SCRIPT WITHOUT ANY PROCESSING +enabled_library_list=() +for library in {1..50}; do + if [[ ${!library} -eq 1 ]]; then + ENABLED_LIBRARY=$(get_library_name $((library - 1))) + enabled_library_list+=(${ENABLED_LIBRARY}) + + echo -e "INFO: Enabled library ${ENABLED_LIBRARY} will be built\n" 1>>"${BASEDIR}"/build.log 2>&1 + fi +done + +# BUILD ENABLED LIBRARIES AND THEIR DEPENDENCIES +let completed=0 +while [ ${#enabled_library_list[@]} -gt $completed ]; do + for library in "${enabled_library_list[@]}"; do + let run=0 + case $library in + fontconfig) + if [[ $OK_expat -eq 1 ]] && [[ $OK_freetype -eq 1 ]]; then + run=1 + fi + ;; + freetype) + if [[ $OK_libpng -eq 1 ]]; then + run=1 + fi + ;; + gnutls) + if [[ $OK_nettle -eq 1 ]] && [[ $OK_gmp -eq 1 ]]; then + run=1 + fi + ;; + harfbuzz) + if [[ $OK_fontconfig -eq 1 ]] && [[ $OK_freetype -eq 1 ]]; then + run=1 + fi + ;; + leptonica) + if [[ $OK_giflib -eq 1 ]] && [[ $OK_jpeg -eq 1 ]] && [[ $OK_libpng -eq 1 ]] && [[ $OK_tiff -eq 1 ]] && [[ $OK_libwebp -eq 1 ]]; then + run=1 + fi + ;; + libass) + if [[ $OK_expat -eq 1 ]] && [[ $OK_freetype -eq 1 ]] && [[ $OK_fribidi -eq 1 ]] && [[ $OK_fontconfig -eq 1 ]] && [[ $OK_libpng -eq 1 ]] && [[ $OK_harfbuzz -eq 1 ]]; then + run=1 + fi + ;; + libtheora) + if [[ $OK_libvorbis -eq 1 ]] && [[ $OK_libogg -eq 1 ]]; then + run=1 + fi + ;; + libvorbis) + if [[ $OK_libogg -eq 1 ]]; then + run=1 + fi + ;; + libwebp) + if [[ $OK_giflib -eq 1 ]] && [[ $OK_jpeg -eq 1 ]] && [[ $OK_libpng -eq 1 ]] && [[ $OK_tiff -eq 1 ]]; then + run=1 + fi + ;; + nettle) + if [[ $OK_gmp -eq 1 ]]; then + run=1 + fi + ;; + rubberband) + if [[ $OK_libsndfile -eq 1 ]] && [[ $OK_libsamplerate -eq 1 ]]; then + run=1 + fi + ;; + srt) + if [[ $OK_openssl -eq 1 ]]; then + run=1 + fi + ;; + tesseract) + if [[ $OK_leptonica -eq 1 ]]; then + run=1 + fi + ;; + tiff) + if [[ $OK_jpeg -eq 1 ]]; then + run=1 + fi + ;; + twolame) + if [[ $OK_libsndfile -eq 1 ]]; then + run=1 + fi + ;; + *) + run=1 + ;; + esac + + BUILD_COMPLETED_FLAG=$(echo "OK_${library}" | sed "s/\-/\_/g") + REBUILD_FLAG=$(echo "REBUILD_${library}" | sed "s/\-/\_/g") + DEPENDENCY_REBUILT_FLAG=$(echo "DEPENDENCY_REBUILT_${library}" | sed "s/\-/\_/g") + + if [[ $run -eq 1 ]] && [[ "${!BUILD_COMPLETED_FLAG}" != "1" ]]; then + LIBRARY_IS_INSTALLED=$(library_is_installed "${LIB_INSTALL_BASE}" "${library}") + + echo -e "INFO: Flags detected for ${library}: already installed=${LIBRARY_IS_INSTALLED}, rebuild requested by user=${!REBUILD_FLAG}, will be rebuilt due to dependency update=${!DEPENDENCY_REBUILT_FLAG}\n" 1>>"${BASEDIR}"/build.log 2>&1 + + # CHECK IF BUILD IS NECESSARY OR NOT + if [[ ${LIBRARY_IS_INSTALLED} -ne 1 ]] || [[ ${!REBUILD_FLAG} -eq 1 ]] || [[ ${!DEPENDENCY_REBUILT_FLAG} -eq 1 ]]; then + echo -n "${library}: " + + "${BASEDIR}"/scripts/run-apple.sh "${library}" 1>>"${BASEDIR}"/build.log 2>&1 + + RC=$? + + # SET SOME FLAGS AFTER THE BUILD + if [ $RC -eq 0 ]; then + ((completed += 1)) + declare "$BUILD_COMPLETED_FLAG=1" + check_if_dependency_rebuilt "${library}" + echo "ok" + elif [ $RC -eq 200 ]; then + echo -e "not supported\n\nSee build.log for details\n" + exit 1 + else + echo -e "failed\n\nSee build.log for details\n" + exit 1 + fi + else + ((completed += 1)) + declare "$BUILD_COMPLETED_FLAG=1" + echo "${library}: already built" + fi + else + echo -e "INFO: Skipping $library, dependencies built=$run, already built=${!BUILD_COMPLETED_FLAG}\n" 1>>"${BASEDIR}"/build.log 2>&1 + fi + done +done + +# BUILD CUSTOM LIBRARIES +for custom_library_index in "${CUSTOM_LIBRARIES[@]}"; do + library_name="CUSTOM_LIBRARY_${custom_library_index}_NAME" + + echo -e "\nDEBUG: Custom library ${!library_name} will be built\n" 1>>"${BASEDIR}"/build.log 2>&1 + + # DEFINE SOME FLAGS TO REBUILD OPTIONS + REBUILD_FLAG=$(echo "REBUILD_${!library_name}" | sed "s/\-/\_/g") + LIBRARY_IS_INSTALLED=$(library_is_installed "${LIB_INSTALL_BASE}" "${!library_name}") + + echo -e "INFO: Flags detected for custom library ${!library_name}: already installed=${LIBRARY_IS_INSTALLED}, rebuild requested by user=${!REBUILD_FLAG}\n" 1>>"${BASEDIR}"/build.log 2>&1 + + if [[ ${LIBRARY_IS_INSTALLED} -ne 1 ]] || [[ ${!REBUILD_FLAG} -eq 1 ]]; then + + echo -n "${!library_name}: " + + "${BASEDIR}"/scripts/run-apple.sh "${!library_name}" 1>>"${BASEDIR}"/build.log 2>&1 + + RC=$? + + # SET SOME FLAGS AFTER THE BUILD + if [ $RC -eq 0 ]; then + echo "ok" + elif [ $RC -eq 200 ]; then + echo -e "not supported\n\nSee build.log for details\n" + exit 1 + else + echo -e "failed\n\nSee build.log for details\n" + exit 1 + fi + else + echo "${!library_name}: already built" + fi +done + +# SKIP TO SPEED UP THE BUILD +if [[ ${SKIP_ffmpeg} -ne 1 ]]; then + + # PREPARE PATHS & DEFINE ${INSTALL_PKG_CONFIG_DIR} + LIB_NAME="ffmpeg" + set_toolchain_paths "${LIB_NAME}" + + # SET BUILD FLAGS + HOST=$(get_host) + export CFLAGS=$(get_cflags "${LIB_NAME}") + export CXXFLAGS=$(get_cxxflags "${LIB_NAME}") + export LDFLAGS=$(get_ldflags "${LIB_NAME}") + export PKG_CONFIG_LIBDIR="${INSTALL_PKG_CONFIG_DIR}" + + cd "${BASEDIR}"/src/"${LIB_NAME}" 1>>"${BASEDIR}"/build.log 2>&1 || return 1 + + LIB_INSTALL_PREFIX="${LIB_INSTALL_BASE}/${LIB_NAME}" + + # BUILD FFMPEG + source "${BASEDIR}"/scripts/apple/ffmpeg.sh + + if [[ $? -ne 0 ]]; then + exit 1 + fi +else + echo -e "\nffmpeg: skipped" +fi + +# SKIP TO SPEED UP THE BUILD +if [[ ${SKIP_ffmpeg_kit} -ne 1 ]]; then + + # BUILD FFMPEG + . "${BASEDIR}"/scripts/apple/ffmpeg-kit.sh "$@" || return 1 +else + echo -e "\nffmpeg-kit: skipped" +fi + +echo -e "\nINFO: Completed build for ${ARCH} at $(date)\n" 1>>"${BASEDIR}"/build.log 2>&1 diff --git a/scripts/variable.sh b/scripts/variable.sh index be8c081..cbb5004 100755 --- a/scripts/variable.sh +++ b/scripts/variable.sh @@ -7,7 +7,7 @@ export FFMPEG_KIT_TMPDIR="${BASEDIR}/.tmp" ENABLED_ARCHITECTURES=(0 0 0 0 0 0 0 0 0 0 0 0 0) # ARRAY OF ENABLED ARCHITECTURE VARIANTS -ENABLED_ARCHITECTURE_VARIANTS=(0 0 0 0 0 0 0 0) +ENABLED_ARCHITECTURE_VARIANTS=(0 0 0 0 0 0 0 0 0 0) # ARRAY OF ENABLED LIBRARIES ENABLED_LIBRARIES=(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) @@ -30,14 +30,14 @@ ARCH_ARM_V7A_NEON=1 # android ARCH_ARMV7=2 # ios ARCH_ARMV7S=3 # ios ARCH_ARM64_V8A=4 # android -ARCH_ARM64=5 # ios, tvos, macos +ARCH_ARM64=5 # ios, tvos, xros, macos ARCH_ARM64E=6 # ios ARCH_I386=7 # ios ARCH_X86=8 # android ARCH_X86_64=9 # android, ios, linux, macos, tvos ARCH_X86_64_MAC_CATALYST=10 # ios ARCH_ARM64_MAC_CATALYST=11 # ios -ARCH_ARM64_SIMULATOR=12 # ios +ARCH_ARM64_SIMULATOR=12 # ios, xros # ARCH VARIANT INDEXES ARCH_VAR_IOS=1 # ios @@ -48,6 +48,8 @@ ARCH_VAR_TVOS=5 # tvos ARCH_VAR_APPLETVOS=6 # tvos ARCH_VAR_APPLETVSIMULATOR=7 # tvos ARCH_VAR_MACOS=8 # macos +ARCH_VAR_XROS=9 # xros +ARCH_VAR_XRSIMULATOR=10 # xros # LIBRARY INDEXES LIBRARY_FONTCONFIG=0 diff --git a/xros.sh b/xros.sh new file mode 100755 index 0000000..6cefe3d --- /dev/null +++ b/xros.sh @@ -0,0 +1,285 @@ +#!/bin/bash + +# CHECK IF XCODE IS INSTALLED +if [ ! -x "$(command -v xcrun)" ]; then + echo -e "\n(*) xcrun command not found. Please check your Xcode installation\n" + exit 1 +fi + +if [ ! -x "$(command -v xcodebuild)" ]; then + echo -e "\n(*) xcodebuild command not found. Please check your Xcode installation\n" + exit 1 +fi + +# LOAD INITIAL SETTINGS +export BASEDIR="$(pwd)" +export FFMPEG_KIT_BUILD_TYPE="xros" +source "${BASEDIR}"/scripts/variable.sh +source "${BASEDIR}"/scripts/function-${FFMPEG_KIT_BUILD_TYPE}.sh +disabled_libraries=() + +# SET DEFAULTS SETTINGS +enable_default_xros_architectures + +# SELECT XCODE VERSION USED FOR BUILDING +XCODE_FOR_FFMPEG_KIT=$(ls ~/.xcode.for.ffmpeg.kit.sh 2>>"${BASEDIR}"/build.log) +if [[ -f ${XCODE_FOR_FFMPEG_KIT} ]]; then + source "${XCODE_FOR_FFMPEG_KIT}" 1>>"${BASEDIR}"/build.log 2>&1 +fi + +# DETECT XROS SDK VERSION +export DETECTED_XROS_SDK_VERSION="$(xcrun --sdk xros --show-sdk-version 2>>${BASEDIR}/build.log)" +echo -e "\nINFO: Using SDK ${DETECTED_XROS_SDK_VERSION} by Xcode provided at $(xcode-select -p)\n" 1>>"${BASEDIR}"/build.log 2>&1 +echo -e "\nINFO: Build options: $*\n" 1>>"${BASEDIR}"/build.log 2>&1 + +# SET DEFAULT BUILD OPTIONS +export GPL_ENABLED="no" +DISPLAY_HELP="" +BUILD_TYPE_ID="" +BUILD_FULL="" +FFMPEG_KIT_XCF_BUILD="" +BUILD_FORCE="" +BUILD_VERSION=$(git describe --tags --always 2>>"${BASEDIR}"/build.log) +if [[ -z ${BUILD_VERSION} ]]; then + echo -e "\n(*): Can not run git commands in this folder. See build.log.\n" + exit 1 +fi + +# MAIN BUILDS ENABLED BY DEFAULT +enable_main_build + +# PROCESS LTS BUILD OPTION FIRST AND SET BUILD TYPE: MAIN OR LTS +for argument in "$@"; do + if [[ "$argument" == "-l" ]] || [[ "$argument" == "--lts" ]]; then + enable_lts_build + BUILD_TYPE_ID+="LTS " + fi +done + +# PROCESS BUILD OPTIONS +while [ ! $# -eq 0 ]; do + case $1 in + -h | --help) + DISPLAY_HELP="1" + ;; + -v | --version) + display_version + exit 0 + ;; + --skip-*) + SKIP_LIBRARY=$(echo "$1" | sed -e 's/^--[A-Za-z]*-//g') + + skip_library "${SKIP_LIBRARY}" + ;; + --no-bitcode) + export NO_BITCODE="1" + ;; + --no-framework) + NO_FRAMEWORK="1" + ;; + --no-output-redirection) + no_output_redirection + ;; + --no-workspace-cleanup-*) + NO_WORKSPACE_CLEANUP_LIBRARY=$(echo $1 | sed -e 's/^--[A-Za-z]*-[A-Za-z]*-[A-Za-z]*-//g') + + no_workspace_cleanup_library "${NO_WORKSPACE_CLEANUP_LIBRARY}" + ;; + -d | --debug) + enable_debug + ;; + -s | --speed) + optimize_for_speed + ;; + -l | --lts) ;; + -x | --xcframework) + FFMPEG_KIT_XCF_BUILD="1" + ;; + -f | --force) + export BUILD_FORCE="1" + ;; + --reconf-*) + CONF_LIBRARY=$(echo $1 | sed -e 's/^--[A-Za-z]*-//g') + + reconf_library "${CONF_LIBRARY}" + ;; + --rebuild-*) + BUILD_LIBRARY=$(echo $1 | sed -e 's/^--[A-Za-z]*-//g') + + rebuild_library "${BUILD_LIBRARY}" + ;; + --redownload-*) + DOWNLOAD_LIBRARY=$(echo $1 | sed -e 's/^--[A-Za-z]*-//g') + + redownload_library "${DOWNLOAD_LIBRARY}" + ;; + --full) + BUILD_FULL="1" + ;; + --enable-gpl) + export GPL_ENABLED="yes" + ;; + --enable-custom-library-*) + CUSTOM_LIBRARY_OPTION_KEY=$(echo $1 | sed -e 's/^--enable-custom-//g;s/=.*$//g') + CUSTOM_LIBRARY_OPTION_VALUE=$(echo $1 | sed -e 's/^--enable-custom-.*=//g') + + echo -e "INFO: Custom library options detected: ${CUSTOM_LIBRARY_OPTION_KEY} ${CUSTOM_LIBRARY_OPTION_VALUE}\n" 1>>"${BASEDIR}"/build.log 2>&1 + + generate_custom_library_environment_variables "${CUSTOM_LIBRARY_OPTION_KEY}" "${CUSTOM_LIBRARY_OPTION_VALUE}" + ;; + --enable-*) + ENABLED_LIBRARY=$(echo $1 | sed -e 's/^--[A-Za-z]*-//g') + + enable_library "${ENABLED_LIBRARY}" + ;; + --disable-lib-*) + DISABLED_LIB=$(echo $1 | sed -e 's/^--[A-Za-z]*-[A-Za-z]*-//g') + + disabled_libraries+=("${DISABLED_LIB}") + ;; + --disable-*) + DISABLED_ARCH=$(echo $1 | sed -e 's/^--[A-Za-z]*-//g') + + disable_arch "${DISABLED_ARCH}" + ;; + --target=*) + TARGET=$(echo $1 | sed -e 's/^--[A-Za-z]*=//g') + + export XROS_MIN_VERSION=${TARGET} + ;; + *) + print_unknown_option "$1" + ;; + esac + shift +done + +# PROCESS FULL OPTION AS LAST OPTION +if [[ -n ${BUILD_FULL} ]]; then + for library in {0..61}; do + if [ ${GPL_ENABLED} == "yes" ]; then + enable_library "$(get_library_name "$library")" 1 + else + if [[ $(is_gpl_licensed "$library") -eq 1 ]]; then + enable_library "$(get_library_name "$library")" 1 + fi + fi + done +fi + +# DISABLE SPECIFIED LIBRARIES +for disabled_library in ${disabled_libraries[@]}; do + set_library "${disabled_library}" 0 +done + +# IF HELP DISPLAYED EXIT +if [[ -n ${DISPLAY_HELP} ]]; then + display_help + exit 0 +fi + +# DISABLE NOT SUPPORTED ARCHITECTURES +disable_xros_architecture_not_supported_on_detected_sdk_version "${ARCH_ARM64_SIMULATOR}" + +# CHECK SOME RULES FOR .framework BUNDLES + +# 1. DISABLE arm64-simulator WHEN arm64 IS ENABLED IN framework BUNDLES +if [[ ${NO_FRAMEWORK} -ne 1 ]] && [[ -z ${FFMPEG_KIT_XCF_BUILD} ]] && [[ ${ENABLED_ARCHITECTURES[${ARCH_ARM64}]} -eq 1 ]] && [[ ${ENABLED_ARCHITECTURES[${ARCH_ARM64_SIMULATOR}]} -eq 1 ]]; then + echo -e "INFO: Disabled arm64-simulator architecture which cannot co-exist with arm64 in the same framework bundle.\n" 1>>"${BASEDIR}"/build.log 2>&1 + disable_arch "arm64-simulator" +fi + +echo -e "\nBuilding ffmpeg-kit ${BUILD_TYPE_ID}shared library for visionOS\n" +echo -e -n "INFO: Building ffmpeg-kit ${BUILD_VERSION} ${BUILD_TYPE_ID}for visionOS: " 1>>"${BASEDIR}"/build.log 2>&1 +echo -e "$(date)\n" 1>>"${BASEDIR}"/build.log 2>&1 + +# PRINT BUILD SUMMARY +print_enabled_architectures +print_enabled_libraries +print_reconfigure_requested_libraries +print_rebuild_requested_libraries +print_redownload_requested_libraries +print_custom_libraries + +# VALIDATE GPL FLAGS +for gpl_library in {$LIBRARY_X264,$LIBRARY_XVIDCORE,$LIBRARY_X265,$LIBRARY_LIBVIDSTAB,$LIBRARY_RUBBERBAND}; do + if [[ ${ENABLED_LIBRARIES[$gpl_library]} -eq 1 ]]; then + library_name=$(get_library_name "${gpl_library}") + + if [ ${GPL_ENABLED} != "yes" ]; then + echo -e "\n(*) Invalid configuration detected. GPL library ${library_name} enabled without --enable-gpl flag.\n" + echo -e "\n(*) Invalid configuration detected. GPL library ${library_name} enabled without --enable-gpl flag.\n" 1>>"${BASEDIR}"/build.log 2>&1 + exit 1 + fi + fi +done + +echo -n -e "\nDownloading sources: " +echo -e "INFO: Downloading the source code of ffmpeg and external libraries.\n" 1>>"${BASEDIR}"/build.log 2>&1 + +# DOWNLOAD GNU CONFIG +download_gnu_config + +# DOWNLOAD LIBRARY SOURCES +downloaded_library_sources "${ENABLED_LIBRARIES[@]}" + +# THIS WILL SAVE ARCHITECTURES TO BUILD +TARGET_ARCH_LIST=() + +# BUILD ENABLED LIBRARIES ON ENABLED ARCHITECTURES +for run_arch in {0..12}; do + if [[ ${ENABLED_ARCHITECTURES[$run_arch]} -eq 1 ]]; then + export ARCH=$(get_arch_name "$run_arch") + export FULL_ARCH=$(get_full_arch_name "$run_arch") + export SDK_PATH=$(get_sdk_path) + export SDK_NAME=$(get_sdk_name) + + # EXECUTE MAIN BUILD SCRIPT + . "${BASEDIR}"/scripts/main-xros.sh "${ENABLED_LIBRARIES[@]}" + + TARGET_ARCH_LIST+=("${FULL_ARCH}") + + # CLEAR FLAGS + for library in {0..61}; do + library_name=$(get_library_name "${library}") + unset "$(echo "OK_${library_name}" | sed "s/\-/\_/g")" + unset "$(echo "DEPENDENCY_REBUILT_${library_name}" | sed "s/\-/\_/g")" + done + fi +done + +echo -e -n "\n" + +# DO NOT BUILD FRAMEWORKS +if [[ ${NO_FRAMEWORK} -ne 1 ]]; then + + # BUILD FFMPEG-KIT + if [[ -n ${TARGET_ARCH_LIST[0]} ]]; then + + # INITIALIZE TARGET FOLDERS + initialize_prebuilt_xros_folders + + # PREPARE PLATFORM ARCHITECTURE STRINGS + build_apple_architecture_variant_strings + + if [[ -n ${FFMPEG_KIT_XCF_BUILD} ]]; then + echo -e -n "\nCreating xcframeworks under prebuilt: " + + create_universal_libraries_for_xros_xcframeworks + + create_frameworks_for_xros_xcframeworks + + create_xros_xcframeworks + else + echo -e -n "\nCreating frameworks under prebuilt: " + + create_universal_libraries_for_xros_default_frameworks + + create_xros_default_frameworks + fi + + echo -e "ok\n" + fi +else + echo -e "INFO: Skipped creating visionOS frameworks.\n" 1>>"${BASEDIR}"/build.log 2>&1 +fi