diff --git a/Makefile b/Makefile index 57b7ea827a..075768d3f2 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 d838e14f32..a302ea40bd 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");