Question

I'm working on a project that will be distributed with GNU autoconf/automake, and I have a set of bash scripts which call awk scripts. I would like the bash scripts to end up in the $PATH, but not the awk scripts. How should I insert these into the project? Should they be put in with other binaries?

Also, is there a way to determine the final location of the file after installation? I presume that /usr/local/bin isn't always where the executables end up...

Was it helpful?

Solution

Add something like this to Makefile.am

scriptsdir = $(prefix)/bin
scripts_DATA = awkscript1 awkscript2

In this case it will install awkscript in $(prefix)/bin (you can also use $(bindir)).

Note: Dont forget that the first should be named name + dir (scripts -> scriptsdir) and the second should be name + _DATA (scripts -> scripts_DATA).

OTHER TIPS

You can just list the scripts that you want to be installed in Makefile.am:

bin_SCRIPTS = foo bar

This will cause foo and bar to be installed during make install. To get the path to their final location, you can use @bindir@ in foo.in and let configure build foo for you. For example, in configure.ac:

AC_CONFIG_FILES([foo bar])

and then in foo.in:

#!/bin/sh

prefix=@prefix@
exec_prefix=@exec_prefix@
bindir=@bindir@
echo bindir = $bindir

Keep in mind that the person running configure may specify any of --prefix, --exec_prefix, or --bindir, and the installation may be redirected with a DESTDIR. Using the technique described here, DESTDIR will not be taken into account and the script will be installed in a location other than the path that it will echo. This is by design, and is the correct behavior, as usually a DESTDIR installation is used to create a tarball that will eventually be unpacked into the filesystem in such a way that the bindir in the script becomes valid.

Jonathan, in response to your additional question: if you want to replace the value of prefix at the time of build, you will need to:

  1. rename your script 'myscript' to 'myscript.in'
  2. add a rule to configure.ac to generate it at the bottom
  3. use a macro I made called AS_AC_EXPAND
  4. use it like this:

    AS_AC_EXPAND(BINDIR, $bindir)

  5. in your 'myscript.in', you can now use @BINDIR@ and it will get expanded to the full path where the script will end up being installed.

Note that you shouldn't use PREFIX directly, any of the installation directories can potentially be changed so you really want to use the value passed to configure for bindir and expand that.

If the awk scripts won't go into the main bin directory (prefix/bin), then you need to place them in an appropriate sub-directory - probably of lib but possibly libexec or share (since the awk scripts are probably platform neutral).

Correct: software won't necessarily end up in /usr/local/bin; on my machine, /usr/local/bin is managed by MIS and all the software I install therefore goes under /usr/gnu/. I use: ./configure --prefix=/usr/gnu to get the software installed where I want it.

You can embed the value of PREFIX in the bash scripts -- effectively, you will 'compile' the scripts to include the install location. Be aware of problems during the build testing - you may need to locate the scripts relative to the current directory first and relative to PREFIX later.

There is some advice about this in the Automake manual. It seems that the preferred approach is to generate the scripts with the makefile rather than with the configure script.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top