blob: 25aed6306a5408a3281609c1e36f6bb9133f66b0 [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 or dynamic FAT libraries for ios in out_ios_libs.
# Exit on errors.
set -e
# Environment
export PATH=/usr/libexec:$PATH
# Globals.
SCRIPT_DIR=$(cd $(dirname $0) && pwd)
WEBRTC_BASE_DIR=${SCRIPT_DIR}/../../..
GYP_WEBRTC_SCRIPT=${WEBRTC_BASE_DIR}/webrtc/build/gyp_webrtc.py
MERGE_SCRIPT=${SCRIPT_DIR}/merge_ios_libs.py
LICENSE_SCRIPT=${SCRIPT_DIR}/generate_licenses.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 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 build_type=$4
local libvpx_build_vp9=$5
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
local ninja_flavor_dir=${ninja_output_dir}/${flavor}
# Compile framework by default.
local gyp_file=webrtc/sdk/sdk.gyp
local gyp_target=rtc_sdk_framework_objc
# Set to 1 to explicitly not hide symbols. We'll want this if we're just
# generating static libs.
local override_visibility=0
if [[ ${build_type} = "legacy" ]]; then
echo "Building objc legacy libraries no longer supported."
exit 1
elif [[ ${build_type} = "static_only" ]]; then
echo "Building static only."
gyp_file=webrtc/build/ios/merge_ios_libs.gyp
gyp_target=rtc_sdk_peerconnection_objc_no_op
override_visibility=1
elif [[ ${build_type} == "framework" ]]; then
echo "Building framework."
else
echo "Unexpected build type: ${build_type}"
exit 1
fi
export GYP_DEFINES="OS=ios target_arch=${target_arch} use_objc_h264=1 \
clang_xcode=1 ios_deployment_target=8.0 \
ios_override_visibility=${override_visibility} \
libvpx_build_vp9=${libvpx_build_vp9}"
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.py ${gyp_file}
popd
# Compile the target we're interested in.
ninja -C ${ninja_flavor_dir} ${gyp_target}
if [[ ${build_type} = "framework" ]]; then
# Manually generate the dSYM files before stripping them. GYP does not seem
# to instruct ninja to generate dSYM files.
dsymutil --out=${ninja_flavor_dir}/WebRTC.framework.dSYM \
${ninja_flavor_dir}/WebRTC.framework/WebRTC
fi
# Make links to the generated static archives.
mkdir -p ${library_output_dir}
for f in ${ninja_flavor_dir}/*.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] [-b build_type] [-c] [-o output_dir]"
echo " -h Print this help."
echo " -b The build type. Can be framework or static_only."
echo " Defaults to framework."
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."
echo " -r Specifies a revision number to embed if building the framework."
exit 0
}
check_preconditions
# Set default arguments.
# Output directory for build artifacts.
OUTPUT_DIR=${WEBRTC_BASE_DIR}/out_ios_libs
# The type of build to perform. Valid arguments are framework and static_only.
BUILD_TYPE="framework"
PERFORM_CLEAN=0
FLAVOR="Profile"
POINT_VERSION="0"
# TODO(tkchin): Add ability to pass in a flag to build vp9. Odds are mobile
# clients will not want it though because of the higher CPU usage.
LIBVPX_BUILD_VP9=0
# Parse arguments.
while getopts "hb:co:r:" opt; do
case "${opt}" in
h) usage;;
b) BUILD_TYPE="${OPTARG}";;
c) PERFORM_CLEAN=1;;
o) OUTPUT_DIR="${OPTARG}";;
r) POINT_VERSION="${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} ${FLAVOR} $ARCH ${BUILD_TYPE} ${LIBVPX_BUILD_VP9}
done
ARM_NINJA_DIR=${OUTPUT_DIR}/arm_ninja/${FLAVOR}-iphoneos
ARM64_NINJA_DIR=${OUTPUT_DIR}/arm64_ninja/${FLAVOR}-iphoneos
IA32_NINJA_DIR=${OUTPUT_DIR}/ia32_ninja/${FLAVOR}-iphonesimulator
X64_NINJA_DIR=${OUTPUT_DIR}/x64_ninja/${FLAVOR}-iphonesimulator
if [[ ${BUILD_TYPE} = "framework" ]]; then
# Merge the framework slices together into a FAT library by copying one arch
# output and merging the rest in.
DYLIB_PATH="WebRTC.framework/WebRTC"
cp -R ${ARM_NINJA_DIR}/WebRTC.framework ${OUTPUT_DIR}
rm ${OUTPUT_DIR}/${DYLIB_PATH}
echo "Merging framework slices."
lipo ${ARM_NINJA_DIR}/${DYLIB_PATH} \
${ARM64_NINJA_DIR}/${DYLIB_PATH} \
${IA32_NINJA_DIR}/${DYLIB_PATH} \
${X64_NINJA_DIR}/${DYLIB_PATH} \
-create -output ${OUTPUT_DIR}/${DYLIB_PATH}
# Merge the dSYM files together in a similar fashion.
DSYM_PATH="WebRTC.framework.dSYM/Contents/Resources/DWARF/WebRTC"
cp -R ${ARM_NINJA_DIR}/WebRTC.framework.dSYM ${OUTPUT_DIR}
rm ${OUTPUT_DIR}/${DSYM_PATH}
echo "Merging dSYM slices."
lipo ${ARM_NINJA_DIR}/${DSYM_PATH} \
${ARM64_NINJA_DIR}/${DSYM_PATH} \
${IA32_NINJA_DIR}/${DSYM_PATH} \
${X64_NINJA_DIR}/${DSYM_PATH} \
-create -output ${OUTPUT_DIR}/${DSYM_PATH}
# Strip the dynamic framework of non-global symbols.
# TODO(tkchin): Override chromium strip settings in supplement.gypi instead.
echo "Stripping non-global symbols."
strip -x ${OUTPUT_DIR}/${DYLIB_PATH}
# Modify the version number.
INFOPLIST_PATH=${OUTPUT_DIR}/WebRTC.framework/Info.plist
MAJOR_MINOR=$(PlistBuddy -c "Print :CFBundleShortVersionString" \
${INFOPLIST_PATH})
VERSION_NUMBER="${MAJOR_MINOR}.${POINT_VERSION}"
echo "Substituting revision number: ${VERSION_NUMBER}"
PlistBuddy -c "Set :CFBundleVersion ${VERSION_NUMBER}" ${INFOPLIST_PATH}
plutil -convert binary1 ${INFOPLIST_PATH}
# Copy pod file.
FORMAT_STRING=s/\${FRAMEWORK_VERSION_NUMBER}/${VERSION_NUMBER}/g
sed -e ${FORMAT_STRING} ${WEBRTC_BASE_DIR}/webrtc/sdk/objc/WebRTC.podspec > \
${OUTPUT_DIR}/WebRTC.podspec
elif [[ ${BUILD_TYPE} = "static_only" ]]; then
echo "Merging static library slices."
# Merge the static libraries together into individual FAT archives.
${MERGE_SCRIPT} ${OUTPUT_DIR}
# Merge the dSYM files together.
TARGET_NAME="rtc_sdk_peerconnection_objc_no_op"
DSYM_PATH="${TARGET_NAME}.app.dSYM/Contents/Resources/DWARF/${TARGET_NAME}"
cp -R ${ARM_NINJA_DIR}/${TARGET_NAME}.app.dSYM ${OUTPUT_DIR}
echo "Merging dSYM slices."
lipo ${ARM_NINJA_DIR}/${DSYM_PATH} \
${ARM64_NINJA_DIR}/${DSYM_PATH} \
${IA32_NINJA_DIR}/${DSYM_PATH} \
${X64_NINJA_DIR}/${DSYM_PATH} \
-create -output ${OUTPUT_DIR}/${DSYM_PATH}
# Strip debugging symbols.
# TODO(tkchin): Override chromium settings in supplement.gypi instead to do
# stripping at build time.
echo "Stripping debug symbols."
strip -S ${OUTPUT_DIR}/fat_libs/*.a
# Symlink the headers.
echo "Symlinking headers."
INPUT_HEADER_DIR="${WEBRTC_BASE_DIR}/webrtc/sdk/objc/Framework/Headers/WebRTC"
OUTPUT_HEADER_DIR="${OUTPUT_DIR}/include"
if [[ -d ${OUTPUT_HEADER_DIR} ]]; then
rm -rf ${OUTPUT_HEADER_DIR}
fi
mkdir -p ${OUTPUT_HEADER_DIR}
ln -sf ${INPUT_HEADER_DIR} ${OUTPUT_HEADER_DIR}/WebRTC
else
echo "BUILD_TYPE ${BUILD_TYPE} not supported."
exit 1
fi
echo "Generating LICENSE.html."
${LICENSE_SCRIPT} ${OUTPUT_DIR}/arm64_libs ${OUTPUT_DIR}
echo "Done!"