(svn r158) -Fix: make endianess check 100% accurate (hopefully ;))
authortruelight
Sat, 04 Sep 2004 14:20:12 +0000
changeset 157 dd017fa3bad8
parent 156 8fef5e5752d6
child 158 b1a821f84250
(svn r158) -Fix: make endianess check 100% accurate (hopefully ;))
Makefile
endian_check.c
stdafx.h
--- a/Makefile	Sat Sep 04 13:06:09 2004 +0000
+++ b/Makefile	Sat Sep 04 14:20:12 2004 +0000
@@ -171,6 +171,7 @@
 
 # Set output executable names
 TTD=openttd$(EXE)
+ENDIAN_CHECK=endian_check$(EXE)
 STRGEN=strgen/strgen$(EXE)
 OSXAPP="OpenTTD.app"
 
@@ -198,7 +199,7 @@
 ifeq ($(shell uname -m), x86_64)
 endwarnings:=endwarnings
 64_bit_warnings:=64_bit_warnings
-BASECFLAGS += -m64 -D_LITTLE_ENDIAN
+BASECFLAGS += -m64
 endif
 
 
@@ -488,8 +489,15 @@
 endif
 
 
-all: $(UPDATECONFIG) $(TTD) $(OSX) $(endwarnings)
+all: endian.h $(UPDATECONFIG) $(TTD) $(OSX) $(endwarnings)
 
+endian.h: $(ENDIAN_CHECK)
+	# Check if system is LITTLE_ENDIAN or BIG_ENDIAN 
+	./$(ENDIAN_CHECK) > $@
+
+$(ENDIAN_CHECK): endian_check.c
+	$(CC) $(BASECFLAGS) $(CDEFS) endian_check.c -o $@
+	
 
 $(TTD): table/strings.h $(ttd_OBJS) $(LANGS) $(MAKE_CONFIG)
 	$(C_LINK) $@ $(TTDLDFLAGS) $(ttd_OBJS) $(LIBS)
@@ -546,7 +554,7 @@
 # ttd$(EXE) is removed just to make sure people execute the right binary (openttd$(EXE))
 # remove this for next release!
 clean:
-	rm -rf .deps *~ $(TTD) $(STRGEN) core table/strings.h $(LANGS) $(ttd_OBJS) ttd$(EXE)
+	rm -rf .deps *~ $(TTD) $(STRGEN) core table/strings.h $(LANGS) $(ttd_OBJS) endian.h $(ENDIAN_CHECK) ttd$(EXE)
 
 mrproper: clean
 	rm -rf $(MAKE_CONFIG)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/endian_check.c	Sat Sep 04 14:20:12 2004 +0000
@@ -0,0 +1,22 @@
+#include <stdio.h>
+
+// This pretty simple file checks if the system is LITTLE_ENDIAN or BIG_ENDIAN
+//  it does that by putting a 1 and a 0 in an array, and read it out as one
+//  number. If it is 1, it is LITTLE_ENDIAN, if it is 256, it is BIG_ENDINA
+//
+// After that it outputs the contents of an include files (endian.h)
+//  that says or TTD_LITTLE_ENDIAN, or TTD_BIG_ENDIAN. Makefile takes
+//  care of the real writing to the file.
+
+int main () {
+  unsigned char EndianTest[2] = { 1, 0 };
+  printf("#ifndef ENDIAN_H\n#define ENDIAN_H\n");
+  if( *(short *) EndianTest == 1 )
+    printf("#define TTD_LITTLE_ENDIAN\n");
+  else
+    printf("#define TTD_BIG_ENDIAN\n");
+
+  printf("#endif\n");
+
+  return 0;
+}
--- a/stdafx.h	Sat Sep 04 13:06:09 2004 +0000
+++ b/stdafx.h	Sat Sep 04 14:20:12 2004 +0000
@@ -67,27 +67,12 @@
 # define GCC_PACK
 #endif
 
+// Windows has always LITTLE_ENDIAN
 #if defined(WIN32)
-# define TTD_LITTLE_ENDIAN
-#endif
-
-#if defined(i386)
-# define TTD_LITTLE_ENDIAN
-#endif
-
-#if defined(__MORPHOS__)
-# define TTD_BIG_ENDIAN
-#endif
-
-// Check endianness
-#if !defined(TTD_LITTLE_ENDIAN) && !defined(TTD_BIG_ENDIAN)
-#	if defined(_BIG_ENDIAN)
-#		define TTD_BIG_ENDIAN
-#	elif defined(_LITTLE_ENDIAN)
-#		define TTD_LITTLE_ENDIAN
-#	else
-#		error No endianness defined, use either TTD_LITTLE_ENDIAN or TTD_BIG_ENDIAN
-#endif
+  #define TTD_LITTLE_ENDIAN
+#else
+// Else include endian.h, which has the endian-type, autodetected by the Makefile
+  #include "endian.h"
 #endif
 
 #if defined(UNIX)