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