[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: "dynamic" makefile
From: |
Sylvestre Ledru |
Subject: |
Re: "dynamic" makefile |
Date: |
Thu, 07 Dec 2006 18:23:54 +0100 |
Le jeudi 30 novembre 2006 à 15:45 +0100, Ralf Wildenhues a écrit :
> * Sylvestre Ledru wrote on Thu, Nov 30, 2006 at 03:02:21PM CET:
> >
> > I would like to generate a Makefile which will work with source files
> > provided in the command line (parameters) instead of providing them into
> > the Makefile.am.
> [...]
> > I would like to be able to produce this kind of line from a Makefile.am
> > but instead of providing "src/hashtable_localization.c", it will use
> > parameters provided by the user. (ie $1)
> >
> > I want to do this because I want to provide to the user of my
> > application the possibility to edit C/fortran files, compile, link and
> > load them from the application without touching configure.* or Makefile*
>
> I don't think this is possible in general. If the list of files the
> user can choose is a subset of a pre-defined set of source file names,
> you can stuff all of those in some EXTRA_foo_SOURCES variable.
>
> Otherwise, all you can get is the inference rules. I.e.,
> make foo.o
>
> will look for foo.c (and maybe foo.f, foo.cpp...) and if found use the
> corresponding .c.o (or .f.o, .cpp.o, ...) rule if you have enabled the
> inference rule. (Automake outputs them as soon as you list some source
> file with that extension in a *_SOURCES variable; an EXTRA_*_SOURCES as
> above would probably come in handy again). But this won't get you the
> benefit of dependency-tracking of included files. And you'd still have
> to write a rule for linking (but you can just write one manually and
> make it depend upon a macro name which the user overrides).
>
> Hope that helps.
Yep, it did help.
I worked on a solution. Some might find it perfectible (and I won't deny
it) :)
It is a test case.
Here is the procedure :
# autoreconf (just once for the maintainer, just to create Makefile.in
and configure)
# ./configure
# ./compile.sh mygreatlib plop.c plop.f
# make
Here is what I did :
------- Makefile.am -------
lib_LTLIBRARIES = libsciexternal.la
libsciexternal_la_SOURCES = foo.c foo2.f foo3.cxx
------- configure.ac -------
AC_INIT([project],[0],[url])
AM_MAINTAINER_MODE
AM_INIT_AUTOMAKE([foreign])
AC_PROG_CC
AC_PROG_CXX
AC_PROG_F77
AC_PROG_LIBTOOL
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
------- compile.sh -------
#!/bin/sh
ORIGINALLIBNAME=libsciexternal
# Check number of parameters
if test $# -lt 2; then
echo "Syntax : $0 libname sources"
exit -1
fi
# retrieve parameters
LIB=$1
shift
SOURCES=$*
# Check if files exist
for file in $SOURCES; do
if test ! -s $file; then
echo "Cannot find $file"
exit -2
fi
done
# Relaunch configure if files are missing
if test ! -s Makefile -o Makefile -ot Makefile.orig ; then
echo "Detection of C/C++/Fortran Compilers"
./configure
mv Makefile Makefile.orig
fi
# Replace fake filenames to the one we want
sed -s "s|libsciexternal_la_SOURCES = foo.c foo2.f foo3.cxx|
lib"$LIB"_la_SOURCES = $SOURCES|" Makefile.orig > Makefile
##Replace sources by .lo file
SOURCES=`echo $SOURCES|sed -s 's|\.c|\.lo|'`
SOURCES=`echo $SOURCES|sed -s 's|\.f|\.lo|'`
SOURCES=`echo $SOURCES|sed -s 's|\.cxx|\.lo|'`
### Changes objects in the source code
sed -si "s|am_libsciexternal_la_OBJECTS = foo.lo foo2.lo foo3.lo|
am_lib"$LIB"_la_OBJECTS = $SOURCES|" Makefile
### Changes objects in the source code
sed -si "s|libsciexternal|lib"$LIB"|" Makefile
-------
Comments/criticism are welcome :)
Cheers,
Sylvestre
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- Re: "dynamic" makefile,
Sylvestre Ledru <=