On 01/06/2013 09:45 AM, David Yu wrote: > Hi guys: > I want my project auto probe the Makefile.am entry all > directories, if a directory has Makefile.am, I will create Makefile.in > with automake. > Your best bet is to create a bootstrap script that prepares this information for autoconf; something like (untested!):
#!/bin/sh makefiles=`find . -name Makefile.am | sed 's/\.am/'` dirs=`echo "$makefiles" | sed 's,/Makefile$,,' for f in $makefiles; do echo "AC_CONFIG_FILES([$f])"; done > config-files.m4 echo SUBDIRS = > subdirs.am for d in $dirs; do test "$d" = . || echo "SUBDIRS += $d"; done >> subdirs.am and then, in configure.ac: m4_include([config-files.m4]) and in top-level Makefile.am: include $(top_srcdir)/subdirs.am But is this extra complication really worth? If you don't have too many Makefile.am and subdirectories, I suggest you to list them explicitly in AC_CONFIG_FILES ans SUBDIRS. That will save you lot of headaches later (among them, the need to explicitly re-run the above bootstrap by hand whenever you add, remove or rename a Makefile.am-holding subdirectory). > After that, I will create Makefile with configure. > > Here is my key codes of configure.in and Makefile.am > --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- > #configure.in > DEVICE_COMPILE="shell find ./ -mindepth 2 -name Makefile.am | sed > 's/Makefile.am/ /'" > AC_SUBST(DEVICE_COMPILE) > # probe the device modules > for DEVICE_MODULES in `find device -mindepth 2 -name Makefile.am | sed > 's/Makefile.am/Makefile/'` > do > echo $DEVICE_MODULES > AC_CONFIG_FILES($DEVICE_MODULES) > done > AC_OUTPUT > This has no hope to work, since the arguments of AC_CONFIG_FILES must be known by autoconf and automake at m4 runtime, not at shell runtime. (True, you can run shell code from m4 as well -- with the 'm4_esyscmd' and 'm4_esyscmd_s' autoconf-provided macros -- but doing so will likely prove even more brittle than the "bootstrap script" approach I suggested above). > --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- > #Makefile.am > SUBDIRS = $(@DEVICE_COMPILE@) > Specifying the list of SUBDIRS as configure-time @subst@ has its share of issues too; see: <http://www.gnu.org/software/automake/manual/automake.html#Subdirectories-with-AC_005fSUBST> > --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- > > 1. I can probe the Makefile.am of every directory. > 2. But I can't create Makefile.in with "automake --add-missing --copy > --force-missing". > 3. I added "AC_CONFIG_FILES(test/Makefile)" into configure.in, It can > create Makefile.in in test/. > 4. I removed "AC_CONFIG_FILES(test/Makefile)" from configure.in, I can > create Makefile with Makefile.in that is created in step 3. > > I guess automake use "AC_CONFIG_FILES($DEVICE_MODULES)" create Makefile.in, > but automake can't run the shell command, So "$DEVICE_MODULES" is NULL or > invalid. While It can execute the shell command in the process of > configure, so configure can create Makefile entry every directory that has > Makefile.am, But there is not Makefile.in. then I get a error : > *config.status: > error: cannot find input file: `test/Makefile.in'* > * > * > My question is how to use shell command in the process of automake. > Other method is ok too. > > My English is not good, I hope you can get it. > > > David Yu > Thanks > HTH, Stefano