When cross-compiling, configure says: checking for working getgroups... no
Here's a proposed patch for improving this in gnulib. Again, would it be better to modify AC_FUNC_GETGROUPS in Autoconf? 2012-05-01 Bruno Haible <br...@clisp.org> getgroups: Avoid "guessing no" when cross-compiling to glibc systems. * m4/getgroups.m4 (gl_FUNC_GETGROUPS): When cross-compiling, set ac_cv_func_getgroups_works without invoking AC_FUNC_GETGROUPS. --- m4/getgroups.m4.orig Tue May 1 23:17:52 2012 +++ m4/getgroups.m4 Tue May 1 23:17:30 2012 @@ -1,4 +1,4 @@ -# serial 17 +# serial 18 dnl From Jim Meyering. dnl A wrapper around AC_FUNC_GETGROUPS. @@ -11,40 +11,64 @@ AC_DEFUN([gl_FUNC_GETGROUPS], [ - AC_REQUIRE([AC_FUNC_GETGROUPS]) AC_REQUIRE([AC_TYPE_GETGROUPS]) AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles + + AC_CHECK_FUNCS([getgroups]) if test "$ac_cv_func_getgroups" != yes; then HAVE_GETGROUPS=0 - elif test "$ac_cv_func_getgroups_works.$ac_cv_type_getgroups" != yes.gid_t - then - REPLACE_GETGROUPS=1 - AC_DEFINE([GETGROUPS_ZERO_BUG], [1], [Define this to 1 if - getgroups(0,NULL) does not return the number of groups.]) else - dnl Detect FreeBSD bug; POSIX requires getgroups(-1,ptr) to fail. - AC_CACHE_CHECK([whether getgroups handles negative values], - [gl_cv_func_getgroups_works], - [AC_RUN_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT], - [[int size = getgroups (0, 0); - gid_t *list = malloc (size * sizeof *list); - return getgroups (-1, list) != -1;]])], - [gl_cv_func_getgroups_works=yes], - [gl_cv_func_getgroups_works=no], - [case "$host_os" in - # Guess yes on glibc systems. - *-gnu*) gl_cv_func_getgroups_works="guessing yes" ;; - # If we don't know, assume the worst. - *) gl_cv_func_getgroups_works="guessing no" ;; - esac - ])]) - case "$gl_cv_func_getgroups_works" in - *yes) ;; - *) - REPLACE_GETGROUPS=1 + if test $cross_compiling = no; then + AC_FUNC_GETGROUPS + else + dnl Improved cross-compilation guess. + case "$host_os" in + # Guess yes on glibc systems. + *-gnu*) ac_cv_func_getgroups_works="guessing yes" ;; + # If we don't know, assume the worst. + *) ac_cv_func_getgroups_works="guessing no" ;; + esac + fi + case "$ac_cv_func_getgroups" in + *yes) + AC_DEFINE([HAVE_GETGROUPS], [1], + [Define to 1 if your system has a working 'getgroups' function.]) ;; esac + if test "$ac_cv_type_getgroups" != gid_t \ + || { case "$ac_cv_func_getgroups_works in + *yes) false;; + *) true;; + esac + }; then + REPLACE_GETGROUPS=1 + AC_DEFINE([GETGROUPS_ZERO_BUG], [1], [Define this to 1 if + getgroups(0,NULL) does not return the number of groups.]) + else + dnl Detect FreeBSD bug; POSIX requires getgroups(-1,ptr) to fail. + AC_CACHE_CHECK([whether getgroups handles negative values], + [gl_cv_func_getgroups_works], + [AC_RUN_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT], + [[int size = getgroups (0, 0); + gid_t *list = malloc (size * sizeof *list); + return getgroups (-1, list) != -1;]])], + [gl_cv_func_getgroups_works=yes], + [gl_cv_func_getgroups_works=no], + [case "$host_os" in + # Guess yes on glibc systems. + *-gnu*) gl_cv_func_getgroups_works="guessing yes" ;; + # If we don't know, assume the worst. + *) gl_cv_func_getgroups_works="guessing no" ;; + esac + ])]) + case "$gl_cv_func_getgroups_works" in + *yes) ;; + *) + REPLACE_GETGROUPS=1 + ;; + esac + fi fi test -n "$GETGROUPS_LIB" && LIBS="$GETGROUPS_LIB $LIBS" ])