summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile8
-rw-r--r--endian_check.c31
2 files changed, 24 insertions, 15 deletions
diff --git a/Makefile b/Makefile
index 57b7ea827..075768d3f 100644
--- a/Makefile
+++ b/Makefile
@@ -108,7 +108,10 @@
#
# BUILD_UNIVERSAL_BINARY: builds a universal binary for OSX. Make sure you got both PPC and x86 libs
#
-# ENDIAN_FORCE: forces the endian-check to give a certain result. Can be either BE or LE.
+# ENDIAN_FORCE: forces the endian-check to give a certain result. Can be BE, LE or PREPROCESSOR.
+# PREPROCESSOR is always used on all OSX targets and will make the preprocessor pick the right endian.
+# this means that you don't have to think about endianess when compiling for OSX.
+# Very useful for universal binaries and crosscompilers. Not sure if it works on non OSX targets
# WINDRES: the location of your windres
# CC_HOST: the gcc of your localhost if you are making a target that produces incompatible executables
# CFLAGS_HOST: cflags used for CC_HOST. Make it something if you are getting errors when you try to compi
@@ -519,6 +522,9 @@ endif
# OSX specific setup
ifdef OSX
+ # set the endian flag for OSX, that can't fail
+ ENDIAN_FORCE:=PREPROCESSOR
+
# ensure that changing libpathnames will not overwrite anything in the binary
LDFLAGS += -headerpad_max_install_names
diff --git a/endian_check.c b/endian_check.c
index d838e14f3..a302ea40b 100644
--- a/endian_check.c
+++ b/endian_check.c
@@ -12,12 +12,14 @@
int main (int argc, char *argv[]) {
unsigned char EndianTest[2] = { 1, 0 };
- int force_BE = 0, force_LE = 0;
+ int force_BE = 0, force_LE = 0, force_PREPROCESSOR = 0;
if (argc > 1 && strcmp(argv[1], "BE") == 0)
force_BE = 1;
if (argc > 1 && strcmp(argv[1], "LE") == 0)
force_LE = 1;
+ if (argc > 1 && strcmp(argv[1], "PREPROCESSOR") == 0)
+ force_PREPROCESSOR = 1;
printf("#ifndef ENDIAN_H\n#define ENDIAN_H\n");
@@ -27,20 +29,21 @@ int main (int argc, char *argv[]) {
if (force_BE == 1) {
printf("#define TTD_BIG_ENDIAN\n");
} else {
-#ifdef __APPLE__
- // adding support for universal binaries on OSX
- // Universal binaries supports both PPC and x86
- printf("#ifdef __BIG_ENDIAN__\n");
- printf("#define TTD_BIG_ENDIAN\n");
- printf("#else\n");
- printf("#define TTD_LITTLE_ENDIAN\n");
- printf("#endif\n");
-#else
- if ( *(short *) EndianTest == 1 )
- printf("#define TTD_LITTLE_ENDIAN\n");
- else
+ if (force_PREPROCESSOR == 1) {
+ // adding support for universal binaries on OSX
+ // Universal binaries supports both PPC and x86
+ // If a compiler for OSX gets this setting, it will always pick the correct endian and no test is needed
+ printf("#ifdef __BIG_ENDIAN__\n");
printf("#define TTD_BIG_ENDIAN\n");
-#endif
+ printf("#else\n");
+ printf("#define TTD_LITTLE_ENDIAN\n");
+ printf("#endif\n");
+ } else {
+ if ( *(short *) EndianTest == 1 )
+ printf("#define TTD_LITTLE_ENDIAN\n");
+ else
+ printf("#define TTD_BIG_ENDIAN\n");
+ }
}
}
printf("#endif\n");