45054d56f6dae990a07624f8c81b2d09cc6bf974
[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     --skip-ninja)
257         ARGS+=(--define "_skip_ninja 1")
258     ;;
259     --skip-gn)
260         ARGS+=(--define "_skip_gn 1")
261     ;;
262     --ttrace)
263         ARGS[$count]=--define
264         count=$(( $count + 1 ))
265         ARGS[$count]="_ttrace 1"
266     ;;
267     --component-build)
268         ARGS+=(--define "component_build 1")
269     ;;
270     --disable-wrtjs)
271         ARGS+=(--define "_disable_wrt_js 1")
272     ;;
273     --gbs-debug)
274         ARGS+=(--debug)
275     ;;
276     --icu=*)
277         ARGS+=(--define "_use_system_icu $(echo $1 | sed -e 's/--icu=//g')")
278     ;;
279     --rpmlint)
280         RPMLINT=1
281     ;;
282     --nodebug)
283         ARGS+=(--define "_nodebug 1")
284     ;;
285     --noinit)
286         NOINIT=1
287         ARGS+=("$1")
288     ;;
289     --mirror)
290         MIRROR=1
291     ;;
292     --release)
293         LOCAL_BUILD=0
294         RELEASE_BUILD=1
295     ;;
296     --squashfs)
297         MAKE_SQUASHFS_RPM=1
298     ;;
299     --gcc)
300         LOCAL_BUILD=0
301         ARGS+=(--define "_clang 0")
302     ;;
303     --clang)
304         LOCAL_BUILD=0
305         ARGS+=(--define "_clang 1")
306     ;;
307     --standard*)
308         PROFILE=tz_$(echo $1 | sed 's/--//g')
309     ;;
310     --emulator*)
311         PROFILE=tz_$(echo $1 | sed 's/--//g')
312     ;;
313     --tizen*)
314     ;;
315     --build-chrome)
316         BUILD_CHROME=1
317         ARGS+=(--define "_build_chrome 1")
318     ;;
319     *)
320       ARGS+=("$1")
321     ;;
322     esac
323     shift;
324   done
325
326   ARGS+=(--define "_make_squashfs_rpm $MAKE_SQUASHFS_RPM")
327
328   if [ "$LOCAL_BUILD" == "1" ]; then
329     ARGS+=(--define "_local_build 1")
330     local _jobs=$((`/usr/bin/getconf _NPROCESSORS_ONLN` / 2 - `ps -ef | grep " ninja " | wc -l` -1))
331     local _smp_mflags=-j$(if ((${_jobs} > 10)); then echo ${_jobs}; else echo 10; fi)
332     ARGS+=(--define "_costomized_smp_mflags $_smp_mflags")
333     # Default values
334     ARGS+=(--define "_clang 1")
335   fi
336
337   if [ "$RELEASE_BUILD" == "1" ]; then
338     ARGS+=(--define "_local_build 0")
339     if [[ $platform == "tv" ]]; then
340       ARGS+=(--define "_clang 1")
341     else
342       ARGS+=(--define "_clang 0")
343       ARGS+=(--define "_no_lto 0")
344     fi
345   fi
346
347   if [ "$PROFILE" == "" ]; then
348     if [[ $platform == "tv" ]]; then
349       PROFILE=tztv_${DEFAULT_TIZEN_VERSION}_arm-pontusm
350     elif [[ $platform == "da" ]]; then
351       PROFILE=tzda_${DEFAULT_TIZEN_VERSION}_arm-kantm
352     elif [[ $platform == "riscv" ]]; then
353       PROFILE=tz_${DEFAULT_TIZEN_VERSION}_riscv
354     elif [[ $platform == "wearable" ]]; then
355       PROFILE=tzwr_5.5_arm-spin
356     elif [[ $platform == "Base-X" ]]; then
357       PROFILE=tz_X
358     else
359       echo "Cannot set default PROFILE for platform=${platform}"
360       exit 1
361     fi
362   fi
363
364   if [ "$MIRROR" == "1" ]; then
365     PROFILE=${PROFILE}_mirror
366   fi
367
368   echo "Set the profile : $PROFILE"
369
370   if [ "$ARCHITECTURE" == "" ]; then
371     ARCHITECTURE=armv7l
372   fi
373   echo "Set the architecture : $ARCHITECTURE"
374
375   if [ "$(echo "${PROFILE}" | grep -P "tz_standard")" != "" -a "$NOINIT" == 0 ]; then
376     processRpmlintOption $PROFILE $RPMLINT
377   fi
378   local BRANCH=$(echo $(basename $(git symbolic-ref HEAD)))
379   if [ "$(echo $BRANCH | grep dev)" != "" ]; then
380     BRANCH=dev
381   elif [ "$(echo $BRANCH | grep beta)" != "" ]; then
382     BRANCH=beta
383   else
384     BRANCH=release
385   fi
386   local CHROMIUM_VERSION=$(echo $(head -n 1 chrome/VERSION) | sed -e 's/MAJOR=//g')
387
388   local GBS_ROOT_OPT=
389   if [ "$USE_GLOBAL_GBS_CONF" == "" ]; then
390     CONF_FLAG="--conf ${SCRIPTDIR}/gbs.conf"
391     if [ "$GBS_ROOT" == "" ]; then
392       if [ "$BUILD_CHROME" == "1" ]; then
393         GBS_ROOT_OPT="-B ~/GBS-ROOT-M${CHROMIUM_VERSION}-${PROFILE^^}-TIZEN_${DEFAULT_TIZEN_VERSION^^}-CHROME-${BRANCH^^}"
394       else
395         GBS_ROOT_OPT="-B ~/GBS-ROOT-M${CHROMIUM_VERSION}-${PROFILE^^}-TIZEN_${DEFAULT_TIZEN_VERSION^^}-${BRANCH^^}"
396       fi
397     else
398       GBS_ROOT_OPT="-B $GBS_ROOT"
399     fi
400   fi
401
402   processICU initialize_icu
403   gbs $CONF_FLAG build -P $PROFILE --include-all -A $ARCHITECTURE "${ARGS[@]}" $BUILD_CONF_OPTS --incremental $GBS_ROOT_OPT
404   local RESULT=$?
405
406   undoReplacedGn $platform
407   processICU restore_icu
408
409   if [[ $RESULT != 0 ]]; then
410     exit $RESULT
411   fi
412 }
413
414 function processICU() {
415   local ICU_PATH="$TOPDIR/third_party/icu/source"
416   local ICU_REPLACE_PATH="$TOPDIR/third_party/icu/source_replace"
417
418   if [ "$1" == "replace_icu" ]; then
419     if [ ! -e $ICU_REPLACE_PATH ] && [ -e $ICU_PATH ]; then
420       echo "** third_party/icu/source is replaced to use system icu."
421       mv $ICU_PATH $ICU_REPLACE_PATH
422     fi
423   elif [ "$1" == "restore_icu" ]; then
424     if [ -e $ICU_REPLACE_PATH ] && [ ! -e $ICU_PATH ]; then
425       echo "** third_party/icu/source is restored."
426       mv $ICU_REPLACE_PATH $ICU_PATH
427     fi
428   elif [ "$1" == "initialize_icu" ]; then
429     if [ -e $ICU_REPLACE_PATH ]; then
430       echo "** third_party/icu/source is initialized."
431       rm -rf $ICU_PATH
432       mv $ICU_REPLACE_PATH $ICU_PATH
433     fi
434   fi
435 }
436
437 function processRpmlintOption() {
438   local PROFILE=$1
439   local RPMLINT=$2
440   local URL_TARGET=
441   export BUILD_CONF_OPTS=
442
443   echo "** Process rpmlint option"
444
445   local PREVIOUS_RPMLINT="!rpmlint"
446   if [ ! -f "$PREVIOUS_BUILD_CONF_PATH" ]; then
447     # Never built before
448     PREVIOUS_RPMLINT=""
449   elif [ "$(grep -Po "\!rpmlint" "$PREVIOUS_BUILD_CONF_PATH" | uniq -d)" != "!rpmlint" ]; then
450     # Once built with rpmlint
451     PREVIOUS_RPMLINT="rpmlint"
452   fi
453
454   # Disable rpmlint
455   if [ "$RPMLINT" == 0 ]; then
456     echo "** Disable rpmlint"
457     BUILD_CONF_DIR=$SCRIPTDIR/build_conf
458     rm -rf $BUILD_CONF_DIR
459     mkdir $BUILD_CONF_DIR
460     URL_TARGET=$(echo $PROFILE | sed -e 's#.*\.[0-9]*_\([-a-zA-Z0-9]*\).*#\1#;s/tz_//g')
461     # The latest version doesn't have tizen version in snapshot repository url.
462     if [ "$DEFAULT_TIZEN_VERSION" == "${LATEST_TIZEN_VERSION}" ]; then
463       URL_TIZEN_VERSION=
464     else
465       URL_TIZEN_VERSION=-$DEFAULT_TIZEN_VERSION
466     fi
467     REPO=http://download.tizen.org/snapshots/TIZEN/Tizen$URL_TIZEN_VERSION/Tizen$URL_TIZEN_VERSION-$platform/latest/repos/$URL_TARGET/packages/repodata/
468     echo "** Repo : $REPO"
469     wget $REPO -O $BUILD_CONF_DIR/index.html > /dev/null 2>&1
470     BUILD_CONF_GZ=$(grep "build.conf.gz" $BUILD_CONF_DIR/index.html | sed -e 's#.*\=\"\(.*\)\".*#\1#')
471     BUILD_CONF=$(basename $BUILD_CONF_GZ .gz)
472     wget $REPO$BUILD_CONF_GZ -P $BUILD_CONF_DIR > /dev/null 2>&1
473     if [ ! -f "$BUILD_CONF_DIR/$BUILD_CONF_GZ" ]; then
474       echo "It's failed to donwload build.conf. Please contact system administrator."
475       exit 1
476     fi
477     gunzip $BUILD_CONF_DIR/$BUILD_CONF_GZ
478     sed -i 's/rpmlint-mini\ rpmlint-tizen/!rpmlint-mini\ !rpmlint-tizen/g' $BUILD_CONF_DIR/$BUILD_CONF
479     if [ "$DEFAULT_TIZEN_VERSION" == "6.0" ]; then
480       sed -i 's/tizen_version_major 5/tizen_version_major 6/g' $BUILD_CONF_DIR/$BUILD_CONF
481       sed -i 's/tizen_version_minor 5/tizen_version_minor 0/g' $BUILD_CONF_DIR/$BUILD_CONF
482     fi
483     BUILD_CONF_OPTS="-D $BUILD_CONF_DIR/$BUILD_CONF"
484     if [ "$PREVIOUS_RPMLINT" == "rpmlint" ]; then
485       echo "** Once built with rpmlint"
486       BUILD_CONF_OPTS+=" --clean"
487     fi
488   else # Enable rpmlint
489     echo "** Enable rpmlint"
490     BUILD_CONF_OPTS=""
491     if [ "$PREVIOUS_RPMLINT" == "!rpmlint" ]; then
492       BUILD_CONF_OPTS="--clean"
493     fi
494   fi
495 }