On Mon, Jul 23, 2001 at 02:01:02AM +0200, Guido Draheim wrote:
> 
> Tim Van Holder wrote:
> > 
> > > Nowadays, many shared libraries include a -config script e.g. libgtk
> > > [...]
> > > There is much duplication of code here.  Anyone wishing to use this
> > > scheme must duplicate the script and then amend it for their use, and
> > > also convert the m4 macro as well, to AM_PATH_<LIB>.  libtool could be
> > > used to automate this.  Currently I maintain the gimp-print build
> > 
> > It seems to me this really is something that would fall under autoconf's
> > jurisdiction, so I've CC'd that list.
> > 
> > >[...]
> > > To remove the need for m4 macro duplication, a single macro could be
> > > used instead.  E.g.:
> > >
> > > AC_PATH_LIB(libname, minimum_version, header, config-script)
> > > where libname is the name of the library to check for e.g. gtk, gimp.
> > >       minimum version is the lowest version to allow
> > >       header is the header to include when compiling the test program
> > >         (default libname/libname.h)
> > >       script is the config script to run (default libname-config)
> > 
> > This seems potentially useful, though it would depend on how compatible
> > <lib>-config scripts actually are (i.e. if gtk-config and sdl-config,
> > for example, were to take different options, the usefulness of this
> > macro would be limited at best).

Well, if there is a minumum requirement a config script has to conform to,
and they are all generated with the companion macro, there shouldn't be
a problem.

> > > AC_LIB_CONFIG(libname, location)
> > > this would generate the script libname-config in the specified
> > > location in the source tree.  The following variables would be used in
> > 
> > That should be be AC_CONFIG_LIBCONFIG, to match the existing
> > AC_CONFIG_* macros.  I'm not sure this has to be a specific macro though,
> > as it could be easily created using the existing config.status mechanism.
> > [...]
> 
> There is a generic-config macro that I'm using quite often. However it
> does not implant code into config.status - it would be best to have
> that done somehow. Anyway, check the m4 source in the ac-archive under:
> http://www.gnu.org/software/ac-archive/Miscellaneous/ac_create_generic_config.html

This is what I was looking for.  Will this ever be made part of the
autoconf distribution?

I hope you don't mind, I have made a few changes to the macro (see the 
attached file).  The changes:
* more flexible
  - include more detail in output script
  - use --prefix=DIR and --exec-prefix=DIR for --cflags and --libs output
* fixed a minor error in the script
* use library-specific variables, so there can be many libconfig scripts
  in a single package (one per library)
