[mapserver-dev] Mixed code and variable definition breaks MSVC builds

Even Rouault even.rouault at mines-paris.org
Sat Jul 21 15:21:49 PDT 2012


Le samedi 21 juillet 2012 23:41:20, Tamas Szekeres a écrit :
> Dear Committers,
> 
> I usually find issues in the mapserver codebase due to the mixed code and
> variable definitions committed into the code according to the C++/C99 style
> coding convention. This makes the code uncompilable with MSVC which is
> still pretty much C89 with a few minor extensions, and it doesn't support
> this practice by default. We could definitely rename the corresponding c
> files to cpp or force the c++ compilation or we can use a commandine option
> to provide the same effect if we would like to follow this convention.
> 
> In the past I continouosly fixed this issue by modifying the corresponding
> code to use C89 forward definitions, but I'm not sure I'd like to take the
> responsibility do such things in a daily practice. At the moment we also
> have such issues in mapserver/master breaking the Windows builds for
> several days.
> 
> What would be the reasonable solution to prevent this issue happening so
> frequently? We should probably make a decision whether we should compile
> MapServer with MSVC for C++  or declare we might want to use forward
> definitions everywhere in the code (Probably MS RFC 7.1 should be modified
> with this).
> 
> BTW: gcc users may sometimes take a look at the daily builds at
> http://www.gisinternals.com/sdk/ to make sure thinks are working correctly
> with MSVC or not.

Based on what exists in GDAL, I suggest the following change in configure.in, 
as well as the addition of m4/ax_cflags_warn_all.m4, which will add by default 
the "-Wdeclaration-after-statement" flag in CFLAGS with GCC, which generates 
"warning: ISO C90 forbids mixed declarations and code" (what would be cool 
would be to error out, only on that error, instead of just warning)

maputil.c: In function 'msOffsetPolyline':
maputil.c:1748: warning: ISO C90 forbids mixed declarations and code
maplabel.c: In function 'msAddLabelGroup':
maplabel.c:361: warning: ISO C90 forbids mixed declarations and code
maplabel.c: In function 'msAddLabel':
maplabel.c:552: warning: ISO C90 forbids mixed declarations and code
maplabel.c:576: warning: ISO C90 forbids mixed declarations and code
mapresample.c: In function 'msNearestRasterResampler':
mapresample.c:119: warning: unused variable 'nValue'
mapresample.c: In function 'msSourceSample':
mapresample.c:272: warning: ISO C90 forbids mixed declarations and code
mapresample.c: In function 'msBilinearRasterResampler':
mapresample.c:445: warning: ISO C90 forbids mixed declarations and code
mapdraw.c: In function 'msDrawVectorLayer':
mapdraw.c:1043: warning: ISO C90 forbids mixed declarations and code


diff --git a/configure.in b/configure.in
index 92c94b5..304b7b7 100755
--- a/configure.in
+++ b/configure.in
@@ -36,6 +36,7 @@ m4_include([m4/mapserver.m4])
 m4_include([m4/apache.m4])
 m4_include([m4/ax_jni_include_dir.m4])
 m4_include([m4/ax_pkg_swig.m4])
+m4_include([m4/ax_cflags_warn_all.m4])
 
 AC_CONFIG_SRCDIR([mapserv.c])
 dnl Checks for programs.
@@ -2162,42 +2163,33 @@ AC_MSG_CHECKING(compiler warnings)
 AC_ARG_WITH(warnings,
 [  --with-warnings[[=flags]] Enable strict warnings (or user defined 
warnings)],,)
 
+AX_CFLAGS_WARN_ALL(C_WFLAGS)
+AX_CXXFLAGS_WARN_ALL(CXX_WFLAGS)
+
 if test "$with_warnings" = "yes" ; then 
   if test "$GCC" = "yes" ; then
-    WFLAGS="-W -Wall -Wcast-align -Wmissing-prototypes -Wstrict-prototypes -
Wpointer-arith -Wreturn-type"
-    C_EXTRA_WFLAGS="-Wmissing-declarations"
+    WFLAGS="-W -Wcast-align -Wmissing-prototypes -Wstrict-prototypes -
Wpointer-arith -Wreturn-type"
+    C_WFLAGS="$C_WFLAGS -Wmissing-declarations"
   
     AC_MSG_RESULT([strict])
   else
     WFLAGS=""
-    C_EXTRA_WFLAGS=""
-    AC_MSG_RESULT([disabled])
-  fi
-
-elif test "$with_warnings" = "" ; then 
-  if test "$GCC" = "yes" ; then
-    WFLAGS="-Wall"
-    C_EXTRA_WFLAGS=""
-    AC_MSG_RESULT([basic])
-  else
-    WFLAGS=""
-    C_EXTRA_WFLAGS=""
     AC_MSG_RESULT([disabled])
   fi
 
 elif test "$with_warnings" = "no" ; then
   WFLAGS=""
-  C_EXTRA_WFLAGS=""
+  C_WFLAGS=""
+  CXX_WFLAGS=""
   AC_MSG_RESULT([disabled])
 
-else
+elif test "$with_warnings" != "" ; then 
   WFLAGS="$with_warnings"
-  C_EXTRA_WFLAGS=""
   AC_MSG_RESULT([user defined])
 fi
 
-CFLAGS="$CFLAGS $WFLAGS $C_EXTRA_WFLAGS"
-CXXFLAGS="$CXXFLAGS $WFLAGS "
+CFLAGS="$CFLAGS $WFLAGS $C_WFLAGS"
+CXXFLAGS="$CXXFLAGS $WFLAGS $CXX_WFLAGS"
 
 dnl ---------------------------------------------------------------------
 dnl Check --enable-debug option for "-g" compile flag. (OFF by default)

> 
> Best regards,
> 
> Tamas


More information about the mapserver-dev mailing list