57 lines
2.4 KiB
Diff
57 lines
2.4 KiB
Diff
|
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 for next branch.
|
||
|
|
||
|
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
|
||
|
|