#!/bin/sh # some elements originated from qemu configure set -e TMPC="/tmp/picodrive-conf-${RANDOM}-$$-${RANDOM}.c" TMPO="/tmp/picodrive-conf-${RANDOM}-$$-${RANDOM}.o" TMPB="/tmp/picodrive-conf-${RANDOM}-$$-${RANDOM}" trap "rm -f $TMPC $TMPO $TMPB" EXIT INT QUIT TERM rm -f config.log compile_object() { c="$CC $MFLAGS $CFLAGS -c $TMPC -o $TMPO $@" echo $c >> config.log $c >> config.log 2>&1 } compile_binary() { c="$CC $MFLAGS $CFLAGS $TMPC -o $TMPB $LDFLAGS $@ $SYSLIBS" echo $c >> config.log $c >> config.log 2>&1 } check_option() { echo 'void test(void) { }' >$TMPC compile_object $1 || return 1 return 0 } check_define() { $CC -E -dD $MFLAGS $CFLAGS pico/arm_features.h | grep -q "define[ ]*$1" || return 1 return 0 } # setting options to "yes" or "no" will make that choice default, # "" means "autodetect". # TODO this is annoyingly messy. should have platform and device platform_list="generic pandora gph dingux retrofw opendingux[-gcw0] odbeta[-gcw0] miyoo rpi1 rpi2 ps2 psp win32" platform="generic" sound_driver_list="oss alsa sdl" sound_drivers="" have_armv5="" have_armv6="" have_armv7="" have_arm_oabi="" have_arm_neon="" have_libavcodec="" have_libchdr="" have_gles="no" need_sdl="no" need_zlib="no" # hardcoded stuff CC="${CC-${CROSS_COMPILE}gcc}" CXX="${CXX-${CROSS_COMPILE}g++}" AS="${AS-${CROSS_COMPILE}as}" STRIP="${STRIP-${CROSS_COMPILE}strip}" LD="${LD-${CROSS_COMPILE}gcc}" # Use better gcc for linking SYSROOT=`$CC $CFLAGS $LDFLAGS --print-sysroot 2> /dev/null || true` config_mak="config.mak" fail() { echo "$@" if test -n "$DUMP_CONFIG_LOG"; then cat config.log; fi exit 1 } # call during arg parsing, so that cmd line can override platform defaults set_platform() { platform=$1 CFLAGS="$CFLAGS -D__`echo ${platform%-*} | tr '[a-z]' '[A-Z]'`__" case "$platform" in rpi1) MFLAGS="-mcpu=arm1176jzf-s -mfpu=vfp" have_gles="yes" ;; rpi2) MFLAGS="-mcpu=cortex-a7 -mfpu=neon" have_gles="yes" ;; generic) MFLAGS="" ;; dingux) # dingoo a320, ritmix rzx-50, the like. all have Ingenic MIPS cpu <= JZ4755 sound_drivers="sdl" # use static linking since the lib situation is ... let's say vague #LDFLAGS="$LDFLAGS -static" # uses a pre-gcw0 version of opendingux MFLAGS="-march=mips32 -msoft-float" platform="opendingux" ;; retrofw) # devices using retrofw. AFAIK all have Ingenic MIPS JZ4760 with fpu sound_drivers="sdl" # uses it's own modified version of opendingux MFLAGS="-march=mips32" platform="opendingux" ;; opendingux | opendingux-gcw0) # more modern devices using opendingux, with Ingenic MIPS JZ4770 or newer sound_drivers="sdl" # mostly based on opendingux for gcw0 CFLAGS="$CFLAGS -D__OPENDINGUX__" [ "${platform#*gcw0}" = "" ] && CFLAGS="$CFLAGS -D__GCW0__" MFLAGS="-march=mips32r2" platform="opendingux" ;; miyoo) # Miyoo BittBoy, PocketGO 1, PowKiddy V90/Q90 with Allwinner F1C100s sound_drivers="sdl" CFLAGS="$CFLAGS -D__OPENDINGUX__" MFLAGS="-mcpu=arm926ej-s -marm" platform="opendingux" ;; odbeta | odbeta-gcw0) # various devices with opendingux beta, arch flags from toolchain default sound_drivers="sdl" CFLAGS="$CFLAGS -D__OPENDINGUX__" [ "${platform#*gcw0}" = "" ] && CFLAGS="$CFLAGS -D__GCW0__" MFLAGS="" # toolchains are arch specific platform="opendingux" ;; pandora) sound_drivers="oss alsa" have_libavcodec="yes" MFLAGS="-mcpu=cortex-a8 -mfpu=neon -mfloat-abi=softfp" ;; gph) sound_drivers="oss" # compile for OABI if toolchain provides it (faster code on caanoo) have_arm_oabi="yes" # always use static linking, since caanoo doesn't have OABI libs. Moreover, # dynamic linking slows Wiz 1-10%, and libm on F100 isn't compatible LDFLAGS="$LDFLAGS -static" # unified binary for all of them. picodrive detects device type for itself. CFLAGS="$CFLAGS -D__GP2X__" # add -mfpu=fpa to select correct parameter passing for -msoft-float :-/ MFLAGS="-mcpu=arm920t -mfloat-abi=soft -mfpu=fpa" platform="gp2x" ;; psp) # use newlib SYSLIBS="-lc -lpspuser -lpspkernel" MFLAGS="-march=allegrex" ARCH=mipsel ;; ps2) # use newlib SYSLIBS="" MFLAGS="" ARCH=mips64r5900el ASFLAGS="$ASFLAGS -G0 -call_shared" CFLAGS="$CFLAGS -D_EE -G0 -I${PS2SDK}/ee/include -I${PS2SDK}/common/include -I${PS2DEV}/gsKit/include -I${PS2SDK}/ports/include" LDFLAGS="$LDFLAGS -Wl,-zmax-page-size=128 -T${PS2SDK}/ee/startup/linkfile -L${PS2SDK}/ee/lib -L${PS2DEV}/gsKit/lib -L${PS2SDK}/ports/lib" ;; win32) MFLAGS="" ;; *) fail "unsupported platform: $platform" ;; esac } for opt do optarg=`expr "x$opt" : 'x[^=]*=\(.*\)'` || true case "$opt" in --help|-h) show_help="yes" ;; --platform=*) set_platform "$optarg" ;; --sound-drivers=*) sound_drivers="$optarg" ;; --with-libavcodec=*) have_libavcodec="$optarg" ;; --with-sdl-gles=*) have_gles="$optarg" ;; --with-zlib=*) need_zlib="$optarg" ;; *) echo "ERROR: unknown option $opt"; show_help="yes" ;; esac done if [ "$show_help" = "yes" ]; then echo "options:" echo " --help print this message" echo " --platform=NAME target platform [$platform]" echo " available: $platform_list" echo " --sound-drivers=LIST sound output drivers [guessed]" echo " available: $sound_driver_list" echo " --with-libavcodec=yes|no use libavcodec for mp3 decoding" echo " --with-sdl-gles=yes|no enable GLES usage for SDL" echo " --with-zlib=yes|no use internal zlib" echo "influential environment variables:" echo " CROSS_COMPILE CC CXX AS STRIP CFLAGS ASFLAGS LDFLAGS LDLIBS" exit 1 fi # validate selections if [ "x$sound_drivers" != "x" ]; then for d in $sound_drivers; do if ! echo $sound_driver_list | grep -q "\<$d\>"; then fail "unsupported sound driver: $sound_driver" fi done fi if ! test -f "platform/libpicofe/README"; then fail "libpicofe is missing, please run 'git submodule update --init'" fi #if [ "$need_warm" = "yes" ]; then # if ! test -f "frontend/warm/README"; then # fail "wARM is missing, please run 'git submodule init && git submodule update'" # fi #fi if [ -z "$ARCH" ]; then ARCH=`$CC $MFLAGS $CFLAGS -dumpmachine | awk -F '-' '{print $1}'` fi # CPU/ABI stuff first, else compile test may fail case "$ARCH" in arm64*) ;; arm*) # ARM stuff ARCH="arm" # OABI/EABI selection if [ "$have_arm_oabi" = "yes" ] && check_option -mabi=apcs-gnu; then echo "$CFLAGS" | grep -q -- '-mabi=' || MFLAGS="$MFLAGS -mabi=apcs-gnu" echo "$CFLAGS" | grep -q -- '-m\(no-\)*thumb-interwork' || CFLAGS="$CFLAGS -mno-thumb-interwork" fi if [ "x$have_arm_neon" = "x" ]; then # detect NEON from user-supplied cflags to enable asm code have_arm_neon=`check_define __ARM_NEON__ && echo yes` || true fi if [ "x$have_armv7" = "x" ]; then if check_define HAVE_ARMV7; then have_armv7="yes" have_armv6="yes" have_armv5="yes" fi fi if [ "x$have_armv6" = "x" ]; then if check_define HAVE_ARMV6; then have_armv6="yes" have_armv5="yes" fi fi if [ "x$have_armv5" = "x" ]; then have_armv5=`check_define HAVE_ARMV5 && echo yes` || true fi # must disable thumb as recompiler can't handle it if check_define __thumb__; then CFLAGS="$CFLAGS -marm" fi # add -ldl for helix support need_dl=yes # warn about common mistakes if [ "$platform" != "gp2x" -a "$have_armv5" != "yes" ]; then if ! echo "$CFLAGS" | grep -q -- '-mcpu=\|-march='; then echo "Warning: compiling for ARMv4, is that really what you want?" echo "You probably should specify -mcpu= or -march= like this:" echo " CFLAGS=-march=armv6 ./configure ..." fi fi if [ "$have_arm_neon" = "yes" -a "$have_armv7" != "yes" ]; then echo "Warning: compiling for NEON, but not ARMv7?" echo "You probably want to specify -mcpu= or -march= like this:" echo " CFLAGS=-march=armv7-a ./configure ..." fi ;; *) ;; esac case "$platform" in rpi1 | rpi2 | generic | opendingux | win32) need_sdl="yes" ;; esac # basic compiler test cat > $TMPC < $TMPC < int main (int argc, char *argv[]) { uncompress(0, 0, 0, 0); } EOF compile_binary "$@" } check_libpng() { cat > $TMPC < int main (int argc, char *argv[]) { png_init_io(0, 0); } EOF # compile_binary compile_object } check_oss() { cat > $TMPC < #include int main (int argc, char *argv[]) { int a=0; ioctl(0, SNDCTL_DSP_SETFMT, &a); } EOF compile_binary } check_alsa() { cat > $TMPC < int main (int argc, char *argv[]) { snd_pcm_open(0, 0, 0, 0); } EOF compile_binary "$@" } check_sdl() { cat > $TMPC < int main (int argc, char *argv[]) { SDL_OpenAudio(0, 0); } EOF compile_binary "$@" } check_libavcodec() { cat > $TMPC < int main (int argc, char *argv[]) { avcodec_decode_audio3(0, 0, 0, 0); } EOF compile_object "$@" } check_libchdr() { cat > $TMPC < int main (int argc, char *argv[]) { chd_open("", 0, NULL, NULL); } EOF compile_object "$@" } test -n "$SDL_CONFIG" || SDL_CONFIG="$(ls $SYSROOT/*bin*/sdl-config 2>/dev/null | grep /bin/sdl-config | head -n 1)" test -n "$SDL_CONFIG" || SDL_CONFIG="$(ls $SYSROOT/*/*bin*/sdl-config 2>/dev/null | grep /bin/sdl-config | head -n 1)" #test -n "$SDL_CONFIG" || SDL_CONFIG="$(ls $SYSROOT/*bin*/sdl2-config 2>/dev/null | grep /bin/sdl2-config | head -n 1)" #test -n "$SDL_CONFIG" || SDL_CONFIG="$(ls $SYSROOT/*/*bin*/sdl2-config 2>/dev/null | grep /bin/sdl2-config | head -n 1)" SDLVERSION=sdl && echo $SDL_CONFIG | grep -q sdl2 && SDLVERSION=sdl2 test -n "$SDL_CONFIG" || SDL_CONFIG=false MAIN_LDLIBS="$LDLIBS -lm" check_zlib -lz && MAIN_LDLIBS="$MAIN_LDLIBS -lz" || need_zlib="yes" MAIN_LDLIBS="-lpng $MAIN_LDLIBS" check_libpng || fail "please install libpng (libpng-dev)" case "$have_libavcodec" in y|Y|yes) if check_libavcodec; then have_libavcodec="yes" need_dl=yes else have_libavcodec="no" fi ;; *) have_libavcodec="no" ;; esac #if check_libchdr; then # have_libchdr="yes" # MAIN_LDLIBS="-lchdr $MAIN_LDLIBS" #fi # find what audio support we can compile if [ "x$sound_drivers" = "x" ]; then if check_oss; then sound_drivers="$sound_drivers oss"; fi if check_alsa -lasound; then sound_drivers="$sound_drivers alsa" MAIN_LDLIBS="-lasound $MAIN_LDLIBS" fi if [ "$need_sdl" = "yes" ] || check_sdl `$SDL_CONFIG --cflags --libs`; then sound_drivers="$sound_drivers sdl" need_sdl="yes" fi else if echo $sound_drivers | grep -q "\"; then check_oss || fail "oss support is missing" fi if echo $sound_drivers | grep -q "\"; then MAIN_LDLIBS="-lasound $MAIN_LDLIBS" check_alsa -lasound || fail "please install libasound2-dev" fi fi if [ "$need_sdl" = "yes" ]; then [ -x "$SDL_CONFIG" ] || \ fail "sdl-config is missing; please install libsdl (libsdl1.2-dev)" CFLAGS="$CFLAGS `$SDL_CONFIG --cflags`" MAIN_LDLIBS="`$SDL_CONFIG --libs` $MAIN_LDLIBS" SYSLIBS="$SYSLIBS -ldl" need_dl=yes check_sdl `$SDL_CONFIG --libs` || fail "please install libsdl (libsdl1.2-dev)" if [ "$SDLVERSION" = "sdl2" ]; then CFLAGS="$CFLAGS -D__USE_SDL2__" fi fi # add -ldl if needed if [ "$need_dl" = "yes" ]; then case "$MAIN_LDLIBS" in *"-ldl"*) ;; *) MAIN_LDLIBS="$MAIN_LDLIBS -ldl" ;; esac fi if check_option -Wno-unused_result; then CFLAGS="$CFLAGS -Wno-unused-result" fi # set things that failed to autodetect to "no" test "x$have_armv6" != "x" || have_armv6="no" test "x$have_armv7" != "x" || have_armv7="no" test "x$have_libavcodec" != "x" || have_libavcodec="no" test "x$have_libchdr" != "x" || have_libchdr="no" echo "architecture $ARCH" echo "platform $platform" echo "sound drivers $sound_drivers" echo "C compiler $CC" echo "C compiler flags $MFLAGS $CFLAGS" echo "libraries $MAIN_LDLIBS" echo "linker flags $LDFLAGS" echo "libavcodec (mp3) $have_libavcodec" #echo "libchdr $have_libchdr" # echo "ARMv7 optimizations $have_armv7" echo "# Automatically generated by configure" > $config_mak printf "# Configured with:" >> $config_mak printf " '%s'" "$0" "$@" >> $config_mak echo >> $config_mak echo "CC = $CC" >> $config_mak echo "CXX = $CXX" >> $config_mak echo "AS = $AS" >> $config_mak echo "STRIP = $STRIP" >> $config_mak echo "LD = $LD" >> $config_mak echo "CFLAGS += $MFLAGS $CFLAGS" >> $config_mak echo "ASFLAGS += $MFLAGS $ASFLAGS" >> $config_mak echo "LDFLAGS += $LDFLAGS" >> $config_mak echo "LDLIBS += $MAIN_LDLIBS" >> $config_mak echo >> $config_mak echo "ARCH = $ARCH" >> $config_mak echo "PLATFORM = $platform" >> $config_mak echo "SOUND_DRIVERS = $sound_drivers" >> $config_mak if [ "$have_gles" = "yes" ]; then echo "HAVE_GLES = 1" >> $config_mak fi if [ "$have_libavcodec" = "yes" ]; then echo "HAVE_LIBAVCODEC = 1" >> $config_mak fi if [ "$have_libchdr" = "yes" ]; then echo "HAVE_LIBCHDR = 1" >> $config_mak fi if [ "$need_zlib" = "yes" ]; then echo "PLATFORM_ZLIB = 1" >> $config_mak fi if [ "$ARCH" = "arm" -a "$have_armv6" != "yes" -a "$have_armv7" != "yes" ]; then # pass info to cyclone not to use newer arm arch instructions echo "HAVE_ARMv6 = 0" >> $config_mak fi # GP2X toolchains are too old for UAL asm, # so add this here to not litter main Makefile #if [ "$platform" = "gp2x" ]; then # echo >> $config_mak # echo '%.o: %.S' >> $config_mak # echo ' $(CC) $(CFLAGS) -E -c $^ -o /tmp/$(notdir $@).s' >> $config_mak # echo ' $(AS) $(ASFLAGS) /tmp/$(notdir $@).s -o $@' >> $config_mak #fi # use pandora's skin (for now) test -e skin || ln -s platform/pandora/skin skin # vim:shiftwidth=2:expandtab