<URL: http://bugs.freeciv.org/Ticket/Display.html?id=39600 >

On some platforms (including Windows and Mac OS X) it's necessary to
include SDL.h in civclient.c when SDL is used (for sound support,
gui-sdl or gui-ftwl) to avoid a compiler warning about missing previous
prototype for 'SDL_main' and, in the case of Mac OS X, to make the
client run at all (unless the sdl-config script is patched to add
"-Dmain=SDL_main" to the CFLAGS).

Explanation from the SDL FAQ at www.libsdl.org:

"Just like main() is the entry point for C programs (inc. C++,
Objective-C, and Objective-C++), SDL_main() is the main entry point for
SDL programs. However, you don't actually write an SDL_main() function.
The header file "SDL_main.h" remaps your main() function to the
SDL_main() function with a function macro. Your SDL_main() function is
called after the code in SDLMain.m has performed the required
"bootstrap" initializations to support the SDL runtime.

There are three things you have to do:

   1. You must include either SDLMain.m/.h or libSDLmain in your
application, because this is the code that defines SDL's entry point. If
you fail to do this, it is likely that "_main undefined" will be thrown
by the linker.
   2. You must give your main() procedure the following prototype:

      int main(int argc, char*argv[]);

   3. You must make sure the file containing your main() procedure
#includes SDL.h.

Otherwise, the macro will not remap main() to SDL_main(), you will get
an undefined _main error, or the bootstrap process will not run, and SDL
will behave strangely or your application will crash or hang."

--------------------------------------------------------------------

Patches for S2_0, S2_1 and trunk are attached. BTW, since ESD and ALSA
sound support was removed from S2_1 and trunk a while ago, we don't need
esd.m4 and alsa.m4 anymore, do we?

Index: client/audio.c
===================================================================
--- client/audio.c	(revision 13366)
+++ client/audio.c	(working copy)
@@ -29,7 +29,7 @@
 #include "support.h"
 
 #include "audio_none.h"
-#ifdef SDL
+#ifdef AUDIO_SDL
 #include "audio_sdl.h"
 #endif
 
@@ -142,7 +142,7 @@
   assert(num_plugins_used == 1);
   selected_plugin = 0;
 
-#ifdef SDL
+#ifdef AUDIO_SDL
   audio_sdl_init();
 #endif
 }
@@ -250,7 +250,7 @@
     return;
   }
 
