Mercurial > hg > octave-lojdl > gnulib-hg
changeset 6824:913c75b3bc0b
Make it work when cross-compiling.
author | Bruno Haible <bruno@clisp.org> |
---|---|
date | Fri, 16 Jun 2006 13:15:45 +0000 |
parents | 7810ba58e527 |
children | b048a64a7f04 |
files | m4/ChangeLog m4/size_max.m4 |
diffstat | 2 files changed, 28 insertions(+), 23 deletions(-) [+] |
line wrap: on
line diff
--- a/m4/ChangeLog +++ b/m4/ChangeLog @@ -1,6 +1,10 @@ +2006-06-15 Bruno Haible <bruno@clisp.org> + + * size_max.m4 (gl_SIZE_MAX): Make it work also when cross-compiling. + 2006-06-15 Eric Blake <ebb9@byu.net> - * m4/ssize_t.m4 (gt_TYPE_SSIZE_T): Work in spite of -Werror. + * ssize_t.m4 (gt_TYPE_SSIZE_T): Work in spite of -Werror. 2006-05-30 Ralf Wildenhues <Ralf.Wildenhues@gmx.de> Bruno Haible <bruno@clisp.org>
--- a/m4/size_max.m4 +++ b/m4/size_max.m4 @@ -1,5 +1,5 @@ -# size_max.m4 serial 3 -dnl Copyright (C) 2003, 2005 Free Software Foundation, Inc. +# size_max.m4 serial 4 +dnl Copyright (C) 2003, 2005-2006 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. @@ -23,28 +23,29 @@ ], result=yes) if test -z "$result"; then dnl Define it ourselves. Here we assume that the type 'size_t' is not wider - dnl than the type 'unsigned long'. - dnl The _AC_COMPUTE_INT macro works up to LONG_MAX, since it uses 'expr', - dnl which is guaranteed to work from LONG_MIN to LONG_MAX. - _AC_COMPUTE_INT([(size_t)~(size_t)0 / 10], res_hi, - [#include <stddef.h>], result=?) - _AC_COMPUTE_INT([(size_t)~(size_t)0 % 10], res_lo, - [#include <stddef.h>], result=?) + dnl than the type 'unsigned long'. Try hard to find a definition that can + dnl be used in a preprocessor #if, i.e. doesn't contain a cast. + _AC_COMPUTE_INT([sizeof (size_t) * CHAR_BIT - 1], size_t_bits_minus_1, + [#include <stddef.h> +#include <limits.h>], size_t_bits_minus_1=) _AC_COMPUTE_INT([sizeof (size_t) <= sizeof (unsigned int)], fits_in_uint, - [#include <stddef.h>], result=?) - if test "$fits_in_uint" = 1; then - dnl Even though SIZE_MAX fits in an unsigned int, it must be of type - dnl 'unsigned long' if the type 'size_t' is the same as 'unsigned long'. - AC_TRY_COMPILE([#include <stddef.h> - extern size_t foo; - extern unsigned long foo; - ], [], fits_in_uint=0) - fi - if test -z "$result"; then - if test "$fits_in_uint" = 1; then - result="$res_hi$res_lo"U + [#include <stddef.h>], fits_in_uint=) + if test -n "$size_t_bits_minus_1" && test -n "$fits_in_uint"; then + if test $fits_in_uint = 1; then + dnl Even though SIZE_MAX fits in an unsigned int, it must be of type + dnl 'unsigned long' if the type 'size_t' is the same as 'unsigned long'. + AC_TRY_COMPILE([#include <stddef.h> + extern size_t foo; + extern unsigned long foo; + ], [], fits_in_uint=0) + fi + dnl We cannot use 'expr' to simplify this expression, because 'expr' + dnl works only with 'long' integers in the host environment, while we + dnl might be cross-compiling from a 32-bit platform to a 64-bit platform. + if test $fits_in_uint = 1; then + result="(((1U << $size_t_bits_minus_1) - 1) * 2 + 1)" else - result="$res_hi$res_lo"UL + result="(((1UL << $size_t_bits_minus_1) - 1) * 2 + 1)" fi else dnl Shouldn't happen, but who knows...