Discussion:
static inlines in headers on Android
Bruno Haible
2018-05-13 18:59:43 UTC
Permalink
Compiling a testdir for Android 4.3, I get errors like these:

In file included from /ANDROID_SDK/ndk-bundle/sysroot/usr/include/stdlib.h:263:0,
from ../gllib/stdlib.h:36,
from macros.h:22,
from test-hypotl.c:29:
/ANDROID_SDK/ndk-bundle/sysroot/usr/include/android/legacy_stdlib_inlines.h:76:22: error: static declaration of 'random' follows non-static declaration
static __inline long random(void) { return lrand48(); }
^
In file included from test-hypotl.c:21:0:
../gllib/stdlib.h:1038:1: note: previous declaration of 'random' was here
_GL_FUNCDECL_SYS (random, long, (void));
^
In file included from /ANDROID_SDK/ndk-bundle/sysroot/usr/include/stdlib.h:263:0,
from ../gllib/stdlib.h:36,
from macros.h:22,
from test-hypotl.c:29:
/ANDROID_SDK/ndk-bundle/sysroot/usr/include/android/legacy_stdlib_inlines.h:78:22: error: static declaration of 'srandom' follows non-static declaration
static __inline void srandom(unsigned int __s) { srand48(__s); }
^
In file included from test-hypotl.c:21:0:
../gllib/stdlib.h:1052:1: note: previous declaration of 'srandom' was here
_GL_FUNCDECL_SYS (srandom, void, (unsigned int seed));
^
In file included from /ANDROID_SDK/ndk-bundle/sysroot/usr/include/stdlib.h:263:0,
from ../gllib/stdlib.h:36,
from macros.h:22,
from test-hypotl.c:29:
/ANDROID_SDK/ndk-bundle/sysroot/usr/include/android/legacy_stdlib_inlines.h:80:21: error: static declaration of 'grantpt' follows non-static declaration
static __inline int grantpt(int __fd __attribute((unused))) {
^
In file included from test-hypotl.c:21:0:
../gllib/stdlib.h:724:1: note: previous declaration of 'grantpt' was here
_GL_FUNCDECL_SYS (grantpt, int, (int fd));
^

The reason is that the Android headers define a number of system functions
through 'static inline'. This is the complete list:

./android/legacy_fenv_inlines_arm.h:static __inline int feclearexcept(int __excepts) {
./android/legacy_fenv_inlines_arm.h:static __inline int fedisableexcept(int __mask __unused) {
./android/legacy_fenv_inlines_arm.h:static __inline int feenableexcept(int __mask __unused) {
./android/legacy_fenv_inlines_arm.h:static __inline int fegetenv(fenv_t* __envp) {
./android/legacy_fenv_inlines_arm.h:static __inline int fegetexcept(void) {
./android/legacy_fenv_inlines_arm.h:static __inline int fegetexceptflag(fexcept_t* __flagp, int __excepts) {
./android/legacy_fenv_inlines_arm.h:static __inline int fegetround(void) {
./android/legacy_fenv_inlines_arm.h:static __inline int feholdexcept(fenv_t* __envp) {
./android/legacy_fenv_inlines_arm.h:static __inline int feraiseexcept(int __excepts) {
./android/legacy_fenv_inlines_arm.h:static __inline int fesetenv(const fenv_t* __envp) {
./android/legacy_fenv_inlines_arm.h:static __inline int fesetexceptflag(const fexcept_t* __flagp, int __excepts) {
./android/legacy_fenv_inlines_arm.h:static __inline int fesetround(int __round) {
./android/legacy_fenv_inlines_arm.h:static __inline int fetestexcept(int __excepts) {
./android/legacy_fenv_inlines_arm.h:static __inline int feupdateenv(const fenv_t* __envp) {
./android/legacy_signal_inlines.h:static __inline int sigaddset(sigset_t *set, int signum) {
./android/legacy_signal_inlines.h:static __inline int sigdelset(sigset_t *set, int signum) {
./android/legacy_signal_inlines.h:static __inline int sigemptyset(sigset_t *set) {
./android/legacy_signal_inlines.h:static __inline int sigfillset(sigset_t *set) {
./android/legacy_signal_inlines.h:static __inline int sigismember(const sigset_t *set, int signum) {
./android/legacy_signal_inlines.h:static __inline sighandler_t signal(int s, sighandler_t f) {
./android/legacy_stdlib_inlines.h:static __inline double atof(const char *nptr) { return (strtod(nptr, NULL)); }
./android/legacy_stdlib_inlines.h:static __inline double strtod_l(const char* __s, char** __end_ptr, locale_t __l) {
./android/legacy_stdlib_inlines.h:static __inline float strtof(const char* nptr, char** endptr) {
./android/legacy_stdlib_inlines.h:static __inline float strtof_l(const char* __s, char** __end_ptr, locale_t __l) {
./android/legacy_stdlib_inlines.h:static __inline int abs(int __n) { return (__n < 0) ? -__n : __n; }
./android/legacy_stdlib_inlines.h:static __inline int grantpt(int __fd __attribute((unused))) {
./android/legacy_stdlib_inlines.h:static __inline int rand(void) { return (int)lrand48(); }
./android/legacy_stdlib_inlines.h:static __inline long labs(long __n) { return (__n < 0L) ? -__n : __n; }
./android/legacy_stdlib_inlines.h:static __inline long long llabs(long long __n) {
./android/legacy_stdlib_inlines.h:static __inline long random(void) { return lrand48(); }
./android/legacy_stdlib_inlines.h:static __inline long strtol_l(const char* __s, char** __end_ptr, int __base, locale_t __l) {
./android/legacy_stdlib_inlines.h:static __inline void srand(unsigned int __s) { srand48(__s); }
./android/legacy_stdlib_inlines.h:static __inline void srandom(unsigned int __s) { srand48(__s); }
./android/legacy_strings_inlines.h:static __inline int ffs(int __n) { return __builtin_ffs(__n); }
./android/legacy_sys_stat_inlines.h:static __inline int mkfifo(const char* __path, mode_t __mode) {
./android/legacy_sys_wait_inlines.h:static __inline pid_t wait4(pid_t pid, int* status, int options, struct rusage* rusage) {
./bits/termios_inlines.h:static __inline speed_t cfgetspeed(const struct termios* s) {
./bits/termios_inlines.h:__BIONIC_TERMIOS_INLINE speed_t cfgetispeed(const struct termios* s) {
./bits/termios_inlines.h:__BIONIC_TERMIOS_INLINE speed_t cfgetospeed(const struct termios* s) {
./bits/termios_inlines.h:__BIONIC_TERMIOS_INLINE void cfmakeraw(struct termios* s) {
./bits/termios_inlines.h:__BIONIC_TERMIOS_INLINE int cfsetspeed(struct termios* s, speed_t speed) {
./bits/termios_inlines.h:__BIONIC_TERMIOS_INLINE int cfsetispeed(struct termios* s, speed_t speed) {
./bits/termios_inlines.h:__BIONIC_TERMIOS_INLINE int cfsetospeed(struct termios* s, speed_t speed) {
./bits/termios_inlines.h:__BIONIC_TERMIOS_INLINE int tcdrain(int fd) {
./bits/termios_inlines.h:__BIONIC_TERMIOS_INLINE int tcflow(int fd, int action) {
./bits/termios_inlines.h:__BIONIC_TERMIOS_INLINE int tcflush(int fd, int queue) {
./bits/termios_inlines.h:__BIONIC_TERMIOS_INLINE int tcgetattr(int fd, struct termios* s) {
./bits/termios_inlines.h:__BIONIC_TERMIOS_INLINE pid_t tcgetsid(int fd) {
./bits/termios_inlines.h:__BIONIC_TERMIOS_INLINE int tcsendbreak(int fd, int duration) {
./bits/termios_inlines.h:__BIONIC_TERMIOS_INLINE int tcsetattr(int fd, int optional_actions, const struct termios* s) {
./unistd.h:static __inline__ int getpagesize(void) {

A number of these are interacting with gnulib. I'm applying these fixes.


2018-05-13 Bruno Haible <***@clisp.org>

getpagesize: Fix compilation error on Android.
* m4/getpagesize.m4 (gl_CHECK_FUNC_GETPAGESIZE): New macro.
(gl_FUNC_GETPAGESIZE): Invoke it instead of AC_CHECK_FUNC.
* m4/getcwd-abort-bug.m4 (gl_FUNC_GETCWD_ABORT_BUG): Don't invoke
AC_CHECK_FUNC. Instead, invoke gl_CHECK_FUNC_GETPAGESIZE and define
HAVE_GETPAGESIZE accordingly.
* modules/getcwd (Files): Add m4/getpagesize.m4.

2018-05-13 Bruno Haible <***@clisp.org>

tcgetsid: Fix compilation error on Android.
* m4/tcgetsid.m4 (gl_FUNC_TCGETSID): Use AC_LINK_IFELSE instead of
AC_CHECK_FUNC.

2018-05-13 Bruno Haible <***@clisp.org>

getpass: Fix configure test for Android.
* m4/getpass.m4 (gl_PREREQ_GETPASS): Use AC_LINK_IFELSE instead of
AC_CHECK_FUNC.

2018-05-13 Bruno Haible <***@clisp.org>

ffs: Fix compilation error on Android.
* m4/ffs.m4 (gl_FUNC_FFS): Use AC_LINK_IFELSE instead of AC_CHECK_FUNC.

2018-05-13 Bruno Haible <***@clisp.org>

mkfifo: Fix compilation error on Android.
* m4/mkfifo.m4 (gl_FUNC_MKFIFO): Use AC_LINK_IFELSE instead of
AC_CHECK_FUNC.

2018-05-13 Bruno Haible <***@clisp.org>

c-strtod: Fix configure test for Android.
* m4/c-strtod.m4 (gl_C_STRTOD): Use AC_LINK_IFELSE instead of
AC_CHECK_FUNC.

2018-05-13 Bruno Haible <***@clisp.org>

random: Fix compilation error on Android.
* m4/random.m4 (gl_FUNC_RANDOM): Use AC_LINK_IFELSE instead of
AC_CHECK_FUNC.

2018-05-13 Bruno Haible <***@clisp.org>

grantpt: Fix compilation error on Android.
* m4/grantpt.m4 (gl_FUNC_GRANTPT): Use AC_LINK_IFELSE instead of
AC_CHECK_FUNC.

Loading...