1# Copyright © 2010, 2012, 2013
2#	Thorsten Glaser <tg@mirbsd.org>
3# This file is provided under the same terms as mksh.
4#-
5# Helper script to let src/Build.sh generate Makefrag.inc
6# which we in turn use in the manual creation of Android.mk
7#
8# This script is supposed to be run from/inside AOSP by the
9# porter of mksh to Android (and only manually).
10
11if test x"$1" = x"-t"; then
12	# test compilation
13	args=-r
14	mkmfmode=1
15else
16	# prepare for AOSP
17	args=-M
18	mkmfmode=0
19fi
20
21cd "$(dirname "$0")"
22srcdir=$(pwd)
23rm -rf tmp
24mkdir tmp
25cd ../..
26aospdir=$(pwd)
27cd $srcdir/tmp
28
29addvar() {
30	_vn=$1; shift
31
32	eval $_vn=\"\$$_vn '$*"'
33}
34
35CFLAGS=
36CPPFLAGS=
37LDFLAGS=
38LIBS=
39
40# The definitions below were generated by examining the
41# output of the following command:
42# make showcommands out/target/product/generic/system/bin/mksh 2>&1 | tee log
43#
44# They are only used to let Build.sh find the compiler, header
45# files, linker and libraries to generate Makefrag.inc (similar
46# to what GNU autotools’ configure scripts do), and never used
47# during the real build process. We need this to port mksh to
48# the Android platform and it is crucial these are as close as
49# possible to the values used later. (You also must example the
50# results gathered from Makefrag.inc to see they are the same
51# across all Android platforms, or add appropriate ifdefs.)
52# Since we no longer use the NDK, AOSP has to have been
53# built before using this script.
54
55CC=$ANDROID_TOOLCHAIN/*-gcc
56
57target_arch=$(cd $ANDROID_BUILD_TOP; CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core make --no-print-directory -f build/core/config.mk dumpvar-TARGET_ARCH)
58
59addvar CPPFLAGS \
60    -isystem $aospdir/bionic/libc/arch-$target_arch/include \
61    -isystem $aospdir/bionic/libc/include \
62    -isystem $aospdir/bionic/libc/kernel/uapi \
63    -isystem $aospdir/bionic/libc/kernel/uapi/asm-$target_arch \
64    -isystem $aospdir/bionic/libm/include \
65    -isystem $aospdir/bionic/libm/include/$target_arch \
66    -D_FORTIFY_SOURCE=2 \
67    -include $aospdir/build/core/combo/include/arch/linux-$target_arch/AndroidConfig.h \
68    -I$aospdir/build/core/combo/include/arch/linux-$target_arch/ \
69    -DANDROID -DNDEBUG -UDEBUG
70addvar CFLAGS \
71    -fno-exceptions \
72    -Wno-multichar \
73    -fpic \
74    -fPIE \
75    -ffunction-sections \
76    -fdata-sections \
77    -funwind-tables \
78    -fstack-protector \
79    -Wa,--noexecstack \
80    -Werror=format-security \
81    -fno-short-enums \
82    -Wno-unused-but-set-variable \
83    -fno-builtin-sin \
84    -fno-strict-volatile-bitfields \
85    -Wno-psabi \
86    -fmessage-length=0 \
87    -W \
88    -Wall \
89    -Wno-unused \
90    -Winit-self \
91    -Wpointer-arith \
92    -Werror=return-type \
93    -Werror=non-virtual-dtor \
94    -Werror=address \
95    -Werror=sequence-point \
96    -g \
97    -Wstrict-aliasing=2 \
98    -fgcse-after-reload \
99    -frerun-cse-after-loop \
100    -frename-registers \
101    -Os \
102    -fomit-frame-pointer \
103    -fno-strict-aliasing
104addvar LDFLAGS \
105    -nostdlib \
106    -Bdynamic \
107    -fPIE \
108    -pie \
109    -Wl,-dynamic-linker,/system/bin/linker \
110    -Wl,--gc-sections \
111    -Wl,-z,nocopyreloc \
112    -Wl,-z,noexecstack \
113    -Wl,-z,relro \
114    -Wl,-z,now \
115    -Wl,--warn-shared-textrel \
116    -Wl,--fatal-warnings \
117    -Wl,--no-undefined \
118    $ANDROID_PRODUCT_OUT/obj/lib/crtbegin_dynamic.o
119addvar LIBS \
120    -L$ANDROID_PRODUCT_OUT/obj/lib \
121    -Wl,-rpath-link=$ANDROID_PRODUCT_OUT/obj/lib \
122    -Wl,--no-whole-archive \
123    $ANDROID_PRODUCT_OUT/obj/STATIC_LIBRARIES/libcompiler_rt-extras_intermediates/libcompiler_rt-extras.a \
124    -lc \
125    $ANDROID_PRODUCT_OUT/obj/lib/crtend_android.o
126
127
128### Flags used by test builds
129if test $mkmfmode = 1; then
130	addvar CPPFLAGS '-DMKSHRC_PATH=\"/system/etc/mkshrc\"'
131	addvar CPPFLAGS '-DMKSH_DEFAULT_EXECSHELL=\"/system/bin/sh\"'
132	addvar CPPFLAGS '-DMKSH_DEFAULT_TMPDIR=\"/data/local\"'
133fi
134
135### Override flags
136# Let the shell free all memory upon exiting
137addvar CPPFLAGS -DDEBUG_LEAKS
138# UTF-8 works nowadays
139addvar CPPFLAGS -DMKSH_ASSUME_UTF8
140# Reduce filedescriptor usage
141addvar CPPFLAGS -DMKSH_CONSERVATIVE_FDS
142# Leave out RCS ID strings from the binary
143addvar CPPFLAGS -DMKSH_DONT_EMIT_IDSTRING
144# No getpwnam() calls (affects "cd ~username/" only)
145addvar CPPFLAGS -DMKSH_NOPWNAM
146# Leave out the ulimit builtin
147#addvar CPPFLAGS -DMKSH_NO_LIMITS
148# Compile an extra small mksh (optional)
149#addvar CPPFLAGS -DMKSH_SMALL
150
151# Set target platform
152TARGET_OS=Android
153
154# Android-x86 does not have helper functions for ProPolice SSP
155# and AOSP adds the flags by itself (same for warning flags)
156HAVE_CAN_FNOSTRICTALIASING=0
157HAVE_CAN_FSTACKPROTECTORALL=0
158HAVE_CAN_WALL=0
159export HAVE_CAN_FNOSTRICTALIASING HAVE_CAN_FSTACKPROTECTORALL HAVE_CAN_WALL
160
161# even the idea of persistent history on a phone is funny
162HAVE_PERSISTENT_HISTORY=0; export HAVE_PERSISTENT_HISTORY
163
164# ... and run it!
165export CC CPPFLAGS CFLAGS LDFLAGS LIBS TARGET_OS
166sh ../src/Build.sh $args
167rv=$?
168test x"$args" = x"-r" && exit $rv
169test x0 = x"$rv" && mv -f Makefrag.inc ../
170cd ..
171rm -rf tmp
172exit $rv
173