* Renamed to AC_CONFIG_LIBCONFIG
* generate library-config.in, which is then processed by config.status to
  make library-config (so variables are always valid (e.g. $prefix)

Is this OK?  This is my first real attempt at m4, so there may be cleaner
ways of doing some things (e.g. remove some of the `translit' macros).

I would also like to auto-generate version headers, using version variables
in configure.in to work with the lib-check macro.  I could add an optional
third header argument, or make an entirely separate macro
(AC_CONFIG_LIBHEADER?).  Which would be best?

> btw, it does complement a generic lib-check macro that can be found as:
> http://www.gnu.org/software/ac-archive/Miscellaneous/ac_path_generic.html

I'll have a look at this next.  I'll try to add support for the --prefix and
--exec-prefix options if that's OK.

Thanks for the pointers.  Feel free to use the attached macro for whatever
you wish.

Regards,
Roger

-- 
Roger Leigh ** Registration Number: 151826, http://counter.li.org **
Need Epson Stylus Utilities? http://gimp-print.sourceforge.net/
For GPG Public Key: finger [EMAIL PROTECTED] or see public keyservers.
dnl @synopsis AC_CONFIG_LIBCONFIG [(LIBRARY [, DESTINATION])]
dnl
dnl Creates a custom LIBRARY-config file that has all the
dnl things that you want, hmm, well, at least it has
dnl --cflags, --version, --libs.  Optionally output header containing
dnl version details for use with other macros.
dnl
dnl This macros saves you all the typing for a library-config.in script,
dnl you don't even need to distribute one along. Place this macro
dnl in your configure.ac, et voila, you got one that you want to install.
dnl
dnl The defaults: $1 = $LIBRARY  $2 = $DESTINATION.
dnl
dnl It is suggested that the following CFLAGS and LIBS variables are used
dnl in your configure.in.  library_cflags and library_libs are
dnl *essential*.  If they do not exist, defaults will be taken from
dnl LIBRARY_CFLAGS, LIBRARY_LIBS (should be -llibrary *only*) and
dnl LIBRARY_LIBDEPS (-l options for libraries your library depends upon.
dnl LIBLIBRARY_LIBS is simply $LIBRARY_LIBS $LIBRARY_LIBDEPS.
dnl NB. LIBRARY and library are the name of your library, in upper and
dnl lower case, repectively e.g. GTK, gtk.
dnl
dnl LIBRARY_CFLAGS:    cflags for compiling libraries and example progs
dnl LIBRARY_LIBS:      libraries for linking programs.
dnl LIBRARY_LIBDEPS*:  libraries for linking libraries against
dnl library_cflags*:   cflags to store in library-config
dnl library_libs*:     libs to store in library-config
dnl LIBLIBRARY_LIBS:   libs to link programs IN THIS PACKAGE ONLY against
dnl LIBRARY_VERSION*:  the version of your library (x.y.z recommended)
dnl   *=required if you want sensible output.
dnl
dnl There is also an AC_SUBST(LIBRARY_CONFIG) that will be set to
dnl the name of the file that we output in this macro. Use as:
dnl
dnl  install-exec-local: install-config
dnl  install-config:
dnl     $(mkinstalldirs) $(DESTDIR)$(bindir)
dnl     $(INSTALL_EXEC) @LIBRARY_CONFIG@ $(DESTDIR)$(bindir)
dnl
dnl Or, if using automake:
dnl
dnl  bin_SCRIPTS = @LIBRARY_CONFIG@
dnl
dnl Based upon AC_CREATE_GENERIC_CONFIG (ac_create_generic_config.m4)
dnl by Guido Draheim <[EMAIL PROTECTED]>
dnl
dnl @version $Id:$
dnl @author Roger Leigh <[EMAIL PROTECTED]>
dnl
AC_DEFUN([AC_CONFIG_LIBCONFIG],[# create a custom library-config file ($1-config)
L=`echo ifelse($1, , $PACKAGE, $1)`
D=`echo ifelse($2, , ., $2)`
L=`echo $L`
dnl V=`echo ifelse($1, , $VERSION, $1)`
F=`echo $D/$L-config.in`

if test -z "$translit($1_cflags, [A-Z], [a-z])" ; then
  if test -n "$translit($1_CFLAGS, [a-z], [A-Z])" ; then
    translit($1_cflags, [A-Z], [a-z])="$translit($1_CFLAGS, [a-z], [A-Z])"
  else
    translit($1_cflags, [A-Z], [a-z])=''
  fi
  AC_SUBST(translit($1_cflags, [A-Z], [a-z]))
fi

if test -z "$translit($1_libs, [A-Z], [a-z])" ; then
  if test -n "$translit($1_LIBS, [a-z], [A-Z])" ; then
    translit($1_libs, [A-Z], [a-z])="$translit($1_LIBS, [a-z], [A-Z])"
  else
    translit($1_libs, [A-Z], [a-z])='-l$1'
  fi
  if test -n "$translit($1_LIBDEPS, [a-z], [A-Z])" ; then
    translit($1_libs, [A-Z], [a-z])="$translit($1_libs, [A-Z], [a-z]) 
$translit($1_LIBDEPS, [a-z], [A-Z])"
  fi
  AC_SUBST(translit($1_libs, [A-Z], [a-z]))
fi                          

if test -z "$translit($1_VERSION, [a-z], [A-Z])" ; then
  translit($1_VERSION, [a-z], [A-Z])="$VERSION"
  AC_SUBST(translit($1_VERSION, [a-z], [A-Z]))
fi

AC_MSG_RESULT(creating lib$L configuration script... $F)
echo '#! /bin/sh' >$F
echo ' ' >>$F
echo 'template_version="1.0.0"' >>$F
echo ' ' >>$F
echo 'package="@PACKAGE@"' >>$F
echo 'version="@translit($1_VERSION, [a-z], [A-Z])@"' >>$F
echo 'cflags="@translit($1_cflags, [A-Z], [a-z])@"' >>$F
echo 'libs="@translit($1_libs, [A-Z], [a-z])@"' >>$F
echo ' ' >>$F
# in the order of occurence a standard automake Makefile
echo 'prefix="@prefix@"' >>$F
echo 'exec_prefix="@exec_prefix@"' >>$F
echo 'bindir="@bindir@"' >>$F
echo 'sbindir="@sbindir@"' >>$F
echo 'libexecdir="@libexecdir@"' >>$F
echo 'datadir="@datadir@"' >>$F
echo 'sysconfdir="@sysconfdir@"' >>$F
echo 'sharedstatedir="@sharedstatedir@"' >>$F
echo 'localstatedir="@localstatedir@"' >>$F
echo 'libdir="@libdir@"' >>$F
echo 'infodir="@infodir@"' >>$F
echo 'mandir="@mandir@"' >>$F
echo 'includedir="@includedir@"' >>$F
echo 'target="'$target'"' >>$F
echo 'host="'$host'"' >>$F
echo 'build="'$build'"' >>$F
echo ' ' >>$F
echo 'if test "'"\$""#"'" -eq 0; then' >>$F
echo '   cat <<EOF' >>$F
echo 'Usage: $1-config [[OPTIONS]]' >>$F
echo 'Options:' >>$F
echo '        [[--prefix[=DIR]]]' >>$F
echo '        [[--exec-prefix[=DIR]]]' >>$F
echo '        [[--package]]' >>$F
echo '        [[--version]]' >>$F
echo '        [[--cflags]]' >>$F
echo '        [[--libs]]' >>$F
echo '        [[--help]]' >>$F
echo 'EOF' >>$F
echo 'fi' >>$F
echo ' ' >>$F
echo 'o=""' >>$F
echo 'h=""' >>$F
echo 'for i ; do' >>$F
echo '  case $i in' >>$F
echo '  --prefix=*) prefix=`echo $i | sed -e "s/--prefix=//"` ;' >>$F
echo '    includedir="$prefix/include" ;' >>$F
echo '    libdir="$prefix/lib" ;;' >>$F
echo '  --prefix)    o="$o $prefix" ;;' >>$F
echo '  --exec_prefix|--eprefix) o="$o $exec_prefix" ;;' >>$F
echo '  --exec-prefix=*) exec_prefix=`echo $i | sed -e "s/--exec-prefix=//"` ;' >>$F
echo '    libdir="$exec_prefix/lib" ;;' >>$F
echo '  --package)   o="$o $package" ;;' >>$F
echo '  --version)   o="$o $version" ;;' >>$F
echo '  --cflags) if test "_$includedir" != "_/usr/include" ; then' >>$F
echo '    o="$o -I$includedir" ;' >>$F
echo '    o="$o $cflags" ; fi' >>$F
echo '  ;;' >>$F
echo '  --libs)                  o="$o -L$libdir $libs" ;;' >>$F
echo '  --bindir)                o="$o $bindir" ;;' >>$F
echo '  --sbindir)               o="$o $sbindir" ;;' >>$F
echo '  --libexecdir)            o="$o $libexecdir" ;;' >>$F
echo '  --datadir)               o="$o $datadir" ;;' >>$F
echo '  --sysconfdir)            o="$o $sysconfdir" ;;' >>$F
echo '  --sharedstatedir)        o="$o $sharedstatedir" ;;' >>$F
echo '  --localstatedir)         o="$o $localstatedir" ;;' >>$F
echo '  --libdir)                o="$o $libdir" ;;' >>$F
echo '  --infodir)               o="$o $infodir" ;;' >>$F
echo '  --mandir)                o="$o $mandir" ;;' >>$F
echo '  --target)                o="$o $target" ;;' >>$F
echo '  --host)                  o="$o $host" ;;' >>$F
echo '  --build)                 o="$o $build" ;;' >>$F
echo '  --pkgdatadir)            o="$o $datadir/$package" ;;' >>$F
echo '  --pkglibdir)             o="$o $libdir/$package" ;;' >>$F
echo '  --pkgincludedir)         o="$o $includedir/$package" ;;' >>$F
echo '  --template-version)      o="$o $template_version" ;;' >>$F
echo '  --help) h="1" ;;' >>$F
echo '  //*|/*//*|./*//*) v=`echo $i | sed -e s://:\$:g`' >>$F
echo '       v=`eval "echo $v"` ' >>$F
echo '       o="$o $v" ;; ' >>$F
echo '  esac' >>$F
echo 'done' >>$F
echo ' ' >>$F
echo 'o=`eval "echo $o"`' >>$F
echo 'o=`eval "echo $o"`' >>$F
echo 'eval "echo $o"' >>$F
echo ' ' >>$F
echo 'if test ! -z "$h" ; then ' >>$F
echo 'cat <<EOF' >>$F
echo 'All available options:' >>$F
echo '  --prefix=DIR and  Change prefix and exec-prefix' >>$F
echo '  --exec-prefix=DIR (only affects --libs and --cflags)' >>$F
echo '  --prefix          \$prefix        $prefix' >>$F
echo '  --package         \$package       $package' >>$F
echo '  --version         \$version       $version' >>$F
echo '  --cflags          -I\$includedir  unless it is /usr/include' >>$F
echo '  --libs            -L\$libdir \$LIBS $libs' >>$F
echo '  --exec_prefix  or... ' >>$F
echo '  --eprefix         \$exec_prefix   $exec_prefix' >>$F
echo '  --bindir          \$bindir        $bindir' >>$F
echo '  --sbindir         \$sbindir       $sbindir' >>$F
echo '  --libexecdir      \$libexecdir    $libexecdir' >>$F
echo '  --datadir         \$datadir       $datadir' >>$F
echo '  --sysconfdir      \$sysconfdir    $sysconfdir' >>$F
echo '  --sharedstatedir  \$sharedstatedir$sharedstatedir' >>$F
echo '  --localstatedir   \$localstatedir $localstatedir' >>$F
echo '  --libdir          \$libdir        $libdir' >>$F
echo '  --infodir         \$infodir       $infodir' >>$F
echo '  --mandir          \$mandir        $mandir' >>$F
echo '  --target          \$target        $target' >>$F
echo '  --host            \$host          $host' >>$F
echo '  --build           \$build         $build' >>$F
echo '  --pkgdatadir      \$datadir/\$package' >>$F
echo '  --pkglibdir       \$libdir/\$package' >>$F
echo '  --pkgincludedir   \$includedir/\$package' >>$F
echo '  --template-version $template_version' >>$F
echo '  --help            generated by ac_create_libconfig.m4' >>$F
echo 'EOF' >>$F
echo 'fi' >>$F
translit($1_CONFIG, [a-z], [A-Z])="$F"
AC_SUBST(translit($1_CONFIG, [a-z], [A-Z]))
])

Reply via email to