[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
AC_DEFUN_ONCE and conditional dependencies
From: |
Bruno Haible |
Subject: |
AC_DEFUN_ONCE and conditional dependencies |
Date: |
Tue, 03 Jul 2012 03:20:11 +0200 |
User-agent: |
KMail/4.7.4 (Linux/3.1.10-1.9-desktop; KDE/4.7.4; x86_64; ; ) |
Hi Eric,
I wrote:
> But I have two issues with AC_DEFUN_ONCE.
> ...
> More generally, this would lead to the coding convention that all macros
> gl_FUNC_FOO for a single function foo() would be an AC_DEFUN_ONCE.
My second issue with AC_DEFUN_ONCE is that this coding convention would
defeat parts of the benefits of conditional dependencies. Namely, if 'foo'
is a module that is conditionally included (depending on the system), then
so far we have been able to eliminate both the autoconf test (gl_FUNC_FOO
invocation) and the code (foo.o compilation unit) on systems where the
module is not used. But if gl_FUNC_FOO is defined through AC_DEFUN_ONCE,
its body is expanded unconditionally, before gl_INIT, therefore it is
executed on all systems.
How can we fix this?
I'm thinking about two macros AC_DEFUN_ONCE_IFNEEDED, AC_REQUIRE_IFNEEDED
that will operate like AC_DEFUN_ONCE and AC_REQUIRE except that they will
ensure that the body is executed only when actually needed.
AC_DEFUN_ONCE works like this:
AC_DEFUN_ONCE([FOO], [
AC_REQUIRE([DEPENDENCY1])
AC_REQUIRE([DEPENDENCY2])
BODY-CODE
])
=>
AC_DEFUN([FOO],
[
AC_REQUIRE([FOO_BODY])
])
AC_DEFUN([FOO_BODY], [
AC_REQUIRE([DEPENDENCY1])
AC_REQUIRE([DEPENDENCY2])
BODY-CODE
])
AC_DEFUN_ONCE_IFNEEDED would use shell functions, roughly like this:
AC_DEFUN_ONCE_IFNEEDED([FOO], [
AC_REQUIRE([DEPENDENCY1])
AC_REQUIRE_IFNEEDED([DEPENDENCY2])
BODY-CODE
])
=>
AC_DEFUN([FOO],
[
AC_REQUIRE([FOO_BODY])
foo_func
])
AC_DEFUN([FOO_BODY], [
AC_REQUIRE([DEPENDENCY1])
AC_REQUIRE([DEPENDENCY2])
foo_var=false
foo_func ()
{
if ! $foo_var; then
dependency2_func
BODY-CODE
foo_var=true
fi
}
])
Eric, is it possible to write such macros? It is complicated, sure. But
is there something that makes the idea unimplementable?
Bruno