#!/bin/sh # __________ __ ___. # Open \______ \ ____ ____ | | _\_ |__ _______ ___ # Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / # Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < # Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ # \/ \/ \/ \/ \/ # # global CC options for all platforms CCOPTS="-W -Wall -Wundef -O -nostdlib -ffreestanding -Wstrict-prototypes -pipe -std=gnu99" # LD options for the core LDOPTS="" # LD options for the core + plugins GLOBAL_LDOPTS="" extradefines="" use_logf="#undef ROCKBOX_HAS_LOGF" use_bootchart="#undef DO_BOOTCHART" use_logf_serial="#undef LOGF_SERIAL" scriptver=`echo '$Revision$' | sed -e 's:\\$::g' -e 's/Revision: //'` rbdir="/.rockbox" bindir= libdir= sharedir= thread_support="ASSEMBLER_THREADS" app_lcd_width= app_lcd_height= app_lcd_orientation= # Properly retain command line arguments containing spaces cmdline= for arg in "$@"; do case "$arg" in *\ *) cmdline="$cmdline \"$arg\"";; *) cmdline="$cmdline $arg";; esac done # # Begin Function Definitions # input() { read response echo $response } prefixtools () { prefix="$1" if [ -n "$ARG_COMPILER_PREFIX" ]; then echo "WARNING: asked to override target toolchain $1 with $ARG_COMPILER_PREFIX" echo "WARNING: overriding the toolchain means you are running an untested configuration" echo "WARNING: you build might be broken because of that" prefix="$ARG_COMPILER_PREFIX" fi CC=${prefix}gcc CPP=${prefix}cpp WINDRES=${prefix}windres DLLTOOL=${prefix}dlltool DLLWRAP=${prefix}dllwrap RANLIB=${prefix}ranlib LD=${prefix}ld AR=${prefix}ar AS=${prefix}as OC=${prefix}objcopy } app_set_paths () { # setup files and paths depending on the platform if [ -z "$ARG_PREFIX" ]; then sharedir="/usr/local/share/rockbox" bindir="/usr/local/bin" libdir="/usr/local/lib" else if [ -d "$ARG_PREFIX" ]; then if [ -z `echo $ARG_PREFIX | grep "^/"` ]; then ARG_PREFIX=`realpath $ARG_PREFIX` if [ "0" != "$?" ]; then echo "ERROR: Could not get prefix path (is realpath installed?)." exit fi fi sharedir="$ARG_PREFIX/share/rockbox" bindir="$ARG_PREFIX/bin" libdir="$ARG_PREFIX/lib" else echo "ERROR: PREFIX directory $ARG_PREFIX does not exist" exit fi fi } # Set the application LCD size according to the following priorities: # 1) If --lcdwidth and --lcdheight are set, use them # 2) If a size is passed to the app_set_lcd_size() function, use that # 3) Otherwise ask the user app_set_lcd_size () { if [ -z "$ARG_LCDWIDTH" ]; then ARG_LCDWIDTH=$1 fi if [ -z "$ARG_LCDHEIGHT" ]; then ARG_LCDHEIGHT=$2 fi echo "Enter the LCD width (default: 320)" if [ -z "$ARG_LCDWIDTH" ]; then app_lcd_width=`input` else app_lcd_width="$ARG_LCDWIDTH" fi if [ -z "$app_lcd_width" ]; then app_lcd_width="320"; fi echo "Enter the LCD height (default: 480)" if [ -z "$ARG_LCDHEIGHT" ]; then app_lcd_height=`input` else app_lcd_height="$ARG_LCDHEIGHT" fi if [ -z "$app_lcd_height" ]; then app_lcd_height="480"; fi if [ $app_lcd_width -gt $app_lcd_height ]; then lcd_orientation="landscape" else lcd_orientation="portrait" fi echo "Selected $app_lcd_width x $app_lcd_height resolution ($lcd_orientation)" ARG_LCDWIDTH=$app_lcd_width ARG_LCDHEIGHT=$app_lcd_height app_lcd_width="#define LCD_WIDTH $app_lcd_width" app_lcd_height="#define LCD_HEIGHT $app_lcd_height" } findarmgcc() { prefixtools arm-elf-eabi- gccchoice="4.4.4" } # scan the $PATH for the given command findtool(){ file="$1" IFS=":" for path in $PATH do # echo "checks for $file in $path" >&2 if test -f "$path/$file"; then echo "$path/$file" return fi done # check whether caller wants literal return value if not found if [ "$2" = "--lit" ]; then echo "$file" fi } # scan the $PATH for sdl-config - check whether for a (cross-)win32 # sdl as requested findsdl(){ files=sdl-config if [ -n "$CROSS_COMPILE" ]; then # sdl-config might (not) be prefixed for cross compiles so try both. files="${CROSS_COMPILE}sdl-config:${files}" fi winbuild="$1" paths2check="$PATH" if [ -n "$CROSS_COMPILE" ]; then # add cross compile sys-root-directories to search in: sysroot=$($CPP --print-sysroot 2>&1) if [ $? -eq 0 ]; then subdirs="bin:mingw/bin:sbin:mingw/sbin" IFS=":" for subdir in $subdirs do if [ -e "${sysroot}/${subdir}" ]; then paths2check="${sysroot}/${subdir}:${paths2check}" fi done else echo "WARNING: unable to get sys-root directory from your cross-compiler" >&2 echo "WARNING: $CPP --print-sysroot returns" >&2 echo "WARNING: ${sysroot}" >&2 fi fi # search for the correct sdl-config IFS=":" for path in $paths2check do for file in $files do if test -f "$path/$file"; then if [ "0" != `$path/$file --libs |grep -c mwindows` ]; then if [ "yes" = "${winbuild}" ]; then echo "$path/$file" return fi else if [ "yes" != "${winbuild}" ]; then echo "$path/$file" return fi fi fi done done } # check for availability of sigaltstack to support our thread engine check_sigaltstack() { cat >$tmpdir/check_threads.c < int main(int argc, char **argv) { #ifndef NULL #define NULL (void*)0 #endif sigaltstack(NULL, NULL); return 0; } EOF $CC -o $tmpdir/check_threads $tmpdir/check_threads.c 1> /dev/null result=$? rm -rf $tmpdir/check_threads* echo $result } # check for availability of Fiber on Win32 to support our thread engine check_fiber() { cat >$tmpdir/check_threads.c < int main(int argc, char **argv) { ConvertThreadToFiber(NULL); return 0; } EOF $CC -o $tmpdir/check_threads $tmpdir/check_threads.c 2>/dev/null result=$? rm -rf $tmpdir/check_threads* echo $result } simcc () { # default tool setup for native building prefixtools "$CROSS_COMPILE" ARG_ARM_THUMB=0 # can't use thumb in native builds # unset arch if already set shcc() and friends arch= arch_version= app_type=$1 winbuild="" GCCOPTS=`echo $CCOPTS | sed -e s/-ffreestanding// -e s/-nostdlib// -e s/-Wundef//` GCCOPTS="$GCCOPTS -fno-builtin -g" # Some linux setups like to warn about unused results. They are correct, # but cleaning this up is a lot of work. GCCOPTS="$GCCOPTS -Wno-unused-result" GCCOPTIMIZE='' LDOPTS="$LDOPTS -lm" # button-sdl.c uses sqrt() sigaltstack="" fibers="" endian="" # endianess of the dap doesnt matter here # default output binary name, don't override app_get_platform() if [ "$app_type" != "sdl-app" ]; then output="rockboxui" fi # default share option, override below if needed SHARED_LDFLAG="-shared" SHARED_CFLAGS="-fPIC -fvisibility=hidden" if [ "$win32crosscompile" = "yes" ]; then # We are crosscompiling # add cross-compiler option(s) GCCOPTS="$GCCOPTS -Wno-format" LDOPTS="$LDOPTS -mconsole -static" output="$output.exe" winbuild="yes" if [ -z "$CROSS_COMPILE" ]; then if [ "$win64" = "yes" ]; then CROSS_COMPILE=${CROSS_COMPILE:-"x86_64-w64-mingw32-"} else # different possible names; try to find the correct one: names="i686-w64-mingw32 i686-pc-mingw32 i586-mingw32msvc" for name in $names do if which "${name}-gcc" >/dev/null 2>&1 ; then CROSS_COMPILE="${name}-" break fi done if [ -z "$CROSS_COMPILE" ]; then echo "WARNING: unable to find cross-compiler for 32-bit Windows environment!" echo "WARNING: it's none of \"$names\"." echo "WARNING: set your compiler prefix with CROSS_COMPILE=\"your-prefix-\" and" echo "WARNING: re-run configure again!" exit 2 fi fi fi SHARED_CFLAGS='' prefixtools "$CROSS_COMPILE" fibers=`check_fiber` endian="little" # windows is little endian echo "Enabling MMX support" # -mno-ms-bitfields is a workaround for http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52991 # mingw-gcc >= 4.7 defaults to -mms-bitfields which breaks __attribute__((packed)) # disable it explicitly for the time being (it doesn't appear to be required for us) GCCOPTS="$GCCOPTS -mmmx -mno-ms-bitfields" else case $uname in CYGWIN*) echo "Cygwin host detected" fibers=`check_fiber` LDOPTS="$LDOPTS -mconsole" output="$output.exe" winbuild="yes" SHARED_CFLAGS='' ;; MINGW*) echo "MinGW host detected" fibers=`check_fiber` LDOPTS="$LDOPTS -mconsole" output="$output.exe" winbuild="yes" ;; Linux) sigaltstack=`check_sigaltstack` echo "Linux host detected" LDOPTS="$LDOPTS -ldl" ;; FreeBSD) sigaltstack=`check_sigaltstack` echo "FreeBSD host detected" LDOPTS="$LDOPTS" ;; Darwin) sigaltstack=`check_sigaltstack` echo "Darwin host detected" LDOPTS="$LDOPTS -ldl" SHARED_LDFLAG="-dynamiclib -Wl\,-single_module" ;; SunOS) sigaltstack=`check_sigaltstack` echo "*Solaris host detected" GCCOPTS="$GCCOPTS -fPIC" LDOPTS="$LDOPTS -ldl" ;; *) echo "[ERROR] Unsupported system: $uname, fix configure and retry" exit 1 ;; esac fi if [ "$winbuild" != "yes" ]; then GLOBAL_LDOPTS="$GLOBAL_LDOPTS -Wl,-z,defs" if [ "`uname -m`" = "i686" ]; then echo "Enabling MMX support" GCCOPTS="$GCCOPTS -mmmx" fi fi sdl=`findsdl $winbuild` if [ -n `echo $app_type | grep "sdl"` ]; then if [ -z "$sdl" ]; then echo "configure didn't find sdl-config, which indicates that you" echo "don't have SDL (properly) installed. Please correct and" echo "re-run configure!" exit 2 else echo Using $sdl # generic sdl-config checker sdlccopts=$($sdl --cflags) if $sdl --static-libs > /dev/null 2>&1 ; then sdlldopts=$($sdl --static-libs) else echo "Your sdl-config does not know about static libs, falling back to shared library" sdlldopts=$($sdl --libs) fi GCCOPTS="$GCCOPTS ${sdlccopts}" LDOPTS="$LDOPTS ${sdlldopts}" fi fi GCCOPTS="$GCCOPTS -I\$(SIMDIR)" # x86_64 supports MMX by default if [ "$endian" = "" ]; then id=$$ cat >$tmpdir/conftest-$id.c < int main(int argc, char **argv) { int var=0; char *varp = (char *)&var; *varp=1; printf("%d\n", var); return 0; } EOF $CC -o $tmpdir/conftest-$id $tmpdir/conftest-$id.c 2>/dev/null # when cross compiling, the endianess cannot be detected because the above program doesn't run # on the local machine. assume little endian but print a warning endian=`$tmpdir/conftest-$id 2> /dev/null` if [ "$endian" != "" ] && [ $endian -gt "1" ]; then # big endian endian="big" else # little endian endian="little" fi fi if [ "$CROSS_COMPILE" != "" ]; then echo "WARNING: Cross Compiling, cannot detect endianess. Assuming $endian endian!" fi if [ "$app_type" = "sdl-sim" ]; then echo "Simulator environment deemed $endian endian" elif [ "$app_type" = "sdl-app" ]; then echo "Application environment deemed $endian endian" elif [ "$app_type" = "checkwps" ]; then echo "CheckWPS environment deemed $endian endian" fi # use wildcard here to make it work even if it was named *.exe like # on cygwin rm -f $tmpdir/conftest-$id* thread_support= if [ -z "$ARG_THREAD_SUPPORT" ] || [ "$ARG_THREAD_SUPPORT" = "0" ]; then if [ "$sigaltstack" = "0" ]; then thread_support="HAVE_SIGALTSTACK_THREADS" LDOPTS="$LDOPTS -lpthread" # pthread needed echo "Selected sigaltstack threads" elif [ "$fibers" = "0" ]; then thread_support="HAVE_WIN32_FIBER_THREADS" echo "Selected Win32 Fiber threads" fi fi if [ -n `echo $app_type | grep "sdl"` ] && [ -z "$thread_support" ] \ && [ "$ARG_THREAD_SUPPORT" != "0" ]; then thread_support="HAVE_SDL_THREADS" if [ "$ARG_THREAD_SUPPORT" = "1" ]; then echo "Selected SDL threads" else echo "WARNING: Falling back to SDL threads" fi fi } # # functions for setting up cross-compiler names and options # also set endianess and what the exact recommended gcc version is # the gcc version should most likely match what versions we build with # rockboxdev.sh # shcc () { prefixtools sh-elf- GCCOPTS="$CCOPTS -m1" GCCOPTIMIZE="-fomit-frame-pointer -fschedule-insns" endian="big" gccchoice="4.0.3" } calmrisccc () { prefixtools calmrisc16-unknown-elf- GCCOPTS="-Wl\,--no-check-sections $CCOPTS" GCCOPTIMIZE="-fomit-frame-pointer" endian="big" } coldfirecc () { prefixtools m68k-elf- GCCOPTS="$CCOPTS -mcpu=5249 -malign-int -mstrict-align" GCCOPTIMIZE="-fomit-frame-pointer" endian="big" gccchoice="4.5.2" } arm7tdmicc () { findarmgcc GCCOPTS="$CCOPTS -mcpu=arm7tdmi" GCCOPTIMIZE="-fomit-frame-pointer" endian="little" } arm9tdmicc () { findarmgcc GCCOPTS="$CCOPTS -mcpu=arm9tdmi" GCCOPTIMIZE="-fomit-frame-pointer" endian="little" } arm940tbecc () { findarmgcc GCCOPTS="$CCOPTS -mbig-endian -mcpu=arm940t" GCCOPTIMIZE="-fomit-frame-pointer" endian="big" } arm940tcc () { findarmgcc GCCOPTS="$CCOPTS -mcpu=arm940t" GCCOPTIMIZE="-fomit-frame-pointer" endian="little" } arm946cc () { findarmgcc GCCOPTS="$CCOPTS -mcpu=arm9e" GCCOPTIMIZE="-fomit-frame-pointer" endian="little" } arm926ejscc () { findarmgcc GCCOPTS="$CCOPTS -mcpu=arm926ej-s" GCCOPTIMIZE="-fomit-frame-pointer" endian="little" } arm1136jfscc () { findarmgcc GCCOPTS="$CCOPTS -mcpu=arm1136jf-s" GCCOPTIMIZE="-fomit-frame-pointer" endian="little" } arm1176jzscc () { findarmgcc GCCOPTS="$CCOPTS -mcpu=arm1176jz-s" GCCOPTIMIZE="-fomit-frame-pointer" endian="little" } arm7ejscc () { findarmgcc GCCOPTS="$CCOPTS -march=armv5te" GCCOPTIMIZE="-fomit-frame-pointer" endian="little" } mipselcc () { prefixtools mipsel-elf- # mips is predefined, but we want it for paths. use __mips instead GCCOPTS="$CCOPTS -march=mips32 -mtune=r4600 -mno-mips16 -mno-long-calls -Umips" GCCOPTS="$GCCOPTS -ffunction-sections -msoft-float -G 0 -Wno-parentheses" GCCOPTIMIZE="-fomit-frame-pointer" endian="little" gccchoice="4.1.2" } maemocc () { # Scratchbox sets up "gcc" based on the active target prefixtools "" GCCOPTS=`echo $CCOPTS | sed -e s/-ffreestanding// -e s/-nostdlib// -e s/-Wundef//` GCCOPTS="$GCCOPTS -fno-builtin -g -I\$(SIMDIR)" GCCOPTIMIZE='' LDOPTS="-lm -ldl $LDOPTS" GLOBAL_LDOPTS="$GLOBAL_LDOPTS -Wl,-z,defs" SHARED_LDFLAG="-shared" SHARED_CFLAGS='' endian="little" thread_support="HAVE_SIGALTSTACK_THREADS" is_n900=0 # Determine maemo version if pkg-config --atleast-version=5 maemo-version; then if [ "$1" == "4" ]; then echo "ERROR: Maemo 4 SDK required." exit 1 fi extradefines="$extradefines -DMAEMO5" echo "Found N900 maemo version" is_n900=1 elif pkg-config --atleast-version=4 maemo-version; then if [ "$1" == "5" ]; then echo "ERROR: Maemo 5 SDK required." exit 1 fi extradefines="$extradefines -DMAEMO4" echo "Found N8xx maemo version" else echo "Unable to determine maemo version. Is the maemo-version-dev package installed?" exit 1 fi # SDL if [ $is_n900 -eq 1 ]; then GCCOPTS="$GCCOPTS `pkg-config --cflags sdl`" LDOPTS="$LDOPTS `pkg-config --libs sdl`" else GCCOPTS="$GCCOPTS `sdl-config --cflags`" LDOPTS="$LDOPTS `sdl-config --libs`" fi # glib and libosso support GCCOPTS="$GCCOPTS `pkg-config --cflags libosso glib-2.0 gthread-2.0`" LDOPTS="$LDOPTS `pkg-config --libs libosso glib-2.0 gthread-2.0`" # libhal support: Battery monitoring GCCOPTS="$GCCOPTS `pkg-config --cflags hal`" LDOPTS="$LDOPTS `pkg-config --libs hal`" GCCOPTS="$GCCOPTS -O2 -fno-strict-aliasing" if [ $is_n900 -eq 1 ]; then # gstreamer support: Audio output. GCCOPTS="$GCCOPTS `pkg-config --cflags gstreamer-base-0.10 gstreamer-plugins-base-0.10 gstreamer-app-0.10`" LDOPTS="$LDOPTS `pkg-config --libs gstreamer-base-0.10 gstreamer-plugins-base-0.10 gstreamer-app-0.10`" # N900 specific: libplayback support GCCOPTS="$GCCOPTS `pkg-config --cflags libplayback-1`" LDOPTS="$LDOPTS `pkg-config --libs libplayback-1`" # N900 specific: Enable ARMv7 NEON support if sb-conf show -A |grep -q -i arm; then echo "Detected ARM target" GCCOPTS="$GCCOPTS -mcpu=cortex-a8 -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp" extradefines="$extradefines -DMAEMO_ARM_BUILD" else echo "Detected x86 target" fi else # N8xx specific: Enable armv5te instructions if sb-conf show -A |grep -q -i arm; then echo "Detected ARM target" GCCOPTS="$GCCOPTS -mcpu=arm1136jf-s -mfloat-abi=softfp -mfpu=vfp" extradefines="$extradefines -DMAEMO_ARM_BUILD" else echo "Detected x86 target" fi fi } pandoracc () { # Note: The new "Ivanovic" pandora toolchain is not able to compile rockbox. # You have to use the sebt3 toolchain: # http://www.gp32x.com/board/index.php?/topic/58490-yactfeau/ PNDSDK="/usr/local/angstrom/arm" if [ ! -x $PNDSDK/bin/arm-angstrom-linux-gnueabi-gcc ]; then echo "Pandora SDK gcc not found in $PNDSDK/bin/arm-angstrom-linux-gnueabi-gcc" exit fi PATH=$PNDSDK/bin:$PATH:$PNDSDK/arm-angstrom-linux-gnueabi/usr/bin PKG_CONFIG_PATH=$PNDSDK/arm-angstrom-linux-gnueabi/usr/lib/pkgconfig LDOPTS="-L$PNDSDK/arm-angstrom-linux-gnueabi/usr/lib -Wl,-rpath,$PNDSDK/arm-angstrom-linux-gnueabi/usr/lib $LDOPTS" PKG_CONFIG="pkg-config" GCCOPTS=`echo $CCOPTS | sed -e s/-ffreestanding// -e s/-nostdlib// -e s/-Wundef//` GCCOPTS="$GCCOPTS -fno-builtin -g -I\$(SIMDIR)" GCCOPTIMIZE='' LDOPTS="-lm -ldl $LDOPTS" GLOBAL_LDOPTS="$GLOBAL_LDOPTS -Wl,-z,defs" SHARED_LDFLAG="-shared" SHARED_CFLAGS='' endian="little" thread_support="HAVE_SIGALTSTACK_THREADS" # Include path GCCOPTS="$GCCOPTS -I$PNDSDK/arm-angstrom-linux-gnueabi/usr/include" # Set up compiler gccchoice="4.3.3" prefixtools "$PNDSDK/bin/arm-angstrom-linux-gnueabi-" # Detect SDL GCCOPTS="$GCCOPTS `$PNDSDK/bin/sdl-config --cflags`" LDOPTS="$LDOPTS `$PNDSDK/bin/sdl-config --libs`" # Compiler options GCCOPTS="$GCCOPTS -O2 -fno-strict-aliasing" GCCOPTS="$GCCOPTS -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp" GCCOPTS="$GCCOPTS -ffast-math -fsingle-precision-constant" } arm1176jzlinuxcc () { GCCOPTS=`echo $CCOPTS | sed -e s/-ffreestanding// -e s/-nostdlib//` # Although the ARM1176JZ-S supports unaligned accesses, those seems to disabled # by the kernel. Since GCC emits unaligned accesses by default on ARMv6, we # need to disable that GCCOPTS="$GCCOPTS -mcpu=arm1176jz-s -mno-unaligned-access -mfloat-abi=softfp" GCCOPTIMIZE='' LDOPTS="-lasound -lpthread -lm -ldl -lrt $LDOPTS" GLOBAL_LDOPTS="$GLOBAL_LDOPTS -Wl,-z,defs" # warn about undefined symbols in shared libraries SHARED_LDFLAG="-shared" SHARED_CFLAGS='' endian="little" app_type="ypr0" # Include path GCCOPTS="$GCCOPTS -D_GNU_SOURCE=1 -U_FORTIFY_SOURCE -D_REENTRANT" # Set up compiler gccchoice="4.9.4" prefixtools "arm-rockbox-linux-gnueabi-" } ypr0cc () { arm1176jzlinuxcc app_type="ypr0" } sonynwzcc () { arm1176jzlinuxcc app_type="sonynwz" } androidcc () { if [ -z "$ANDROID_SDK_PATH" ]; then echo "ERROR: You need the Android SDK installed and have the ANDROID_SDK_PATH" echo "environment variable point to the root directory of the Android SDK." exit fi if [ -z "$ANDROID_NDK_PATH" ]; then echo "ERROR: You need the Android NDK installed (r16 or higher) and have the ANDROID_NDK_PATH" echo "environment variable point to the root directory of the Android NDK." exit fi buildhost=$(uname | tr "[:upper:]" "[:lower:]") GCCOPTS=`echo $CCOPTS | sed -e s/-ffreestanding// -e s/-nostdlib// -e s/-Wundef//` LDOPTS="$LDOPTS -ldl -llog" if [ "$modelname" != "ibassodx50" ] && [ "$modelname" != "ibassodx90" ]; then LDOPTS="$LDOPTS -Wl,-soname,librockbox.so -shared" fi SHARED_LDFLAG="-shared" SHARED_CFLAGS='' GLOBAL_LDOPTS="-Wl,-z,defs -Wl,-z,noexecstack" ANDROID_ARCH=$1 # for android.make too gccchoice="4.6" # arch dependant stuff case $ANDROID_ARCH in armeabi) endian="little" gcctarget="arm-linux-androideabi-" # sigaltstack is not available in pre-android-9, however asm # threads work fine so far thread_support="ASSEMBLER_THREADS" GCCOPTS="$GCCOPTS -march=armv5te -mtune=xscale -msoft-float -fomit-frame-pointer \ --sysroot=$ANDROID_NDK_PATH/platforms/android-16/arch-arm" LDOPTS="$LDOPTS --sysroot=$ANDROID_NDK_PATH/platforms/android-16/arch-arm" ;; mips) endian="little" gcctarget="mipsel-linux-android-" thread_support="HAVE_SIGALTSTACK_THREADS" GCCOPTS="$GCCOPTS -march=mips32 -mtune=r4600 -mno-mips16 -mno-long-calls -fomit-frame-pointer \ --sysroot=$ANDROID_NDK_PATH/platforms/android-14/arch-mips -fPIC" LDOPTS="$LDOPTS --sysroot=$ANDROID_NDK_PATH/platforms/android-14/arch-mips" ;; x86) endian="little" gcctarget="i686-linux-android-" gccdir=x86-$gccchoice thread_support="HAVE_SIGALTSTACK_THREADS" GCCOPTS="$GCCOPTS -Wa,--noexecstack -ffunction-sections -fomit-frame-pointer\ --sysroot=$ANDROID_NDK_PATH/platforms/android-9/arch-x86" LDOPTS="$LDOPTS --sysroot=$ANDROID_NDK_PATH/platforms/android-9/arch-x86" ;; *) echo "ERROR: androidcc(): Unknown target architecture" exit ;; esac echo "Application environment deemed $endian endian" if [ -z "$gccdir" ]; then gccdir=$gcctarget$gccchoice fi if [ -d $ANDROID_NDK_PATH/toolchains/$gccdir/prebuilt/$buildhost-x86 ]; then gccprefix=$ANDROID_NDK_PATH/toolchains/$gccdir/prebuilt/$buildhost-x86 else gccprefix=$ANDROID_NDK_PATH/toolchains/$gccdir/prebuilt/$buildhost-x86_64 fi PATH=$PATH:$gccprefix/bin prefixtools $gcctarget } androidndkcc() { if ! [ -d "$ANDROID_NDK_PATH" ]; then echo "ERROR: You need the Android NDK installed (r16 or higher) and have the ANDROID_NDK_PATH" echo "environment variable point to the root directory of the Android NDK." exit fi make_toolchain="${ANDROID_NDK_PATH}/build/tools/make-standalone-toolchain.sh" if ! [ -e "${make_toolchain}" ]; then echo "ERROR: ${make_toolchain} could not be found." exit fi buildhost=$(uname -s | tr "[:upper:]" "[:lower:]") # the prebuild android NDK only supports intel architecture anyway, so we can take shortcuts case $(getconf LONG_BIT) in 32) buildhost="${buildhost}-x86" ;; 64) buildhost="${buildhost}-x86_64" ;; esac GCCOPTS=`echo $CCOPTS | sed -e s/-ffreestanding// -e s/-nostdlib// -e s/-Wundef//` LDOPTS="$LDOPTS -ldl -llog" SHARED_LDFLAG="-shared" SHARED_CFLAGS='' GLOBAL_LDOPTS="-Wl,-z,defs -Wl,-z,noexecstack" # arch dependant stuff case $1 in armeabi) endian="little" gccchoice="4.6" gcctarget="arm-linux-androideabi-" echo "${make_toolchain} --system=${buildhost} --toolchain=arm-linux-androideabi-4.6 --platform=android-16 --install-dir=${pwd}/android-toolchain" ${make_toolchain} --system=${buildhost} --toolchain=arm-linux-androideabi-4.6 --platform=android-16 --install-dir=${pwd}/android-toolchain if [ ${?} != 0 ]; then exit fi GCCOPTS="$GCCOPTS -march=armv5te -mtune=xscale -msoft-float -fomit-frame-pointer --sysroot=${pwd}/android-toolchain/sysroot" LDOPTS="$LDOPTS --sysroot=${pwd}/android-toolchain/sysroot" ;; *) echo "ERROR: androidndkcc(): Unknown target architecture" exit ;; esac echo "Using endian ${endian}" echo "Using gccchoice ${gccchoice}" echo "Using gcctarget ${gcctarget}" PATH=$PATH:${pwd}/android-toolchain/bin prefixtools $gcctarget } mipsellinuxcc () { GCCOPTS=`echo $CCOPTS | sed -e s/-ffreestanding// -e s/-nostdlib//` GCCOPTS="$GCCOPTS -march=mips32r2 -mno-mips16 -mno-long-calls -Umips -fPIC" GCCOPTIMIZE='' LDOPTS="-lasound -lpthread -lm -ldl -lrt $LDOPTS" GLOBAL_LDOPTS="$GLOBAL_LDOPTS -Wl,-z,defs" SHARED_LDFLAG="-shared" SHARED_CFLAGS='-fPIC -fvisibility=hidden' endian="little" app_type="rocker" thread_support="HAVE_SIGALTSTACK_THREADS" # Include path GCCOPTS="$GCCOPTS -D_GNU_SOURCE=1 -U_FORTIFY_SOURCE -D_REENTRANT" # Set up compiler gccchoice="4.9.4" prefixtools "mipsel-rockbox-linux-gnu-" } whichadvanced () { atype=`echo "$1" | cut -c 2-` ################################################################## # Prompt for specific developer options # if [ "$atype" ]; then interact= else interact=1 echo "" printf "Enter your developer options (press only enter when done)\n\ (D)EBUG, (L)ogf, Boot(c)hart, (S)imulator, (P)rofiling, (V)oice, (W)in32 crosscompile,\n\ Win(6)4 crosscompile, (T)est plugins, S(m)all C lib, Logf to Ser(i)al port:" if [ "$modelname" = "archosplayer" ]; then printf ", Use (A)TA poweroff" fi if [ "$t_model" = "ondio" ]; then printf ", (B)acklight MOD" fi if [ "$modelname" = "iaudiom5" ]; then printf ", (F)M radio MOD" fi if [ "$modelname" = "iriverh120" ]; then printf ", (R)TC MOD" fi echo "" fi cont=1 while [ $cont = "1" ]; do if [ "$interact" ]; then option=`input` else option=`echo "$atype" | cut -c 1` fi case $option in [Dd]) if [ "yes" = "$profile" ]; then echo "Debug is incompatible with profiling" else echo "DEBUG build enabled" use_debug="yes" fi ;; [Ll]) echo "logf() support enabled" logf="yes" ;; [Mm]) echo "Using Rockbox' small C library" extradefines="$extradefines -DHAVE_ROCKBOX_C_LIBRARY" ;; [Tt]) echo "Including test plugins" extradefines="$extradefines -DHAVE_TEST_PLUGINS" ;; [Cc]) echo "bootchart enabled (logf also enabled)" bootchart="yes" logf="yes" ;; [Ii]) echo "Logf to serial port enabled (logf also enabled)" logf="yes" logf_serial="yes" ;; [Ss]) echo "Simulator build enabled" simulator="yes" ;; [Pp]) if [ "yes" = "$use_debug" ]; then echo "Profiling is incompatible with debug" else echo "Profiling support is enabled" profile="yes" fi ;; [Vv]) echo "Voice build selected" voice="yes" ;; [Aa]) if [ "$modelname" = "archosplayer" ]; then have_ata_poweroff="#define HAVE_ATA_POWER_OFF" echo "ATA power off enabled" fi ;; [Bb]) if [ "$t_model" = "ondio" ]; then have_backlight="#define HAVE_BACKLIGHT" echo "Backlight functions enabled" fi ;; [Ff]) if [ "$modelname" = "iaudiom5" ]; then have_fmradio_in="#define HAVE_FMRADIO_IN" echo "FM radio functions enabled" fi ;; [Rr]) if [ "$modelname" = "iriverh120" ]; then config_rtc="#define CONFIG_RTC RTC_DS1339_DS3231" have_rtc_alarm="#define HAVE_RTC_ALARM" echo "RTC functions enabled (DS1339/DS3231)" fi ;; [Ww]) echo "Enabling Windows cross-compiling (32-bit)" win32crosscompile="yes" win64="" ;; [6]) echo "Enabling Windows cross-compiling (64-bit)" win32crosscompile="yes" win64="yes" ;; "") # Match enter press when finished with advanced options cont=0 ;; *) echo "[ERROR] Option $option unsupported" ;; esac if [ "$interact" ]; then btype="$btype$option" else atype=`echo "$atype" | cut -c 2-` [ "$atype" ] || cont=0 fi done echo "done" if [ "yes" = "$voice" ]; then # Ask about languages to build picklang voicelanguage=`whichlang` echo "Voice language set to $voicelanguage" # Configure encoder and TTS engine for each language for thislang in `echo $voicelanguage | sed 's/,/ /g'`; do voiceconfig "$thislang" done fi if [ "yes" = "$use_debug" ]; then debug="-DDEBUG" GCCOPTS="$GCCOPTS -g -DDEBUG" fi if [ "yes" = "$logf" ]; then use_logf="#define ROCKBOX_HAS_LOGF 1" fi if [ "yes" = "$logf_serial" ]; then use_logf_serial="#define LOGF_SERIAL 1" fi if [ "yes" = "$bootchart" ]; then use_bootchart="#define DO_BOOTCHART 1" fi if [ "yes" = "$simulator" ]; then debug="-DDEBUG" extradefines="$extradefines -DSIMULATOR -DHAVE_TEST_PLUGINS" archosrom="" flash="" fi if [ "yes" = "$profile" ]; then extradefines="$extradefines -DRB_PROFILE" PROFILE_OPTS="-finstrument-functions" fi } # Configure voice settings voiceconfig () { thislang=$1 if [ ! "$ARG_TTS" ]; then echo "Building $thislang voice for $modelname. Select options" echo "" fi if [ -n "`findtool flite`" ]; then FLITE="F(l)ite " FLITE_OPTS="" DEFAULT_TTS="flite" DEFAULT_TTS_OPTS=$FLITE_OPTS DEFAULT_NOISEFLOOR="500" DEFAULT_CHOICE="l" fi if [ -n "`findtool espeak`" ]; then ESPEAK="(e)Speak " ESPEAK_OPTS="" DEFAULT_TTS="espeak" DEFAULT_TTS_OPTS=$ESPEAK_OPTS DEFAULT_NOISEFLOOR="500" DEFAULT_CHOICE="e" fi if [ -n "`findtool festival`" ]; then FESTIVAL="(F)estival " case "$thislang" in "italiano") FESTIVAL_OPTS="--language italian" ;; "espanol") FESTIVAL_OPTS="--language spanish" ;; "finnish") FESTIVAL_OPTS="--language finnish" ;; "czech") FESTIVAL_OPTS="--language czech" ;; *) FESTIVAL_OPTS="" ;; esac DEFAULT_TTS="festival" DEFAULT_TTS_OPTS=$FESTIVAL_OPTS DEFAULT_NOISEFLOOR="500" DEFAULT_CHOICE="f" fi if [ -n "`findtool swift`" ]; then SWIFT="S(w)ift " SWIFT_OPTS="" DEFAULT_TTS="swift" DEFAULT_TTS_OPTS=$SWIFT_OPTS DEFAULT_NOISEFLOOR="500" DEFAULT_CHOICE="w" fi # Allow SAPI if Windows is in use if [ -n "`findtool winver`" ]; then SAPI="(S)API " SAPI_OPTS="" DEFAULT_TTS="sapi" DEFAULT_TTS_OPTS=$SAPI_OPTS DEFAULT_NOISEFLOOR="500" DEFAULT_CHOICE="s" fi if [ "$FESTIVAL" = "$FLITE" ] && [ "$FLITE" = "$ESPEAK" ] && [ "$ESPEAK" = "$SAPI" ] && [ "$SAPI" = "$SWIFT" ]; then echo "You need Festival, eSpeak or Flite in your path, or SAPI available to build voice files" exit 3 fi if [ "$ARG_TTS" ]; then option=$ARG_TTS else echo "TTS engine to use: ${FLITE}${FESTIVAL}${ESPEAK}${SAPI}${SWIFT}(${DEFAULT_CHOICE})?" option=`input` if [ -z "$option" ]; then option=${DEFAULT_CHOICE}; fi advopts="$advopts --tts=$option" fi case "$option" in [Ll]) TTS_ENGINE="flite" NOISEFLOOR="500" # TODO: check this value TTS_OPTS=$FLITE_OPTS ;; [Ee]) TTS_ENGINE="espeak" NOISEFLOOR="500" TTS_OPTS=$ESPEAK_OPTS ;; [Ff]) TTS_ENGINE="festival" NOISEFLOOR="500" TTS_OPTS=$FESTIVAL_OPTS ;; [Ss]) TTS_ENGINE="sapi" NOISEFLOOR="500" TTS_OPTS=$SAPI_OPTS ;; [Ww]) TTS_ENGINE="swift" NOISEFLOOR="500" TTS_OPTS=$SWIFT_OPTS ;; *) TTS_ENGINE=$DEFAULT_TTS TTS_OPTS=$DEFAULT_TTS_OPTS NOISEFLOOR=$DEFAULT_NOISEFLOOR esac echo "Using $TTS_ENGINE for TTS" # Select which voice to use for Festival if [ "$TTS_ENGINE" = "festival" ]; then voicelist=`echo "(voice.list)"|festival -i 2>/dev/null |tr "\n" " "|sed -e 's/.*festival> (\(.*\)) festival>/\1/'|sort` for voice in $voicelist; do TTS_FESTIVAL_VOICE="$voice" # Default choice break done if [ "$ARG_VOICE" ]; then CHOICE=$ARG_VOICE else i=1 for voice in $voicelist; do printf "%3d. %s\n" "$i" "$voice" i=`expr $i + 1` done printf "Please select which Festival voice to use (default is $TTS_FESTIVAL_VOICE): " CHOICE=`input` fi i=1 for voice in $voicelist; do if [ "$i" = "$CHOICE" -o "$voice" = "$CHOICE" ]; then TTS_FESTIVAL_VOICE="$voice" fi i=`expr $i + 1` done advopts="$advopts --voice=$CHOICE" echo "Festival voice set to $TTS_FESTIVAL_VOICE" echo "(voice_$TTS_FESTIVAL_VOICE)" > festival-prolog.scm fi # Read custom tts options from command line if [ "$ARG_TTSOPTS" ]; then TTS_OPTS="$ARG_TTSOPTS" echo "$TTS_ENGINE options set to $TTS_OPTS" fi if [ "$swcodec" = "yes" ]; then ENCODER="rbspeexenc" ENC_OPTS="-q 4 -c 10" else if [ -n "`findtool lame`" ]; then ENCODER="lame" ENC_OPTS="--resample 12 -t -m m -h -V 9.999 -S -B 64 --vbr-new" else echo "You need LAME in the system path to build voice files for" echo "HWCODEC targets." exit 4 fi fi echo "Using $ENCODER for encoding voice clips" # Read custom encoder options from command line if [ "$ARG_ENCOPTS" ]; then ENC_OPTS="$ARG_ENCOPTS" echo "$ENCODER options set to $ENC_OPTS" fi TEMPDIR="${pwd}" if [ -n "`findtool cygpath`" ]; then TEMPDIR=`cygpath . -a -w` fi } picklang() { # figure out which languages that are around for file in $rootdir/apps/lang/*.lang; do clean=`basename $file .lang` langs="$langs $clean" done if [ "$ARG_LANG" ]; then pick=$ARG_LANG else echo "Select a number for the language to use (default is english)" # FIXME The multiple-language feature is currently broken # echo "You may enter a comma-separated list of languages to build" num=1 for one in $langs; do echo "$num. $one" num=`expr $num + 1` done pick=`input` advopts="$advopts --language=$pick" fi } whichlang() { output="" # Allow the user to pass a comma-separated list of langauges for thispick in `echo $pick | sed 's/,/ /g'`; do num=1 for one in $langs; do # Accept both the language number and name if [ "$num" = "$thispick" ] || [ "$thispick" = "$one" ]; then if [ "$output" = "" ]; then output=$one else output=$output,$one fi fi num=`expr $num + 1` done done if [ -z "$output" ]; then # pick a default output="english" fi echo $output } help() { echo "Rockbox configure script." echo "Invoke this in a directory to generate a Makefile to build Rockbox" echo "Do *NOT* run this within the tools directory!" echo "" cat </dev/null 2>&1 ; } then echo "WEEEEEEEEP. Don't run this configure script within the tools directory." echo "It will only cause you pain and grief. Instead do this:" echo "" echo " cd .." echo " mkdir build-dir" echo " cd build-dir" echo " ../tools/configure" echo "" echo "Much happiness will arise from this. Enjoy" exit 5 fi fi if test -r "tools/configure"; then # this is a check for a configure script in the tools/ directory, if there # is one, try to figure out if it is this one! if { grep "^# Jukebox" tools/configure >/dev/null 2>&1 ; } then echo "WEEEEEEEEP. Don't run this configure script in the root of the tree." echo "It will only cause you pain and grief. Instead do this:" echo "" echo " mkdir build-dir" echo " cd build-dir" echo " ../tools/configure" echo "" echo "Much happiness will arise from this. Enjoy" exit 5 fi fi # get our current directory pwd=`pwd`; if { echo $pwd | grep " "; } then echo "You're running this script in a path that contains space. The build" echo "system is unfortunately not clever enough to deal with this. Please" echo "run the script from a different path, rename the path or fix the build" echo "system!" exit 6 fi if [ -z "$rootdir" ]; then ################################################################## # Figure out where the source code root is! # rootdir=`dirname $0`/../ ##################################################################### # Convert the possibly relative directory name to an absolute version # now=`pwd` cd $rootdir rootdir=`pwd` # cd back to the build dir cd $now fi apps="apps" appsdir='$(ROOTDIR)/apps' toolsdir='$(ROOTDIR)/tools' ################################################################## # Figure out target platform # if [ "$ARG_TARGET" ]; then buildfor=$ARG_TARGET else echo "Enter target platform:" cat <&1 | sed -e 's/[^0-9.-]//g'` else ldver=`$LD --version | head -n 1 | sed -e 's/\ /\n/g' | tail -n 1` fi if [ -z "$gccver" ]; then echo "[WARNING] The compiler you must use ($CC) is not in your path!" echo "[WARNING] this may cause your build to fail since we cannot do the" echo "[WARNING] checks we want now." else # gccver should now be "3.3.5", "3.4.3", "2.95.3-6" and similar, but don't # DEPEND on it num1=`echo $gccver | cut -d . -f1` num2=`echo $gccver | cut -d . -f2` gccnum=`(expr $num1 "*" 100 + $num2) 2>/dev/null` # This makes: # 3.3.X => 303 # 3.4.X => 304 # 2.95.3 => 295 echo "Using $CC $gccver ($gccnum)" if test "$gccnum" -ge "400"; then # gcc 4.0 is just *so* much pickier on arguments that differ in signedness # so we ignore that warnings for now # -Wno-pointer-sign GCCOPTS="$GCCOPTS -Wno-pointer-sign" fi if test "$gccnum" -ge "402"; then # disable warning about "warning: initialized field overwritten" as gcc 4.2 # and later would throw it for several valid cases GCCOPTS="$GCCOPTS -Wno-override-init" fi if test "$gccnum" -ge "601"; then # gcc 6 adds a lot of warnings that while useful are too time-consuming # to clean up right away GCCOPTS="$GCCOPTS -Wno-shift-negative-value -Wno-unused-const-variable -Wno-nonnull-compare -Wno-tautological-compare" fi if test "$gccnum" -ge "700"; then # gcc 7 spews a bunch of warnings by default GCCOPTS="$GCCOPTS -Wno-expansion-to-defined -Wimplicit-fallthrough=0" fi case $prefix in ""|"$CROSS_COMPILE") # simulator ;; *) # Verify that the cross-compiler is of a recommended version! if test "$gccver" != "$gccchoice"; then echo "WARNING: Your cross-compiler $CC $gccver is not of the recommended" echo "WARNING: version $gccchoice!" echo "WARNING: This may cause your build to fail since it may be a version" echo "WARNING: that isn't functional or known to not be the best choice." echo "WARNING: If you suffer from build problems, you know that this is" echo "WARNING: a likely source for them..." fi ;; esac fi echo "Using $LD $ldver" makever=`make --version | head -1` echo "Detected make $makever" # check the compiler for SH platforms if test "$CC" = "sh-elf-gcc"; then if test "$gccnum" -lt "400"; then echo "WARNING: Consider upgrading your compiler to the 4.0.X series!" echo "WARNING: http://www.rockbox.org/twiki/bin/view/Main/CrossCompiler" else # figure out patch status gccpatch=`$CC --version`; if { echo $gccpatch | grep "rockbox" >/dev/null 2>&1; } then echo "gcc $gccver is rockbox patched" # then convert -O to -Os to get smaller binaries! GCCOPTS=`echo $GCCOPTS | sed 's/ -O / -Os /'` else echo "WARNING: You use an unpatched gcc compiler: $gccver" echo "WARNING: http://www.rockbox.org/twiki/bin/view/Main/CrossCompiler" fi fi fi if test "$CC" = "m68k-elf-gcc"; then # convert -O to -Os to get smaller binaries! GCCOPTS=`echo $GCCOPTS | sed 's/ -O / -Os /'` fi if [ "$ARG_CCACHE" = "1" ]; then echo "Enable ccache for building" ccache="ccache" elif [ "$ARG_CCACHE" != "0" ]; then ccache=`findtool ccache` if test -n "$ccache"; then echo "Found and uses ccache ($ccache)" fi fi # figure out the full path to the various commands if possible HOSTCC=`findtool gcc --lit` HOSTAR=`findtool ar --lit` CC=`findtool ${CC} --lit` CPP=`findtool ${CPP} --lit` LD=`findtool ${LD} --lit` AR=`findtool ${AR} --lit` AS=`findtool ${AS} --lit` OC=`findtool ${OC} --lit` WINDRES=`findtool ${WINDRES} --lit` DLLTOOL=`findtool ${DLLTOOL} --lit` DLLWRAP=`findtool ${DLLWRAP} --lit` RANLIB=`findtool ${RANLIB} --lit` # in pure cross-compiler environments without own native compiler this helps: HOSTCC=${HOSTCC:-${CC}} HOSTAR=${HOSTAR:-${AR}} if [ -z "$arch" ]; then cpp_defines=$(echo "" | $CPP $GCCOPTS -dD) if [ -n "$(echo $cpp_defines | grep -w __sh__)" ]; then arch="sh" elif [ -n "$(echo $cpp_defines | grep -w __m68k__)" ]; then arch="m68k" elif [ -n "$(echo $cpp_defines | grep -w __arm__)" ]; then arch="arm" # cpp defines like "#define __ARM_ARCH_4TE__ 1" (where we want to extract the 4) arch_version="$(echo $cpp_defines | tr ' ' '\012' | grep __ARM_ARCH | sed -e 's,.*\([0-9]\).*,\1,' | grep -v __ARM_ARCH)" elif [ -n "$(echo $cpp_defines | grep -w __mips__)" ]; then arch="mips" arch_version="$(echo $cpp_defines | tr ' ' '\012' | grep _MIPS_ARCH_MIPS | sed -e 's,.*\([0-9][0-9]\).*,\1,' | grep -v _MIPS_ARCH_MIPS)" elif [ -n "$(echo $cpp_defines | grep -w __i386__)" ]; then arch="x86" elif [ -n "$(echo $cpp_defines | grep -w __x86_64__)" ]; then arch="amd64" else arch="none" echo "Warning: Could not determine target arch" fi if [ "$arch" != "none" ]; then if [ -n "$arch_version" ]; then echo "Automatically selected arch: $arch (ver $arch_version)" else echo "Automatically selected arch: $arch" fi fi; else if [ -n "$arch_version" ]; then echo "Manually selected arch: $arch (ver $arch_version)" else echo "Manually selected arch: $arch" fi fi arch="arch_$arch" if [ -n "$arch_version" ]; then Darch_version="#define ARCH_VERSION $arch_version" fi if test -n "$ccache"; then CC="$ccache $CC" fi if test "$ARG_ARM_THUMB" = "1"; then extradefines="$extradefines -DUSE_THUMB" CC="$toolsdir/thumb-cc.py $CC" fi if test "X$endian" = "Xbig"; then defendian="ROCKBOX_BIG_ENDIAN" else defendian="ROCKBOX_LITTLE_ENDIAN" fi if [ "$ARG_RBDIR" != "" ]; then if [ -z `echo $ARG_RBDIR | grep '^/'` ]; then rbdir="/"$ARG_RBDIR else rbdir=$ARG_RBDIR fi echo "Using alternate rockbox dir: ${rbdir}" fi cat > autoconf.h < Makefile <