Merge "configure: add --extra-cxxflags option"
[platform/upstream/libvpx.git] / build / make / iosbuild.sh
1 #!/bin/sh
2 ##
3 ##  Copyright (c) 2014 The WebM project authors. All Rights Reserved.
4 ##
5 ##  Use of this source code is governed by a BSD-style license
6 ##  that can be found in the LICENSE file in the root of the source
7 ##  tree. An additional intellectual property rights grant can be found
8 ##  in the file PATENTS.  All contributing project authors may
9 ##  be found in the AUTHORS file in the root of the source tree.
10 ##
11 ##
12 ## This script generates 'VPX.framework'. An iOS app can encode and decode VPx
13 ## video by including 'VPX.framework'.
14 ##
15 ## Run iosbuild.sh to create 'VPX.framework' in the current directory.
16 ##
17 set -e
18 devnull='> /dev/null 2>&1'
19
20 BUILD_ROOT="_iosbuild"
21 CONFIGURE_ARGS="--disable-docs
22                 --disable-examples
23                 --disable-libyuv
24                 --disable-unit-tests"
25 DIST_DIR="_dist"
26 FRAMEWORK_DIR="VPX.framework"
27 HEADER_DIR="${FRAMEWORK_DIR}/Headers/vpx"
28 MAKE_JOBS=1
29 SCRIPT_DIR=$(dirname "$0")
30 LIBVPX_SOURCE_DIR=$(cd ${SCRIPT_DIR}/../..; pwd)
31 LIPO=$(xcrun -sdk iphoneos${SDK} -find lipo)
32 ORIG_PWD="$(pwd)"
33 TARGETS="arm64-darwin-gcc
34          armv7-darwin-gcc
35          armv7s-darwin-gcc
36          x86-iphonesimulator-gcc
37          x86_64-iphonesimulator-gcc"
38
39 # Configures for the target specified by $1, and invokes make with the dist
40 # target using $DIST_DIR as the distribution output directory.
41 build_target() {
42   local target="$1"
43   local old_pwd="$(pwd)"
44   local target_specific_flags=""
45
46   vlog "***Building target: ${target}***"
47
48   case "${target}" in
49     x86-*)
50       target_specific_flags="--enable-pic"
51       vlog "Enabled PIC for ${target}"
52       ;;
53   esac
54
55   mkdir "${target}"
56   cd "${target}"
57   eval "${LIBVPX_SOURCE_DIR}/configure" --target="${target}" \
58     ${CONFIGURE_ARGS} ${EXTRA_CONFIGURE_ARGS} ${target_specific_flags} \
59     ${devnull}
60   export DIST_DIR
61   eval make -j ${MAKE_JOBS} dist ${devnull}
62   cd "${old_pwd}"
63
64   vlog "***Done building target: ${target}***"
65 }
66
67 # Returns the preprocessor symbol for the target specified by $1.
68 target_to_preproc_symbol() {
69   target="$1"
70   case "${target}" in
71     arm64-*)
72       echo "__aarch64__"
73       ;;
74     armv7-*)
75       echo "__ARM_ARCH_7A__"
76       ;;
77     armv7s-*)
78       echo "__ARM_ARCH_7S__"
79       ;;
80     x86-*)
81       echo "__i386__"
82       ;;
83     x86_64-*)
84       echo "__x86_64__"
85       ;;
86     *)
87       echo "#error ${target} unknown/unsupported"
88       return 1
89       ;;
90   esac
91 }
92
93 # Create a vpx_config.h shim that, based on preprocessor settings for the
94 # current target CPU, includes the real vpx_config.h for the current target.
95 # $1 is the list of targets.
96 create_vpx_framework_config_shim() {
97   local targets="$1"
98   local config_file="${HEADER_DIR}/vpx_config.h"
99   local preproc_symbol=""
100   local target=""
101   local include_guard="VPX_FRAMEWORK_HEADERS_VPX_VPX_CONFIG_H_"
102
103   local file_header="/*
104  *  Copyright (c) $(date +%Y) The WebM project authors. All Rights Reserved.
105  *
106  *  Use of this source code is governed by a BSD-style license
107  *  that can be found in the LICENSE file in the root of the source
108  *  tree. An additional intellectual property rights grant can be found
109  *  in the file PATENTS.  All contributing project authors may
110  *  be found in the AUTHORS file in the root of the source tree.
111  */
112
113 /* GENERATED FILE: DO NOT EDIT! */
114
115 #ifndef ${include_guard}
116 #define ${include_guard}
117
118 #if defined"
119
120   printf "%s" "${file_header}" > "${config_file}"
121   for target in ${targets}; do
122     preproc_symbol=$(target_to_preproc_symbol "${target}")
123     printf " ${preproc_symbol}\n" >> "${config_file}"
124     printf "#define VPX_FRAMEWORK_TARGET \"${target}\"\n" >> "${config_file}"
125     printf "#include \"VPX/vpx/${target}/vpx_config.h\"\n" >> "${config_file}"
126     printf "#elif defined" >> "${config_file}"
127     mkdir "${HEADER_DIR}/${target}"
128     cp -p "${BUILD_ROOT}/${target}/vpx_config.h" "${HEADER_DIR}/${target}"
129   done
130
131   # Consume the last line of output from the loop: We don't want it.
132   sed -i '' -e '$d' "${config_file}"
133
134   printf "#endif\n\n" >> "${config_file}"
135   printf "#endif  // ${include_guard}" >> "${config_file}"
136 }
137
138 # Configures and builds each target specified by $1, and then builds
139 # VPX.framework.
140 build_framework() {
141   local lib_list=""
142   local targets="$1"
143   local target=""
144   local target_dist_dir=""
145
146   # Clean up from previous build(s).
147   rm -rf "${BUILD_ROOT}" "${FRAMEWORK_DIR}"
148
149   # Create output dirs.
150   mkdir -p "${BUILD_ROOT}"
151   mkdir -p "${HEADER_DIR}"
152
153   cd "${BUILD_ROOT}"
154
155   for target in ${targets}; do
156     build_target "${target}"
157     target_dist_dir="${BUILD_ROOT}/${target}/${DIST_DIR}"
158     lib_list="${lib_list} ${target_dist_dir}/lib/libvpx.a"
159   done
160
161   cd "${ORIG_PWD}"
162
163   # The basic libvpx API includes are all the same; just grab the most recent
164   # set.
165   cp -p "${target_dist_dir}"/include/vpx/* "${HEADER_DIR}"
166
167   # Build the fat library.
168   ${LIPO} -create ${lib_list} -output ${FRAMEWORK_DIR}/VPX
169
170   # Create the vpx_config.h shim that allows usage of vpx_config.h from
171   # within VPX.framework.
172   create_vpx_framework_config_shim "${targets}"
173
174   # Copy in vpx_version.h.
175   cp -p "${BUILD_ROOT}/${target}/vpx_version.h" "${HEADER_DIR}"
176
177   vlog "Created fat library ${FRAMEWORK_DIR}/VPX containing:"
178   for lib in ${lib_list}; do
179     vlog "  $(echo ${lib} | awk -F / '{print $2, $NF}')"
180   done
181
182   # TODO(tomfinegan): Verify that expected targets are included within
183   # VPX.framework/VPX via lipo -info.
184 }
185
186 # Trap function. Cleans up the subtree used to build all targets contained in
187 # $TARGETS.
188 cleanup() {
189   local readonly res=$?
190   cd "${ORIG_PWD}"
191
192   if [ $res -ne 0 ]; then
193     elog "build exited with error ($res)"
194   fi
195
196   if [ "${PRESERVE_BUILD_OUTPUT}" != "yes" ]; then
197     rm -rf "${BUILD_ROOT}"
198   fi
199 }
200
201 iosbuild_usage() {
202 cat << EOF
203   Usage: ${0##*/} [arguments]
204     --help: Display this message and exit.
205     --extra-configure-args <args>: Extra args to pass when configuring libvpx.
206     --jobs: Number of make jobs.
207     --preserve-build-output: Do not delete the build directory.
208     --show-build-output: Show output from each library build.
209     --targets <targets>: Override default target list. Defaults:
210          ${TARGETS}
211     --test-link: Confirms all targets can be linked. Functionally identical to
212                  passing --enable-examples via --extra-configure-args.
213     --verbose: Output information about the environment and each stage of the
214                build.
215 EOF
216 }
217
218 elog() {
219   echo "${0##*/} failed because: $@" 1>&2
220 }
221
222 vlog() {
223   if [ "${VERBOSE}" = "yes" ]; then
224     echo "$@"
225   fi
226 }
227
228 trap cleanup EXIT
229
230 # Parse the command line.
231 while [ -n "$1" ]; do
232   case "$1" in
233     --extra-configure-args)
234       EXTRA_CONFIGURE_ARGS="$2"
235       shift
236       ;;
237     --help)
238       iosbuild_usage
239       exit
240       ;;
241     --jobs)
242       MAKE_JOBS="$2"
243       shift
244       ;;
245     --preserve-build-output)
246       PRESERVE_BUILD_OUTPUT=yes
247       ;;
248     --show-build-output)
249       devnull=
250       ;;
251     --test-link)
252       EXTRA_CONFIGURE_ARGS="${EXTRA_CONFIGURE_ARGS} --enable-examples"
253       ;;
254     --targets)
255       TARGETS="$2"
256       shift
257       ;;
258     --verbose)
259       VERBOSE=yes
260       ;;
261     *)
262       iosbuild_usage
263       exit 1
264       ;;
265   esac
266   shift
267 done
268
269 if [ "${VERBOSE}" = "yes" ]; then
270 cat << EOF
271   BUILD_ROOT=${BUILD_ROOT}
272   DIST_DIR=${DIST_DIR}
273   CONFIGURE_ARGS=${CONFIGURE_ARGS}
274   EXTRA_CONFIGURE_ARGS=${EXTRA_CONFIGURE_ARGS}
275   FRAMEWORK_DIR=${FRAMEWORK_DIR}
276   HEADER_DIR=${HEADER_DIR}
277   MAKE_JOBS=${MAKE_JOBS}
278   PRESERVE_BUILD_OUTPUT=${PRESERVE_BUILD_OUTPUT}
279   LIBVPX_SOURCE_DIR=${LIBVPX_SOURCE_DIR}
280   LIPO=${LIPO}
281   ORIG_PWD=${ORIG_PWD}
282   TARGETS="${TARGETS}"
283 EOF
284 fi
285
286 build_framework "${TARGETS}"
287 echo "Successfully built '${FRAMEWORK_DIR}' for:"
288 echo "         ${TARGETS}"