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
 # 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])])
 
 
 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))
 
        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
 
 #
 
 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