Hi, Ian Beckwith wrote: > 'make check' fails because modules/ioctl uses AC_CHECK_FUNCS: > > $ make check > git grep -w -l AC_CHECK_FUNCS modules && \ > { echo use AC_CHECK_FUNCS_ONCE, not AC_CHECK_FUNCS in modules/ > 1>&2; \ > exit 1; } || : > modules/ioctl > use AC_CHECK_FUNCS_ONCE, not AC_CHECK_FUNCS in modules/ > make: *** [sc_prefer_ac_check_funcs_once] Error 1
When we introduced this check, Jim Meyering said [1]: "if there's enough logic, then you can argue it belongs in a .m4 file and not in the module file's configure.ac section." [1] http://lists.gnu.org/archive/html/bug-gnulib/2009-10/msg00147.html This fixes the error: 2010-04-19 Bruno Haible <br...@clisp.org> ioctl: Move autoconf macro to a .m4 file. * m4/ioctl.m4: New file, extracted from modules/ioctl. * modules/ioctl (Files): Add it. (configure.ac): Simply invoke gl_FUNC_IOCTL. Reported by Ian Beckwith <i...@erislabs.net>. ================================= m4/ioctl.m4 ================================= # ioctl.m4 serial 1 dnl Copyright (C) 2008-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_IOCTL], [ AC_REQUIRE([gl_SYS_IOCTL_H_DEFAULTS]) AC_REQUIRE([gl_HEADER_SYS_SOCKET]) if test "$ac_cv_header_winsock2_h" = yes; then dnl Even if the 'socket' module is not used here, another part of the dnl application may use it and pass file descriptors that refer to dnl sockets to the ioctl() function. So enable the support for sockets. AC_LIBOBJ([ioctl]) gl_REPLACE_SYS_IOCTL_H else AC_CHECK_FUNCS([ioctl]) dnl On glibc systems, the second parameter is 'unsigned long int request', dnl not 'int request'. We cannot simply cast the function pointer, but dnl instead need a wrapper. AC_CACHE_CHECK([for ioctl with POSIX signature], [gl_cv_func_ioctl_posix_signature], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include <sys/ioctl.h>]], [[extern int ioctl (int, int, ...);]]) ], [gl_cv_func_ioctl_posix_signature=yes], [gl_cv_func_ioctl_posix_signature=no]) ]) if test $gl_cv_func_ioctl_posix_signature != yes; then REPLACE_IOCTL=1 AC_LIBOBJ([ioctl]) gl_REPLACE_SYS_IOCTL_H fi fi ]) =============================================================================== --- modules/ioctl.orig Mon Apr 19 22:23:25 2010 +++ modules/ioctl Mon Apr 19 22:07:11 2010 @@ -4,6 +4,7 @@ Files: lib/ioctl.c lib/w32sock.h +m4/ioctl.m4 Depends-on: sys_ioctl @@ -11,35 +12,7 @@ errno configure.ac: -AC_REQUIRE([gl_SYS_IOCTL_H_DEFAULTS]) -AC_REQUIRE([gl_HEADER_SYS_SOCKET]) -if test "$ac_cv_header_winsock2_h" = yes; then - dnl Even if the 'socket' module is not used here, another part of the - dnl application may use it and pass file descriptors that refer to - dnl sockets to the ioctl() function. So enable the support for sockets. - AC_LIBOBJ([ioctl]) - gl_REPLACE_SYS_IOCTL_H -else - AC_CHECK_FUNCS([ioctl]) - dnl On glibc systems, the second parameter is 'unsigned long int request', - dnl not 'int request'. We cannot simply cast the function pointer, but - dnl instead need a wrapper. - AC_CACHE_CHECK([for ioctl with POSIX signature], - [gl_cv_func_ioctl_posix_signature], - [AC_COMPILE_IFELSE( - [AC_LANG_PROGRAM( - [[#include <sys/ioctl.h>]], - [[extern int ioctl (int, int, ...);]]) - ], - [gl_cv_func_ioctl_posix_signature=yes], - [gl_cv_func_ioctl_posix_signature=no]) - ]) - if test $gl_cv_func_ioctl_posix_signature != yes; then - REPLACE_IOCTL=1 - AC_LIBOBJ([ioctl]) - gl_REPLACE_SYS_IOCTL_H - fi -fi +gl_FUNC_IOCTL gl_SYS_IOCTL_MODULE_INDICATOR([ioctl]) Makefile.am: