#!/bin/sh # some elements originated from qemu configure set -e TMPC="/tmp/pcsx-conf-${RANDOM}-$$-${RANDOM}.c" TMPO="/tmp/pcsx-conf-${RANDOM}-$$-${RANDOM}.o" TMPB="/tmp/pcsx-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 $MAIN_LDLIBS $@" echo $c >> config.log $c >> config.log 2>&1 } check_define() { echo "" > $TMPC $CC -E -dD $CFLAGS $TMPC | grep -q $1 || return 1 return 0 } # setting options to "yes" or "no" will make that choice default, # "" means "autodetect". platform_list="generic pandora maemo caanoo libretro" platform="generic" builtin_gpu_list="peops unai neon" builtin_gpu="" sound_driver_list="oss alsa sdl pulseaudio libretro" sound_drivers="" plugins="plugins/spunull/spunull.so \ plugins/dfxvideo/gpu_peops.so plugins/gpu_unai/gpu_unai.so" ram_fixed="no" drc_cache_base="no" have_armv6="" have_armv7="" have_arm_neon="" have_tslib="" enable_dynarec="yes" need_sdl="no" need_libpicofe="yes" need_warm="no" # these are for known platforms optimize_cortexa8="no" optimize_arm926ej="no" # hardcoded stuff CC="${CC-${CROSS_COMPILE}gcc}" CXX="${CXX-${CROSS_COMPILE}g++}" AS="${AS-${CROSS_COMPILE}as}" AR="${AS-${CROSS_COMPILE}ar}" MAIN_LDLIBS="$LDLIBS -ldl -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 generic) ;; pandora) sound_drivers="oss alsa" ram_fixed="yes" drc_cache_base="yes" optimize_cortexa8="yes" have_arm_neon="yes" ;; maemo) ram_fixed="yes" drc_cache_base="yes" optimize_cortexa8="yes" have_arm_neon="yes" ;; caanoo) sound_drivers="oss" ram_fixed="yes" drc_cache_base="yes" optimize_arm926ej="yes" need_warm="yes" ;; libretro) sound_drivers="libretro" need_libpicofe="no" ;; *) 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" ;; --gpu=*) builtin_gpu="$optarg" ;; --sound-drivers=*) sound_drivers="$optarg" ;; --enable-neon) have_arm_neon="yes" ;; --disable-neon) have_arm_neon="no" ;; --disable-dynarec) enable_dynarec="no" ;; *) 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 " --gpu=NAME builtin gpu plugin [guessed]" echo " available: $builtin_gpu_list" echo " --sound-drivers=LIST sound output drivers [guessed]" echo " available: $sound_driver_list" echo " --enable-neon" echo " --disable-neon enable/disable ARM NEON optimizations [guessed]" echo " --disable-dynarec disable dynamic recompiler" echo " (dynarec is only available and enabled on ARM)" echo "influential environment variables:" echo " CROSS_COMPILE CC CXX AS AR CFLAGS ASFLAGS LDFLAGS LDLIBS" exit 1 fi # validate selections if [ "x$builtin_gpu" != "x" ]; then if ! echo $builtin_gpu_list | grep -q "\<$builtin_gpu\>"; then fail "unsupported builtin gpu plugin: $builtin_gpu" fi fi 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 [ "$need_libpicofe" = "yes" ]; then if ! test -f "frontend/libpicofe/README"; then fail "libpicofe is missing, please run 'git submodule init && git submodule update'" fi 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 -v 2>&1 | grep -i 'target:' | awk '{print $2}' \ | awk -F '-' '{print $1}'` fi # ARM stuff if [ "$ARCH" = "arm" ]; then if [ "$optimize_cortexa8" = "yes" ]; then CFLAGS="$CFLAGS -mcpu=cortex-a8 -mtune=cortex-a8" ASFLAGS="$ASFLAGS -mcpu=cortex-a8" fi if [ "$optimize_arm926ej" = "yes" ]; then CFLAGS="$CFLAGS -mcpu=arm926ej-s -mtune=arm926ej-s" ASFLAGS="$ASFLAGS -mcpu=arm926ej-s -mfloat-abi=softfp" 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_armv6" = "x" ]; then have_armv6=`check_define __ARM_ARCH_6 && echo yes` || true fi if [ "x$have_armv7" = "x" ]; then if check_define __ARM_ARCH_7A__; then have_armv6="yes" have_armv7="yes" fi fi if [ "x$builtin_gpu" = "x" ]; then if [ "$have_arm_neon" = "yes" ]; then builtin_gpu="neon" elif [ "$have_armv7" != "yes" ]; then # pre-ARMv7 hardware is usually not fast enough for peops builtin_gpu="unai" else builtin_gpu="peops" fi fi # automatically set mfpu and mfloat-abi if they are not set if [ "$have_arm_neon" = "yes" ]; then echo "$CFLAGS" | grep -q -- '-mfpu=' || CFLAGS="$CFLAGS -mfpu=neon" echo "$ASFLAGS" | grep -q -- '-mfpu=' || ASFLAGS="$ASFLAGS -mfpu=neon" elif [ "$have_armv6" = "yes" ]; then echo "$CFLAGS" | grep -q -- '-mfpu=' || CFLAGS="$CFLAGS -mfpu=vfp" echo "$ASFLAGS" | grep -q -- '-mfpu=' || ASFLAGS="$ASFLAGS -mfpu=vfp" fi floatabi_set_by_gcc=`$CC -v 2>&1 | grep -q -- --with-float= && echo yes` || true if [ "$floatabi_set_by_gcc" != "yes" -a "$have_armv6" = "yes" ]; then echo "$CFLAGS" | grep -q -- '-mfloat-abi=' || CFLAGS="$CFLAGS -mfloat-abi=softfp" echo "$ASFLAGS" | grep -q -- '-mfloat-abi=' || ASFLAGS="$ASFLAGS -mfloat-abi=softfp" fi # must disable thumb as recompiler can't handle it if check_define __thumb__; then CFLAGS="$CFLAGS -marm" fi if [ "$have_armv7" = "yes" ]; then ASFLAGS="$ASFLAGS --defsym HAVE_ARMV7=1" else ASFLAGS="$ASFLAGS --defsym HAVE_ARMV7=0" fi else # dynarec only available on ARM enable_dynarec="no" fi if [ "x$builtin_gpu" = "x" ]; then builtin_gpu="peops" fi # supposedly we can avoid -fPIC on armv5 for slightly better performace? if [ "$ARCH" != "arm" -o "$have_armv6" = "yes" ]; then PLUGIN_CFLAGS="$PLUGIN_CFLAGS -fPIC" fi if [ "$ram_fixed" = "yes" ]; then CFLAGS="$CFLAGS -DRAM_FIXED" fi case "$platform" in generic) need_sdl="yes" ;; maemo) maemo_cflags=`pkg-config --cflags hildon-1` maemo_ldlibs=`pkg-config --libs hildon-1` CFLAGS="$CFLAGS -DMAEMO -DMAEMO_CHANGES $maemo_cflags" MAIN_LDLIBS="$MAIN_LDLIBS $maemo_ldlibs" ;; libretro) CFLAGS="$CFLAGS -fPIC" MAIN_LDFLAGS="$MAIN_LDFLAGS -shared -Wl,--no-undefined" ;; esac # header/library presence tests check_zlib() { cat > $TMPC < int main(void) { uncompress(0, 0, 0, 0); } EOF compile_binary } check_bzlib() { cat > $TMPC < void main() { BZ2_bzBuffToBuffDecompress(0, 0, 0, 0, 0, 0); } EOF compile_object } check_libpng() { cat > $TMPC < void main() { png_init_io(0, 0); } EOF compile_binary } check_oss() { cat > $TMPC < #include void main() { int a=0; ioctl(0, SNDCTL_DSP_SETFMT, &a); } EOF compile_binary } check_alsa() { cat > $TMPC < void main() { snd_pcm_open(0, 0, 0, 0); } EOF compile_binary "$@" } check_sdl() { cat > $TMPC < void main() { SDL_OpenAudio(0, 0); } EOF compile_binary "$@" } MAIN_LDLIBS="$MAIN_LDLIBS -lz" check_zlib || fail "please install zlib (libz-dev)" check_bzlib || fail "please install bz2lib (libbz2-dev)" MAIN_LDLIBS="-lpng $MAIN_LDLIBS" check_libpng || fail "please install libpng (libpng-dev)" # 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 || fail "please install libasound2-dev" fi fi if [ "$need_sdl" = "yes" ]; then which sdl-config > /dev/null || \ 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 || fail "please install libsdl (libsdl1.2-dev)" fi # check for tslib (only headers needed) if [ "x$have_tslib" = "x" ]; then cat > $TMPC < void test(struct ts_sample sample) {} EOF if compile_object; then have_tslib="yes" else have_tslib="no" fi fi # check for GLES headers cat > $TMPC < #include #include void *test(void) { return eglGetDisplay( (EGLNativeDisplayType)0 ); } EOF if compile_object; then plugins="$plugins plugins/gpu-gles/gpu_gles.so" fi if [ "$have_arm_neon" = "yes" -a "$builtin_gpu" != "neon" ]; then plugins="$plugins plugins/gpu_neon/gpu_neon.so" fi cat > $TMPC < $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 "CFLAGS += $CFLAGS" >> $config_mak echo "ASFLAGS += $ASFLAGS" >> $config_mak echo "LDFLAGS += $LDFLAGS" >> $config_mak echo "MAIN_LDFLAGS += $MAIN_LDFLAGS" >> $config_mak echo "MAIN_LDLIBS += $MAIN_LDLIBS" >> $config_mak echo "PLUGIN_CFLAGS += $PLUGIN_CFLAGS" >> $config_mak echo >> $config_mak if [ "$platform" = "libretro" ]; then echo "TARGET = libretro.so" >> $config_mak fi echo "ARCH = $ARCH" >> $config_mak echo "PLATFORM = $platform" >> $config_mak echo "BUILTIN_GPU = $builtin_gpu" >> $config_mak echo "SOUND_DRIVERS = $sound_drivers" >> $config_mak if [ "$ARCH" = "arm" ]; then echo "PLUGINS = $plugins" >> $config_mak else echo -n "PLUGINS =" >> $config_mak for p in $plugins; do echo -n " ${p}.${ARCH}" >> $config_mak done echo >> $config_mak fi if [ "$have_armv6" = "yes" ]; then echo "HAVE_ARMV6 = 1" >> $config_mak fi if [ "$have_armv7" = "yes" ]; then echo "HAVE_ARMV7 = 1" >> $config_mak fi if [ "$have_arm_neon" = "yes" ]; then echo "HAVE_NEON = 1" >> $config_mak fi if [ "$have_tslib" = "yes" ]; then echo "HAVE_TSLIB = 1" >> $config_mak fi if [ "$enable_dynarec" = "yes" ]; then echo "USE_DYNAREC = 1" >> $config_mak fi if [ "$drc_cache_base" = "yes" ]; then echo "DRC_CACHE_BASE = 1" >> $config_mak fi # use pandora's skin (for now) test -e skin || ln -s frontend/pandora/skin skin # vim:shiftwidth=2:expandtab