Created
March 22, 2018 06:43
-
-
Save Mahabali/6d60bf6739ae7c81420315895bab13cc to your computer and use it in GitHub Desktop.
webrtc build ios libs.sh
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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} \ | |
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!" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment