blob: a01d128373eb216f499d0a800700e26b690b8b61 [file] [log] [blame]
#!/bin/bash
# Copyright 2015 The WebRTC project authors. All Rights Reserved.
#
# Use of this source code is governed by a BSD-style license
# that can be found in the LICENSE file in the root of the source
# tree. An additional intellectual property rights grant can be found
# in the file PATENTS. All contributing project authors may
# be found in the AUTHORS file in the root of the source tree.
# Generates static FAT libraries for ios in out_ios_libs.
# Exit on errors.
set -e
# Globals.
SCRIPT_DIR=$(cd $(dirname $0) && pwd)
WEBRTC_BASE_DIR=${SCRIPT_DIR}/../../..
GYP_WEBRTC_SCRIPT=${WEBRTC_BASE_DIR}/webrtc/build/gyp_webrtc
EXPORT_HEADERS_SCRIPT=${SCRIPT_DIR}/export_headers.py
MERGE_SCRIPT=${SCRIPT_DIR}/merge_ios_libs.py
function check_preconditions {
# Check for Darwin.
if [[ ! $(uname) = "Darwin" ]]; then
echo "OS/X required." >&2
exit 1
fi
# Check for libtool.
if [[ -z $(which libtool) ]]; then
echo "Missing libtool binary." >&2
exit 1
fi
# Check for GYP generator.
if [[ ! -x ${GYP_WEBRTC_SCRIPT} ]]; then
echo "Failed to find gyp generator." >&2
exit 1
fi
# Check for export headers script.
if [[ ! -x ${EXPORT_HEADERS_SCRIPT} ]]; then
echo "Failed to find export headers script." >&2
exit 1
fi
# Check for merge script.
if [[ ! -x ${MERGE_SCRIPT} ]]; then
echo "Failed to find library merging script." >&2
exit 1
fi
}
function build_webrtc {
local base_output_dir=$1
local flavor=$2
local target_arch=$3
local ninja_output_dir=${base_output_dir}/${target_arch}_ninja
local library_output_dir=${base_output_dir}/${target_arch}_libs
if [[ ${target_arch} = 'arm' || ${target_arch} = 'arm64' ]]; then
flavor="${flavor}-iphoneos"
else
flavor="${flavor}-iphonesimulator"
fi
export GYP_DEFINES="OS=ios target_arch=${target_arch} use_objc_h264=1 \
clang_xcode=1 ios_override_visibility=1"
export GYP_GENERATORS="ninja"
export GYP_GENERATOR_FLAGS="output_dir=${ninja_output_dir}"
# GYP generation requires relative path for some reason.
pushd ${WEBRTC_BASE_DIR}
webrtc/build/gyp_webrtc webrtc/build/ios/merge_ios_libs.gyp
popd
if [[ ${USE_LEGACY_API} -eq 1 ]]; then
ninja -C ${ninja_output_dir}/${flavor} libjingle_peerconnection_objc_no_op
else
ninja -C ${ninja_output_dir}/${flavor} webrtc_api_objc_no_op
fi
mkdir -p ${library_output_dir}
for f in ${ninja_output_dir}/${flavor}/*.a
do
ln -sf "${f}" "${library_output_dir}/$(basename ${f})"
done
}
function clean_artifacts {
local output_dir=$1
if [[ -d ${output_dir} ]]; then
rm -r ${output_dir}
fi
}
function usage {
echo "WebRTC iOS FAT libraries build script."
echo "Each architecture is compiled separately before being merged together."
echo "By default, the fat libraries will be created in out_ios_libs/fat_libs."
echo "The headers will be copied to out_ios_libs/include."
echo "Usage: $0 [-h] [-c] [-o]"
echo " -h Print this help."
echo " -c Removes generated build output."
echo " -o Specifies a directory to output build artifacts to."
echo " If specified together with -c, deletes the dir."
exit 0
}
check_preconditions
# Set default arguments.
# Output directory for build artifacts.
OUTPUT_DIR=${WEBRTC_BASE_DIR}/out_ios_libs
# Flag to build the new or legacy version of the API.
USE_LEGACY_API=0
PERFORM_CLEAN=0
# Parse arguments.
while getopts "hco:" opt; do
case "${opt}" in
h) usage;;
c) PERFORM_CLEAN=1;;
o) OUTPUT_DIR="${OPTARG}";;
*)
usage
exit 1
;;
esac
done
if [[ ${PERFORM_CLEAN} -ne 0 ]]; then
clean_artifacts ${OUTPUT_DIR}
exit 0
fi
# Build all the common architectures.
archs=( "arm" "arm64" "ia32" "x64" )
for arch in "${archs[@]}"
do
echo "Building WebRTC arch: ${arch}"
build_webrtc ${OUTPUT_DIR} "Profile" $arch
done
# Export header files.
${EXPORT_HEADERS_SCRIPT} ${OUTPUT_DIR} ${USE_LEGACY_API}
# Merge the libraries together.
${MERGE_SCRIPT} ${OUTPUT_DIR}