bug-gnulib
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]