123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446 |
- #!/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 $CFLAGS -c $TMPC -o $TMPO $@"
- echo $c >> config.log
- $c >> config.log 2>&1
- }
- compile_binary()
- {
- c="$CC $CFLAGS $TMPC -o $TMPB $LDFLAGS $@"
- 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 $CFLAGS pico/arm_features.h | grep -q $1 || return 1
- return 0
- }
- # setting options to "yes" or "no" will make that choice default,
- # "" means "autodetect".
- platform_list="generic pandora gp2x wiz caanoo opendingux gcw0 rg350 rpi1 rpi2"
- platform="generic"
- sound_driver_list="oss alsa sdl"
- sound_drivers=""
- have_armv5=""
- have_armv6=""
- have_armv7=""
- have_arm_oabi=""
- have_arm_neon=""
- have_libavcodec=""
- need_sdl="no"
- need_zlib="no"
- # these are for known platforms
- optimize_cortexa8="no"
- optimize_cortexa7="no"
- optimize_arm1176jzf="no"
- optimize_arm926ej="no"
- optimize_arm920="no"
- # hardcoded stuff
- CC="${CC-${CROSS_COMPILE}gcc}"
- CXX="${CXX-${CROSS_COMPILE}g++}"
- AS="${AS-${CROSS_COMPILE}as}"
- STRIP="${STRIP-${CROSS_COMPILE}strip}"
- SYSROOT=`$CC $CFLAGS $LDFLAGS --print-sysroot 2> /dev/null || true`
- 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
- MAIN_LDLIBS="$LDLIBS -lm"
- config_mak="config.mak"
- fail()
- {
- echo "$@"
- exit 1
- }
- # call during arg parsing, so that cmd line can override platform defaults
- set_platform()
- {
- platform=$1
- case "$platform" in
- rpi1)
- optimize_arm1176jzf="yes"
- ;;
- rpi2)
- optimize_cortexa7="yes"
- have_arm_neon="yes"
- ;;
- generic)
- ;;
- opendingux | gcw0 | rg350)
- sound_drivers="sdl"
- # both are really an opendingux
- CFLAGS="$CFLAGS -D__`echo $platform | tr '[a-z]' '[A-Z]'`__"
- platform="opendingux"
- ;;
- pandora)
- sound_drivers="oss alsa"
- optimize_cortexa8="yes"
- have_arm_neon="yes"
- ;;
- gp2x | wiz | caanoo)
- sound_drivers="oss"
- optimize_arm920="yes"
- # 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
- CFLAGS="$CFLAGS -D__GP2X__"
- platform="gp2x"
- ;;
- *)
- 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"
- ;;
- *) 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 "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 -dumpmachine | awk -F '-' '{print $1}'`
- fi
- # CPU/ABI stuff first, else compile test may fail
- case "$ARCH" in
- arm*)
- # ARM stuff
- ARCH="arm"
- if [ "$optimize_cortexa8" = "yes" ]; then
- CFLAGS="$CFLAGS -mcpu=cortex-a8 -mtune=cortex-a8"
- ASFLAGS="$ASFLAGS -mcpu=cortex-a8"
- fi
- if [ "$optimize_cortexa7" = "yes" ]; then
- CFLAGS="$CFLAGS -mcpu=cortex-a7"
- ASFLAGS="$ASFLAGS -mcpu=cortex-a7"
- fi
- if [ "$optimize_arm1176jzf" = "yes" ]; then
- CFLAGS="$CFLAGS -mcpu=arm1176jzf-s -mfloat-abi=hard"
- ASFLAGS="$ASFLAGS -mcpu=arm1176jzf-s -mfloat-abi=hard"
- fi
- if [ "$optimize_arm926ej" = "yes" ]; then
- CFLAGS="$CFLAGS -mcpu=arm926ej-s -mtune=arm926ej-s"
- ASFLAGS="$ASFLAGS -mcpu=arm926ej-s -mfloat-abi=softfp"
- fi
- if [ "$optimize_arm920" = "yes" ]; then
- CFLAGS="$CFLAGS -mcpu=arm920t -mtune=arm920t"
- ASFLAGS="$ASFLAGS -mcpu=arm920t -mfloat-abi=soft"
- 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
- # OABI/EABI selection
- if [ "$have_arm_oabi" = "yes" ] && check_option -mabi=apcs-gnu; then
- echo "$CFLAGS" | grep -q -- '-mabi=' || CFLAGS="$CFLAGS -mabi=apcs-gnu"
- echo "$CFLAGS" | grep -q -- '-m\(no-\)*thumb-interwork' || CFLAGS="$CFLAGS -mno-thumb-interwork"
- echo "$ASFLAGS" | grep -q -- '-mabi=' || ASFLAGS="$ASFLAGS -mabi=apcs-gnu"
- fi
- # automatically set mfpu and mfloat-abi if they are not set
- if [ "$have_arm_neon" = "yes" ]; then
- fpu="neon"
- abi="hard"
- elif [ "$have_armv6" = "yes" ]; then
- fpu="vfp"
- abi="softfp"
- elif check_option -mfpu=fpa; then
- fpu="fpa" # compatibility option for arm-linux-gnueabi-gcc on ubuntu
- abi="soft"
- fi
- if [ "x$fpu" != "x" ]; then
- echo "$CFLAGS" | grep -q -- '-mfpu=' || CFLAGS="$CFLAGS -mfpu=$fpu"
- echo "$ASFLAGS" | grep -q -- '-mfpu=' || ASFLAGS="$ASFLAGS -mfpu=$fpu"
- echo "$CFLAGS" | grep -q -- '-mfloat-abi=' || CFLAGS="$CFLAGS -mfloat-abi=$abi"
- echo "$ASFLAGS" | grep -q -- '-mfloat-abi=' || ASFLAGS="$ASFLAGS -mfloat-abi=$abi"
- fi
- # add -ldl for helix support
- case "$MAIN_LDLIBS" in
- *"-ldl"*) ;;
- *) MAIN_LDLIBS="-ldl $MAIN_LDLIBS" ;;
- esac
- # 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)
- need_sdl="yes"
- ;;
- esac
- # basic compiler test
- cat > $TMPC <<EOF
- int main (int argc, char *argv[]) { return 0; }
- EOF
- if ! compile_binary; then
- fail "compiler test failed, please check config.log"
- fi
- # header/library presence tests
- check_zlib()
- {
- cat > $TMPC <<EOF
- #include <zlib.h>
- int main (int argc, char *argv[]) { uncompress(0, 0, 0, 0); }
- EOF
- compile_binary "$@"
- }
- check_libpng()
- {
- cat > $TMPC <<EOF
- #include <png.h>
- int main (int argc, char *argv[]) { png_init_io(0, 0); }
- EOF
- # compile_binary
- compile_object
- }
- check_oss()
- {
- cat > $TMPC <<EOF
- #include <sys/soundcard.h>
- #include <sys/ioctl.h>
- int main (int argc, char *argv[]) { int a=0; ioctl(0, SNDCTL_DSP_SETFMT, &a); }
- EOF
- compile_binary
- }
- check_alsa()
- {
- cat > $TMPC <<EOF
- #include <alsa/asoundlib.h>
- int main (int argc, char *argv[]) { snd_pcm_open(0, 0, 0, 0); }
- EOF
- compile_binary "$@"
- }
- check_sdl()
- {
- cat > $TMPC <<EOF
- #include <SDL.h>
- int main (int argc, char *argv[]) { SDL_OpenAudio(0, 0); }
- EOF
- compile_binary "$@"
- }
- check_libavcodec()
- {
- cat > $TMPC <<EOF
- #include <libavcodec/avcodec.h>
- int main (int argc, char *argv[]) { avcodec_decode_audio3(0, 0, 0, 0); }
- EOF
- compile_object "$@"
- }
- check_zlib -lz &&MAIN_LDLIBS="$MAIN_LDLIBS -lz" || need_zlib="yes"
- MAIN_LDLIBS="-lpng $MAIN_LDLIBS"
- check_libpng || fail "please install libpng (libpng-dev)"
- if check_libavcodec; then
- have_libavcodec="yes"
- # add -ldl if needed
- case "$MAIN_LDLIBS" in
- *"-ldl"*) ;;
- *) MAIN_LDLIBS="-ldl $MAIN_LDLIBS" ;;
- esac
- 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 "\<oss\>"; then
- check_oss || fail "oss support is missing"
- fi
- if echo $sound_drivers | grep -q "\<alsa\>"; 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"
- check_sdl `$SDL_CONFIG --libs` || fail "please install libsdl (libsdl1.2-dev)"
- if [ "$SDLVERSION" = "sdl2" ]; then
- CFLAGS="$CFLAGS -D__USE_SDL2__"
- fi
- 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"
- echo "architecture $ARCH"
- echo "platform $platform"
- echo "sound drivers $sound_drivers"
- echo "C compiler $CC"
- echo "C compiler flags $CFLAGS"
- echo "libraries $MAIN_LDLIBS"
- echo "linker flags $LDFLAGS"
- echo "libavcodec (mp3) $have_libavcodec"
- # 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 "CFLAGS += $CFLAGS" >> $config_mak
- echo "ASFLAGS += $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_libavcodec" = "yes" ]; then
- echo "HAVE_LIBAVCODEC = 1" >> $config_mak
- fi
- if [ "$need_zlib" = "yes" ]; then
- echo "PLATFORM_ZLIB = 1" >> $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
|