| From 16d88e7813a7739c070a7a1cf6388fd4f236fd99 Mon Sep 17 00:00:00 2001 |
| From: Gustavo Zacarias <gustavo@zacarias.com.ar> |
| Date: Fri, 31 Jan 2014 06:45:18 -0300 |
| Subject: [PATCHv2] build: find FILE_OFFSET_BITS via array |
| |
| This makes cross-compiling happy, use a trick similar to autoconf's |
| AC_CHECK_SIZEOF macro. |
| Basically we make an array: |
| |
| static int array[1 - 2 * !(((long int)(sizeof(off_t))) < 8)]; |
| |
| This gives -1 multiplied by the negation of the condition |
| (sizeof(off_t) < 8) cast to a long int. |
| So if the condition is true it gives array[(-1 * 0)] (remember the |
| condition is cast and negated) thus passing a build test with a 0-sized |
| array. |
| If it's false it gives array[(-1 * 1)] thus failing with a |
| negative-sized array. |
| |
| Status: Upstream. |
| |
| Signed-off-by: Gustavo Zacarias <gustavo@zacarias.com.ar> |
| --- |
| lib/ccan/wscript | 11 +++++++---- |
| 1 file changed, 7 insertions(+), 4 deletions(-) |
| |
| diff --git a/lib/ccan/wscript b/lib/ccan/wscript |
| index 59b8205..81039d0 100644 |
| --- a/lib/ccan/wscript |
| +++ b/lib/ccan/wscript |
| @@ -127,15 +127,18 @@ def configure(conf): |
| # Only check for FILE_OFFSET_BITS=64 if off_t is normally small: |
| # use raw routines because wrappers include previous _GNU_SOURCE |
| # or _FILE_OFFSET_BITS defines. |
| + # The math for these tests is: |
| + # array[-1 * !((int)(condition)) ] (condition is true) = array[0] = builds |
| + # array[-1 * !((int)(condition)) ] (condition is false) = array[-1] = fails |
| conf.check(fragment="""#include <sys/types.h> |
| - int main(void) { return !(sizeof(off_t) < 8); }""", |
| - execute=True, msg='Checking for small off_t', |
| + int main(void) { static int test_array[1 - 2 * !(((long int)(sizeof(off_t))) < 8)]; }""", |
| + msg='Checking for small off_t', |
| define_name='SMALL_OFF_T') |
| # Unreliable return value above, hence use define. |
| if conf.CONFIG_SET('SMALL_OFF_T'): |
| conf.check(fragment="""#include <sys/types.h> |
| - int main(void) { return !(sizeof(off_t) >= 8); }""", |
| - execute=True, msg='Checking for -D_FILE_OFFSET_BITS=64', |
| + int main(void) { static int test_array[1 - 2 * !(((long int)(sizeof(off_t))) >= 8)]; }""", |
| + msg='Checking for -D_FILE_OFFSET_BITS=64', |
| ccflags='-D_FILE_OFFSET_BITS=64', |
| define_name='HAVE_FILE_OFFSET_BITS') |
| |
| -- |
| 1.8.3.2 |
| |