[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

sys/types.h on Android includes stdint.h before defining time_t

From: Simon Josefsson
Subject: sys/types.h on Android includes stdint.h before defining time_t
Date: Fri, 20 Jan 2012 11:38:16 +0100
User-agent: Gnus/5.110018 (No Gnus v0.18) Emacs/24.0.92 (gnu/linux)

I'm looking at porting gnulib to Android (using the NDK), and there
seems to be a fundamental incompatibility between the system sys/types.h
header file and several of gnulib's header file replacements.  I get
build errors for the following gnulib test directory:

./gnulib-tool --create-testdir --dir m --with-tests vasprintf

I'm building it like this:

address@hidden:~/dummy-0$ ./configure CC="arm-linux-androideabi-gcc --sysroot 
--host=arm-linux-androideabi --build=i686-pc-linux-gnu

and the error is:

arm-linux-androideabi-gcc --sysroot 
/home/jas/android-ndk-r7/platforms/android-8/arch-arm -DHAVE_CONFIG_H -I. -I..  
-DGNULIB_STRICT_CHECKING=1   -g -O2 -MT printf-args.o -MD -MP -MF 
.deps/printf-args.Tpo -c -o printf-args.o printf-args.c
In file included from 
                 from ./stdint.h:527,
                 from ./stdio.h:44,
                 from ./wchar.h:72,
                 from printf-args.h:42,
                 from printf-args.c:30:
 error: expected specifier-qualifier-list before 'time_t'
 error: expected specifier-qualifier-list before 'time_t'

The reason is that printf-args.c includes some header files that in turn
includes the system sys/types.h.  So far great.  However, the system
sys/types.h start like this:

#ifndef _SYS_TYPES_H_
#define _SYS_TYPES_H_

#define __need_size_t
#define __need_ptrdiff_t
#include <stddef.h>
#include <stdint.h>

later down in the system sys/types.h file there is the definition of

typedef __kernel_time_t       time_t;

Thus gnulib's stdint.h file gets included from the system sys/types.h
before time_t is declared.  Further down in gnulib's stdint.h there is:

#if @HAVE_WCHAR_H@ && ! (defined WCHAR_MIN && defined WCHAR_MAX)
  /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
     included before <wchar.h>.  */
# include <stddef.h>
# include <stdio.h>
# include <time.h>

Thus the system time.h gets included, and it includes the system
sys/time.h which first includes sys/types.h and then linux/time.h.
However, including sys/types.h here is a no-op since _SYS_TYPES_H is
already defined.  So back to the system sys/time.h which includes
linux/time.h.  And then the system linux/time.h contains:

struct timespec {
 time_t tv_sec;
 long tv_nsec;

This doesn't work because time_t is not yet defined.

Does anyone see a clean way out of this?


reply via email to

[Prev in Thread] Current Thread [Next in Thread]