Преглед изворни кода

Temporary adjustment for strict aliasing (#2582)

* Fixes #2572.
* Added a custom rule to avoid optimization causing monsters to not attack. (From tests this appears to be npc.cpp on Centos 7 and mob.cpp on Windows vc141)
* Added -fno-strict-alising to CMake when building with GCC. (Clang and VS have it by default)
* Fixed cmake output path.
Thanks to @lighta!
lighta пре 7 година
родитељ
комит
673315994b
5 измењених фајлова са 29 додато и 10 уклоњено
  1. 6 1
      CMakeLists.txt
  2. 8 4
      configure
  3. 7 4
      configure.in
  4. 4 0
      src/map/Makefile.in
  5. 4 1
      src/map/map-server.vcxproj

+ 6 - 1
CMakeLists.txt

@@ -50,11 +50,12 @@ endif()
 
 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/lib/${suffixInstallStr})
 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/lib/${suffixInstallStr})
-set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/..)
+set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
 set(CMAKE_C_CREATE_SHARED_LIBRARY)
 set(CMAKE_CXX_CREATE_SHARED_LIBRARY)
 set(CMAKE_DEBUG_POSTFIX "d")
 set(CMAKE_RELEASE_POSTFIX "r")
+
 #
 # Prevent building in the source directory by default
 #
@@ -89,6 +90,10 @@ if( MSVC )
 	set_property( CACHE GLOBAL_LIBRARIES    PROPERTY VALUE ${GLOBAL_LIBRARIES} "oldnames.lib" "ws2_32.lib" )
 	set_property( CACHE GLOBAL_DEFINITIONS  PROPERTY VALUE "${GLOBAL_DEFINITIONS} -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE" )
 endif()
+if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_GNUCC)
+  set_property( CACHE GLOBAL_DEFINITIONS  PROPERTY VALUE "${GLOBAL_DEFINITIONS} -fno-strict-aliasing" )
+  #set_property( CACHE GLOBAL_DEFINITIONS  PROPERTY VALUE "${GLOBAL_DEFINITIONS} -O2" ); #need more test to enable this
+endif()
 
 
 #

+ 8 - 4
configure

@@ -623,6 +623,7 @@ ac_includes_default="\
 
 ac_subst_vars='LTLIBOBJS
 LIBOBJS
+CXXFLAG_CLEARS
 CFLAGS_AR
 DLLEXT
 PCRE_CFLAGS
@@ -4460,7 +4461,8 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 CFLAGS="$CFLAGS -pipe -ffast-math -Wall"
 CPPFLAGS="$CPPFLAGS -I../common"
 CXXFLAGS="$CXXFLAGS -std=c++11"
-
+#CXXFLAGS="$CXXFLAGS -std=gnu++11"
+CXXFLAG_CLEARS="-std=c++11"
 
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5
 $as_echo_n "checking whether byte ordering is bigendian... " >&6; }
@@ -5763,8 +5765,8 @@ my_shared_test_flags=""
 #
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -fno-strict-aliasing" >&5
 $as_echo_n "checking whether $CC supports -fno-strict-aliasing... " >&6; }
-OLD_CFLAGS="$CFLAGS"
-CFLAGS="$CFLAGS -fno-strict-aliasing"
+OLD_CPPFLAGS="$CPPFLAGS"
+CPPFLAGS="$CPPFLAGS -fno-strict-aliasing"
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 int foo;
@@ -5776,7 +5778,7 @@ else
 
 		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
-		CFLAGS="$OLD_CFLAGS"
+		CPPFLAGS="$OLD_CPPFLAGS"
 
 
 fi
@@ -7017,10 +7019,12 @@ else
 $as_echo "no" >&6; }
 fi
 
+CXXFLAG_CLEARS="-std=c++11 $CPPFLAGS"
 CFLAGS="$OPT_LTO $CFLAGS"
 CFLAGS_AR="$OPT_LTO_AR $CFLAGS"
 
 
