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