2015-03-23 19:07:37 +00:00
|
|
|
#!/bin/bash
|
2016-03-21 11:38:26 -07:00
|
|
|
|
|
|
|
|
# Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
2015-03-23 19:07:37 +00:00
|
|
|
#
|
2016-03-21 11:38:26 -07:00
|
|
|
# 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.
|
2015-03-23 19:07:37 +00:00
|
|
|
|
2016-10-05 13:16:03 -07:00
|
|
|
# Generates static FAT libraries for ios in out_ios_libs.
|
2015-03-23 19:07:37 +00:00
|
|
|
|
2016-04-16 12:06:33 -07:00
|
|
|
# Exit on errors.
|
|
|
|
|
set -e
|
2016-02-19 17:15:49 -08:00
|
|
|
|
2016-10-30 23:09:44 -07:00
|
|
|
# Environment
|
|
|
|
|
export PATH=/usr/libexec:$PATH
|
|
|
|
|
|
2016-04-16 12:06:33 -07:00
|
|
|
SCRIPT_DIR=$(cd $(dirname $0) && pwd)
|
2016-03-21 11:38:26 -07:00
|
|
|
WEBRTC_BASE_DIR=${SCRIPT_DIR}/../../..
|
2016-04-16 12:06:33 -07:00
|
|
|
|
2016-10-11 13:27:26 -07:00
|
|
|
function clean_artifacts {
|
|
|
|
|
local output_dir=$1
|
|
|
|
|
if [[ -d ${output_dir} ]]; then
|
|
|
|
|
echo "Deleting ${output_dir}"
|
|
|
|
|
rm -r ${output_dir}
|
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function build_webrtc {
|
|
|
|
|
local target_arch=$1
|
|
|
|
|
local flavor=$2
|
|
|
|
|
local build_type=$3
|
|
|
|
|
local ios_deployment_target=$4
|
|
|
|
|
local libvpx_build_vp9=$5
|
|
|
|
|
local custom_gn_options=$6
|
2016-10-05 13:16:03 -07:00
|
|
|
|
2016-10-11 13:27:26 -07:00
|
|
|
OUTPUT_DIR=${SDK_OUTPUT_DIR}/${target_arch}_libs
|
|
|
|
|
GN_ARGS="target_os=\"ios\" ios_enable_code_signing=false \
|
|
|
|
|
use_xcode_clang=true is_component_build=false"
|
2016-10-05 13:16:03 -07:00
|
|
|
|
2016-10-11 13:27:26 -07:00
|
|
|
# Add flavor option.
|
|
|
|
|
if [[ ${flavor} = "debug" ]]; then
|
|
|
|
|
GN_ARGS="${GN_ARGS} is_debug=true"
|
|
|
|
|
elif [[ ${flavor} = "release" ]]; then
|
|
|
|
|
GN_ARGS="${GN_ARGS} is_debug=false"
|
|
|
|
|
else
|
|
|
|
|
echo "Unexpected flavor type: ${flavor}"
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
2016-10-05 13:16:03 -07:00
|
|
|
|
2016-10-11 13:27:26 -07:00
|
|
|
# Add the specified architecture.
|
2016-10-05 13:16:03 -07:00
|
|
|
OUTPUT_LIB=${OUTPUT_DIR}/${SDK_LIB_NAME}
|
2016-10-11 13:27:26 -07:00
|
|
|
GN_ARGS="${GN_ARGS} target_cpu=\"${target_arch}\""
|
|
|
|
|
|
|
|
|
|
# Add deployment target.
|
|
|
|
|
GN_ARGS="${GN_ARGS} ios_deployment_target=\"${ios_deployment_target}\""
|
|
|
|
|
|
|
|
|
|
# Add vp9 option.
|
|
|
|
|
GN_ARGS="${GN_ARGS} rtc_libvpx_build_vp9=${libvpx_build_vp9}"
|
|
|
|
|
|
|
|
|
|
# Add custom options.
|
|
|
|
|
if [[ -n "${custom_gn_options}" ]]; then
|
|
|
|
|
GN_ARGS="${GN_ARGS} ${custom_gn_options}"
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
# Generate static or dynamic.
|
|
|
|
|
if [[ ${build_type} = "static_only" ]]; then
|
|
|
|
|
GN_TARGET_NAME="rtc_sdk_objc"
|
|
|
|
|
elif [[ ${build_type} == "framework" ]]; then
|
|
|
|
|
GN_TARGET_NAME="rtc_sdk_framework_objc"
|
|
|
|
|
GN_ARGS="${GN_ARGS} enable_dsyms=true enable_stripping=true"
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
echo "Building WebRTC with args: ${GN_ARGS}"
|
2016-10-05 13:16:03 -07:00
|
|
|
gn gen ${OUTPUT_DIR} --args="${GN_ARGS}"
|
2016-10-11 13:27:26 -07:00
|
|
|
echo "Building target: ${GN_TARGET_NAME}"
|
|
|
|
|
ninja -C ${OUTPUT_DIR} ${GN_TARGET_NAME}
|
|
|
|
|
|
|
|
|
|
# Strip debug symbols to reduce size.
|
|
|
|
|
if [[ ${build_type} = "static_only" ]]; then
|
|
|
|
|
strip -S ${OUTPUT_DIR}/obj/webrtc/sdk/lib${GN_TARGET_NAME}.a -o \
|
|
|
|
|
${OUTPUT_DIR}/lib${GN_TARGET_NAME}.a
|
|
|
|
|
fi
|
2016-04-16 12:06:33 -07:00
|
|
|
}
|
2015-03-23 19:07:37 +00:00
|
|
|
|
2016-10-11 13:27:26 -07:00
|
|
|
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/."
|
|
|
|
|
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
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SDK_OUTPUT_DIR=${WEBRTC_BASE_DIR}/out_ios_libs
|
|
|
|
|
SDK_LIB_NAME="librtc_sdk_objc.a"
|
|
|
|
|
SDK_FRAMEWORK_NAME="WebRTC.framework"
|
|
|
|
|
|
|
|
|
|
BUILD_FLAVOR="release"
|
|
|
|
|
BUILD_TYPE="framework"
|
|
|
|
|
IOS_DEPLOYMENT_TARGET="8.0"
|
|
|
|
|
LIBVPX_BUILD_VP9="false"
|
|
|
|
|
CUSTOM_GN_OPTS=""
|
|
|
|
|
WEBRTC_REVISION="0"
|
|
|
|
|
|
|
|
|
|
# Parse arguments.
|
|
|
|
|
while getopts "hb:co:r:" opt; do
|
|
|
|
|
case "${opt}" in
|
|
|
|
|
h) usage;;
|
|
|
|
|
b) BUILD_TYPE="${OPTARG}";;
|
|
|
|
|
c) PERFORM_CLEAN=1;;
|
|
|
|
|
o) SDK_OUTPUT_DIR="${OPTARG}";;
|
|
|
|
|
r) WEBRTC_REVISION="${OPTARG}";;
|
|
|
|
|
*)
|
|
|
|
|
usage
|
|
|
|
|
exit 1
|
|
|
|
|
;;
|
|
|
|
|
esac
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
if [[ ${PERFORM_CLEAN} -ne 0 ]]; then
|
|
|
|
|
clean_artifacts ${SDK_OUTPUT_DIR}
|
|
|
|
|
exit 0
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
# Build all architectures.
|
|
|
|
|
build_webrtc "arm" ${BUILD_FLAVOR} ${BUILD_TYPE} \
|
|
|
|
|
${IOS_DEPLOYMENT_TARGET} ${LIBVPX_BUILD_VP9} ${CUSTOM_GN_OPTS}
|
|
|
|
|
build_webrtc "arm64" ${BUILD_FLAVOR} ${BUILD_TYPE} \
|
|
|
|
|
${IOS_DEPLOYMENT_TARGET} ${LIBVPX_BUILD_VP9} ${CUSTOM_GN_OPTS}
|
|
|
|
|
build_webrtc "x64" ${BUILD_FLAVOR} ${BUILD_TYPE} \
|
|
|
|
|
${IOS_DEPLOYMENT_TARGET} ${LIBVPX_BUILD_VP9} ${CUSTOM_GN_OPTS}
|
|
|
|
|
|
|
|
|
|
# Ignoring x86 except for static libraries for now because of a GN build issue
|
|
|
|
|
# where the generated dynamic framework has the wrong architectures.
|
|
|
|
|
|
|
|
|
|
# Create FAT archive.
|
|
|
|
|
if [[ ${BUILD_TYPE} = "static_only" ]]; then
|
|
|
|
|
build_webrtc "x86" ${BUILD_FLAVOR} ${BUILD_TYPE} \
|
|
|
|
|
${IOS_DEPLOYMENT_TARGET} ${LIBVPX_BUILD_VP9} ${CUSTOM_GN_OPTS}
|
|
|
|
|
|
|
|
|
|
ARM_LIB_PATH=${SDK_OUTPUT_DIR}/arm_libs/${SDK_LIB_NAME}
|
|
|
|
|
ARM64_LIB_PATH=${SDK_OUTPUT_DIR}/arm64_libs/${SDK_LIB_NAME}
|
|
|
|
|
X64_LIB_PATH=${SDK_OUTPUT_DIR}/x64_libs/${SDK_LIB_NAME}
|
|
|
|
|
X86_LIB_PATH=${SDK_OUTPUT_DIR}/x86_libs/${SDK_LIB_NAME}
|
|
|
|
|
|
|
|
|
|
# Combine the slices.
|
|
|
|
|
lipo ${ARM_LIB_PATH} ${ARM64_LIB_PATH} ${X64_LIB_PATH} ${X86_LIB_PATH} \
|
|
|
|
|
-create -output ${SDK_OUTPUT_DIR}/${SDK_LIB_NAME}
|
|
|
|
|
elif [[ ${BUILD_TYPE} = "framework" ]]; then
|
|
|
|
|
ARM_LIB_PATH=${SDK_OUTPUT_DIR}/arm_libs
|
|
|
|
|
ARM64_LIB_PATH=${SDK_OUTPUT_DIR}/arm64_libs
|
|
|
|
|
X64_LIB_PATH=${SDK_OUTPUT_DIR}/x64_libs
|
|
|
|
|
X86_LIB_PATH=${SDK_OUTPUT_DIR}/x86_libs
|
|
|
|
|
|
|
|
|
|
# Combine the slices.
|
|
|
|
|
DYLIB_PATH="WebRTC.framework/WebRTC"
|
|
|
|
|
cp -R ${ARM64_LIB_PATH}/WebRTC.framework ${SDK_OUTPUT_DIR}
|
|
|
|
|
rm ${SDK_OUTPUT_DIR}/${DYLIB_PATH}
|
|
|
|
|
echo "Merging framework slices."
|
|
|
|
|
lipo ${ARM_LIB_PATH}/${DYLIB_PATH} \
|
|
|
|
|
${ARM64_LIB_PATH}/${DYLIB_PATH} \
|
|
|
|
|
${X64_LIB_PATH}/${DYLIB_PATH} \
|
|
|
|
|
-create -output ${SDK_OUTPUT_DIR}/${DYLIB_PATH}
|
|
|
|
|
|
|
|
|
|
# Remove stray mobileprovision if it exists until chromium roll lands.
|
|
|
|
|
# See https://codereview.chromium.org/2397433002.
|
|
|
|
|
PROVISION_FILE=${SDK_OUTPUT_DIR}/WebRTC.framework/embedded.mobileprovision
|
|
|
|
|
if [[ -e ${PROVISION_FILE} ]]; then
|
|
|
|
|
rm ${PROVISION_FILE}
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
# Merge the dSYM slices.
|
|
|
|
|
DSYM_PATH="WebRTC.dSYM/Contents/Resources/DWARF/WebRTC"
|
|
|
|
|
cp -R ${ARM64_LIB_PATH}/WebRTC.dSYM ${SDK_OUTPUT_DIR}
|
|
|
|
|
rm ${SDK_OUTPUT_DIR}/${DSYM_PATH}
|
|
|
|
|
echo "Merging dSYM slices."
|
|
|
|
|
lipo ${ARM_LIB_PATH}/${DSYM_PATH} \
|
|
|
|
|
${ARM64_LIB_PATH}/${DSYM_PATH} \
|
|
|
|
|
${X64_LIB_PATH}/${DSYM_PATH} \
|
|
|
|
|
-create -output ${SDK_OUTPUT_DIR}/${DSYM_PATH}
|
|
|
|
|
|
|
|
|
|
# Modify the version number.
|
|
|
|
|
# Format should be <Branch cut MXX>.<Hotfix #>.<Rev #>.
|
|
|
|
|
# e.g. 55.0.14986 means branch cut 55, no hotfixes, and revision number 14986.
|
|
|
|
|
INFOPLIST_PATH=${SDK_OUTPUT_DIR}/WebRTC.framework/Info.plist
|
|
|
|
|
MAJOR_MINOR=$(PlistBuddy -c "Print :CFBundleShortVersionString" \
|
|
|
|
|
${INFOPLIST_PATH})
|
|
|
|
|
VERSION_NUMBER="${MAJOR_MINOR}.${WEBRTC_REVISION}"
|
|
|
|
|
echo "Substituting revision number: ${VERSION_NUMBER}"
|
|
|
|
|
PlistBuddy -c "Set :CFBundleVersion ${VERSION_NUMBER}" ${INFOPLIST_PATH}
|
|
|
|
|
plutil -convert binary1 ${INFOPLIST_PATH}
|
|
|
|
|
else
|
|
|
|
|
echo "BUILD_TYPE ${BUILD_TYPE} not supported."
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
2016-10-05 13:16:03 -07:00
|
|
|
|
|
|
|
|
echo "Done."
|