Skip to content

Commit

Permalink
build: find FILE_OFFSET_BITS via array
Browse files Browse the repository at this point in the history
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.

Signed-off-by: Gustavo Zacarias <[email protected]>
Reviewed-by: Andrew Bartlett <[email protected]>
Reviewed-by: Andreas Schneider <[email protected]>

Autobuild-User(master): Andrew Bartlett <[email protected]>
Autobuild-Date(master): Tue Feb 18 23:18:32 CET 2014 on sn-devel-104
  • Loading branch information
gustavoz authored and abartlet committed Feb 18, 2014
1 parent cd65571 commit 0d9bb86
Showing 1 changed file with 7 additions and 4 deletions.
11 changes: 7 additions & 4 deletions lib/ccan/wscript
Original file line number Diff line number Diff line change
Expand Up @@ -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')

Expand Down

0 comments on commit 0d9bb86

Please sign in to comment.