[M69 Dev][Public][Rom Size][Build Speed] Support clang build for chromium-efl
[platform/framework/web/chromium-efl.git] / tizen_src / build / common.sh
1 #!/bin/bash
2
3 export SCRIPTDIR=$(readlink -e $(dirname $0))
4 export TOPDIR=$(readlink -f "${SCRIPTDIR}/../..")
5 export CHROME_SRC="${TOPDIR}"
6 # Please set DEFAULT_TIZEN_VERSION to 'latest' for the latest tizen version
7 # or set DEFAULT_TIZEN_VERSION to current tizen version for the others.
8 export DEFAULT_TIZEN_VERSION=latest
9
10 if [ "$(echo "$@" | grep -e "--tizen")" != "" ]; then
11   tizen_version=$(echo $@ | sed -e 's#.*--tizen_\([0-9.]*\).*#\1#')
12   if $(echo $tizen_version | grep -qe "^[-\?[0-9]\+\.\?[0-9]*$" && echo true || echo false); then
13     DEFAULT_TIZEN_VERSION=$tizen_version
14   else
15     DEFAULT_TIZEN_VERSION=latest
16   fi
17 fi
18
19 function getHostOs() {
20   echo $(uname -s | sed -e 's/Linux/linux/;s/Darwin/mac/')
21 }
22
23 function getHostArch() {
24   echo $(uname -m | sed -e \
25         's/i.86/ia32/;s/x86_64/x64/;s/amd64/x64/;s/arm.*/arm/;s/i86pc/ia32/;s/aarch64/arm64/')
26 }
27
28 function getPythonVersion() {
29   echo $(python --version  2>&1 | sed -e 's/Python \([0-9]\+\.[0-9]\+\)\.[0-9]\+/\1/')
30 }
31
32 function setIfUndef() {
33     eval original=\$$1
34     new=$2
35     if [ -n "$original" ]; then
36         echo $original
37     else
38         echo $new
39     fi
40 }
41
42
43 function hostBuldScriptUsage() {
44 cat << EOF
45 usage: $1 [OPTIONS]
46
47 Build non gbs version of chromium-efl
48
49 OPTIONS:
50    -h, --help            Show this message
51    --build-ewk-unittests Build ewk unittests
52    --ccache              Configure ccache installed in your system
53    --clang               Use chromium's clang compiler to build the sources
54    --no-content-shell    Don't build content_shell application
55    --debug               Build debug version of chromium-efl (out.${host_arch}/Debug instead of out.${host_arch}/Release)
56    -jN                   Set number of jobs, just like with make or ninja
57    --skip-ninja          Skip ninja step
58
59 examples:
60 $0 --ccache
61 $0 --skip-ninja
62 EOF
63   exit
64 }
65
66 function parseHostBuildScriptParams() {
67
68   export USE_CCACHE=0
69   export USE_CLANG=1
70   export FORCE_JHBUILD=0
71   export SKIP_NINJA=0
72   export BUILD_EWK_UNITTESTS=0
73   export BUILD_CONTENT_SHELL=1
74   export BUILD_SUBDIRECTORY=Release
75   export COMPONENT_BUILD=0
76
77   local platform="$1"
78   shift
79
80   while [[ $# > 0 ]]; do
81     case "$1" in
82       -h|--help)
83         hostBuldScriptUsage ${0}
84         ;;
85       --skip-gn)
86         export SKIP_GN=1
87         ;;
88       --ccache)
89         echo using ccache
90         export USE_CCACHE=1
91         source $TOPDIR/tizen_src/build/ccache_env.sh ${platform}
92         ;;
93       --gcc)
94         export USE_CLANG=0
95         ;;
96       --no-content-shell)
97         export BUILD_CONTENT_SHELL=0
98         ;;
99       --force-jhbuild)
100         export FORCE_JHBUILD=1
101         ;;
102       --skip-ninja)
103         export SKIP_NINJA=1
104         ;;
105       --build-ewk-unittests)
106         export BUILD_EWK_UNITTESTS=1
107         ;;
108       --debug)
109         export BUILD_SUBDIRECTORY="Debug"
110         ;;
111       --component-build)
112         export COMPONENT_BUILD=1
113         ;;
114       -j*)
115         export JOBS="$1"
116         ;;
117       *)
118         echo "Unknown argument: $1"
119         exit 1
120         ;;
121     esac
122     shift;
123   done
124 }
125
126 function hostGnChromiumEfl() {
127   if [[ $SKIP_GN != 1 ]]; then
128     local XWALK_ARG=""
129     local COMPONENT_ARG=""
130     if [[ $COMPONENT_BUILD == 1 ]]; then
131       COMPONENT_ARG="component=shared_library"
132     fi
133     ${TOPDIR}/tizen_src/build/gn_chromiumefl.sh \
134       $XWALK_ARG \
135       $COMPONENT_ARG \
136       $@
137   fi
138 }
139
140 function hostNinja() {
141   if [[ $SKIP_NINJA == 0 ]]; then
142     TARGETS="chromium-ewk efl_webprocess efl_webview_app ubrowser"
143     if [[ $BUILD_EWK_UNITTESTS == 1 ]]; then
144       TARGETS="$TARGETS ewk_unittests"
145     fi
146     if [[ $BUILD_CONTENT_SHELL == 1 ]]; then
147       TARGETS="$TARGETS content_shell dump_syms minidump_stackwalk"
148     fi
149     if [[ $BUILD_CHROMEDRIVER == 1 ]]; then
150       TARGETS="$TARGETS chromedriver"
151     fi
152     export BUILD_SUBDIRECTORY=""
153     BUILDDIR=${GN_GENERATOR_OUTPUT}/${BUILD_SUBDIRECTORY}
154     ninja -C $BUILDDIR ${JOBS} ${TARGETS}
155   fi
156 }
157
158 function error_report() {
159   echo "Error: File:$1 Line:$2"
160   exit 1
161 }
162
163 function findElementInArray() {
164   local elm
165   for elm in "${@:2}"; do
166     [[ "$elm" = "$1" ]] && return 0;
167   done
168   return 1;
169 }
170
171 function setupAndExecuteTargetBuild() {
172   local platform="$1"
173   shift
174
175   local PROFILE
176   local ARCHITECTURE
177   local CONF_FLAG
178   local -a ARGS
179
180   local count=0
181   local exclusive_options=0
182   local RPMLINT=0
183   local NOINIT=0
184   local MIRROR=0
185
186   # "|| :" means "or always succeeding built-in command"
187   PROFILE=$(echo "$@" | grep -Po "(?<=\-P\s)[^\s]*" | uniq || :)
188   ARCHITECTURE=$(echo "$@" | grep -Po "(?<=\-A\s)[^\s]*" | uniq || :)
189
190   while [[ $# > 0 ]]; do
191     count=$(( $count + 1 ))
192     case "$1" in
193     --debug)
194         ARGS[$count]=--define
195         count=$(( $count + 1 ))
196         ARGS[$count]="_debug_mode 1"
197     ;;
198     --skip-ninja)
199         ARGS[$count]=--define
200         count=$(( $count + 1 ))
201         ARGS[$count]="_skip_ninja 1"
202     ;;
203     --skip-gn)
204         ARGS[$count]=--define
205         count=$(( $count + 1 ))
206         ARGS[$count]="_skip_gn 1"
207     ;;
208     --component-build)
209         ARGS[$count]=--define
210         count=$(( $count + 1 ))
211         ARGS[$count]="component_build 1"
212     ;;
213     --gbs-debug)
214         ARGS[$count]=--debug
215     ;;
216     --rpmlint)
217         RPMLINT=1
218         count=$(( $count + 1 ))
219     ;;
220     --nodebug)
221         ARGS[$count]=--define
222         count=$(( $count + 1 ))
223         ARGS[$count]="_nodebug 1"
224     ;;
225     --noinit)
226         NOINIT=1
227         ARGS[$count]="$1"
228         count=$(( $count + 1 ))
229     ;;
230     --mirror)
231         MIRROR=1
232     ;;
233     --gcc)
234         ARGS[$count]=--define
235         count=$(( $count + 1 ))
236         ARGS[$count]="_gcc 1"
237     ;;
238     --clang)
239         ARGS[$count]=--define
240         count=$(( $count + 1 ))
241         ARGS[$count]="_clang 1"
242     ;;
243     --standard*)
244         if [ "$DEFAULT_TIZEN_VERSION" == "latest" ]; then
245           echo $1
246           PROFILE=tz_$(echo $1 | sed 's/--//g')
247         elif [ "$DEFAULT_TIZEN_VERSION" == "4.0" ]; then
248           PROFILE=tz_${DEFAULT_TIZEN_VERSION}_$(echo $1 | sed 's/--//g')_$(echo $ARCHITECTURE | grep "i586" -q && echo "ia32" || echo $ARCHITECTURE)
249         else
250           PROFILE=tz_${DEFAULT_TIZEN_VERSION}_$(echo $1 | sed 's/--//g')
251         fi
252     ;;
253     --emulator*)
254         if [ "$DEFAULT_TIZEN_VERSION" == "latest" ]; then
255           PROFILE=tz_$(echo $1 | sed 's/--//g')
256         elif [ "$DEFAULT_TIZEN_VERSION" == "4.0" ]; then
257           PROFILE=tz_${DEFAULT_TIZEN_VERSION}_$(echo $1 | sed 's/--//g')_$(echo $ARCHITECTURE | grep "i586" -q && echo "ia32" || echo $ARCHITECTURE)
258         else
259           PROFILE=tz_${DEFAULT_TIZEN_VERSION}_$(echo $1 | sed 's/--//g')
260         fi
261     ;;
262     --tizen*)
263     ;;
264     *)
265       ARGS[$count]="$1"
266     ;;
267     esac
268     shift;
269   done
270
271   if [ "$PROFILE" == "" ]; then
272     if [[ $platform == "mobile" ]]; then
273       PROFILE=tzmb_3.0_target-TM1
274     elif [[ $platform == "tv" ]]; then
275       if [ "$DEFAULT_TIZEN_VERSION" == "latest" ]; then
276         PROFILE=tztv_arm-kantm2
277       elif [ "$DEFAULT_TIZEN_VERSION" == "4.0" ]; then
278         PROFILE=tztv_4.0_arm-kantm
279       fi
280     elif [[ $platform == "da" ]]; then
281       if [ "$DEFAULT_TIZEN_VERSION" == "latest" ]; then
282         PROFILE=tzda_arm-kantm
283       else
284         PROFILE=tzda_${DEFAULT_TIZEN_VERSION}_arm-kantm
285       fi
286     else
287       echo "Cannot set default PROFILE for platform=${platform}"
288       exit 1
289     fi
290   fi
291
292   if [ "$MIRROR" == "1" ]; then
293     PROFILE=${PROFILE}_mirror
294   fi
295
296   echo "Set the profile : $PROFILE"
297
298   if [ "$ARCHITECTURE" == "" ]; then
299     if [[ $platform == "mobile" ]]; then
300       ARCHITECTURE=armv7l
301     elif [[ $platform == "mobile_emulator" ]]; then
302       ARCHITECTURE=i586
303     elif [[ $platform == "tv" ]]; then
304       ARCHITECTURE=armv7l
305     elif [[ $platform == "tv_emulator" ]]; then
306       ARCHITECTURE=i586
307     else
308       echo "Cannot set default ARCHITECTURE for platform=${platform}"
309       exit 1
310     fi
311   fi
312   echo "Set the architecture : $ARCHITECTURE"
313
314   if [ "$USE_GLOBAL_GBS_CONF" == "" ]; then
315     CONF_FLAG="--conf ${SCRIPTDIR}/gbs.conf"
316   fi
317
318   if [ "$(echo "${PROFILE}" | grep -P "kant|jazz|hawk|product")" == "" -a "$NOINIT" == 0 ]; then
319     processRpmlintOption $PROFILE $RPMLINT
320   fi
321   local BRANCH=$(echo $(basename $(git symbolic-ref HEAD)))
322   if [ "$(echo $BRANCH | grep dev)" != "" ]; then
323     BRANCH=dev
324   elif [ "$(echo $BRANCH | grep beta)" != "" ]; then
325     BRANCH=beta
326   else
327     BRANCH=release
328   fi
329   local CHROMIUM_VERSION=$(echo $(head -n 1 chrome/VERSION) | sed -e 's/MAJOR=//g')
330
331   gbs $CONF_FLAG build -P $PROFILE --include-all -A $ARCHITECTURE "${ARGS[@]}" $BUILD_CONF_OPTS --incremental \
332       -B ~/GBS-ROOT-${PROFILE^^}-${ARCHITECTURE^^}-TIZEN_${DEFAULT_TIZEN_VERSION^^}-${BRANCH^^}-M${CHROMIUM_VERSION}
333 }
334
335 function processRpmlintOption() {
336   local PROFILE=$1
337   local RPMLINT=$2
338   local URL_TARGET=
339   export BUILD_CONF_OPTS=
340
341   echo "** Process rpmlint option"
342
343   local PREVIOUS_RPMLINT="!rpmlint"
344   if [ ! -f "$PREVIOUS_BUILD_CONF_PATH" ]; then
345     # Never built before
346     PREVIOUS_RPMLINT=""
347   elif [ "$(grep -Po "\!rpmlint" "$PREVIOUS_BUILD_CONF_PATH" | uniq -d)" != "!rpmlint" ]; then
348     # Once built with rpmlint
349     PREVIOUS_RPMLINT="rpmlint"
350   fi
351
352   # Disable rpmlint
353   if [ "$RPMLINT" == 0 ]; then
354     echo "** Disable rpmlint"
355     BUILD_CONF_DIR=$SCRIPTDIR/build_conf
356     rm -rf $BUILD_CONF_DIR
357     mkdir $BUILD_CONF_DIR
358     URL_TARGET=$(echo $PROFILE | sed -e 's#.*\.[0-9]*_\([-a-zA-Z0-9]*\).*#\1#;s/tz_//g')
359     # The latest version doesn't have tizen version in snapshot repository url.
360     if [ "$(echo $DEFAULT_TIZEN_VERSION)" == "latest" ]; then
361       URL_TIZEN_VERSION=
362     else
363       URL_TIZEN_VERSION=$DEFAULT_TIZEN_VERSION-
364     fi
365     REPO=http://download.tizen.org/snapshots/tizen/$URL_TIZEN_VERSION$platform/latest/repos/$URL_TARGET/packages/repodata/
366     echo "** Repo : $REPO"
367     wget $REPO -O $BUILD_CONF_DIR/index.html > /dev/null 2>&1
368     BUILD_CONF_GZ=$(grep "build.conf.gz" $BUILD_CONF_DIR/index.html | sed -e 's#.*\=\"\(.*\)\".*#\1#')
369     BUILD_CONF=$(basename $BUILD_CONF_GZ .gz)
370     wget $REPO$BUILD_CONF_GZ -P $BUILD_CONF_DIR > /dev/null 2>&1
371     if [ ! -f "$BUILD_CONF_DIR/$BUILD_CONF_GZ" ]; then
372       echo "It's failed to donwload build.conf. Please contact system administrator."
373       exit 1
374     fi
375     gunzip $BUILD_CONF_DIR/$BUILD_CONF_GZ
376     sed -i 's/rpmlint-mini\ rpmlint-tizen/!rpmlint-mini\ !rpmlint-tizen/g' $BUILD_CONF_DIR/$BUILD_CONF
377     BUILD_CONF_OPTS="-D $BUILD_CONF_DIR/$BUILD_CONF"
378     if [ "$PREVIOUS_RPMLINT" == "rpmlint" ]; then
379       echo "** Once built with rpmlint"
380       BUILD_CONF_OPTS+=" --clean"
381     fi
382   else # Enable rpmlint
383     echo "** Enable rpmlint"
384     BUILD_CONF_OPTS=""
385     if [ "$PREVIOUS_RPMLINT" == "!rpmlint" ]; then
386       BUILD_CONF_OPTS="--clean"
387     fi
388   fi
389 }