
BUG=webrtc:5737 Review URL: https://codereview.webrtc.org/1875003004 Cr-Commit-Position: refs/heads/master@{#12391}
153 lines
4.9 KiB
Bash
Executable File
153 lines
4.9 KiB
Bash
Executable File
#!/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 dynamic FAT framework for iOS in out_ios_framework.
|
|
|
|
# Exit on errors.
|
|
set -e
|
|
|
|
# Globals.
|
|
SCRIPT_DIR=$(cd $(dirname $0) && pwd)
|
|
WEBRTC_BASE_DIR=${SCRIPT_DIR}/../../..
|
|
BUILD_WEBRTC_SCRIPT=${SCRIPT_DIR}/build_ios_libs.sh
|
|
FLATTEN_HEADERS_SCRIPT=${SCRIPT_DIR}/flatten_ios_headers.py
|
|
SDK_DIR=${SCRIPT_DIR}/SDK
|
|
FRAMEWORK_PROJECT_DIR=${SDK_DIR}/Framework
|
|
FRAMEWORK_PROJECT_PATH=${FRAMEWORK_PROJECT_DIR}/WebRTC.xcodeproj
|
|
|
|
function check_preconditions {
|
|
# Check for Darwin.
|
|
if [[ ! $(uname) = "Darwin" ]]; then
|
|
echo "OS X required." >&2
|
|
exit 1
|
|
fi
|
|
if [[ ! -x ${BUILD_WEBRTC_SCRIPT} ]]; then
|
|
echo "Failed to find iOS library build script." >&2
|
|
exit 1
|
|
fi
|
|
if [[ ! -x ${FLATTEN_HEADERS_SCRIPT} ]]; then
|
|
echo "Failed to find flatten iOS headers script." >&2
|
|
exit 1
|
|
fi
|
|
if [[ ! -x ${FRAMEWORK_PROJECT_PATH} ]]; then
|
|
echo "Failed to find framework XCode project." >&2
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
function clean_artifacts {
|
|
# Make XCode clean up after itself.
|
|
xcodebuild -project ${FRAMEWORK_PROJECT_PATH} -scheme WebRTC \
|
|
-configuration Release clean
|
|
xcodebuild -project ${FRAMEWORK_PROJECT_PATH} -scheme WebRTC \
|
|
-configuration Release clean \
|
|
-destination "platform=iOS Simulator,name=iPhone 6"
|
|
# Remove remaining directory that XCode doesn't delete.
|
|
XCODE_BUILD_DIR=${FRAMEWORK_PROJECT_DIR}/build
|
|
if [[ -d ${XCODE_BUILD_DIR} ]]; then
|
|
rm -r ${XCODE_BUILD_DIR}
|
|
fi
|
|
|
|
# Remove the temporary framework header dir.
|
|
if [[ -d ${FRAMEWORK_INCLUDE_DIR} ]]; then
|
|
rm -r ${FRAMEWORK_INCLUDE_DIR}
|
|
fi
|
|
|
|
# Remove the generated framework.
|
|
if [[ -d ${FRAMEWORK_OUTPUT_DIR} ]]; then
|
|
rm -r ${FRAMEWORK_OUTPUT_DIR}
|
|
fi
|
|
|
|
# Let the other script clean up after itself.
|
|
${BUILD_WEBRTC_SCRIPT} -c
|
|
}
|
|
|
|
function usage {
|
|
echo "WebRTC iOS Framework build script."
|
|
echo "Builds a dynamic Framework for the WebRTC APIs."
|
|
echo "Compiles various architectures and edits header paths as required."
|
|
echo "Usage: $0 [-h] [-c]"
|
|
echo " -h Print this help."
|
|
echo " -c Removes generated build output."
|
|
exit 0
|
|
}
|
|
|
|
check_preconditions
|
|
|
|
# Set the output directories for the various build artifacts.
|
|
# For convenience we'll output some generated files in the same directory
|
|
# as the one we used to output the generated statis libraries.
|
|
LIB_OUTPUT_DIR=${WEBRTC_BASE_DIR}/out_ios_libs
|
|
INCLUDE_OUTPUT_DIR=${LIB_OUTPUT_DIR}/include
|
|
FRAMEWORK_INCLUDE_DIR=${LIB_OUTPUT_DIR}/framework_include
|
|
FRAMEWORK_OUTPUT_DIR=${WEBRTC_BASE_DIR}/out_ios_framework
|
|
PERFORM_CLEAN=0
|
|
|
|
# Parse arguments.
|
|
while getopts "hc" opt; do
|
|
case "${opt}" in
|
|
h) usage;;
|
|
c) PERFORM_CLEAN=1;;
|
|
*)
|
|
usage
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if [[ ${PERFORM_CLEAN} -ne 0 ]]; then
|
|
clean_artifacts
|
|
exit 0
|
|
fi
|
|
|
|
# Build static libraries for iOS.
|
|
${BUILD_WEBRTC_SCRIPT} -o ${LIB_OUTPUT_DIR}
|
|
|
|
# Flatten the directory structure for iOS headers generated from building the
|
|
# static libraries.
|
|
${FLATTEN_HEADERS_SCRIPT} ${INCLUDE_OUTPUT_DIR} ${FRAMEWORK_INCLUDE_DIR}
|
|
|
|
# Replace full paths for headers with framework paths.
|
|
SED_PATTERN='
|
|
s/(\#import )\"webrtc\/api\/objc\/(.*)\"/\1<WebRTC\/\2>/g;
|
|
s/(\#import )\"webrtc\/base\/objc\/(.*)\"/\1<WebRTC\/\2>/g;
|
|
s/(\#include )\"webrtc\/base\/objc\/(.*)\"/\1<WebRTC\/\2>/g;
|
|
'
|
|
sed -E -i '' "$SED_PATTERN" ${FRAMEWORK_INCLUDE_DIR}/*.h
|
|
|
|
# Build the framework.
|
|
xcodebuild -project ${FRAMEWORK_PROJECT_PATH} -scheme WebRTC \
|
|
-configuration Release build \
|
|
CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO
|
|
xcodebuild -project ${FRAMEWORK_PROJECT_PATH} -scheme WebRTC \
|
|
-configuration Release build \
|
|
-destination "platform=iOS Simulator,name=iPhone 6"
|
|
|
|
# XCode should output the build artifacts to the following directories.
|
|
DEVICE_BUILD_DIR=${FRAMEWORK_PROJECT_DIR}/build/Release-iphoneos
|
|
SIMULATOR_BUILD_DIR=${FRAMEWORK_PROJECT_DIR}/build/Release-iphonesimulator
|
|
|
|
# Copy podspec, framework, dSYM and LICENSE to FRAMEWORK_OUTPUT_DIR.
|
|
mkdir -p ${FRAMEWORK_OUTPUT_DIR}
|
|
cp ${SDK_DIR}/WebRTC.podspec ${FRAMEWORK_OUTPUT_DIR}/
|
|
cp -R ${DEVICE_BUILD_DIR}/WebRTC.framework ${FRAMEWORK_OUTPUT_DIR}/
|
|
cp -R ${DEVICE_BUILD_DIR}/WebRTC.framework.dSYM ${FRAMEWORK_OUTPUT_DIR}/
|
|
cp -R ${WEBRTC_BASE_DIR}/webrtc/LICENSE ${FRAMEWORK_OUTPUT_DIR}/
|
|
|
|
# Combine multiple architectures.
|
|
DYLIB_PATH=WebRTC.framework/WebRTC
|
|
DWARF_PATH=WebRTC.framework.dSYM/Contents/Resources/DWARF/WebRTC
|
|
lipo ${FRAMEWORK_OUTPUT_DIR}/${DYLIB_PATH} \
|
|
${SIMULATOR_BUILD_DIR}/${DYLIB_PATH} \
|
|
-create -output ${FRAMEWORK_OUTPUT_DIR}/${DYLIB_PATH}
|
|
lipo ${FRAMEWORK_OUTPUT_DIR}/${DWARF_PATH} \
|
|
${SIMULATOR_BUILD_DIR}/${DWARF_PATH} \
|
|
-create -output ${FRAMEWORK_OUTPUT_DIR}/${DWARF_PATH}
|