+
 { $as_echo "$as_me:${as_lineno-$LINENO}: Configure finish" >&5
 $as_echo "$as_me: Configure finish" >&6;}
 { $as_echo "$as_me:${as_lineno-$LINENO}: CPPFLAGS= $CPPFLAGS" >&5

+ 7 - 4
configure.in

@@ -442,7 +442,8 @@ AC_LANG([C++])
 CFLAGS="$CFLAGS -pipe -ffast-math -Wall"
 CPPFLAGS="$CPPFLAGS -I../common"
 CXXFLAGS="$CXXFLAGS -std=c++11"
-
+#CXXFLAGS="$CXXFLAGS -std=gnu++11"
+CXXFLAG_CLEARS="-std=c++11"
 
 AC_C_BIGENDIAN(
 	[AC_MSG_ERROR([[bigendian is not supported... stopping]])],
@@ -908,14 +909,14 @@ AC_SUBST([WITH_PLUGINS])
 # -O2 implies -fstrict-aliasing, but the code is not safe for that
 #
 AC_MSG_CHECKING([whether $CC supports -fno-strict-aliasing])
-OLD_CFLAGS="$CFLAGS"
-CFLAGS="$CFLAGS -fno-strict-aliasing"
+OLD_CPPFLAGS="$CPPFLAGS"
+CPPFLAGS="$CPPFLAGS -fno-strict-aliasing"
 AC_COMPILE_IFELSE(
 	[AC_LANG_SOURCE([int foo;])],
 	[AC_MSG_RESULT([yes])],
 	[
 		AC_MSG_RESULT([no])
-		CFLAGS="$OLD_CFLAGS"
+		CPPFLAGS="$OLD_CPPFLAGS"
 	]
 )
 
@@ -1300,9 +1301,11 @@ else
 	AC_MSG_RESULT([no])
 fi
 
+CXXFLAG_CLEARS="-std=c++11 $CPPFLAGS"
 CFLAGS="$OPT_LTO $CFLAGS" 
 CFLAGS_AR="$OPT_LTO_AR $CFLAGS"
 AC_SUBST([CFLAGS_AR])
+AC_SUBST([CXXFLAG_CLEARS])
 
 AC_MSG_NOTICE([Configure finish])
 AC_MSG_NOTICE([CPPFLAGS= $CPPFLAGS])

+ 4 - 0
src/map/Makefile.in

@@ -78,6 +78,10 @@ map-server: obj $(MAP_DIR_OBJ) $(COMMON_AR) $(LIBCONFIG_AR) $(YAML_CPP_AR)
 
 
 # map object files
+#cause this one failling otherwise
+obj/npc.o: npc.cpp $(MAP_H) $(COMMON_H)  $(MT19937AR_H) $(LIBCONFIG_H) $(YAML_CPP_H)
+	@echo "	CXX	$< (custom rule)"
+	@@CXX@ @CXXFLAG_CLEARS@ $(COMMON_INCLUDE) $(MT19937AR_INCLUDE) $(LIBCONFIG_INCLUDE) $(PCRE_CFLAGS) $(YAML_CPP_INCLUDE) @MYSQL_CFLAGS@ @CPPFLAGS@ -c $(OUTPUT_OPTION) $<
 
 obj/%.o: %.c $(MAP_H) $(COMMON_H)  $(MT19937AR_H) $(LIBCONFIG_H) $(YAML_CPP_H)
 	@echo "	CC	$<"

+ 4 - 1
src/map/map-server.vcxproj

@@ -233,7 +233,9 @@
     <ClCompile Include="map.cpp" />
     <ClCompile Include="mapreg.cpp" />
     <ClCompile Include="mercenary.cpp" />
-    <ClCompile Include="mob.cpp" />
+    <ClCompile Include="mob.cpp">
+      <Optimization Condition="'$(Configuration)'=='Release'">Disabled</Optimization>
+    </ClCompile>
     <ClCompile Include="npc.cpp" />
     <ClCompile Include="npc_chat.cpp" />
     <ClCompile Include="party.cpp" />
@@ -368,3 +370,4 @@
     <Copy SourceFiles="$(SolutionDir)db\import-tmpl\status_disabled.txt" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\status_disabled.txt')" />
   </Target>
 </Project>
+