summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortruelight <truelight@openttd.org>2004-09-04 14:20:12 +0000
committertruelight <truelight@openttd.org>2004-09-04 14:20:12 +0000
commit0fe07eac63a5c76f58ba7e25c1fba3fc762c4313 (patch)
tree6e2b691afebf8d8b014d667e8214654134147c6f
parent85628544eeac566a70bf3f218bc078c096c65c50 (diff)
downloadopenttd-0fe07eac63a5c76f58ba7e25c1fba3fc762c4313.tar.xz
(svn r158) -Fix: make endianess check 100% accurate (hopefully ;))
-rw-r--r--Makefile14
-rw-r--r--endian_check.c22
-rw-r--r--stdafx.h25
3 files changed, 38 insertions, 23 deletions
diff --git a/Makefile b/Makefile
index 9085cae74..73b938097 100644
--- a/Makefile
+++ b/Makefile
@@ -171,6 +171,7 @@ endif
# Set output executable names
TTD=openttd$(EXE)
+ENDIAN_CHECK=endian_check$(EXE)
STRGEN=strgen/strgen$(EXE)
OSXAPP="OpenTTD.app"
@@ -198,7 +199,7 @@ BUILDDATE=`date +%d.%m.%y`
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 @@ OSX:=OSX
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 @@ FORCE:
# 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)
diff --git a/endian_check.c b/endian_check.c
new file mode 100644
index 000000000..14d96fe91
--- /dev/null
+++ b/endian_check.c
@@ -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;
+}
diff --git a/stdafx.h b/stdafx.h
index ab79d51eb..6e1034b2f 100644
--- a/stdafx.h
+++ b/stdafx.h
@@ -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)