Hi Michael, * Michael Schulz wrote on Sat, Nov 05, 2005 at 05:23:30PM CET: > > I'm newbe to autoconf, automake. > I try to make a target in Makefile.am that compiles the base source code > with some extra code and extra libs. > But a 'make fb' only compiles the base source code. Makefile.am:
*snip* > fb: > @if test "$(LINUX_FRAMEBUFFER)" = "yes"; then \ > echo -e "\n*** Compile moll with image support via Linux > framebuffer! ***\n"; \ > echo -e "\n/* Define to 1 if you have Linux framebuffer. > */\n#define HAVE_LINUX_FB 1" >> $(srcdir)/config.h; \ > SOURCES="$(SOURCES) $(moll_fb_sources)"; \ > LIBS="$(LIBS) $(LIBS_IMAGE)"; \ > $(MAKE) all; \ > else \ > echo -e "\nNo support for Linux framebuffer!\n"; \ > fi Well, I don't quite understand what you are trying to achieve. First, I guess there is a typo in your Makefile.am: Did you mean moll_SOURCES="$(moll_SOURCES) $(moll_fb_SOURCES)" above? My following explanations assume you did. Next thing: setting of environment variables does not override the value of make macros (variables) by default. One uses either make target FOO=bar to set $(FOO), or FOO=bar make -e target or, equivalently, FOO=bar; export FOO; make -e target but the latter two cause all other environment variables to influence the make settings as well! (Imagine you had SHELL=/bin/csh, which is not so uncommon, unfortunately; that would be pretty bad.) Let's go on: Your snippet uses echo -e which is not quite portable; under ksh or ash, it will print "-e", for example. For non-ancient hosts, printf is quite portable and easier to use. Third, automake needs to know all sources at the time it is run. Fortunately, you can achieve this by either: defining two different targets you would like to build, or by using an automake conditional. Example with automake conditional: Put AM_CONDITIONAL([FRAMEBUF], [test "$LINUX_FRAMEBUFFER" = yes]) in configure.ac (in case $LINUX_FRAMEBUFFER is set in there), and in Makefile.am, put if FRAMEBUF moll_SOURCES += $(moll_fb_sources) endif Be sure to also look at the Automake documentation of conditionals, though. The other way (two targets) would be similar to this: bin_PROGRAMS = moll moll_fb moll_SOURCES = ... moll_fb_SOURCES = $(moll_SOURCES) $(moll_fb_sources) but I don't know whether that's applicable in your case. Lastly, it's not too good an idea to invoke 'make' from within a Makefile, unless you have to. It basically destroys its ability to know what has already been updated and what hasn't. I hope this helps you a bit further. Cheers, Ralf