This patch combine three patch which is related to "--gcov" flag.
[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 export LATEST_TIZEN_VERSION=8.0
7 export DEFAULT_TIZEN_VERSION=$LATEST_TIZEN_VERSION
8
9 if [ "$(echo "$@" | grep -e "--tizen")" != "" ]; then
10   tizen_version=$(echo $@ | sed -e 's#.*--tizen_\([0-9.]*\).*#\1#')
11   DEFAULT_TIZEN_VERSION=$tizen_version
12 fi
13
14 # Generate gbs.conf
15 export PUBLIC_REPO_VERSION=
16 if [ "$DEFAULT_TIZEN_VERSION" != "${LATEST_TIZEN_VERSION}" ]; then
17   PUBLIC_REPO_VERSION=-$DEFAULT_TIZEN_VERSION
18 fi
19 sed -e "s/@PUBLIC_REPO_VERSION@/$PUBLIC_REPO_VERSION/g" \
20     -e "s/@TIZEN_VERSION@/$DEFAULT_TIZEN_VERSION/g" \
21     tizen_src/build/gbs.conf.in > tizen_src/build/gbs.conf
22
23 function getSystemDeps() {
24   local host_arch=$(getHostArch)
25   local platform=$1
26   local system_deps="--system-libraries
27                      libpng
28                      libxslt
29                      zlib
30                     "
31   # Tizen profile
32   if [ "$platform" != "desktop" ]; then
33     # Emulator profile
34     if [ "$host_arch" == "x86" -o "$host_arch" == "x64" ]; then
35       system_deps+="libjpeg
36                    "
37     fi
38     # Non product tv profiles on tizen 6.0
39     if [ "$platform" != "tv" -a "$DEFAULT_TIZEN_VERSION" == "6.0" ]; then
40       system_deps+="icu
41                    "
42     fi
43   fi
44   echo $system_deps
45 }
46
47 function getHostOs() {
48   echo $(uname -s | sed -e 's/Linux/linux/;s/Darwin/mac/')
49 }
50
51 function getHostArch() {
52   echo $(uname -m | sed -e \
53         's/i.86/x86/;s/x86_64/x64/;s/amd64/x64/;s/arm.*/arm/;s/i86pc/x86/;s/aarch64/arm64/;s/riscv.*/riscv64/')
54 }
55
56 function getGccVersion() {
57   echo $(gcc -dumpversion)
58 }
59
60 function getPythonVersion() {
61   echo $(python3 --version  2>&1 | sed -e 's/Python \([0-9]\+\.[0-9]\+\)\.[0-9]\+/\1/')
62 }
63
64 function setIfUndef() {
65     eval original=\$$1
66     new=$2
67     if [ -n "$original" ]; then
68         echo $original
69     else
70         echo $new
71     fi
72 }
73
74 function hostBuldScriptUsage() {
75 cat << EOF
76 usage: $1 [OPTIONS]
77
78 Build non gbs version of chromium-efl
79
80 OPTIONS:
81    -h, --help            Show this message
82    --build-ewk-unittests Build ewk unittests
83    --enable-pepper-extensions    Enable Tizen Pepper Extensions
84    --ccache              Configure ccache installed in your system
85    --clang               Use chromium's clang compiler to build the sources
86    --debug               Build debug version of chromium-efl (out.${host_arch}/Debug instead of out.${host_arch}/Release)
87    -jN                   Set number of jobs, just like with make or ninja
88    --skip-ninja          Skip ninja step
89
90 examples:
91 $0 --ccache
92 $0 --skip-ninja
93 EOF
94   exit
95 }
96
97 function undoReplacedGn() {
98   local system_deps=$(getSystemDeps $1)
99   if [ "$system_deps" != "" ]; then
100     echo "** use system lib : undo **"
101     # Restore gn files to their original states not to mess up the tree permanently.
102     $TOPDIR/build/linux/unbundle/replace_gn_files.py --undo $system_deps icu
103   fi
104 }
105
106 function parseHostBuildScriptParams() {
107   trap 'undoReplacedGn $1' SIGINT
108   export USE_CCACHE=0
109   export USE_CLANG=1
110   export FORCE_JHBUILD=0
111   export SKIP_NINJA=0
112   export BUILD_EWK_UNITTESTS=0
113   export BUILD_CHROME=0
114   export BUILD_SUBDIRECTORY=Release
115   export COMPONENT_BUILD=0
116   export ENABLE_PEPPER_EXTENSIONS=0
117
118   local platform="$1"
119   shift
120
121   while [[ $# > 0 ]]; do
122     case "$1" in
123       -h|--help)
124         hostBuldScriptUsage ${0}
125         ;;
126       --skip-gn)
127         export SKIP_GN=1
128         ;;
129       --ccache)
130         echo using ccache
131         export USE_CCACHE=1
132         source $TOPDIR/tizen_src/build/ccache_env.sh ${platform}
133         ;;
134       --gcc)
135         export USE_CLANG=0
136         ;;
137       --build-chrome)
138         export BUILD_CHROME=1
139         ;;
140       --force-jhbuild)
141         export FORCE_JHBUILD=1
142         ;;
143       --skip-ninja)
144         export SKIP_NINJA=1
145         ;;
146       --build-ewk-unittests)
147         export BUILD_EWK_UNITTESTS=1
148         ;;
149       --debug)
150         export BUILD_SUBDIRECTORY="Debug"
151         ;;
152       --component-build)
153         export COMPONENT_BUILD=1
154         ;;
155       --enable-pepper-extensions)
156         export ENABLE_PEPPER_EXTENSIONS=1
157         ;;
158       -j*)
159         export JOBS="$1"
160         ;;
161       *)
162         echo "Unknown argument: $1"
163         exit 1
164         ;;
165     esac
166     shift;
167   done
168 }
169
170 function hostGnChromiumEfl() {
171   if [[ $SKIP_GN != 1 ]]; then
172     local XWALK_ARG=""
173     local COMPONENT_ARG=""
174     local PEPPER_EXTENSIONS_ARG=""
175     if [[ $COMPONENT_BUILD == 1 ]]; then
176       COMPONENT_ARG="component=shared_library"
177     fi
178     if [[ $ENABLE_PEPPER_EXTENSIONS == 1 ]]; then
179       PEPPER_EXTENSIONS_ARG="tizen_pepper_extensions=true"
180     fi
181     ${TOPDIR}/tizen_src/build/gn_chromiumefl.sh \
182       $XWALK_ARG \
183       $COMPONENT_ARG \
184       $PEPPER_EXTENSIONS_ARG \
185       $@
186   fi
187 }
188
189 function hostNinja() {
190   local RESULT=0
191   if [[ $SKIP_NINJA == 0 ]]; then
192     if [[ $BUILD_CHROME == 1 ]]; then
193       TARGETS="content_shell chrome"
194     else
195       TARGETS="chromium-ewk efl_webprocess efl_webview_app ubrowser"
196     fi
197     if [[ $BUILD_EWK_UNITTESTS == 1 ]]; then
198       TARGETS="$TARGETS ewk_unittests"
199     fi
200     if [[ $BUILD_CHROMEDRIVER == 1 ]]; then
201       TARGETS="$TARGETS chromedriver"
202     fi
203     export BUILD_SUBDIRECTORY=""
204     BUILDDIR=${GN_GENERATOR_OUTPUT}/${BUILD_SUBDIRECTORY}
205     ninja -C $BUILDDIR ${JOBS} ${TARGETS}
206     RESULT=$?
207   fi
208   undoReplacedGn $1
209
210   if [[ $RESULT != 0 ]]; then
211     exit $RESULT
212   fi
213 }
214
215 function error_report() {
216   echo "Error: File:$1 Line:$2"
217   exit 1
218 }
219
220 function findElementInArray() {
221   local elm
222   for elm in "${@:2}"; do
223     [[ "$elm" = "$1" ]] && return 0;
224   done
225   return 1;
226 }
227
228 function setupAndExecuteTargetBuild() {
229   local platform="$1"
230   shift
231
232   local PROFILE
233   local ARCHITECTURE
234   local CONF_FLAG
235   local -a ARGS
236
237   local exclusive_options=0
238   local RPMLINT=0
239   local NOINIT=0
240   local MIRROR=0
241   local LOCAL_BUILD=1
242   local RELEASE_BUILD=0
243   local MAKE_SQUASHFS_RPM=0
244   local BUILD_CHROME=0
245
246   # "|| :" means "or always succeeding built-in command"
247   PROFILE=$(echo "$@" | grep -Po "(?<=\-P\s)[^\s]*" | head -1 || :)
248   ARCHITECTURE=$(echo "$@" | grep -Po "(?<=\-A\s)[^\s]*" | head -1 || :)
249   GBS_ROOT=$(echo "$@" | grep -Po "(?<=\-B\s)[^\s]*" | head -1 || :)
250
251   while [[ $# > 0 ]]; do
252     case "$1" in
253     --debug)
254         ARGS+=(--define "_debug_mode 1")
255     ;;
256     --gcov)
257         LOCAL_BUILD=0
258         ARGS+=(--define "_local_build 0")
259         ARGS+=(--define "_clang 0")
260         ARGS+=(--define "_no_lto 0")
261         ARGS+=(--define "gcov 1")
262     ;;
263     --skip-ninja)
264         ARGS+=(--define "_skip_ninja 1")
265     ;;
266     --skip-gn)
267         ARGS+=(--define "_skip_gn 1")
268     ;;
269     --ttrace)
270         ARGS[$count]=--define
271         count=$(( $count + 1 ))
272         ARGS[$count]="_ttrace 1"
273     ;;
274     --component-build)
275         ARGS+=(--define "component_build 1")
276     ;;
277     --disable-wrtjs)
278         ARGS+=(--define "_disable_wrt_js 1")
279     ;;
280     --gbs-debug)
281         ARGS+=(--debug)
282     ;;
283     --icu=*)
284         ARGS+=(--define "_use_system_icu $(echo $1 | sed -e 's/--icu=//g')")
285     ;;
286     --rpmlint)
287         RPMLINT=1
288     ;;
289     --nodebug)
290         ARGS+=(--define "_nodebug 1")
291     ;;
292     --noinit)
293         NOINIT=1
294         ARGS+=("$1")
295     ;;
296     --mirror)
297         MIRROR=1
298     ;;
299     --release)
300         LOCAL_BUILD=0
301         RELEASE_BUILD=1
302     ;;
303     --squashfs)
304         MAKE_SQUASHFS_RPM=1
305     ;;
306     --gcc)
307         LOCAL_BUILD=0
308         ARGS+=(--define "_clang 0")
309     ;;
310     --clang)
311         LOCAL_BUILD=0
312         ARGS+=(--define "_clang 1")
313     ;;
314     --standard*)
315         PROFILE=tz_$(echo $1 | sed 's/--//g')
316     ;;
317     --emulator*)
318         PROFILE=tz_$(echo $1 | sed 's/--//g')
319     ;;
320     --tizen*)
321     ;;
322     --build-chrome)
323         BUILD_CHROME=1
324         ARGS+=(--define "_build_chrome 1")
325     ;;
326     *)
327       ARGS+=("$1")
328     ;;
329     esac
330     shift;
331   done
332
333   ARGS+=(--define "_make_squashfs_rpm $MAKE_SQUASHFS_RPM")
334
335   if [ "$LOCAL_BUILD" == "1" ]; then
336     ARGS+=(--define "_local_build 1")
337     local _jobs=$((`/usr/bin/getconf _NPROCESSORS_ONLN` / 2 - `ps -ef | grep " ninja " | wc -l` -1))
338     local _smp_mflags=-j$(if ((${_jobs} > 10)); then echo ${_jobs}; else echo 10; fi)
339     ARGS+=(--define "_costomized_smp_mflags $_smp_mflags")
340     # Default values
341     ARGS+=(--define "_clang 1")
342   fi
343
344   if [ "$RELEASE_BUILD" == "1" ]; then
345     ARGS+=(--define "_local_build 0")
346     if [[ $platform == "tv" ]]; then
347       ARGS+=(--define "_clang 1")
348     else
349       ARGS+=(--define "_clang 0")
350       ARGS+=(--define "_no_lto 0")
351     fi
352   fi
353
354   if [ "$PROFILE" == "" ]; then
355     if [[ $platform == "tv" ]]; then
356       PROFILE=tztv_${DEFAULT_TIZEN_VERSION}_arm-pontusm
357     elif [[ $platform == "da" ]]; then
358       PROFILE=tzda_${DEFAULT_TIZEN_VERSION}_arm-kantm
359     elif [[ $platform == "riscv" ]]; then
360       PROFILE=tz_${DEFAULT_TIZEN_VERSION}_riscv
361     elif [[ $platform == "wearable" ]]; then
362       PROFILE=tzwr_5.5_arm-spin
363     elif [[ $platform == "Base-X" ]]; then
364       PROFILE=tz_X
365     else
366       echo "Cannot set default PROFILE for platform=${platform}"
367       exit 1
368     fi
369   fi
370
371   if [ "$MIRROR" == "1" ]; then
372     PROFILE=${PROFILE}_mirror
373   fi
374
375   echo "Set the profile : $PROFILE"
376
377   if [ "$ARCHITECTURE" == "" ]; then
378     ARCHITECTURE=armv7l
379   fi
380   echo "Set the architecture : $ARCHITECTURE"
381
382   if [ "$(echo "${PROFILE}" | grep -P "tz_standard")" != "" -a "$NOINIT" == 0 ]; then
383     processRpmlintOption $PROFILE $RPMLINT
384   fi
385   local BRANCH=$(echo $(basename $(git symbolic-ref HEAD)))
386   if [ "$(echo $BRANCH | grep dev)" != "" ]; then
387     BRANCH=dev
388   elif [ "$(echo $BRANCH | grep beta)" != "" ]; then
389     BRANCH=beta
390   else
391     BRANCH=release
392   fi
393   local CHROMIUM_VERSION=$(echo $(head -n 1 chrome/VERSION) | sed -e 's/MAJOR=//g')
394
395   local GBS_ROOT_OPT=
396   if [ "$USE_GLOBAL_GBS_CONF" == "" ]; then
397     CONF_FLAG="--conf ${SCRIPTDIR}/gbs.conf"
398     if [ "$GBS_ROOT" == "" ]; then
399       if [ "$BUILD_CHROME" == "1" ]; then
400         GBS_ROOT_OPT="-B ~/GBS-ROOT-M${CHROMIUM_VERSION}-${PROFILE^^}-TIZEN_${DEFAULT_TIZEN_VERSION^^}-CHROME-${BRANCH^^}"
401       else
402         GBS_ROOT_OPT="-B ~/GBS-ROOT-M${CHROMIUM_VERSION}-${PROFILE^^}-TIZEN_${DEFAULT_TIZEN_VERSION^^}-${BRANCH^^}"
403       fi
404     else
405       GBS_ROOT_OPT="-B $GBS_ROOT"
406     fi
407   fi
408
409   processICU initialize_icu
410   gbs $CONF_FLAG build -P $PROFILE --include-all -A $ARCHITECTURE "${ARGS[@]}" $BUILD_CONF_OPTS --incremental $GBS_ROOT_OPT
411   local RESULT=$?
412
413   undoReplacedGn $platform
414   processICU restore_icu
415
416   if [[ $RESULT != 0 ]]; then
417     exit $RESULT
418   fi
419 }
420
421 function processICU() {
422   local ICU_PATH="$TOPDIR/third_party/icu/source"
423   local ICU_REPLACE_PATH="$TOPDIR/third_party/icu/source_replace"
424
425   if [ "$1" == "replace_icu" ]; then
426     if [ ! -e $ICU_REPLACE_PATH ] && [ -e $ICU_PATH ]; then
427       echo "** third_party/icu/source is replaced to use system icu."
428       mv $ICU_PATH $ICU_REPLACE_PATH
429     fi
430   elif [ "$1" == "restore_icu" ]; then
431     if [ -e $ICU_REPLACE_PATH ] && [ ! -e $ICU_PATH ]; then
432       echo "** third_party/icu/source is restored."
433       mv $ICU_REPLACE_PATH $ICU_PATH
434     fi
435   elif [ "$1" == "initialize_icu" ]; then
436     if [ -e $ICU_REPLACE_PATH ]; then
437       echo "** third_party/icu/source is initialized."
438       rm -rf $ICU_PATH
439       mv $ICU_REPLACE_PATH $ICU_PATH
440     fi
441   fi
442 }
443
444 function processRpmlintOption() {
445   local PROFILE=$1
446   local RPMLINT=$2
447   local URL_TARGET=
448   export BUILD_CONF_OPTS=
449
450   echo "** Process rpmlint option"
451
452   local PREVIOUS_RPMLINT="!rpmlint"
453   if [ ! -f "$PREVIOUS_BUILD_CONF_PATH" ]; then
454     # Never built before
455     PREVIOUS_RPMLINT=""
456   elif [ "$(grep -Po "\!rpmlint" "$PREVIOUS_BUILD_CONF_PATH" | uniq -d)" != "!rpmlint" ]; then
457     # Once built with rpmlint
458     PREVIOUS_RPMLINT="rpmlint"
459   fi
460
461   # Disable rpmlint
462   if [ "$RPMLINT" == 0 ]; then
463     echo "** Disable rpmlint"
464     BUILD_CONF_DIR=$SCRIPTDIR/build_conf
465     rm -rf $BUILD_CONF_DIR
466     mkdir $BUILD_CONF_DIR
467     URL_TARGET=$(echo $PROFILE | sed -e 's#.*\.[0-9]*_\([-a-zA-Z0-9]*\).*#\1#;s/tz_//g')
468     # The latest version doesn't have tizen version in snapshot repository url.
469     if [ "$DEFAULT_TIZEN_VERSION" == "${LATEST_TIZEN_VERSION}" ]; then
470       URL_TIZEN_VERSION=
471     else
472       URL_TIZEN_VERSION=-$DEFAULT_TIZEN_VERSION
473     fi
474     REPO=http://download.tizen.org/snapshots/TIZEN/Tizen$URL_TIZEN_VERSION/Tizen$URL_TIZEN_VERSION-$platform/latest/repos/$URL_TARGET/packages/repodata/
475     echo "** Repo : $REPO"
476     wget $REPO -O $BUILD_CONF_DIR/index.html > /dev/null 2>&1
477     BUILD_CONF_GZ=$(grep "build.conf.gz" $BUILD_CONF_DIR/index.html | sed -e 's#.*\=\"\(.*\)\".*#\1#')
478     BUILD_CONF=$(basename $BUILD_CONF_GZ .gz)
479     wget $REPO$BUILD_CONF_GZ -P $BUILD_CONF_DIR > /dev/null 2>&1
480     if [ ! -f "$BUILD_CONF_DIR/$BUILD_CONF_GZ" ]; then
481       echo "It's failed to donwload build.conf. Please contact system administrator."
482       exit 1
483     fi
484     gunzip $BUILD_CONF_DIR/$BUILD_CONF_GZ
485     sed -i 's/rpmlint-mini\ rpmlint-tizen/!rpmlint-mini\ !rpmlint-tizen/g' $BUILD_CONF_DIR/$BUILD_CONF
486     if [ "$DEFAULT_TIZEN_VERSION" == "6.0" ]; then
487       sed -i 's/tizen_version_major 5/tizen_version_major 6/g' $BUILD_CONF_DIR/$BUILD_CONF
488       sed -i 's/tizen_version_minor 5/tizen_version_minor 0/g' $BUILD_CONF_DIR/$BUILD_CONF
489     fi
490     BUILD_CONF_OPTS="-D $BUILD_CONF_DIR/$BUILD_CONF"
491     if [ "$PREVIOUS_RPMLINT" == "rpmlint" ]; then
492       echo "** Once built with rpmlint"
493       BUILD_CONF_OPTS+=" --clean"
494     fi
495   else # Enable rpmlint
496     echo "** Enable rpmlint"
497     BUILD_CONF_OPTS=""
498     if [ "$PREVIOUS_RPMLINT" == "!rpmlint" ]; then
499       BUILD_CONF_OPTS="--clean"
500     fi
501   fi
502 }