frontend: initial libretro support
[pcsx_rearmed.git] / configure
1 #!/bin/sh
2 # some elements originated from qemu configure
3 set -e
4
5 TMPC="/tmp/pcsx-conf-${RANDOM}-$$-${RANDOM}.c"
6 TMPO="/tmp/pcsx-conf-${RANDOM}-$$-${RANDOM}.o"
7 trap "rm -f $TMPC $TMPO" EXIT INT QUIT TERM
8 rm -f config.log
9
10 compile_object()
11 {
12   c="$CC $CFLAGS -c $TMPC -o $TMPO $1"
13   echo $c >> config.log
14   $c >> config.log 2>&1
15 }
16
17 check_define()
18 {
19   echo "" > $TMPC
20   $CC -E -dD $CFLAGS $TMPC | grep -q $1 || return 1
21   return 0
22 }
23
24 # setting options to "yes" or "no" will make that choice default,
25 # "" means "autodetect".
26
27 platform_list="generic pandora maemo caanoo libretro"
28 platform="generic"
29 sound_driver_list="oss alsa libretro none"
30 sound_driver="alsa"
31 plugins="plugins/spunull/spunull.so \
32 plugins/dfxvideo/gpu_peops.so plugins/gpu_unai/gpu_unai.so"
33 ram_fixed="no"
34 drc_cache_base="no"
35 have_armv6=""
36 have_armv7=""
37 have_arm_neon=""
38 have_tslib=""
39 enable_dynarec="yes"
40 # these are for known platforms
41 optimize_cortexa8="no"
42 optimize_arm926ej="no"
43
44 # hardcoded stuff
45 CC="${CC-${CROSS_COMPILE}gcc}"
46 CXX="${CXX-${CROSS_COMPILE}g++}"
47 AS="${AS-${CROSS_COMPILE}as}"
48 AR="${AS-${CROSS_COMPILE}ar}"
49 config_mak="config.mak"
50
51 # call during arg parsing, so that cmd line can override platform defaults
52 set_platform()
53 {
54   platform=$1
55   case "$platform" in
56   generic)
57     ;;
58   pandora)
59     sound_driver="oss"
60     ram_fixed="yes"
61     drc_cache_base="yes"
62     optimize_cortexa8="yes"
63     have_arm_neon="yes"
64     ;;
65   maemo)
66     ram_fixed="yes"
67     drc_cache_base="yes"
68     optimize_cortexa8="yes"
69     have_arm_neon="yes"
70     ;;
71   caanoo)
72     sound_driver="oss"
73     ram_fixed="yes"
74     drc_cache_base="yes"
75     optimize_arm926ej="yes"
76     ;;
77   libretro)
78     sound_driver="libretro"
79     ;;
80   *)
81     echo "unsupported platform: $platform"
82     exit 1
83     ;;
84   esac
85 }
86
87 for opt do
88   optarg=`expr "x$opt" : 'x[^=]*=\(.*\)'` || true
89   case "$opt" in
90   --help|-h) show_help="yes"
91   ;;
92   --platform=*) set_platform "$optarg"
93   ;;
94   --sound-driver=*) sound_driver="$optarg"
95   ;;
96   --enable-neon) have_arm_neon="yes"
97   ;;
98   --disable-neon) have_arm_neon="no"
99   ;;
100   --disable-dynarec) enable_dynarec="no"
101   ;;
102   *) echo "ERROR: unknown option $opt"; show_help="yes"
103   ;;
104   esac
105 done
106
107 if [ "$show_help" = "yes" ]; then
108   echo "options:"
109   echo "  --help                   print this message"
110   echo "  --platform=NAME          target platform [$platform]"
111   echo "                           available: $platform_list"
112   echo "  --sound-driver=NAME      sound output driver [$sound_driver]"
113   echo "                           available: $sound_driver_list"
114   echo "  --enable-neon"
115   echo "  --disable-neon           enable/disable ARM NEON optimizations [guessed]"
116   echo "  --disable-dynarec        disable dynamic recompiler"
117   echo "                           (dynarec is only available and enabled on ARM)"
118   echo "influential environment variables:"
119   echo "  CROSS_COMPILE CC CXX AS AR CFLAGS ASFLAGS LDFLAGS LDLIBS"
120   exit 1
121 fi
122
123 case "$sound_driver" in
124 oss|alsa|libretro|none)
125   ;;
126 *)
127   echo "unsupported sound driver: $sound_driver"
128   exit 1
129   ;;
130 esac
131
132 if [ -z "$ARCH" ]; then
133   ARCH=`$CC -v 2>&1 | grep -i 'target:' | awk '{print $2}' \
134         | awk -F '-' '{print $1}'`
135 fi
136
137 # ARM stuff
138 if [ "$ARCH" = "arm" ]; then
139   if [ "$optimize_cortexa8" = "yes" ]; then
140   # both: -mfpu=neon
141     CFLAGS="$CFLAGS -mcpu=cortex-a8 -mtune=cortex-a8"
142     ASFLAGS="$ASFLAGS -mcpu=cortex-a8"
143   fi
144   if [ "$optimize_arm926ej" = "yes" ]; then
145     CFLAGS="$CFLAGS -mcpu=arm926ej-s -mtune=arm926ej-s"
146     ASFLAGS="$ASFLAGS -mcpu=arm926ej-s -mfloat-abi=softfp"
147   fi
148
149   if [ "x$have_arm_neon" = "x" ]; then
150     # detect NEON from user-supplied cflags to enable asm code
151     have_arm_neon=`check_define __ARM_NEON__ && echo yes` || true
152   fi
153   if [ "x$have_armv6" = "x" ]; then
154     have_armv6=`check_define __ARM_ARCH_6 && echo yes` || true
155   fi
156   if [ "x$have_armv7" = "x" ]; then
157     if check_define __ARM_ARCH_7A__; then
158       have_armv6="yes"
159       have_armv7="yes"
160     fi
161   fi
162
163   # set mfpu and mfloat-abi if they are not set
164   if [ "$have_arm_neon" = "yes" ]; then
165     echo "$CFLAGS" | grep -q -- '-mfpu=' || CFLAGS="$CFLAGS -mfpu=neon"
166     echo "$ASFLAGS" | grep -q -- '-mfpu=' || ASFLAGS="$ASFLAGS -mfpu=neon"
167   elif [ "$have_armv6" = "yes" ]; then
168     echo "$CFLAGS" | grep -q -- '-mfpu=' || CFLAGS="$CFLAGS -mfpu=vfp"
169     echo "$ASFLAGS" | grep -q -- '-mfpu=' || ASFLAGS="$ASFLAGS -mfpu=vfp"
170   fi
171   if [ "$have_armv6" = "yes" ]; then
172     echo "$CFLAGS" | grep -q -- '-mfloat-abi=' || CFLAGS="$CFLAGS -mfloat-abi=softfp"
173     echo "$ASFLAGS" | grep -q -- '-mfloat-abi=' || ASFLAGS="$ASFLAGS -mfloat-abi=softfp"
174   fi
175
176   # must disable -mthumb as recompiler can't handle it
177   if check_define __thumb__; then
178     CFLAGS="$CFLAGS -mno-thumb"
179   fi
180
181   if [ "$have_armv7" = "yes" ]; then
182     ASFLAGS="$ASFLAGS --defsym HAVE_ARMV7=1"
183   else
184     ASFLAGS="$ASFLAGS --defsym HAVE_ARMV7=0"
185   fi
186 else
187   # dynarec only available on ARM
188   enable_dynarec="no"
189 fi
190
191 if [ "$ARCH" = "x86_64" ]; then
192   # currently we are full of 32bit assumptions,
193   # at least savestate compatibility will break without these
194   CFLAGS="$CFLAGS -m32"
195   LDFLAGS="$LDFLAGS -m32"
196 fi
197
198 # supposedly we can avoid -fPIC on armv5 for slightly better performace?
199 if [ "$ARCH" != "arm" -o "$have_armv6" = "yes" ]; then
200   PLUGIN_CFLAGS="$PLUGIN_CFLAGS -fPIC"
201 fi
202
203 if [ "$ram_fixed" = "yes" ]; then
204   CFLAGS="$CFLAGS -DRAM_FIXED"
205 fi
206
207 case "$platform" in
208 generic)
209   generic_cflags=`sdl-config --cflags`
210   generic_ldlibs=`sdl-config --libs`
211   CFLAGS="$CFLAGS $generic_cflags"
212   LDFLAGS="$LDFLAGS $generic_ldlibs"
213   ;;
214 maemo)
215   maemo_cflags=`pkg-config --cflags hildon-1`
216   maemo_ldlibs=`pkg-config --libs hildon-1`
217   CFLAGS="$CFLAGS -DMAEMO -DMAEMO_CHANGES $maemo_cflags"
218   LDFLAGS="$LDFLAGS $maemo_ldlibs"
219   ;;
220 libretro)
221   CFLAGS="$CFLAGS -fPIC"
222   LDFLAGS="$LDFLAGS -shared"
223   ;;
224 esac
225
226 # check for tslib (only headers needed)
227 if [ "x$have_tslib" = "x" ]; then
228   cat > $TMPC <<EOF
229   #include <tslib.h>
230   void test(struct ts_sample sample) {}
231 EOF
232   if compile_object; then
233     have_tslib="yes"
234   else
235     have_tslib="no"
236   fi
237 fi
238
239 # check for GLES headers
240 cat > $TMPC <<EOF
241 #include <GLES/gl.h>
242 #include <GLES/glext.h>
243 #include <EGL/egl.h>
244 void *test(void) {
245   return eglGetDisplay( (EGLNativeDisplayType)0 );
246 }
247 EOF
248 if compile_object; then
249   plugins="$plugins plugins/gpu-gles/gpu_gles.so"
250 fi
251
252 # short plugin list for display
253 for p in $plugins; do
254   p1=`basename $p`
255   plugins_short="$p1 $plugins_short"
256 done
257
258 # set things that failed to autodetect to "no"
259 test "x$have_armv6" != "x" || have_armv6="no"
260 test "x$have_armv7" != "x" || have_armv7="no"
261 test "x$have_arm_neon" != "x" || have_arm_neon="no"
262
263 echo "architecture        $ARCH"
264 echo "platform            $platform"
265 echo "sound driver        $sound_driver"
266 echo "plugins             $plugins_short"
267 echo "C compiler          $CC"
268 echo "C compiler flags    $CFLAGS"
269 echo "linker flags        $LDFLAGS"
270 echo "enable dynarec      $enable_dynarec"
271 echo "ARMv7 optimizations $have_armv7"
272 echo "enable ARM NEON     $have_arm_neon"
273 echo "tslib support       $have_tslib"
274
275 echo "# Automatically generated by configure" > $config_mak
276 printf "# Configured with:" >> $config_mak
277 printf " '%s'" "$0" "$@" >> $config_mak
278 echo >> $config_mak
279
280 echo "CC = $CC" >> $config_mak
281 echo "CXX = $CXX" >> $config_mak
282 echo "AS = $AS" >> $config_mak
283 echo "CFLAGS += $CFLAGS" >> $config_mak
284 echo "ASFLAGS += $ASFLAGS" >> $config_mak
285 echo "LDFLAGS += $LDFLAGS" >> $config_mak
286 echo "LDLIBS += $LDLIBS" >> $config_mak
287 echo "PLUGIN_CFLAGS += $PLUGIN_CFLAGS" >> $config_mak
288 echo >> $config_mak
289
290 if [ "$platform" = "libretro" ]; then
291   echo "TARGET = libretro.so" >> $config_mak
292 fi
293 echo "ARCH = $ARCH" >> $config_mak
294 echo "PLATFORM = $platform" >> $config_mak
295 case "$sound_driver" in
296 oss)
297   echo "USE_OSS = 1" >> $config_mak
298   ;;
299 alsa)
300   echo "USE_ALSA = 1" >> $config_mak
301   ;;
302 none)
303   echo "USE_NO_SOUND = 1" >> $config_mak
304   ;;
305 esac
306 if [ "$ARCH" = "arm" ]; then
307   echo "PLUGINS = $plugins" >> $config_mak
308 else
309   echo -n "PLUGINS =" >> $config_mak
310   for p in $plugins; do
311     echo -n " ${p}.${ARCH}" >> $config_mak
312   done
313   echo >> $config_mak
314 fi
315 if [ "$have_armv6" = "yes" ]; then
316   echo "HAVE_ARMV6 = 1" >> $config_mak
317 fi
318 if [ "$have_armv7" = "yes" ]; then
319   echo "HAVE_ARMV7 = 1" >> $config_mak
320 fi
321 if [ "$have_arm_neon" = "yes" ]; then
322   echo "HAVE_NEON = 1" >> $config_mak
323 fi
324 if [ "$have_tslib" = "yes" ]; then
325   echo "HAVE_TSLIB = 1" >> $config_mak
326 fi
327 if [ "$enable_dynarec" = "yes" ]; then
328   echo "USE_DYNAREC = 1" >> $config_mak
329 fi
330 if [ "$drc_cache_base" = "yes" ]; then
331   echo "DRC_CACHE_BASE = 1" >> $config_mak
332 fi
333
334 # use pandora's skin (for now)
335 test -e skin || ln -s frontend/pandora/skin skin
336
337 # vim:shiftwidth=2:expandtab