[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: help in deciphering a gnulib-tool/bootstrap issue
From: |
Bruno Haible |
Subject: |
Re: help in deciphering a gnulib-tool/bootstrap issue |
Date: |
Thu, 5 May 2011 16:12:16 +0200 |
User-agent: |
KMail/1.9.9 |
Hi Eric,
> >>> ./bootstrap: aclocal -I m4 --force -I 'gnulib/m4' ...
> >>> missing file gnulib/tests/fseeko.c
> >>> configure.ac:80: error: expected source file, required through
> >>> AC_LIBSOURCES, not found
> ...
> the relaxation of fclose
> dependencies changed fflush from mandatory to test-only, but in the
> process, made it so that gl_REPLACE_FSEEKO is called while servicing the
> wrong directory.
Thanks for the analysis.
> So, one trick is to make the various gl_REPLACE_* functions one-shot -
> once a function has been replaced, then it shouldn't need replacing
> again (where the second call might be an attempt to do a second
> replacement in a test directory).
>
> diff --git i/m4/fseeko.m4 w/m4/fseeko.m4
> index 76507d1..eb5f2f3 100644
> --- i/m4/fseeko.m4
> +++ w/m4/fseeko.m4
> @@ -52,6 +52,9 @@ AC_DEFUN([gl_REPLACE_FSEEKO],
> AC_LIBOBJ([fseeko])
> dnl If we are also using the fseek module, then fseek needs replacing, too.
> m4_ifdef([gl_REPLACE_FSEEK], [gl_REPLACE_FSEEK])
> + dnl Once we have replaced the macro in the libs directory, we don't
> + dnl need to replace it in the tests directory
> + m4_pushdef([gl_REPLACE_FSEEKO])
> ])
This fix is not good, IMO. gnulib-tool already moderately supports multiple
gnulib-tool invocations in the scope of the same configure.ac (with different
--macro-prefix parameters, of course). And we want to support that fully;
Sam and Gary have been pushing for this.
In other words, gl_source_base being assigned "." and then later "tests"
is only a special case. In the run of a single configure,
gl_source_base might take on multiple values
"."
"subdir1"
"subdir2"
When a module has been enabled for subdir1, it does not mean that it can
be dropped from subdir2. The plan is to add a separate --basedir option
to gnulib-tool that identifies the cases where a module can be dropped
because it is already enabled in a particular other directory.
Therefore:
1) The problem here is that fflush.m4 invokes gl_REPLACE_FSEEKO,
which does an AC_LIBOBJ of a file outside module 'fflush'.
2) AC_REQUIRE of a macro that does AC_LIBOBJ is forbidden.
As a template how to fix 1), look at the modules 'mbrtowc' and 'mbrlen':
In mbrlen.m4 we have the code
AC_REQUIRE([gl_FUNC_MBRTOWC])
...
dnl Most bugs affecting the system's mbrtowc function also affect the
dnl mbrlen function. So override mbrlen whenever mbrtowc is overridden.
dnl We could also run the individual tests below; the results would be
dnl the same.
if test $REPLACE_MBRTOWC = 1; then
REPLACE_MBRLEN=1
fi
That is, it's not the 'mbrtowc' module which triggers an AC_LIBOBJ([mbrlen])
but it's the 'mbrlen' module which asks the 'mbrtowc' module whether it
should do AC_LIBOBJ([mbrlen]). A similar thing should be done with 'fflush'
and 'fseeko'.
But now I see that this code is not fully correct either: It does
AC_REQUIRE([gl_FUNC_MBRTOWC]), violating rule 2) above. In fact, it should
do an AC_REQUIRE of the autoconf tests of mbrtowc, _without_ the
AC_LIBOBJ([mbrtowc]) invocation.
This, together with the fact that now the condition under which an
AC_LIBOBJ is done is duplicated in the module description (for the
conditional dependencies), makes me think we should change our idioms
and
move all AC_LIBOBJ invocations to the configure.ac part of the
module description.
In other words:
Distinguish the autoconf tests (that determine some variables)
from the action (AC_LIBOBJ invocations).
The autoconf tests can be AC_REQUIREd, the actions cannot.
Here's an example of what I mean:
--- m4/mbrtowc.m4.orig Thu May 5 16:05:22 2011
+++ m4/mbrtowc.m4 Thu May 5 16:05:09 2011
@@ -53,10 +53,6 @@
esac
fi
fi
- if test $HAVE_MBRTOWC = 0 || test $REPLACE_MBRTOWC = 1; then
- AC_LIBOBJ([mbrtowc])
- gl_PREREQ_MBRTOWC
- fi
])
dnl Test whether mbsinit() and mbrtowc() need to be overridden in a way that
--- modules/mbrtowc.orig Thu May 5 16:05:22 2011
+++ modules/mbrtowc Thu May 5 16:05:05 2011
@@ -20,6 +20,10 @@
configure.ac:
gl_FUNC_MBRTOWC
+if test $HAVE_MBRTOWC = 0 || test $REPLACE_MBRTOWC = 1; then
+ AC_LIBOBJ([mbrtowc])
+ gl_PREREQ_MBRTOWC
+fi
gl_WCHAR_MODULE_INDICATOR([mbrtowc])
Makefile.am:
The benefits of these changed idioms will be:
- It becomes impossible to accidentally AC_REQUIRE an
AC_LIBOBJ invocation.
- The consistency between AC_LIBOBJ invocations and conditional dependencies
is easier to maintain.
- Instead of fflush.m4 invoking gl_REPLACE_FSEEKO, we can have
fseeko.m4 do a AC_REQUIRE([gl_FUNC_FFLUSH]), which solves the bug you found.
Bruno
--
In memoriam Peter van Pels <http://en.wikipedia.org/wiki/Peter_van_Pels>
- help in deciphering a gnulib-tool/bootstrap issue, Eric Blake, 2011/05/04
- Re: help in deciphering a gnulib-tool/bootstrap issue, Bruno Haible, 2011/05/04
- Re: help in deciphering a gnulib-tool/bootstrap issue, Eric Blake, 2011/05/04
- Re: help in deciphering a gnulib-tool/bootstrap issue, Eric Blake, 2011/05/04
- [PATCH 1/2] maint: remove useless REPLACE_*_H macros, Eric Blake, 2011/05/04
- [PATCH 2/2] maint: make most gl_REPLACE macros one-shot, Eric Blake, 2011/05/04
- Re: [PATCH 1/2] maint: remove useless REPLACE_*_H macros, Bruno Haible, 2011/05/05
- Re: [PATCH 1/2] maint: remove useless REPLACE_*_H macros, Eric Blake, 2011/05/05
- Re: help in deciphering a gnulib-tool/bootstrap issue,
Bruno Haible <=