From 0fe07eac63a5c76f58ba7e25c1fba3fc762c4313 Mon Sep 17 00:00:00 2001 From: truelight Date: Sat, 4 Sep 2004 14:20:12 +0000 Subject: [PATCH] (svn r158) -Fix: make endianess check 100% accurate (hopefully ;)) --- Makefile | 14 +++++++++++--- endian_check.c | 22 ++++++++++++++++++++++ stdafx.h | 25 +++++-------------------- 3 files changed, 38 insertions(+), 23 deletions(-) create mode 100644 endian_check.c diff --git a/Makefile b/Makefile index 9085cae741..73b9380977 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 0000000000..14d96fe913 --- /dev/null +++ b/endian_check.c @@ -0,0 +1,22 @@ +#include + +// 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 ab79d51ebb..6e1034b2fa 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)