autoconf
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: How to substitute variables in script files? (Why is $prefix set to


From: Stefano Sabatini
Subject: Re: How to substitute variables in script files? (Why is $prefix set to NONE?)
Date: Thu, 1 Mar 2007 16:52:51 +0100
User-agent: Mutt/1.5.13 (2006-08-11)

Hi Keith, and thanks for the fast reply!

On date Thursday 2007-03-01 13:25:42 +0000, Keith MARSHALL configured this 
message:
> Stefano Sabatini wrote:
> > I'm working on a project when I have a Perl script, call it "script",
> > which contains some installation dependant paths.
> >
> > Since I don't want to hardcode them, I created a "script.in" file, which
> > contains a line with:
> >
> > my $system_config_file= "@SYSCONF_DIR@/script.conf";
> >
> > and placed this snippet in configure.ac:
> >
> > dnl $sysconfdir contains "${prefix}/etc, so I have to
> > dnl eval it another time
> > eval "eval SYSCONF_DIR=$sysconfdir"
> >
> > AC_SUBST(SYSCONF_DIR)
> >
> > AC_CONFIG_FILES(script)
> > 
> > This works mainly as expected, but in the script file I get:
> >
> > my $system_config_file= "NONE/etc/pac.conf";
> >                          ^^^^
> >
> > What am I missing?
> 
> Autoconf initialises `prefix=NONE', then resets it to what the user gave
> as the `--prefix=/some/path' argument.  If the user doesn't specify such
> an argument, then it remains set as `NONE' to the end of the configure
> script, eventually being replaced by `prefix=$ac_default_prefix' in
> config.status, just before generating the AC_CONFIG_FILES; this allows
> your configure script to check, at any time, whether or not the user
> specified `--prefix=/some/path', (e.g. with `test "$prefix" = NONE',
> although AFAIK this feature is undocumented).
> 
> To work around it, you have two options:--
> 
> 1) Defer the extra `eval' to your generated script, so expanding that
>    embedded ${prefix} reference when your own script is run.

Follow a possible implementation of this suggestion:

to put in the input Perl script "script.in" something as:
my $prefix="@prefix@";
...
my $system_config_file= "@SYSCONF_DIR@/script.conf"; 

In the resulting "script" file, prefix will be expanded to something as
"/usr/local", while the last line will appear as:

my $system_config_file= "${prefix}/etc/script.conf"; 

It happens that *accidentally* the ${prefix} notation is understood by
Perl, so the script will perform *running time* the right
substitution.

Unfortunately it's rather ad-hoc solution and not very clear from the
point of view of the script.in reader, and it's not applicable to
other scripting languages that don't support that particular
shell-like syntax (e.g. lisp).

Though I'm not sure this is the solution that you meant.

> 2) Use a hairy construct in configure.ac, such as:--
> 
>    my_sysconfdir=`test "$prefix" = NONE && prefix=$ac_default_prefix;
>      eval echo "${sysconfdir}"`
>    AC_SUBST([my_sysconfdir])
> 
>    (hairy, because AFAIK $ac_default_prefix is undocumented).

2) So the corresponding solution will be:

to put in configure.ac:

SYSCONF_DIR=`test "$prefix" = NONE && prefix=$ac_default_prefix; eval echo 
"${sysconfdir}"`

AC_SUBST(SYSCONF_DIR)

AC_CONFIG_FILES(script)
AC_CONFIG_FILES(Makefile)
..
AC_OUTPUT

and in "script.in":
my $system_config_file= "@SYSCONF_DIR@/script.conf";
 
It doesn't appear too much awkward and it seems to work, so I'll stay
with this.

> > Another question: in the case it's possible to get this working, is it
> > a standard/recommended technique (I see examples using simply sed
> > translations in the Makefile to achieve the same effect)?
> 
> It comes down to whatever best suits the build infrastructure you've
> established for you own project.  My own preference is to let autoconf
> handle as much of the platform dependent variance as possible, and keep
> the makefiles relatively simple.

Me too, here it is why I prefer an autoconf based solution.

Regards
-- 
Stefano Sabatini
Linux user number 337176 (see http://counter.li.org)




reply via email to

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