In a testdir on Android, I see this compilation error: clang++ -DNO_INLINE_GETPASS=1 -DHAVE_CONFIG_H -DEXEEXT=\"\" -DEXEEXT=\"\" -I. -I../../gltests -I.. -DGNULIB_STRICT_CHECKING=1 -DIN_GNULIB_TESTS=1 -I. -I../../gltests -I.. -I../../gltests/.. -I../gllib -I../../gltests/../gllib -I/data/data/com.termux/files/home/local/include -Wall -Wno-error -g -O2 -c -o test-time-c++.o ../../gltests/test-time-c++.cc In file included from ../../gltests/test-time-c++.cc:22: ../gllib/time.h:626:19: error: no member named 'timespec_get' in the global namespace _GL_CXXALIAS_SYS (timespec_get, int, (struct timespec *ts, int base)); ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ../gllib/sched.h:264:20: note: expanded from macro '_GL_CXXALIAS_SYS' return ::func; \ ~~^ In file included from ../../gltests/test-time-c++.cc:22: ../gllib/time.h:627:19: error: use of undeclared identifier 'timespec_get'; did you mean 'gnulib::timespec_get'? _GL_CXXALIASWARN (timespec_get); ^ ../gllib/time.h:626:19: note: 'gnulib::timespec_get' declared here _GL_CXXALIAS_SYS (timespec_get, int, (struct timespec *ts, int base)); ^ 2 errors generated. make[4]: *** [Makefile:23463: test-time-c++.o] Error 1
Here the problem is that timespec_get is only declared for a future API level: /usr/include/time.h:int timespec_get(struct timespec* __ts, int __base) __INTRODUCED_IN(29); This patch fixes the error, like in those cases where we use gl_CHECK_FUNCS_ANDROID. 2023-01-09 Bruno Haible <br...@clisp.org> gettime: Fix compilation error in C++ mode on Android. * m4/gettime.m4 (gl_CHECK_FUNC_TIMESPEC_GET): Also test whether timespec_get is declared. diff --git a/m4/gettime.m4 b/m4/gettime.m4 index 06f32fe26c..7e353fcd00 100644 --- a/m4/gettime.m4 +++ b/m4/gettime.m4 @@ -1,4 +1,4 @@ -# gettime.m4 serial 12 +# gettime.m4 serial 13 dnl Copyright (C) 2002, 2004-2006, 2009-2023 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -26,17 +26,24 @@ AC_DEFUN([gl_CHECK_FUNC_TIMESPEC_GET], dnl We can't use AC_CHECK_FUNC here, because timespec_get() is defined as a dnl static inline function in <time.h> on MSVC 14. - AC_CACHE_CHECK([for timespec_get], [gl_cv_func_timespec_get], - [AC_LINK_IFELSE( - [AC_LANG_PROGRAM( - [[#include <time.h> - struct timespec ts; - ]], - [[return timespec_get (&ts, 0);]]) - ], - [gl_cv_func_timespec_get=yes], - [gl_cv_func_timespec_get=no]) - ]) + dnl But at the same time, we need to notice a missing declaration, like + dnl gl_CHECK_FUNCS_ANDROID does. + AC_CHECK_DECL([timespec_get], , , [[#include <time.h>]]) + if test $ac_cv_have_decl_timespec_get = yes; then + AC_CACHE_CHECK([for timespec_get], [gl_cv_func_timespec_get], + [AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [[#include <time.h> + struct timespec ts; + ]], + [[return timespec_get (&ts, 0);]]) + ], + [gl_cv_func_timespec_get=yes], + [gl_cv_func_timespec_get=no]) + ]) + else + gl_cv_func_timespec_get=no + fi ]) AC_DEFUN([gl_GETTIME_RES],