-#ifdef SDL
+#ifdef AUDIO_SDL
   if (audio_select_plugin("sdl")) return; 
 #endif
   freelog(LOG_ERROR,
Index: client/civclient.c
===================================================================
--- client/civclient.c	(revision 13366)
+++ client/civclient.c	(working copy)
@@ -19,6 +19,10 @@
 #include <windows.h>	/* LoadLibrary() */
 #endif
 
+#ifdef SDL
+#include "SDL.h"
+#endif
+
 #include <assert.h>
 #include <math.h>
 #include <stdio.h>
Index: client/Makefile.am
===================================================================
--- client/Makefile.am	(revision 13366)
+++ client/Makefile.am	(working copy)
@@ -27,10 +27,10 @@
 LIBFTWL = ../utility/ftwl/libftwl.a
 endif
 
-ALL_SDL_FILES=audio_sdl.c audio_sdl.h
+ALL_AUDIO_SDL_FILES=audio_sdl.c audio_sdl.h
 
-if SDL
-SDL_FILES=$(ALL_SDL_FILES)
+if AUDIO_SDL
+AUDIO_SDL_FILES=$(ALL_AUDIO_SDL_FILES)
 endif
 
 if MINGW32
@@ -105,7 +105,7 @@
 		gui-mui/worklistclass.c          \
 		gui-mui/worklistclass.h          \
 		\
-		$(ALL_SDL_FILES)
+		$(ALL_AUDIO_SDL_FILES)
 
 
 ## This is usually false, so "include" is not recursed into 
@@ -126,7 +126,7 @@
 
 ## Above, note -I../intl instead of -I$(top_srdir/intl) is deliberate.
 
-civclient_SOURCES = $(ESD_FILES) $(SDL_FILES) $(ALSA_FILES) $(WINMM_FILES) \
+civclient_SOURCES = $(AUDIO_SDL_FILES) \
 	attribute.h	\
 	attribute.c	\
 	citydlg_common.c \
Index: configure.ac
===================================================================
--- configure.ac	(revision 13366)
+++ configure.ac	(working copy)
@@ -385,6 +385,7 @@
 if test "$ftwl" = sdl ; then
      FTWL_CFLAGS=`sdl-config --cflags`" "`freetype-config --cflags`
      FTWL_LIBS=`sdl-config --libs`" -lpng "`freetype-config --libs`
+     AC_DEFINE(SDL, 1, [SDL is used])
 fi
 
 if test "$ftwl" = opengl ; then
@@ -457,7 +458,7 @@
     AC_MSG_ERROR(could not guess which client to compile)
   fi
 
-  dnl Check for sound support, sets SOUND_CFLAGS, SOUND_LIBS, SDL
+  dnl Check for sound support, sets SOUND_CFLAGS, SOUND_LIBS, AUDIO_SDL
   FC_CHECK_SOUND()
 
   gui_sources="gui-$client"
@@ -480,7 +481,7 @@
 AC_SUBST(SOUND_LIBS)
 AC_SUBST([VERSION_WITHOUT_LABEL])
 AC_SUBST([VERSION_LABEL])
-AM_CONDITIONAL(SDL, test "x$SDL_mixer" = "xyes")
+AM_CONDITIONAL(AUDIO_SDL, test "x$SDL_mixer" = "xyes")
 AM_CONDITIONAL(CLIENT_GUI_SDL, test "$gui_sources" = "gui-sdl")
 AM_CONDITIONAL(CLIENT_GUI_GTK_2_0, test "$gui_sources" = "gui-gtk-2.0")
 AM_CONDITIONAL(CLIENT_GUI_XAW, test "$gui_sources" = "gui-xaw")
Index: m4/sdl-client.m4
===================================================================
--- m4/sdl-client.m4	(revision 13366)
+++ m4/sdl-client.m4	(working copy)
@@ -10,9 +10,9 @@
   elif test "$client" = sdl ; then
     AM_PATH_SDL([1.1.4], [sdl_found="yes"], [sdl_found="no"])
     if test "$sdl_found" = yes; then
+      ac_save_CPPFLAGS="$CPPFLAGS"
       ac_save_CFLAGS="$CFLAGS"
       ac_save_LIBS="$LIBS"
-      ac_save_CPPFLAGS="$CPPFLAGS"
       CPPFLAGS="$CPPFLAGS $SDL_CFLAGS"
       CFLAGS="$CFLAGS $SDL_CFLAGS"
       LIBS="$LIBS $SDL_LIBS"
@@ -22,24 +22,24 @@
         AC_CHECK_HEADER([SDL/SDL_image.h],
                         [sdl_image_h_found="yes"], [sdl_image_h_found="no"])
     	if test "$sdl_image_h_found" = yes; then
+          CPPFLAGS="$ac_save_CPPFLAGS"
+          CFLAGS="$ac_save_CFLAGS"
+          LIBS="$ac_save_LIBS"
 	  AC_CHECK_FT2([2.1.3], [freetype_found="yes"],[freetype_found="no"])
-            if test "$freetype_found" = yes; then
-	        LIBS=""
-	        CLIENT_CFLAGS="$SDL_CFLAGS $FT2_CFLAGS"
-	        CLIENT_LIBS="$SDL_LIBS -lSDL_image $FT2_LIBS"
-	        found_client=yes
-            elif test "$client" = "sdl"; then
-              AC_MSG_ERROR([specified client 'sdl' not configurable (FreeType2 >= 2.1.3 is needed (www.freetype.org))])
-            fi    
+          if test "$freetype_found" = yes; then
+	    CLIENT_CFLAGS="$SDL_CFLAGS $FT2_CFLAGS"
+	    CLIENT_LIBS="$SDL_LIBS -lSDL_image $FT2_LIBS"
+	    AC_DEFINE(SDL, 1, [SDL is used])
+	    found_client=yes
+          elif test "$client" = "sdl"; then
+            AC_MSG_ERROR([specified client 'sdl' not configurable (FreeType2 >= 2.1.3 is needed (www.freetype.org))])
+          fi    
 	elif test "$client" = "sdl"; then
 	    AC_MSG_ERROR([specified client 'sdl' not configurable (SDL_image-devel is needed (www.libsdl.org))])
 	fi
       elif test "$client" = "sdl"; then
         AC_MSG_ERROR([specified client 'sdl' not configurable (SDL_image is needed (www.libsdl.org))])
       fi
-      CPPFLAGS="$ac_save_CPPFLAGS"
-      CFLAGS="$ac_save_CFLAGS"
-      LIBS="$ac_save_LIBS"
     fi
 
     if test "$found_client" = yes; then
Index: m4/sound.m4
===================================================================
--- m4/sound.m4	(revision 13366)
+++ m4/sound.m4	(working copy)
@@ -15,7 +15,8 @@
       if test "x$SDL_mixer" = "xyes"; then
         SOUND_CFLAGS="$SOUND_CFLAGS $SDL_CFLAGS"
         SOUND_LIBS="$SOUND_LIBS $SDL_LIBS -lSDL_mixer"
-        AC_DEFINE(SDL, 1, [SDL_Mixer support])
+        AC_DEFINE(AUDIO_SDL, 1, [SDL_Mixer support])
+        AC_DEFINE(SDL, 1, [SDL is used])
         AC_MSG_RESULT(yes)
       else
         AC_MSG_RESULT([no, found header but not library!])
Index: client/civclient.c
===================================================================
--- client/civclient.c	(revision 13354)
+++ client/civclient.c	(working copy)
@@ -19,6 +19,10 @@
 #include <windows.h>	/* LoadLibrary() */
 #endif
 
+#ifdef SDL
+#include "SDL.h"
+#endif
+
 #include <assert.h>
 #include <stdio.h>
 #include <stdlib.h>
_______________________________________________
Freeciv-dev mailing list
Freeciv-dev@gna.org
https://mail.gna.org/listinfo/freeciv-dev

Reply via email to