1ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#!/bin/sh
2ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian##
3ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian##  Copyright (c) 2014 The WebM project authors. All Rights Reserved.
4ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian##
5ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian##  Use of this source code is governed by a BSD-style license
6ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian##  that can be found in the LICENSE file in the root of the source
7ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian##  tree. An additional intellectual property rights grant can be found
8ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian##  in the file PATENTS.  All contributing project authors may
9ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian##  be found in the AUTHORS file in the root of the source tree.
10ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian##
11ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian##
12ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian## This script generates 'VPX.framework'. An iOS app can encode and decode VPx
13ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian## video by including 'VPX.framework'.
14ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian##
15ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian## Run iosbuild.sh to create 'VPX.framework' in the current directory.
16ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian##
17ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianset -e
18ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramaniandevnull='> /dev/null 2>&1'
19ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
20ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianBUILD_ROOT="_iosbuild"
217ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramanianCONFIGURE_ARGS="--disable-docs
227ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                --disable-examples
237ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                --disable-libyuv
247ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                --disable-unit-tests"
25ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianDIST_DIR="_dist"
26ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianFRAMEWORK_DIR="VPX.framework"
2768e1c830ade592be74773e249bf94e2bbfb50de7JohannFRAMEWORK_LIB="VPX.framework/VPX"
28ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianHEADER_DIR="${FRAMEWORK_DIR}/Headers/vpx"
297ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramanianSCRIPT_DIR=$(dirname "$0")
307ce0a1d1337c01056ba24006efab21f00e179e04Vignesh VenkatasubramanianLIBVPX_SOURCE_DIR=$(cd ${SCRIPT_DIR}/../..; pwd)
31ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianLIPO=$(xcrun -sdk iphoneos${SDK} -find lipo)
32ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianORIG_PWD="$(pwd)"
3368e1c830ade592be74773e249bf94e2bbfb50de7JohannARM_TARGETS="arm64-darwin-gcc
3468e1c830ade592be74773e249bf94e2bbfb50de7Johann             armv7-darwin-gcc
3568e1c830ade592be74773e249bf94e2bbfb50de7Johann             armv7s-darwin-gcc"
3668e1c830ade592be74773e249bf94e2bbfb50de7JohannSIM_TARGETS="x86-iphonesimulator-gcc
3768e1c830ade592be74773e249bf94e2bbfb50de7Johann             x86_64-iphonesimulator-gcc"
380a39d0a697ff3603e8c100300fda363658e10b23James ZernOSX_TARGETS="x86-darwin16-gcc
390a39d0a697ff3603e8c100300fda363658e10b23James Zern             x86_64-darwin16-gcc"
4068e1c830ade592be74773e249bf94e2bbfb50de7JohannTARGETS="${ARM_TARGETS} ${SIM_TARGETS}"
41ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
42ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian# Configures for the target specified by $1, and invokes make with the dist
43ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian# target using $DIST_DIR as the distribution output directory.
44ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianbuild_target() {
45ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  local target="$1"
46ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  local old_pwd="$(pwd)"
47c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  local target_specific_flags=""
48ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
49ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  vlog "***Building target: ${target}***"
50ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
51c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  case "${target}" in
52c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann    x86-*)
53c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann      target_specific_flags="--enable-pic"
54c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann      vlog "Enabled PIC for ${target}"
55c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann      ;;
56c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  esac
57c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann
58ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  mkdir "${target}"
59ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  cd "${target}"
607ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  eval "${LIBVPX_SOURCE_DIR}/configure" --target="${target}" \
61c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann    ${CONFIGURE_ARGS} ${EXTRA_CONFIGURE_ARGS} ${target_specific_flags} \
62c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann    ${devnull}
63ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  export DIST_DIR
64c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  eval make dist ${devnull}
65ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  cd "${old_pwd}"
66ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
67ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  vlog "***Done building target: ${target}***"
68ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian}
69ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
70ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian# Returns the preprocessor symbol for the target specified by $1.
71ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramaniantarget_to_preproc_symbol() {
72ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  target="$1"
73ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  case "${target}" in
74ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian    arm64-*)
75ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian      echo "__aarch64__"
76ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian      ;;
77ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian    armv7-*)
787ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      echo "__ARM_ARCH_7A__"
79ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian      ;;
80ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian    armv7s-*)
81ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian      echo "__ARM_ARCH_7S__"
82ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian      ;;
83ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian    x86-*)
84ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian      echo "__i386__"
85ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian      ;;
86ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian    x86_64-*)
87ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian      echo "__x86_64__"
88ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian      ;;
89ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian    *)
90ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian      echo "#error ${target} unknown/unsupported"
91ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian      return 1
92ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian      ;;
93ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  esac
94ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian}
95ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
96ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian# Create a vpx_config.h shim that, based on preprocessor settings for the
97ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian# current target CPU, includes the real vpx_config.h for the current target.
98ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian# $1 is the list of targets.
99ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramaniancreate_vpx_framework_config_shim() {
100ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  local targets="$1"
101ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  local config_file="${HEADER_DIR}/vpx_config.h"
102ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  local preproc_symbol=""
103ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  local target=""
104ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  local include_guard="VPX_FRAMEWORK_HEADERS_VPX_VPX_CONFIG_H_"
105ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
106ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  local file_header="/*
107ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian *  Copyright (c) $(date +%Y) The WebM project authors. All Rights Reserved.
108ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian *
109ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian *  Use of this source code is governed by a BSD-style license
110ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian *  that can be found in the LICENSE file in the root of the source
111ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian *  tree. An additional intellectual property rights grant can be found
112ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian *  in the file PATENTS.  All contributing project authors may
113ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian *  be found in the AUTHORS file in the root of the source tree.
114ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian */
115ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
116ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian/* GENERATED FILE: DO NOT EDIT! */
117ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
118ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#ifndef ${include_guard}
119ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#define ${include_guard}
120ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
121ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#if defined"
122ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
123ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  printf "%s" "${file_header}" > "${config_file}"
124ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  for target in ${targets}; do
125ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian    preproc_symbol=$(target_to_preproc_symbol "${target}")
126ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian    printf " ${preproc_symbol}\n" >> "${config_file}"
127ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian    printf "#define VPX_FRAMEWORK_TARGET \"${target}\"\n" >> "${config_file}"
128ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian    printf "#include \"VPX/vpx/${target}/vpx_config.h\"\n" >> "${config_file}"
129ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian    printf "#elif defined" >> "${config_file}"
130ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian    mkdir "${HEADER_DIR}/${target}"
131ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian    cp -p "${BUILD_ROOT}/${target}/vpx_config.h" "${HEADER_DIR}/${target}"
132ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  done
133ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
134ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  # Consume the last line of output from the loop: We don't want it.
135ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  sed -i '' -e '$d' "${config_file}"
136ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
137ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  printf "#endif\n\n" >> "${config_file}"
138ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  printf "#endif  // ${include_guard}" >> "${config_file}"
139ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian}
140ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
14168e1c830ade592be74773e249bf94e2bbfb50de7Johann# Verifies that $FRAMEWORK_LIB fat library contains requested builds.
14268e1c830ade592be74773e249bf94e2bbfb50de7Johannverify_framework_targets() {
14368e1c830ade592be74773e249bf94e2bbfb50de7Johann  local requested_cpus=""
14468e1c830ade592be74773e249bf94e2bbfb50de7Johann  local cpu=""
14568e1c830ade592be74773e249bf94e2bbfb50de7Johann
14668e1c830ade592be74773e249bf94e2bbfb50de7Johann  # Extract CPU from full target name.
14768e1c830ade592be74773e249bf94e2bbfb50de7Johann  for target; do
14868e1c830ade592be74773e249bf94e2bbfb50de7Johann    cpu="${target%%-*}"
14968e1c830ade592be74773e249bf94e2bbfb50de7Johann    if [ "${cpu}" = "x86" ]; then
15068e1c830ade592be74773e249bf94e2bbfb50de7Johann      # lipo -info outputs i386 for libvpx x86 targets.
15168e1c830ade592be74773e249bf94e2bbfb50de7Johann      cpu="i386"
15268e1c830ade592be74773e249bf94e2bbfb50de7Johann    fi
15368e1c830ade592be74773e249bf94e2bbfb50de7Johann    requested_cpus="${requested_cpus}${cpu} "
15468e1c830ade592be74773e249bf94e2bbfb50de7Johann  done
15568e1c830ade592be74773e249bf94e2bbfb50de7Johann
15668e1c830ade592be74773e249bf94e2bbfb50de7Johann  # Get target CPUs present in framework library.
15768e1c830ade592be74773e249bf94e2bbfb50de7Johann  local targets_built=$(${LIPO} -info ${FRAMEWORK_LIB})
15868e1c830ade592be74773e249bf94e2bbfb50de7Johann
15968e1c830ade592be74773e249bf94e2bbfb50de7Johann  # $LIPO -info outputs a string like the following:
16068e1c830ade592be74773e249bf94e2bbfb50de7Johann  #   Architectures in the fat file: $FRAMEWORK_LIB <architectures>
16168e1c830ade592be74773e249bf94e2bbfb50de7Johann  # Capture only the architecture strings.
16268e1c830ade592be74773e249bf94e2bbfb50de7Johann  targets_built=${targets_built##*: }
16368e1c830ade592be74773e249bf94e2bbfb50de7Johann
16468e1c830ade592be74773e249bf94e2bbfb50de7Johann  # Sort CPU strings to make the next step a simple string compare.
16568e1c830ade592be74773e249bf94e2bbfb50de7Johann  local actual=$(echo ${targets_built} | tr " " "\n" | sort | tr "\n" " ")
16668e1c830ade592be74773e249bf94e2bbfb50de7Johann  local requested=$(echo ${requested_cpus} | tr " " "\n" | sort | tr "\n" " ")
16768e1c830ade592be74773e249bf94e2bbfb50de7Johann
16868e1c830ade592be74773e249bf94e2bbfb50de7Johann  vlog "Requested ${FRAMEWORK_LIB} CPUs: ${requested}"
16968e1c830ade592be74773e249bf94e2bbfb50de7Johann  vlog "Actual ${FRAMEWORK_LIB} CPUs: ${actual}"
17068e1c830ade592be74773e249bf94e2bbfb50de7Johann
17168e1c830ade592be74773e249bf94e2bbfb50de7Johann  if [ "${requested}" != "${actual}" ]; then
17268e1c830ade592be74773e249bf94e2bbfb50de7Johann    elog "Actual ${FRAMEWORK_LIB} targets do not match requested target list."
17368e1c830ade592be74773e249bf94e2bbfb50de7Johann    elog "  Requested target CPUs: ${requested}"
17468e1c830ade592be74773e249bf94e2bbfb50de7Johann    elog "  Actual target CPUs: ${actual}"
17568e1c830ade592be74773e249bf94e2bbfb50de7Johann    return 1
17668e1c830ade592be74773e249bf94e2bbfb50de7Johann  fi
17768e1c830ade592be74773e249bf94e2bbfb50de7Johann}
17868e1c830ade592be74773e249bf94e2bbfb50de7Johann
179ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian# Configures and builds each target specified by $1, and then builds
180ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian# VPX.framework.
181ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianbuild_framework() {
182ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  local lib_list=""
183ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  local targets="$1"
184ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  local target=""
185ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  local target_dist_dir=""
186ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
187ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  # Clean up from previous build(s).
188ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  rm -rf "${BUILD_ROOT}" "${FRAMEWORK_DIR}"
189ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
190ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  # Create output dirs.
191ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  mkdir -p "${BUILD_ROOT}"
192ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  mkdir -p "${HEADER_DIR}"
193ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
194ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  cd "${BUILD_ROOT}"
195ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
196ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  for target in ${targets}; do
197ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian    build_target "${target}"
198ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian    target_dist_dir="${BUILD_ROOT}/${target}/${DIST_DIR}"
19968e1c830ade592be74773e249bf94e2bbfb50de7Johann    if [ "${ENABLE_SHARED}" = "yes" ]; then
20068e1c830ade592be74773e249bf94e2bbfb50de7Johann      local suffix="dylib"
20168e1c830ade592be74773e249bf94e2bbfb50de7Johann    else
20268e1c830ade592be74773e249bf94e2bbfb50de7Johann      local suffix="a"
20368e1c830ade592be74773e249bf94e2bbfb50de7Johann    fi
20468e1c830ade592be74773e249bf94e2bbfb50de7Johann    lib_list="${lib_list} ${target_dist_dir}/lib/libvpx.${suffix}"
205ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  done
206ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
207ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  cd "${ORIG_PWD}"
208ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
209ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  # The basic libvpx API includes are all the same; just grab the most recent
210ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  # set.
211ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  cp -p "${target_dist_dir}"/include/vpx/* "${HEADER_DIR}"
212ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
213ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  # Build the fat library.
214ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  ${LIPO} -create ${lib_list} -output ${FRAMEWORK_DIR}/VPX
215ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
216ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  # Create the vpx_config.h shim that allows usage of vpx_config.h from
217ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  # within VPX.framework.
218ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  create_vpx_framework_config_shim "${targets}"
219ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
220ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  # Copy in vpx_version.h.
221ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  cp -p "${BUILD_ROOT}/${target}/vpx_version.h" "${HEADER_DIR}"
222ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
22368e1c830ade592be74773e249bf94e2bbfb50de7Johann  if [ "${ENABLE_SHARED}" = "yes" ]; then
22468e1c830ade592be74773e249bf94e2bbfb50de7Johann    # Adjust the dylib's name so dynamic linking in apps works as expected.
22568e1c830ade592be74773e249bf94e2bbfb50de7Johann    install_name_tool -id '@rpath/VPX.framework/VPX' ${FRAMEWORK_DIR}/VPX
22668e1c830ade592be74773e249bf94e2bbfb50de7Johann
22768e1c830ade592be74773e249bf94e2bbfb50de7Johann    # Copy in Info.plist.
22868e1c830ade592be74773e249bf94e2bbfb50de7Johann    cat "${SCRIPT_DIR}/ios-Info.plist" \
22968e1c830ade592be74773e249bf94e2bbfb50de7Johann      | sed "s/\${FULLVERSION}/${FULLVERSION}/g" \
23068e1c830ade592be74773e249bf94e2bbfb50de7Johann      | sed "s/\${VERSION}/${VERSION}/g" \
23168e1c830ade592be74773e249bf94e2bbfb50de7Johann      | sed "s/\${IOS_VERSION_MIN}/${IOS_VERSION_MIN}/g" \
23268e1c830ade592be74773e249bf94e2bbfb50de7Johann      > "${FRAMEWORK_DIR}/Info.plist"
23368e1c830ade592be74773e249bf94e2bbfb50de7Johann  fi
23468e1c830ade592be74773e249bf94e2bbfb50de7Johann
23568e1c830ade592be74773e249bf94e2bbfb50de7Johann  # Confirm VPX.framework/VPX contains the targets requested.
23668e1c830ade592be74773e249bf94e2bbfb50de7Johann  verify_framework_targets ${targets}
23768e1c830ade592be74773e249bf94e2bbfb50de7Johann
23868e1c830ade592be74773e249bf94e2bbfb50de7Johann  vlog "Created fat library ${FRAMEWORK_LIB} containing:"
239ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  for lib in ${lib_list}; do
240ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian    vlog "  $(echo ${lib} | awk -F / '{print $2, $NF}')"
241ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  done
242ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian}
243ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
244ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian# Trap function. Cleans up the subtree used to build all targets contained in
245ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian# $TARGETS.
246ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramaniancleanup() {
2477ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  local readonly res=$?
248ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  cd "${ORIG_PWD}"
249ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
2507ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  if [ $res -ne 0 ]; then
2517ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    elog "build exited with error ($res)"
2527ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  fi
2537ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
254ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  if [ "${PRESERVE_BUILD_OUTPUT}" != "yes" ]; then
255ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian    rm -rf "${BUILD_ROOT}"
256ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  fi
257ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian}
258ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
25968e1c830ade592be74773e249bf94e2bbfb50de7Johannprint_list() {
26068e1c830ade592be74773e249bf94e2bbfb50de7Johann  local indent="$1"
26168e1c830ade592be74773e249bf94e2bbfb50de7Johann  shift
26268e1c830ade592be74773e249bf94e2bbfb50de7Johann  local list="$@"
26368e1c830ade592be74773e249bf94e2bbfb50de7Johann  for entry in ${list}; do
26468e1c830ade592be74773e249bf94e2bbfb50de7Johann    echo "${indent}${entry}"
26568e1c830ade592be74773e249bf94e2bbfb50de7Johann  done
26668e1c830ade592be74773e249bf94e2bbfb50de7Johann}
26768e1c830ade592be74773e249bf94e2bbfb50de7Johann
268ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianiosbuild_usage() {
269ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramaniancat << EOF
270ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  Usage: ${0##*/} [arguments]
271ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian    --help: Display this message and exit.
27268e1c830ade592be74773e249bf94e2bbfb50de7Johann    --enable-shared: Build a dynamic framework for use on iOS 8 or later.
2737ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    --extra-configure-args <args>: Extra args to pass when configuring libvpx.
2740a39d0a697ff3603e8c100300fda363658e10b23James Zern    --macosx: Uses darwin16 targets instead of iphonesimulator targets for x86
27568e1c830ade592be74773e249bf94e2bbfb50de7Johann              and x86_64. Allows linking to framework when builds target MacOSX
27668e1c830ade592be74773e249bf94e2bbfb50de7Johann              instead of iOS.
277ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian    --preserve-build-output: Do not delete the build directory.
278ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian    --show-build-output: Show output from each library build.
2797ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    --targets <targets>: Override default target list. Defaults:
28068e1c830ade592be74773e249bf94e2bbfb50de7Johann$(print_list "        " ${TARGETS})
281c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann    --test-link: Confirms all targets can be linked. Functionally identical to
282c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann                 passing --enable-examples via --extra-configure-args.
283ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian    --verbose: Output information about the environment and each stage of the
284ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian               build.
285ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianEOF
286ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian}
287ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
2887ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianelog() {
2897ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  echo "${0##*/} failed because: $@" 1>&2
2907ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
2917ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
292ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianvlog() {
293ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  if [ "${VERBOSE}" = "yes" ]; then
294ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian    echo "$@"
295ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  fi
296ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian}
297ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
298ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramaniantrap cleanup EXIT
299ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
300ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian# Parse the command line.
301ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianwhile [ -n "$1" ]; do
302ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  case "$1" in
3037ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    --extra-configure-args)
3047ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      EXTRA_CONFIGURE_ARGS="$2"
3057ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      shift
3067ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      ;;
307ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian    --help)
308ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian      iosbuild_usage
309ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian      exit
310ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian      ;;
31168e1c830ade592be74773e249bf94e2bbfb50de7Johann    --enable-shared)
31268e1c830ade592be74773e249bf94e2bbfb50de7Johann      ENABLE_SHARED=yes
31368e1c830ade592be74773e249bf94e2bbfb50de7Johann      ;;
314ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian    --preserve-build-output)
315ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian      PRESERVE_BUILD_OUTPUT=yes
316ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian      ;;
317ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian    --show-build-output)
318ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian      devnull=
319ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian      ;;
320c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann    --test-link)
321c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann      EXTRA_CONFIGURE_ARGS="${EXTRA_CONFIGURE_ARGS} --enable-examples"
322c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann      ;;
3237ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    --targets)
3247ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      TARGETS="$2"
3257ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      shift
3267ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      ;;
32768e1c830ade592be74773e249bf94e2bbfb50de7Johann    --macosx)
32868e1c830ade592be74773e249bf94e2bbfb50de7Johann      TARGETS="${ARM_TARGETS} ${OSX_TARGETS}"
32968e1c830ade592be74773e249bf94e2bbfb50de7Johann      ;;
330ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian    --verbose)
331ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian      VERBOSE=yes
332ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian      ;;
333ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian    *)
334ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian      iosbuild_usage
335ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian      exit 1
336ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian      ;;
337ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  esac
338ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  shift
339ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramaniandone
340ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
34168e1c830ade592be74773e249bf94e2bbfb50de7Johannif [ "${ENABLE_SHARED}" = "yes" ]; then
34268e1c830ade592be74773e249bf94e2bbfb50de7Johann  CONFIGURE_ARGS="--enable-shared ${CONFIGURE_ARGS}"
34368e1c830ade592be74773e249bf94e2bbfb50de7Johannfi
34468e1c830ade592be74773e249bf94e2bbfb50de7Johann
34568e1c830ade592be74773e249bf94e2bbfb50de7JohannFULLVERSION=$("${SCRIPT_DIR}"/version.sh --bare "${LIBVPX_SOURCE_DIR}")
34668e1c830ade592be74773e249bf94e2bbfb50de7JohannVERSION=$(echo "${FULLVERSION}" | sed -E 's/^v([0-9]+\.[0-9]+\.[0-9]+).*$/\1/')
34768e1c830ade592be74773e249bf94e2bbfb50de7Johann
34868e1c830ade592be74773e249bf94e2bbfb50de7Johannif [ "$ENABLE_SHARED" = "yes" ]; then
34968e1c830ade592be74773e249bf94e2bbfb50de7Johann  IOS_VERSION_OPTIONS="--enable-shared"
35068e1c830ade592be74773e249bf94e2bbfb50de7Johann  IOS_VERSION_MIN="8.0"
35168e1c830ade592be74773e249bf94e2bbfb50de7Johannelse
35268e1c830ade592be74773e249bf94e2bbfb50de7Johann  IOS_VERSION_OPTIONS=""
35368e1c830ade592be74773e249bf94e2bbfb50de7Johann  IOS_VERSION_MIN="6.0"
35468e1c830ade592be74773e249bf94e2bbfb50de7Johannfi
35568e1c830ade592be74773e249bf94e2bbfb50de7Johann
356ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianif [ "${VERBOSE}" = "yes" ]; then
357ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramaniancat << EOF
358ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  BUILD_ROOT=${BUILD_ROOT}
359ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  DIST_DIR=${DIST_DIR}
3607ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  CONFIGURE_ARGS=${CONFIGURE_ARGS}
3617ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  EXTRA_CONFIGURE_ARGS=${EXTRA_CONFIGURE_ARGS}
362ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  FRAMEWORK_DIR=${FRAMEWORK_DIR}
36368e1c830ade592be74773e249bf94e2bbfb50de7Johann  FRAMEWORK_LIB=${FRAMEWORK_LIB}
364ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  HEADER_DIR=${HEADER_DIR}
365ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  LIBVPX_SOURCE_DIR=${LIBVPX_SOURCE_DIR}
366ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  LIPO=${LIPO}
367c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  MAKEFLAGS=${MAKEFLAGS}
368ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  ORIG_PWD=${ORIG_PWD}
369c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann  PRESERVE_BUILD_OUTPUT=${PRESERVE_BUILD_OUTPUT}
37068e1c830ade592be74773e249bf94e2bbfb50de7Johann  TARGETS="$(print_list "" ${TARGETS})"
37168e1c830ade592be74773e249bf94e2bbfb50de7Johann  ENABLE_SHARED=${ENABLE_SHARED}
37268e1c830ade592be74773e249bf94e2bbfb50de7Johann  OSX_TARGETS="${OSX_TARGETS}"
37368e1c830ade592be74773e249bf94e2bbfb50de7Johann  SIM_TARGETS="${SIM_TARGETS}"
37468e1c830ade592be74773e249bf94e2bbfb50de7Johann  SCRIPT_DIR="${SCRIPT_DIR}"
37568e1c830ade592be74773e249bf94e2bbfb50de7Johann  FULLVERSION="${FULLVERSION}"
37668e1c830ade592be74773e249bf94e2bbfb50de7Johann  VERSION="${VERSION}"
37768e1c830ade592be74773e249bf94e2bbfb50de7Johann  IOS_VERSION_MIN="${IOS_VERSION_MIN}"
378ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianEOF
379ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianfi
380ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
381ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianbuild_framework "${TARGETS}"
3827ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianecho "Successfully built '${FRAMEWORK_DIR}' for:"
38368e1c830ade592be74773e249bf94e2bbfb50de7Johannprint_list "" ${TARGETS}
384