build: use AC_FUNC_STRERROR_R to check the version of strerror_r()
authorBartosz Golaszewski <bartekgola@gmail.com>
Tue, 24 Jan 2017 10:45:36 +0000 (11:45 +0100)
committerBartosz Golaszewski <bartekgola@gmail.com>
Tue, 24 Jan 2017 10:45:36 +0000 (11:45 +0100)
Define _GNU_SOURCE globally in configure.ac and use the
AC_FUNC_STRERROR_R macro to figure out what version of strerror_r() is
provided. Some libraries (e.g. musl) only provide the POSIX version
even if we explicitly request GNU extensions.

Signed-off-by: Bartosz Golaszewski <bartekgola@gmail.com>
configure.ac
src/lib/Makefile.am
src/lib/core.c
src/tools/Makefile.am

index c4445e911c0c8a313db3a13efae47939cbdd7e2a..bb9820e4c4a344a4f6aac19948094f61fbf0e9a9 100644 (file)
@@ -24,6 +24,8 @@ m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
 AC_CONFIG_SRCDIR([src])
 AC_CONFIG_HEADER([config.h])
 
+AC_DEFINE([_GNU_SOURCE], [], [We want GNU extensions])
+
 AM_PROG_AR
 AC_PROG_CC
 AC_PROG_LIBTOOL
@@ -41,6 +43,7 @@ AC_DEFUN([HEADER_NOT_FOUND_LIB],
 # This is always checked (library needs this)
 AC_HEADER_STDC
 AC_FUNC_MALLOC
+AC_FUNC_STRERROR_R
 AC_CHECK_FUNC([ioctl], [], [FUNC_NOT_FOUND_LIB([ioctl])])
 AC_CHECK_FUNC([asprintf], [], [FUNC_NOT_FOUND_LIB([asprintf])])
 AC_CHECK_FUNC([readdir], [], [FUNC_NOT_FOUND_LIB([readdir])])
index 35b8e7099b03ff13b77e68343a29457c0e7ae608..92dea8651088b04c92519ae139acc3fcddb20060 100644 (file)
@@ -8,7 +8,7 @@
 
 lib_LTLIBRARIES = libgpiod.la
 libgpiod_la_SOURCES = core.c
-libgpiod_la_CFLAGS = -Wall -Wextra -g -D_GNU_SOURCE
+libgpiod_la_CFLAGS = -Wall -Wextra -g
 libgpiod_la_CFLAGS += -fvisibility=hidden -I$(top_srcdir)/include/
 libgpiod_la_CFLAGS += -include $(top_srcdir)/config.h
 libgpiod_la_LDFLAGS = -version-number $(subst .,:,$(PACKAGE_VERSION))
index 2d45e357694fbc5d2e58c32af96dabc473e3e021..494a3b444e5ff109e4bc292728b8e1ef0ed46b74 100644 (file)
@@ -143,10 +143,25 @@ int gpiod_errno(void)
        return last_error;
 }
 
+static const char * strerror_r_wrapper(int errnum, char *buf, size_t buflen)
+{
+#ifdef STRERROR_R_CHAR_P
+       return strerror_r(errnum, buf, buflen);
+#else
+       int status;
+
+       status = strerror_r(errnum, buf, buflen);
+       if (status != 0)
+               snprintf(buf, buflen, "error in strerror_r(): %d", status);
+
+       return buf;
+#endif
+}
+
 const char * gpiod_strerror(int errnum)
 {
        if (errnum < __GPIOD_ERRNO_OFFSET)
-               return strerror_r(errnum, errmsg, sizeof(errmsg));
+               return strerror_r_wrapper(errnum, errmsg, sizeof(errmsg));
        else if (errnum > __GPIOD_MAX_ERR)
                return "invalid error number";
        else
index 35e5f221bd9d7e158e0a404782dd4fc1d7ab11be..016006e59bd8cf0808dba148d641bff8bcaa08e2 100644 (file)
@@ -7,7 +7,7 @@
 #
 
 AM_CFLAGS = -I$(top_srcdir)/include/ -include $(top_srcdir)/config.h
-AM_CFLAGS += -Wall -Wextra -g -D_GNU_SOURCE -L$(top_srcdir)/src/lib
+AM_CFLAGS += -Wall -Wextra -g -L$(top_srcdir)/src/lib
 AM_LDFLAGS = -lgpiod
 DEPENDENCIES = libgpiod.la