From: Stefano Lattarini Date: Wed, 6 Jun 2012 08:27:46 +0000 (+0200) Subject: [ng] subdir-objects: enable unconditionally X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=14fe163aa44992641c0730b0c399aa7d6845e775;p=thirdparty%2Fautomake.git [ng] subdir-objects: enable unconditionally The fact that Automake-generated Makefiles places compiled object files in the current directory by default, also when the corresponding source file is in a subdirectory, is basically an historical accident, due to the fact that the 'subdir-objects' option had only been introduced in April 1999, starting with commit 'user-dep-gen-branchpoint-56-g88b5959', and never made the default, likely to avoid backwards-compatibility issues. Since we believe the behaviour enabled by the 'subdir-objects' is the only natural and most useful one, we make it the only only one available, simplifying the Automake implementation and APIs a little in the process. * NG-NEWS: Update. * doc/automake-ng.texi (Program and Library Variables): The output object files are not anymore placed in the current directory by default, but rather in the same directory of the source file. (LIBOBJS): Now the $(LIBOBJS) and $(ALLOCA) variables can also be be used outside of the directory where their sources lie. (List of Automake options): Don't document the 'subdir-objects' option anymore. Other related minor adjustments. * automake.in (LANG_PROCESS): Remove, it's not needed anymore. (handle_languages): Don't test whether option 'subdir-objects' is set (just assume it is), and do not use the '%SUBDIROBJ%' transform when processing '.am' fragments. (lang_sub_obj): Delete, it would just return 'LANG_SUBDIR' unconditionally now. (lang_c_rewrite): Adjust. Don't test whether the option 'subdir-objects' is set (just assume it is). (lang_yacc_rewrite): Likewise. (lang_lex_rewrite): Likewise. (handle_single_transform): Likewise. Remove an obsolete comment. Add a proper "FIXME" comments about a fragment of code that might have become dead code now. (handle_LIBOBJS_or_ALLOCA): Simplify assuming that the option 'subdir-objects' is always set. Accordingly, there's no need to warn anymore if '$(LIBOBJS)' or '$(ALLOCA)' are used outside the '$config_libobj_dir' directory (as specified by autoconf macro 'AC_CONFIG_LIBOBJ_DIR'). * lib/am/depend2.am: Assume the '?SUBDIROBJ?' Automake time conditional is always true, and remove its use accordingly. lib/am/depend2.am * t/ax/depcomp.sh: Adjust to the fact that 'subdir-objects' is always in effect. * t/ccnoco2.sh: Likewise. * t/cscope.tap: Likewise. * t/depcomp8a.sh: Likewise. * t/depcomp8b.sh: Likewise. * t/libtool3.sh: Likewise. * t/pr401.sh: Likewise. * t/pr401b.sh: Likewise. * t/pr401c.sh: Likewise. * t/lex-line.sh: Likewise. * t/yacc-line.sh: Likewise. * t/yacc5.sh: Likewise. * t/parallel-tests-suffix-prog.sh: Likewise. * t/fort4.sh: Likewise, and extend a bit. * t/fort5.sh: Likewise. * t/gcj.sh: Likewise. * t/subpkg.sh: Likewise. * t/subpkg-yacc.sh: Likewise. * t/xsource.sh: Likewise. * t/libobj20a.sh: Remove as obsolete. * t/libobj20b.sh: Adjust heading comments. * t/libobj20c.sh: Likewise. * t/subdir3.sh: Remove as obsolete. * t/subobj4.sh: Likewise. Signed-off-by: Stefano Lattarini --- diff --git a/NG-NEWS b/NG-NEWS index 1e3c4643c..b7ecce21c 100644 --- a/NG-NEWS +++ b/NG-NEWS @@ -69,6 +69,18 @@ Warnings and diagnostic access to less context and information. +Compilation and Object Files +============================= + +* If a source file is placed in a subdirectory, the corresponding compiled + object will always be put into the subdirectory named after the source + file, rather than in the current directory. For instance, 'src/file.c' + and 'src/file.f90' will be compiled to 'src/file.o', and 'sub/dir/mu.cc' + will be compiled to 'sub/dir/mu.o'. + That is, Automake-NG will unconditionally behave as Automake would do if + its 'subdir-objects' option were active. + + Serial testsuite harness (obsolescent) ====================================== diff --git a/automake.in b/automake.in index a78786673..14b328af8 100644 --- a/automake.in +++ b/automake.in @@ -286,7 +286,6 @@ my $gen_copyright = "\ # subdir if the source file is. In this case the file name cannot # have '..' components. use constant LANG_IGNORE => 0; -use constant LANG_PROCESS => 1; use constant LANG_SUBDIR => 2; # These are used when keeping track of whether an object can be built @@ -1360,7 +1359,6 @@ sub handle_languages '-c' => $lang->compile_flag || '', # These are not used, but they need to be defined # so &transform do not complain. - SUBDIROBJ => 0, 'DERIVED-EXT' => 'BUG', DIST_SOURCE => 1, VERBOSE => $verbose, @@ -1375,9 +1373,7 @@ sub handle_languages # needed. my $output_flag = $lang->output_flag || ''; $output_flag = '-o' - if (! $output_flag - && $lang->name eq 'c' - && option 'subdir-objects'); + if (! $output_flag && $lang->name eq 'c'); # Compute a possible derived extension. # This is not used by depend2.am. @@ -1400,8 +1396,7 @@ sub handle_languages COMPILE => '$(' . $lang->compiler . ')', LTCOMPILE => '$(LT' . $lang->compiler . ')', - -o => $output_flag, - SUBDIROBJ => !! option 'subdir-objects'); + -o => $output_flag); } # Now include code for each specially handled object with this @@ -1627,10 +1622,6 @@ sub handle_single_transform ($$$$$%) next; } - # If the source file is in a subdirectory then the '.o' is put - # into the current directory, unless the subdir-objects option - # is in effect. - # Split file name into base and extension. next if ! /^(?:(.*)\/)?([^\/]*?)(\.[^.]+)$/; prog_error ("source file '$_' missing dotted extension") @@ -1683,7 +1674,7 @@ sub handle_single_transform ($$$$$%) # generates another source file which we must then process # further. my $subr = \&{'lang_' . $lang->name . '_rewrite'}; - defined &$subr or $subr = \&lang_sub_obj; + defined &$subr or $subr = sub { return LANG_SUBDIR; }; my ($r, $source_extension) = &$subr ($directory, $base, $extension, $obj, $have_per_exec_flags, $var); @@ -1747,15 +1738,10 @@ sub handle_single_transform ($$$$$%) # flags are used) we cannot compile the file with an # inference rule: we need an explicit rule. # - # If the source is in a subdirectory and the object is in - # the current directory, we also need an explicit rule. - # # If both source and object files are in a subdirectory - # (this happens when the subdir-objects option is used), # then the inference will work. # if ($renamed - || ($directory ne '' && ! option 'subdir-objects') # We must also use specific rules for a nodist_ source # if its language requests it. || ($lang->nodist_specific && ! $transform{'DIST_SOURCE'})) @@ -1824,6 +1810,8 @@ sub handle_single_transform ($$$$$%) $linker = ''; } + # FIXME: this is likely an internal error now that we use + # FIXME: subdir-objects unconditionally ... err_am "object '$object' created by '$full' and '$object_map{$object}'" if (defined $object_map{$object} && $object_map{$object} ne $full); @@ -2154,25 +2142,17 @@ sub handle_LIBOBJS_or_ALLOCA ($) if ($config_libobj_dir && $relative_dir ne $config_libobj_dir) { - if (option 'subdir-objects') - { - # In the top-level Makefile we do not use $(top_builddir), because - # we are already there, and since the targets are built without - # a $(top_builddir), it helps BSD Make to match them with - # dependencies. - $dir = "$config_libobj_dir/" if $config_libobj_dir ne '.'; - $dir = "$topsrcdir/$dir" if $relative_dir ne '.'; - define_variable ('LIBOBJDIR', INTERNAL, $dir); - $clean_files{"\$($var)"} = MOSTLY_CLEAN; - # If LTLIBOBJS is used, we must also clear LIBOBJS (which might - # be created by libtool as a side-effect of creating LTLIBOBJS). - $clean_files{"\$($var)"} = MOSTLY_CLEAN if $var =~ s/^LT//; - } - else - { - error ("'\$($var)' cannot be used outside '$config_libobj_dir' if" - . " 'subdir-objects' is not set"); - } + # In the top-level Makefile we do not use $(top_builddir), because + # we are already there, and since the targets are built without + # a $(top_builddir), it helps BSD Make to match them with + # dependencies. + $dir = "$config_libobj_dir/" if $config_libobj_dir ne '.'; + $dir = "$topsrcdir/$dir" if $relative_dir ne '.'; + define_variable ('LIBOBJDIR', INTERNAL, $dir); + $clean_files{"\$($var)"} = MOSTLY_CLEAN; + # If LTLIBOBJS is used, we must also clear LIBOBJS (which might + # be created by libtool as a side-effect of creating LTLIBOBJS). + $clean_files{"\$($var)"} = MOSTLY_CLEAN if $var =~ s/^LT//; } return $dir; @@ -5099,50 +5079,34 @@ sub check_gnits_standards # Note that the calls to these functions are computed, so don't bother # searching for their precise names in the source. -# This is just a convenience function that can be used to determine -# when a subdir object should be used. -sub lang_sub_obj -{ - return option 'subdir-objects' ? LANG_SUBDIR : LANG_PROCESS; -} - # Rewrite a single C source file. sub lang_c_rewrite { my ($directory, $base, $ext, $obj, $have_per_exec_flags, $var) = @_; - my $r = LANG_PROCESS; - if (option 'subdir-objects') + # libtool is always able to put the object at the proper place, so we + # do not have to require AM_PROG_CC_C_O when building '.lo' files. + if (! $seen_cc_c_o && $obj ne '.lo') { - $r = LANG_SUBDIR; if ($directory && $directory ne '.') - { - $base = $directory . '/' . $base; - - # libtool is always able to put the object at the proper place, - # so we do not have to require AM_PROG_CC_C_O when building .lo files. - msg_var ('portability', $var, - "compiling '$base.c' in subdir requires " - . "'AM_PROG_CC_C_O' in '$configure_ac'", - uniq_scope => US_GLOBAL, - uniq_part => 'AM_PROG_CC_C_O subdir') - unless $seen_cc_c_o || $obj eq '.lo'; - } - } - - if (! $seen_cc_c_o - && $have_per_exec_flags - && ! option 'subdir-objects' - && $obj ne '.lo') - { - msg_var ('portability', - $var, "compiling '$base.c' with per-target flags requires " - . "'AM_PROG_CC_C_O' in '$configure_ac'", - uniq_scope => US_GLOBAL, - uniq_part => 'AM_PROG_CC_C_O per-target') + { + msg_var ('portability', $var, + "compiling '$directory/$base.c' in subdir requires" + . " 'AM_PROG_CC_C_O' in '$configure_ac'", + uniq_scope => US_GLOBAL, + uniq_part => 'AM_PROG_CC_C_O subdir'); + } + elsif ($have_per_exec_flags) + { + msg_var ('portability', $var, + "compiling '$base.c' with per-target flags requires" + . " 'AM_PROG_CC_C_O' in '$configure_ac'", + uniq_scope => US_GLOBAL, + uniq_part => 'AM_PROG_CC_C_O per-target'); + } } - return $r; + return LANG_SUBDIR; } # Rewrite a single header file. @@ -5166,9 +5130,8 @@ sub lang_yacc_rewrite { my ($directory, $base, $ext) = @_; - my $r = &lang_sub_obj; (my $newext = $ext) =~ tr/y/c/; - return ($r, $newext); + return (LANG_SUBDIR, $newext); } sub lang_yaccxx_rewrite { lang_yacc_rewrite (@_); }; @@ -5177,9 +5140,8 @@ sub lang_lex_rewrite { my ($directory, $base, $ext) = @_; - my $r = &lang_sub_obj; (my $newext = $ext) =~ tr/l/c/; - return ($r, $newext); + return (LANG_SUBDIR, $newext); } sub lang_lexxx_rewrite { lang_lex_rewrite (@_); }; diff --git a/doc/automake-ng.texi b/doc/automake-ng.texi index a01136c8c..563a569eb 100644 --- a/doc/automake-ng.texi +++ b/doc/automake-ng.texi @@ -4019,7 +4019,7 @@ choose the assembler for you (by default the C compiler) and set This is like @code{AC_PROG_CC_C_O}, but it generates its results in the manner required by Automake. You must use this instead of @code{AC_PROG_CC_C_O} when you need this functionality, that is, when -using per-target flags or subdir-objects with C sources. +using per-target flags or subdir objects with C sources. @item AM_PROG_LEX @acindex AM_PROG_LEX @@ -5563,18 +5563,13 @@ nodist_maude_SOURCES = nodist.c dist_maude_SOURCES = dist-me.c @end example -By default the output file (on Unix systems, the @file{.o} file) will -be put into the current build directory. However, if the option -@option{subdir-objects} is in effect in the current directory then the -@file{.o} file will be put into the subdirectory named after the -source file. For instance, with @option{subdir-objects} enabled, -@file{sub/dir/file.c} will be compiled to @file{sub/dir/file.o}. Some -people prefer this mode of operation. You can specify -@option{subdir-objects} in @code{AUTOMAKE_OPTIONS} (@pxref{Options}). +The output file (on Unix systems, the @file{.o} file) will be put into the +subdirectory named after the source file. For instance @file{file.c} will +compiled to @file{file.o}, while @file{sub/dir/file.c} will be compiled to +@file{sub/dir/file.o}. @cindex Subdirectory, objects in @cindex Objects in subdirectory - @item EXTRA_maude_SOURCES Automake needs to know the list of files you intend to compile @emph{statically}. For one thing, this is the only way Automake has of @@ -5970,19 +5965,15 @@ tool1_SOURCES = @dots{} tool2_SOURCES = @dots{} @end example -When option @option{subdir-objects} is not used, as in the above -example, the variables @samp{$(LIBOBJS)} or @samp{$(ALLOCA)} can only -be used in the directory where their sources lie. E.g., here it would -be wrong to use @samp{$(LIBOBJS)} or @samp{$(ALLOCA)} in -@file{src/Makefile.am}. However if both @option{subdir-objects} and -@code{AC_CONFIG_LIBOBJ_DIR} are used, it is OK to use these variables +The variables @samp{$(LIBOBJS)} or @samp{$(ALLOCA)} are typically +used in the directory where their sources lie. However, if +@code{AC_CONFIG_LIBOBJ_DIR} is used, it is OK to use these variables in other directories. For instance @file{src/Makefile.am} could be changed as follows. @example # src/Makefile.am -AUTOMAKE_OPTIONS = subdir-objects LDADD = $(LIBOBJS) $(ALLOCA) bin_PROGRAMS = tool1 tool2 @dots{} @@ -10120,18 +10111,6 @@ bin_SCRIPTS = true.sh ... AM_INSTALLCHECK_STD_OPTIONS_EXEMPT = false$(EXEEXT) true.sh @end example -@item @option{subdir-objects} -@cindex Options, @option{subdir-objects} -@opindex subdir-objects -If this option is specified, then objects are placed into the -subdirectory of the build directory corresponding to the subdirectory of -the source file. For instance, if the source file is -@file{subdir/file.cxx}, then the output file would be -@file{subdir/file.o}. - -In order to use this option with C sources, you should add -@code{AM_PROG_CC_C_O} to @file{configure.ac}. - @anchor{tar-formats} @item @option{tar-v7} @itemx @option{tar-ustar} diff --git a/lib/am/depend2.am b/lib/am/depend2.am index e68bba7ab..faf685a6e 100644 --- a/lib/am/depend2.am +++ b/lib/am/depend2.am @@ -33,8 +33,7 @@ ## and easily inline the dependency tracking. if %?FIRST% -?SUBDIROBJ?am__depdir = $(dir $@)/$(DEPDIR) -?!SUBDIROBJ?am__depdir = $(DEPDIR) +am__depdir = $(dir $@)/$(DEPDIR) ## FIXME: more precise in the removal of the suffix? am__depbase = $(am__depdir)/$(basename $(notdir $@)) ## Avoid useless forks when possible. diff --git a/lib/am/lex.am b/lib/am/lex.am index b5e2bb29d..038c125bb 100644 --- a/lib/am/lex.am +++ b/lib/am/lex.am @@ -23,7 +23,7 @@ endif %?MAINTAINER-MODE% ?GENERIC?%%DERIVED-EXT%: %%EXT% ?!GENERIC?%OBJ%: %SOURCE% -?SUBDIROBJ? %SILENT%test -d $(dir $@) || $(MKDIR_P) $(dir $@) + %SILENT%test -d $(dir $@) || $(MKDIR_P) $(dir $@) ?GENERIC? %VERBOSE%$(am__skiplex) \ ?!GENERIC??DIST_SOURCE? %VERBOSE%$(am__skiplex) \ $(SHELL) $(YLWRAP) $< $(LEX_OUTPUT_ROOT).c %OBJ% -- %COMPILE% diff --git a/lib/am/yacc.am b/lib/am/yacc.am index 4393ce9ea..3ead3a51a 100644 --- a/lib/am/yacc.am +++ b/lib/am/yacc.am @@ -41,7 +41,7 @@ endif %?FIRST% ?GENERIC?%%DERIVED-EXT%: %%EXT% ?!GENERIC?%OBJ%: %SOURCE% -?SUBDIROBJ? %SILENT%test -d $(dir $@) || $(MKDIR_P) $(dir $@) + %SILENT%test -d $(dir $@) || $(MKDIR_P) $(dir $@) %VERBOSE% \ ?GENERIC? $(am__skipyacc) \ ?!GENERIC??DIST_SOURCE? $(am__skipyacc) \ diff --git a/t/ax/depcomp.sh b/t/ax/depcomp.sh index a9180e937..7e38e2063 100644 --- a/t/ax/depcomp.sh +++ b/t/ax/depcomp.sh @@ -200,12 +200,12 @@ ${normalized_target}_${LINKADD} = src/libbaz.$a grep-test: ## For debugging. cat \$(DEPDIR)/foo.$po || : - cat \$(DEPDIR)/subfoo.$po || : + cat sub/\$(DEPDIR)/subfoo.$po || : cat src/\$(DEPDIR)/baz.$po || : cat src/sub2/\$(DEPDIR)/sub2foo.$po || : -## Checks done here. +## Checks are done here. grep '^foo.$objext.*:' \$(DEPDIR)/foo.$po - grep '^subfoo\.$objext.*:' \$(DEPDIR)/subfoo.$po + grep '^sub/subfoo\.$objext.*:' sub/\$(DEPDIR)/subfoo.$po grep '^baz\.$objext.*:' src/\$(DEPDIR)/baz.$po grep '^sub2/sub2foo\.$objext.*:' src/sub2/\$(DEPDIR)/sub2foo.$po END diff --git a/t/ccnoco2.sh b/t/ccnoco2.sh index e6c9c6428..b51629109 100755 --- a/t/ccnoco2.sh +++ b/t/ccnoco2.sh @@ -20,36 +20,33 @@ . ./defs || Exit 1 cat >>configure.ac <Makefile.am <Makefile.am <src/Makefile.am <> Makefile.am AUTOMAKE_fails --copy --add-missing -grep '^Makefile\.am:2:.*subdir.*AM_PROG_CC_C_O' stderr +grep "^Makefile\.am:3:.* 'a\.c' with per-target flags.* 'AM_PROG_CC_C_O'" stderr +grep "^src/Makefile\.am:2:.* 'sub/a\.c' in subdir.* 'AM_PROG_CC_C_O'" stderr + +rm -rf autom4te*.cache +echo AM_PROG_CC_C_O >> configure.ac +$ACLOCAL +$AUTOMAKE -a : diff --git a/t/cscope.tap b/t/cscope.tap index fb808ccae..8362b9f3b 100755 --- a/t/cscope.tap +++ b/t/cscope.tap @@ -24,6 +24,8 @@ ocwd=`pwd` || fatal_ "getting top-level directory" cat >> configure.ac << 'END' AC_CONFIG_FILES([sub/Makefile]) +m4_define([AM_PROG_CC_C_O], [:]) +AM_PROG_CC_C_O AC_SUBST([CC], [who-cares]) AC_SUBST([CXX], [who-cares]) AC_SUBST([FC], [who-cares]) diff --git a/t/depcomp8a.sh b/t/depcomp8a.sh index 01a2403c2..7467f1c54 100755 --- a/t/depcomp8a.sh +++ b/t/depcomp8a.sh @@ -24,7 +24,7 @@ required=cc cat >> configure.ac << 'END' AC_PROG_CC -#x AM_PROG_CC_C_O +AM_PROG_CC_C_O AC_OUTPUT END @@ -45,26 +45,6 @@ cat > sub/bar.c << 'END' extern int bar = 0; END -$ACLOCAL -$AUTOMAKE -a -grep include Makefile.in # For debugging. -grep 'include.*\./\$(DEPDIR)/foo\.P' Makefile.in -grep 'include.*\./\$(DEPDIR)/bar\.P' Makefile.in -grep 'include.*/\./\$(DEPDIR)' Makefile.in && Exit 1 - -$AUTOCONF -# Don't reject slower dependency extractors, for better coverage. -./configure --enable-dependency-tracking -$MAKE -cross_compiling || ./zardoz -DISTCHECK_CONFIGURE_FLAGS='--enable-dependency-tracking' $MAKE distcheck - -# Try again with subdir-objects option. - -sed 's/#x //' configure.ac >configure.int -mv -f configure.int configure.ac -echo AUTOMAKE_OPTIONS = subdir-objects >> Makefile.am - $ACLOCAL $AUTOMAKE -a grep include Makefile.in # For debugging. diff --git a/t/depcomp8b.sh b/t/depcomp8b.sh index b5f7371cd..1ecbbfd0b 100755 --- a/t/depcomp8b.sh +++ b/t/depcomp8b.sh @@ -24,7 +24,7 @@ required='cc libtoolize' cat >> configure.ac << 'END' AC_PROG_CC -#x AM_PROG_CC_C_O +AM_PROG_CC_C_O AM_PROG_AR AC_PROG_LIBTOOL AC_OUTPUT @@ -40,26 +40,6 @@ echo 'extern int foo = 0;' > foo.c echo 'extern int bar = 0;' > sub/bar.c libtoolize - -$ACLOCAL -$AUTOMAKE -a -grep include Makefile.in # For debugging. -grep 'include.*\./\$(DEPDIR)/foo\.P' Makefile.in -grep 'include.*\./\$(DEPDIR)/bar\.P' Makefile.in -grep 'include.*/\./\$(DEPDIR)' Makefile.in && Exit 1 - -$AUTOCONF -# Don't reject slower dependency extractors, for better coverage. -./configure --enable-dependency-tracking -$MAKE -DISTCHECK_CONFIGURE_FLAGS='--enable-dependency-tracking' $MAKE distcheck - -# Try again with subdir-objects option. - -sed 's/#x //' configure.ac >configure.int -mv -f configure.int configure.ac -echo AUTOMAKE_OPTIONS = subdir-objects >> Makefile.am - $ACLOCAL $AUTOMAKE -a grep include Makefile.in # For debugging. diff --git a/t/fort4.sh b/t/fort4.sh index a23c9bda5..eb85bda11 100755 --- a/t/fort4.sh +++ b/t/fort4.sh @@ -34,6 +34,7 @@ END cat >bye.f90 <<'END' program goodbye call baz + call zar stop end END @@ -46,6 +47,7 @@ END sed s,foo,bar, foo.f90 > sub/bar.f90 sed s,foo,baz, foo.f90 > sub/baz.f +sed s,foo,zar, foo.f90 > sub/zardoz.f90 cat >>configure.ac <<'END' AC_PROG_F77 @@ -59,9 +61,29 @@ END cat >Makefile.am <<'END' bin_PROGRAMS = hello goodbye hello_SOURCES = hello.f foo.f90 sub/bar.f90 -goodbye_SOURCES = bye.f90 sub/baz.f +goodbye_SOURCES = bye.f90 sub/baz.f sub/zardoz.f90 goodbye_FCFLAGS = LDADD = $(FCLIBS) + +.PHONY: test-obj +test-obj: + ls -l . sub # For debugging. + test -f hello.$(OBJEXT) + test -f foo.$(OBJEXT) + test -f sub/bar.$(OBJEXT) + test ! -f bar.$(OBJEXT) + test -f goodbye-bye.$(OBJEXT) + test ! -f bye.$(OBJEXT) + test -f sub/goodbye-zardoz.$(OBJEXT) + test ! -f sub/zardoz.$(OBJEXT) + test ! -f goodbye-zardoz.$(OBJEXT) + test ! -f zardoz.$(OBJEXT) +## The setting of FCFLAGS should only cause objects deriving from +## Fortran 90, not Fortran 77, to be renamed. + test -f sub/baz.$(OBJEXT) + test ! -f sub/goodbye-baz.$(OBJEXT) + test ! -f goodbye-baz.$(OBJEXT) + test ! -f baz.$(OBJEXT) END $ACLOCAL @@ -73,20 +95,9 @@ $AUTOCONF # ./configure may exit with status 77 if no compiler is found, # or if the compiler cannot compile Fortran 90 files). ./configure -$MAKE -subobjs=`echo sub/*.o sub/*.obj` -test "$subobjs" = 'sub/*.o sub/*.obj' -$MAKE distcheck -$MAKE distclean -echo 'AUTOMAKE_OPTIONS = subdir-objects' >> Makefile.am -$AUTOMAKE -./configure $MAKE -test ! -f bar.o -test ! -f bar.obj -test ! -f baz.o -test ! -f baz.obj -test ! -f goodbye-baz.o -test ! -f goodbye-baz.obj +$MAKE test-obj $MAKE distcheck + +: diff --git a/t/fort5.sh b/t/fort5.sh index 4614b661d..b9e5b80d2 100755 --- a/t/fort5.sh +++ b/t/fort5.sh @@ -88,18 +88,17 @@ grep " --tag=FC" Makefile.in # ./configure may exit with status 77 if no compiler is found, # or if the compiler cannot compile Fortran 90 files). ./configure -$MAKE -subobjs=`echo sub/*.lo` -test "$subobjs" = 'sub/*.lo' -$MAKE distcheck -# The following will be fixed in a later patch: -$MAKE distclean -echo 'AUTOMAKE_OPTIONS = subdir-objects' >> Makefile.am -$AUTOMAKE -a -./configure $MAKE +test -f sub/bar.lo test ! -f bar.lo +## The setting of FCFLAGS should only cause objects deriving from +## Fortran 90, not Fortran 77, to be renamed. +test -f sub/baz.lo test ! -f baz.lo +test ! -f sub/libgoodbye_la-baz.lo test ! -f libgoodbye_la-baz.lo + $MAKE distcheck + +: diff --git a/t/gcj.sh b/t/gcj.sh index b510f1c76..cad90b737 100755 --- a/t/gcj.sh +++ b/t/gcj.sh @@ -16,21 +16,50 @@ # Test of compiled java. +required='gcc gcj' . ./defs || Exit 1 cat >> configure.ac << 'END' -_AM_DEPENDENCIES([GCJ]) -AC_SUBST([GCJ]) +# FIXME: AM_PROG_GCJ should cause OBJEXT and EXEEXT to be set, but +# FIXME: it currently does not. See also xfailing test 'gcj6.sh'. +AC_PROG_CC +AM_PROG_GCJ +AC_OUTPUT END cat > Makefile.am << 'END' bin_PROGRAMS = convert -convert_SOURCES = x/y/convert.java +convert_SOURCES = $(my-java-source) +convert_LDFLAGS = --main=convert +my-java-source = x/y/convert.java +$(my-java-source): + rm -f $@-t $@ + test -d $(@D) || $(MKDIR_P) $(@D) + echo 'public class convert {' >> $@-t + echo ' public static void main (String[] args) {' >> $@-t + echo ' System.out.println("Hello, World!");' >> $@-t + echo ' }' >> $@-t + echo '}' >> $@-t + chmod a-w $@-t && mv -f $@-t $@ +.PHONY: test-obj +check-local: test-obj +test-obj: + test -f x/y/convert.$(OBJEXT) END $ACLOCAL $AUTOMAKE +$FGREP 'x/y/convert.$(OBJEXT)' Makefile.in -grep '^x/y/convert' Makefile.in +$AUTOCONF +./configure + +$MAKE +$MAKE test-obj +if ! cross_compiling; then + ./convert + test "$(./convert)" = 'Hello, World!' +fi +$MAKE distcheck : diff --git a/t/lex-line.sh b/t/lex-line.sh index 4a0aed576..3db979f30 100755 --- a/t/lex-line.sh +++ b/t/lex-line.sh @@ -15,7 +15,7 @@ # along with this program. If not, see . # Check that automake lex support ensures that lex-generated C -# files use correct "#line" directives. Try also with the +# files use correct "#line" directives. # 'subdir-object' option enabled. # See also sister test 'yacc-line.test'. @@ -23,7 +23,6 @@ required='cc lex' . ./defs || Exit 1 cat >> configure.ac << 'END' -AC_CONFIG_FILES([sub/Makefile]) AC_PROG_CC AM_PROG_CC_C_O AC_PROG_LEX @@ -33,7 +32,6 @@ END mkdir dir sub sub/dir cat > Makefile.am << 'END' -SUBDIRS = sub bin_PROGRAMS = foo bar LDADD = $(LEXLIB) bar_LFLAGS = -v @@ -41,16 +39,6 @@ foo_SOURCES = zardoz.l bar_SOURCES = dir/quux.l END -cat > sub/Makefile.am << 'END' -AUTOMAKE_OPTIONS = subdir-objects -noinst_PROGRAMS = foo bar -## We already used $(LEXLIB) above, so try @LEXLIB@ now. -LDADD = @LEXLIB@ -foo_LFLAGS = -v -foo_SOURCES = zardoz.l -bar_SOURCES = dir/quux.l -END - cat > zardoz.l << 'END' %{ #define YY_NO_UNISTD_H 1 @@ -74,10 +62,8 @@ int yywrap (void) END cp zardoz.l dir/quux.l -cp zardoz.l sub/zardoz.l -cp zardoz.l sub/dir/quux.l -c_outputs='zardoz.c bar-quux.c sub/foo-zardoz.c sub/dir/quux.c' +c_outputs='zardoz.c dir/bar-quux.c' $ACLOCAL $AUTOCONF @@ -97,7 +83,7 @@ for vpath in : false; do $MAKE # For debugging, - ls -l . sub sub/dir + ls -l . dir $EGREP 'line|\.l' $c_outputs grep '#.*line.*build.*\.l' $c_outputs && Exit 1 @@ -111,14 +97,10 @@ for vpath in : false; do grep "#.*\.l.*\.l" $c_outputs && Exit 1 if $vpath; then grep '#.*line.*"\.\./zardoz\.l"' zardoz.c - grep '#.*line.*"\.\./dir/quux\.l"' bar-quux.c - grep '#.*line.*"\.\./\.\./sub/zardoz\.l"' sub/foo-zardoz.c - grep '#.*line.*"\.\./\.\./sub/dir/quux\.l"' sub/dir/quux.c + grep '#.*line.*"\.\./dir/quux\.l"' dir/bar-quux.c else grep '#.*line.*"zardoz\.l"' zardoz.c - grep '#.*line.*"dir/quux\.l"' bar-quux.c - grep '#.*line.*"zardoz\.l"' sub/foo-zardoz.c - grep '#.*line.*"dir/quux\.l"' sub/dir/quux.c + grep '#.*line.*"dir/quux\.l"' dir/bar-quux.c fi cd $srcdir diff --git a/t/libobj20a.sh b/t/libobj20a.sh deleted file mode 100755 index d56be31da..000000000 --- a/t/libobj20a.sh +++ /dev/null @@ -1,45 +0,0 @@ -#! /bin/sh -# Copyright (C) 2010-2012 Free Software Foundation, Inc. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -# Test error reporting for AC_CONFIG_LIBOBJ_DIR. -# See also sister tests 'libobj20b.test' and 'libobj20c.test' . - -. ./defs || Exit 1 - -cat >> configure.ac << 'END' -AC_CONFIG_LIBOBJ_DIR([libobj-dir]) -AC_PROG_CC -AM_PROG_AR -AC_PROG_RANLIB -AC_LIBOBJ([foo]) -END - -cat > Makefile.am << 'END' -noinst_LIBRARIES = libtu.a -libtu_a_SOURCES = -libtu_a_LIBADD = $(LIBOBJS) -END - -mkdir libobj-dir -: > libobj-dir/foo.c -: > ar-lib - -$ACLOCAL -AUTOMAKE_fails -grep 'LIBOBJS.*used outside.*libobj-dir' stderr -grep 'subdir-objects.*not set' stderr - -: diff --git a/t/libobj20b.sh b/t/libobj20b.sh index f8ca60019..97807fee8 100755 --- a/t/libobj20b.sh +++ b/t/libobj20b.sh @@ -15,7 +15,7 @@ # along with this program. If not, see . # Test error reporting for AC_CONFIG_LIBOBJ_DIR. -# See also sister tests 'libobj20a.test' and 'libobj20c.test' . +# See also sister test 'libobj20c.sh'. . ./defs || Exit 1 diff --git a/t/libobj20c.sh b/t/libobj20c.sh index 7ae51bf21..64b703044 100755 --- a/t/libobj20c.sh +++ b/t/libobj20c.sh @@ -15,7 +15,7 @@ # along with this program. If not, see . # Test error reporting for AC_CONFIG_LIBOBJ_DIR. -# See also sister tests 'libobj20a.test' and 'libobj20b.test' . +# See also sister test 'libobj20b.sh'. . ./defs || Exit 1 diff --git a/t/libtool3.sh b/t/libtool3.sh index dbcd519d9..5ac3b1635 100755 --- a/t/libtool3.sh +++ b/t/libtool3.sh @@ -23,6 +23,7 @@ required='cc libtoolize' cat >> configure.ac << 'END' AC_PROG_CC AM_PROG_AR +AM_PROG_CC_C_O AM_PROG_LIBTOOL AC_OUTPUT END @@ -75,12 +76,8 @@ $ACLOCAL $AUTOCONF $AUTOMAKE --add-missing --copy -# We need explicit rules to build 1.o and a.lo. Make sure -# Automake did not output additional rules for 1.lo and and a.lo. -$FGREP '1.o:' Makefile.in -$FGREP '1.lo:' Makefile.in && Exit 1 -$FGREP 'a.o:' Makefile.in && Exit 1 -$FGREP 'a.lo:' Makefile.in +# We shouldn't need explicit rules. +$EGREP '[^%]\.(o|obj|lo) *:' Makefile.in && Exit 1 ./configure diff --git a/t/parallel-tests-suffix-prog.sh b/t/parallel-tests-suffix-prog.sh index 28dd34991..d7b414067 100755 --- a/t/parallel-tests-suffix-prog.sh +++ b/t/parallel-tests-suffix-prog.sh @@ -23,6 +23,7 @@ required='cc native' cat >> configure.ac << 'END' AC_PROG_CC +AM_PROG_CC_C_O AC_OUTPUT END diff --git a/t/pr401.sh b/t/pr401.sh index 849ee5fc2..7e8c491b1 100755 --- a/t/pr401.sh +++ b/t/pr401.sh @@ -103,17 +103,6 @@ $AUTOMAKE test ! -d lib/lib $MAKE distcheck -## -------------------------------------------- ## -## Error message with usage in wrong directory. ## -## -------------------------------------------- ## - -mv -f src/Makefile.am src/t -sed 's/LDADD = .*/LDADD = @LIBOBJS@/' src/t > src/Makefile.am -AUTOMAKE_fails -grep 'cannot be used outside.*lib' stderr -mv -f src/t src/Makefile.am - - ## -------------------------------------------- ## ## Test using LIBOBJS from a sibling directory. ## ## -------------------------------------------- ## diff --git a/t/pr401b.sh b/t/pr401b.sh index 382d1181e..6f49b1f0d 100755 --- a/t/pr401b.sh +++ b/t/pr401b.sh @@ -104,15 +104,6 @@ $AUTOMAKE -a test ! -d lib/lib $MAKE distcheck -## -------------------------------------------- ## -## Error message with usage in wrong directory. ## -## -------------------------------------------- ## - -mv -f src/Makefile.am src/t -sed 's/LDADD = .*/LDADD = @LTLIBOBJS@/' src/t > src/Makefile.am -AUTOMAKE_fails -grep 'cannot be used outside.*lib' stderr -mv -f src/t src/Makefile.am ## ---------------------------------------------- ## ## Test using LTLIBOBJS from a sibling directory. ## diff --git a/t/pr401c.sh b/t/pr401c.sh index 12afade9d..ea2f03d0e 100755 --- a/t/pr401c.sh +++ b/t/pr401c.sh @@ -105,16 +105,6 @@ $AUTOMAKE test ! -d lib/lib $MAKE distcheck -## -------------------------------------------- ## -## Error message with usage in wrong directory. ## -## -------------------------------------------- ## - -mv -f src/Makefile.am src/t -sed 's/LDADD = .*/LDADD = @ALLOCA@/' src/t > src/Makefile.am -AUTOMAKE_fails -grep 'cannot be used outside.*lib' stderr -mv -f src/t src/Makefile.am - ## ------------------------------------------- ## ## Test using ALLOCA from a sibling directory. ## diff --git a/t/subdir3.sh b/t/subdir3.sh deleted file mode 100755 index d9b160fa8..000000000 --- a/t/subdir3.sh +++ /dev/null @@ -1,36 +0,0 @@ -#! /bin/sh -# Copyright (C) 1999-2012 Free Software Foundation, Inc. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -# Test to make sure subdir source file generates explicit dependency. - -. ./defs || Exit 1 - -cat > Makefile.am << 'END' -bin_PROGRAMS = zardoz widdershins -zardoz_SOURCES = y.c x/z.c -widdershins_SOURCES = x/z.c -END - -cat >> configure.ac << 'END' -AC_PROG_CC -END - -$ACLOCAL -$AUTOMAKE - -grep '^z\.o: x/z\.c$' Makefile.in - -: diff --git a/t/subobj4.sh b/t/subobj4.sh deleted file mode 100755 index 6a3d2212e..000000000 --- a/t/subobj4.sh +++ /dev/null @@ -1,53 +0,0 @@ -#! /bin/sh -# Copyright (C) 2001-2012 Free Software Foundation, Inc. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -# Make sure '../foo/foo.cpp' generates a rule. -# Report from Dave Brolley. - -. ./defs || Exit 1 - -cat >> configure.ac << 'END' -AC_PROG_CC -AM_PROG_CC_C_O -AC_PROG_CXX -AC_CONFIG_FILES([d1/Makefile d2/Makefile]) -AC_OUTPUT -END - -mkdir d1 d2 - -cat > Makefile.am << 'END' -SUBDIRS = d1 d2 -END - -cat > d1/Makefile.am << 'END' -bin_PROGRAMS = z -z_SOURCES = ../d2/z.c -END - -cat > d2/Makefile.am << 'END' -END - -: > compile -: > d2/z.c - -$ACLOCAL -$AUTOMAKE - -grep '^z\.o:.* \.\./d2/z\.c *$' d1/Makefile.in -grep "@am__fastdepCC_FALSE@.*source=['\"]../d2/z.c['\"] " d1/Makefile.in - -: diff --git a/t/subpkg-yacc.sh b/t/subpkg-yacc.sh index 9d7ad8824..022e6533b 100755 --- a/t/subpkg-yacc.sh +++ b/t/subpkg-yacc.sh @@ -20,13 +20,17 @@ required='cc yacc' . ./defs || Exit 1 -cat >>configure.ac <<'END' +cat > configure.ac <<'END' +AC_INIT([suya], [0.5a], [automake-ng@gnu.org]) +AM_INIT_AUTOMAKE([foreign -Wall]) AC_PROG_CC +AC_CONFIG_FILES([GNUmakefile]) AC_CONFIG_SUBDIRS([lib]) AC_OUTPUT END -cat >Makefile.am <<'EOF' +cat >GNUmakefile.am <<'EOF' +AUTOMAKE_OPTIONS = -Wno-override SUBDIRS = lib bin_PROGRAMS = MU MU_LDADD = lib/liblib.a @@ -55,6 +59,7 @@ AC_PROG_RANLIB AC_PROG_YACC dnl This comes after YACC and RANLIB checks, deliberately. AC_PROG_CC +AM_PROG_CC_C_O AM_PROG_AR AC_CONFIG_HEADERS([config.h:config.hin]) AC_CONFIG_FILES([Makefile]) @@ -107,14 +112,16 @@ EOF $ACLOCAL $AUTOCONF -$AUTOMAKE -Wno-override +$AUTOMAKE +test ! -f compile cd lib $ACLOCAL $AUTOCONF $AUTOHEADER -$AUTOMAKE -Wno-override --add-missing +$AUTOMAKE --add-missing cd .. +test -f compile ./configure diff --git a/t/subpkg.sh b/t/subpkg.sh index 82bf33818..18d3e20bb 100755 --- a/t/subpkg.sh +++ b/t/subpkg.sh @@ -23,7 +23,8 @@ mkdir m4 cat >m4/foo.m4 <<'EOF' AC_DEFUN([FOO],[ - AC_PROG_CC + AC_REQUIRE([AC_PROG_CC]) + AC_REQUIRE([AM_PROG_CC_C_O]) AC_OUTPUT ]) EOF @@ -92,6 +93,8 @@ int lib (void) } EOF +cp "$am_scriptdir"/compile . + $ACLOCAL -I m4 $AUTOCONF $AUTOMAKE -Wno-override @@ -104,7 +107,10 @@ $AUTOHEADER $AUTOMAKE -Wno-override --add-missing cd .. -./configure +./configure >stdout || { cat stdout; Exit 1; } +cat stdout +grep '^checking whether cc understands -c and -o together' stdout + $MAKE $MAKE distcheck test ! -d subpack-1 # Make sure distcheck cleans up after itself. diff --git a/t/xsource.sh b/t/xsource.sh index 5f89dc9c6..677670fe7 100755 --- a/t/xsource.sh +++ b/t/xsource.sh @@ -21,18 +21,22 @@ cat > Makefile.am << 'END' bin_PROGRAMS = zardoz -zardoz_SOURCES = z.c x/z.c +lib_LTLIBRARIES = libfoo.la +zardoz_SOURCES = z.c +libfoo_la_SOURCES = z.c END +: > ltmain.sh +: > config.guess +: > config.sub + cat >> configure.ac << 'END' AC_PROG_CC +AC_SUBST([LIBTOOL], [unused]) END -mkdir x - -: > z.c -: > x/z.c - $ACLOCAL AUTOMAKE_fails -$FGREP 'z.$(OBJEXT)' stderr +$FGREP "object 'z.\$(OBJEXT)' created both with libtool and without" stderr + +: diff --git a/t/yacc-line.sh b/t/yacc-line.sh index 23b5a1b5b..1d536eec6 100755 --- a/t/yacc-line.sh +++ b/t/yacc-line.sh @@ -15,38 +15,27 @@ # along with this program. If not, see . # Check that automake yacc support ensures that yacc-generated C -# files use correct "#line" directives. Try also with the -# 'subdir-object' option enabled. +# files use correct "#line" directives. # See also sister test 'lex-line.test'. required='cc yacc' . ./defs || Exit 1 cat >> configure.ac << 'END' -AC_CONFIG_FILES([sub/Makefile]) AC_PROG_CC AM_PROG_CC_C_O AC_PROG_YACC AC_OUTPUT END -mkdir dir sub sub/dir +mkdir dir cat > Makefile.am << 'END' -SUBDIRS = sub -bin_PROGRAMS = foo bar -AM_YFLAGS = -d -bar_YFLAGS = -foo_SOURCES = zardoz.y -bar_SOURCES = dir/quux.y -END - -cat > sub/Makefile.am << 'END' -AUTOMAKE_OPTIONS = subdir-objects -noinst_PROGRAMS = foo bar -foo_YFLAGS = -d +noinst_PROGRAMS = foo bar baz +baz_YFLAGS = -d foo_SOURCES = zardoz.y bar_SOURCES = dir/quux.y +baz_SOURCES = zardoz.y END cat > zardoz.y << 'END' @@ -64,10 +53,8 @@ int main(void) END cp zardoz.y dir/quux.y -cp zardoz.y sub/zardoz.y -cp zardoz.y sub/dir/quux.y -c_outputs='zardoz.c bar-quux.c sub/foo-zardoz.c sub/dir/quux.c' +c_outputs='zardoz.c dir/quux.c baz-zardoz.c' $ACLOCAL $AUTOCONF @@ -87,7 +74,7 @@ for vpath in : false; do $MAKE # For debugging, - ls -l . sub sub/dir + ls -l . dir $EGREP 'line|\.y' $c_outputs # Adjusted "#line" should not contain reference to the builddir. @@ -102,14 +89,12 @@ for vpath in : false; do grep "#.*\.y.*\.y" $c_outputs && Exit 1 if $vpath; then grep '#.*line.*"\.\./zardoz\.y"' zardoz.c - grep '#.*line.*"\.\./dir/quux\.y"' bar-quux.c - grep '#.*line.*"\.\./\.\./sub/zardoz\.y"' sub/foo-zardoz.c - grep '#.*line.*"\.\./\.\./sub/dir/quux\.y"' sub/dir/quux.c + grep '#.*line.*"\.\./zardoz\.y"' baz-zardoz.c + grep '#.*line.*"\.\./dir/quux\.y"' dir/quux.c else grep '#.*line.*"zardoz\.y"' zardoz.c - grep '#.*line.*"dir/quux\.y"' bar-quux.c - grep '#.*line.*"zardoz\.y"' sub/foo-zardoz.c - grep '#.*line.*"dir/quux\.y"' sub/dir/quux.c + grep '#.*line.*"zardoz\.y"' baz-zardoz.c + grep '#.*line.*"dir/quux\.y"' dir/quux.c fi cd $srcdir diff --git a/t/yacc5.sh b/t/yacc5.sh index ab24b563d..b24dcd3cd 100755 --- a/t/yacc5.sh +++ b/t/yacc5.sh @@ -25,55 +25,31 @@ AM_PROG_CC_C_O AC_PROG_YACC END -cat > Makefile.am << 'END' -bin_PROGRAMS = maude -maude_SOURCES = sub/maude.y -END - -mkdir sub - -: > sub/maude.y - $ACLOCAL -$AUTOMAKE -a - -grep '^maude\.c:.*maude\.y' Makefile.in - - -## Try again with subdir-objects. cat > Makefile.am << 'END' -AUTOMAKE_OPTIONS = subdir-objects bin_PROGRAMS = maude maude_SOURCES = sub/maude.y END - -$ACLOCAL $AUTOMAKE -a - # No rule needed, the default .y.c: inference rule is enough # (but there may be an additional dependency on a dirstamp file). grep '^sub/maude\.c:.*maude\.y' Makefile.in && Exit 1 - ## Try again with per-exe flags. cat > Makefile.am << 'END' bin_PROGRAMS = maude maude_SOURCES = sub/maude.y -## A particularly trickey case. +## A particularly tricky case. maude_YFLAGS = -d END - -$ACLOCAL $AUTOMAKE -a - +grep '^sub/maude-maude\.c:.*sub/maude\.y' Makefile.in # Rule should use maude_YFLAGS. grep 'AM_YFLAGS.*maude' Makefile.in && Exit 1 - # Silly regression. grep 'maudec' Makefile.in && Exit 1 - # Make sure the .o file is required. grep '^am_maude_OBJECTS.*maude' Makefile.in