Index: webrtc/build/ios/build_ios_libs.sh |
diff --git a/webrtc/build/ios/build_ios_libs.sh b/webrtc/build/ios/build_ios_libs.sh |
index 56175520fc8cf917eafad69da35d4cce58c3eaf5..ef64ab0c95b42c72f18afbcc6adba4e59ef819f3 100755 |
--- a/webrtc/build/ios/build_ios_libs.sh |
+++ b/webrtc/build/ios/build_ios_libs.sh |
@@ -8,7 +8,7 @@ |
# 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. |
+# Generates static or dynamic FAT libraries for ios in out_ios_libs. |
# Exit on errors. |
set -e |
@@ -17,7 +17,6 @@ set -e |
SCRIPT_DIR=$(cd $(dirname $0) && pwd) |
WEBRTC_BASE_DIR=${SCRIPT_DIR}/../../.. |
GYP_WEBRTC_SCRIPT=${WEBRTC_BASE_DIR}/webrtc/build/gyp_webrtc.py |
-EXPORT_HEADERS_SCRIPT=${SCRIPT_DIR}/export_headers.py |
MERGE_SCRIPT=${SCRIPT_DIR}/merge_ios_libs.py |
function check_preconditions { |
@@ -39,12 +38,6 @@ function check_preconditions { |
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 |
@@ -56,6 +49,8 @@ function build_webrtc { |
local base_output_dir=$1 |
local flavor=$2 |
local target_arch=$3 |
+ local build_type=$4 |
+ |
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 |
@@ -63,23 +58,54 @@ function build_webrtc { |
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 legacy." |
+ gyp_file=webrtc/build/ios/merge_ios_libs.gyp |
+ gyp_target=libjingle_peerconnection_objc_no_op |
+ override_visibility=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_override_visibility=1" |
+clang_xcode=1 ios_deployment_target=8.0 \ |
+ios_override_visibility=${override_visibility}" |
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} |
- ${GYP_WEBRTC_SCRIPT} webrtc/build/ios/merge_ios_libs.gyp |
+ webrtc/build/gyp_webrtc.py ${gyp_file} |
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 |
+ # 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 |
- mkdir -p ${library_output_dir} |
- for f in ${ninja_output_dir}/${flavor}/*.a |
+ # 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 |
@@ -97,11 +123,14 @@ function usage { |
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 "Usage: $0 [-h] [-b build_type] [-c] [-o output_dir]" |
echo " -h Print this help." |
+ echo " -b The build type. Can be framework, static_only or legacy." |
+ 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 |
} |
@@ -110,16 +139,21 @@ 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 |
+# The type of build to perform. Valid arguments are framework, static_only and |
+# legacy. |
+BUILD_TYPE="framework" |
PERFORM_CLEAN=0 |
+FLAVOR="Profile" |
+POINT_VERSION="0" |
# Parse arguments. |
-while getopts "hco:" opt; do |
+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 |
@@ -133,15 +167,99 @@ if [[ ${PERFORM_CLEAN} -ne 0 ]]; then |
fi |
# Build all the common architectures. |
-archs=( "arm" "arm64" "ia32" "x64" ) |
-for arch in "${archs[@]}" |
+ARCHS=( "arm" "arm64" "ia32" "x64" ) |
+for ARCH in "${ARCHS[@]}" |
do |
- echo "Building WebRTC arch: ${arch}" |
- build_webrtc ${OUTPUT_DIR} "Profile" $arch |
+ echo "Building WebRTC arch: ${ARCH}" |
+ build_webrtc ${OUTPUT_DIR} ${FLAVOR} $ARCH ${BUILD_TYPE} |
done |
-# Export header files. |
-${EXPORT_HEADERS_SCRIPT} ${OUTPUT_DIR} ${USE_LEGACY_API} |
+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/Resources/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 |
+else |
+ 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" |
+ if [[ ${BUILD_TYPE} = "legacy" ]]; then |
+ TARGET_NAME="libjingle_peerconnection_objc_no_op" |
+ fi |
+ 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 |
+ if [[ ${BUILD_TYPE} = "legacy" ]]; then |
+ INPUT_HEADER_DIR="${WEBRTC_BASE_DIR}/talk/app/webrtc/objc/public" |
+ ln -sf ${INPUT_HEADER_DIR} ${OUTPUT_HEADER_DIR} |
+ else |
+ mkdir -p ${OUTPUT_HEADER_DIR} |
+ ln -sf ${INPUT_HEADER_DIR} ${OUTPUT_HEADER_DIR}/WebRTC |
+ fi |
+fi |
-# Merge the libraries together. |
-${MERGE_SCRIPT} ${OUTPUT_DIR} |
+echo "Done!" |