diff options
Diffstat (limited to 't/ax/depcomp.sh')
-rw-r--r-- | t/ax/depcomp.sh | 420 |
1 files changed, 420 insertions, 0 deletions
diff --git a/t/ax/depcomp.sh b/t/ax/depcomp.sh new file mode 100644 index 000000000..a9180e937 --- /dev/null +++ b/t/ax/depcomp.sh @@ -0,0 +1,420 @@ +#! /bin/sh +# Copyright (C) 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 <http://www.gnu.org/licenses/>. + +# Check dependency tracking in various flavours. +# Contains both libtool and non-libtool case. +# Sourced by the various (autogenerated) 'depcomp*.tap' tests. +# Examples of reported failures that motivated those test are +# listed below. + +# ------------------------------------------------------------------------- + +# <http://lists.gnu.org/archive/html/automake-patches/2011-04/msg00028.html> +# +# Here's the bug: makedepend will prefix VPATH to the object file name, +# thus the second make will invoke depcomp with object='../../src/foo.o', +# causing errors such as: +# +# touch: cannot touch '../../src/.deps/foo.TPo': No such file or directory +# makedepend: error: cannot open "../../src/.deps/foo.TPo" +# ../../depcomp: line 560: ../../src/.deps/foo.TPo: No such file or directory + +# ------------------------------------------------------------------------- + +# <http://debbugs.gnu.org/cgi/bugreport.cgi?bug=8473> +# <http://lists.gnu.org/archive/html/automake-patches/2011-04/msg00079.html> +# +# Here's the bug: hp depmode will prefix VPATH to the object file name, +# thus the second gmake will invoke depcomp with object='../../src/foo.o', +# causing errors such as (broken on multiple lines for clarity): +# +# cpp: "", line 0: error 4066: Cannot create +# "../../gllib/.deps/nonblocking.TPo" file for +# "-M../../gllib/.deps/nonblocking.TPo" option. +# (No such file or directory[errno=2]) +# + +# ------------------------------------------------------------------------- + +# <http://lists.gnu.org/archive/html/automake-patches/2011-04/msg00140.html> +# <http://lists.gnu.org/archive/html/automake-patches/2011-05/msg00019.html> +# +# A partial failure of an earlier version of this test; some bad +# post-processing of the '*.Po' files led to the following broken +# contents of 'src/sub/.deps/subfoo.Po': +# +# > sub/subfoo.o: ../../depmod-data.dir/src/sub/subfoo.c \ +# > ../../depmod-data.dir/src/foo.h +# > ../../depmod-data.dir/src/sub/subfoo.c \: +# > ../../depmod-data.dir/src/foo.h: +# +# which caused make to die with an error like: +# +# "sub/.deps/subfoo.Po:3: *** missing separator. Stop." + +# ------------------------------------------------------------------------- + +# This expects ./defs has already been included has already been included.. + +ocwd=`pwd` || fatal_ "cannot get current working directory" +longpath=this-is/a-path/which-has/quite-a/definitely/truly/long_long_name +cachevar=am_cv_CC_dependencies_compiler_type + +srctree=depmod-1.0 +mkdir $srctree +cd $srctree + +cd_top () +{ + cd "$ocwd" || fatal_ "cannot chdir back to top directory" +} + +delete () +{ + test -f "$1" || fatal_ "$1: file does not exist" + rm -f "$1" || fatal_ "$1: couldn't remove" +} + +edit () +{ + file=$1; shift + sed "$@" <"$file" > t && mv -f t "$file" \ + || fatal_ "$file: editing of file failed" +} + +rewrite () +{ + file=$1; shift + "$@" > "$file" || fatal_ "$file: couldn't rewrite" +} + +setup_srcdir () +{ + srcdir=$1 # This is intended to be global. + mkdir -p "$srcdir" \ + || fatal_ "couldn't create source directory '$srcdir'" + cp -pR "$ocwd/$srctree"/* "$srcdir"/ \ + || fatal_ "couldn't populate source directory '$srcdir'" +} + + +check_no_depfiles () +{ + find . -name '*.Plo' -o -name '*.Po' | grep . && return 1 + return 0 +} + +check_distclean () +{ + # "make distcleancheck" can only run from a VPATH build. + if test $vpath = no; then + make_ok distclean && check_no_depfiles + else + $MAKE distcleancheck + fi +} + +cat > configure.ac <<END +AC_INIT([$me], [1.0]) +AC_CONFIG_AUX_DIR([build-aux]) +AM_INIT_AUTOMAKE +AC_PROG_CC +AM_PROG_CC_C_O +AM_PROG_AR +`if test $depcomp_with_libtool = yes; then + echo AC_PROG_LIBTOOL +else + echo AC_PROG_RANLIB +fi` +AC_CONFIG_FILES([Makefile src/Makefile]) +AC_OUTPUT +END + +mkdir build-aux sub src src/sub2 + +case $depcomp_with_libtool in + yes) + po=Plo objext=lo a=la + normalized_target=libfoo_la + # On platforms requiring that no undefined symbols exist in order + # to build shared libraries (e.g. Windows DLLs), you have to + # explicitly declare that the libtool library you are building + # does not actually have any undefined symbols, for libtool to + # even try to build it as a shared library. Without that + # explicit declaration, libtool falls back to a static library + # only, regardless of any --enable-shared flags etc. + LIBPRIMARY=LTLIBRARIES LINKADD=LIBADD NOUNDEF=-no-undefined + libbaz_ldflags="libbaz_${a}_LDFLAGS = $NOUNDEF" + echo lib_LTLIBRARIES = libfoo.la >> Makefile.am + make_ok () + { + $MAKE ${1+"$@"} >output 2>&1 || { cat output; return 1; } + cat output + $FGREP 'unknown directive' output && return 1 + rm -f output + # Checks for stray files possibly left around by less common + # depmodes. + find . -name '*.[ud]' | grep . && return 1 + return 0 + } + ;; + no) + po=Po objext='$(OBJEXT)' a=a + normalized_target=foo + LIBPRIMARY=LIBRARIES LINKADD=LDADD NOUNDEF= + libbaz_ldflags= + echo bin_PROGRAMS = foo >> Makefile.am + make_ok () + { + $MAKE ${1+"$@"} + } + ;; + *) + fatal_ "invalid value '$depcomp_with_libtool' for variable" \ + "\$depcomp_with_libtool" + ;; +esac + +cat >> Makefile.am <<END +SUBDIRS = src +# We include subfoo only to be sure that the munging in depcomp +# doesn't remove too much from the object file name. +${normalized_target}_SOURCES = foo.c sub/subfoo.c foo.h sub/subfoo.h +${normalized_target}_LDFLAGS = $NOUNDEF +${normalized_target}_${LINKADD} = src/libbaz.$a + +.PHONY: grep-test +grep-test: +## For debugging. + cat \$(DEPDIR)/foo.$po || : + cat \$(DEPDIR)/subfoo.$po || : + cat src/\$(DEPDIR)/baz.$po || : + cat src/sub2/\$(DEPDIR)/sub2foo.$po || : +## Checks done here. + grep '^foo.$objext.*:' \$(DEPDIR)/foo.$po + grep '^subfoo\.$objext.*:' \$(DEPDIR)/subfoo.$po + grep '^baz\.$objext.*:' src/\$(DEPDIR)/baz.$po + grep '^sub2/sub2foo\.$objext.*:' src/sub2/\$(DEPDIR)/sub2foo.$po +END + +cat > src/Makefile.am <<END +AUTOMAKE_OPTIONS = subdir-objects +noinst_${LIBPRIMARY} = libbaz.$a +# We include sub2foo only to be sure that the munging in depcomp +# doesn't remove too much from the object file name. +libbaz_${a}_SOURCES = baz.c sub2/sub2foo.c baz.h sub2/sub2foo.h +$libbaz_ldflags +END + +cat > foo.c <<'END' +#include "foo.h" +#include "src/baz.h" +#include <stdlib.h> +int main (void) +{ + printf ("foo bar\n"); + exit (EXIT_SUCCESS + subfoo () + baz ()); +} +END + +cat > foo.h <<'END' +#include <stdio.h> +#include "sub/subfoo.h" +END + +cat > sub/subfoo.c <<'END' +#include "sub/subfoo.h" +int subfoo (void) { return 0; } +END + +echo '/* empty */' > src/sub2/sub2foo.h + +cat > sub/subfoo.h <<'END' +#include <stdio.h> +extern int subfoo (void); +END + +cat > src/baz.c <<'END' +#include "baz.h" +int baz (void) { return 0; } +END + +cat > src/baz.h <<'END' +extern int baz (void); +END + +cat > src/sub2/sub2foo.c <<'END' +#include "sub2foo.h" +int sub2foo (void) { return 0; } +END + +test $depcomp_with_libtool = no || libtoolize \ + || fatal_ "libtoolize failed" +$ACLOCAL && $AUTOCONF && $AUTOMAKE -a \ + || fatal_ "autotools failed" +test -f build-aux/depcomp \ + || fatal_ "depcomp script not installed" + +# To offer extra coverage for the depmodes (like "aix" of "hp2") where the +# name of the compiler-generated depfiles can depend on whether libtool is +# in use *and* on which kind of libraries libtool is building (static, +# shared, or both), we would like to run the libtool-oriented tests thrice: +# once after having run configure with the '--disable-shared' option, once +# after having run it with the '--enable-shared' options, and once by +# leaving it to configure to automatically select which kind of library (or +# libraries) to build. +# +# But doing such three-fold checks unconditionally for all the depmodes +# would slow down the already too slow libtool tests unacceptably (up to a +# 150-200% factor), with no real gain in coverage for most of the depmodes. +# So, since the depmodes that would benefit from the extra tests are never +# forced to configure in out tests below, but can only be automatically +# selected by '--enable-dependency-tracking', we make this threefold check +# only in this later case. + +if test $depmode,$depcomp_with_libtool = auto,yes; then + do_all_tests () + { + do_test default + do_test noshared --disable-shared + do_test nostatic --disable-static + } +else + do_all_tests () { do_test; } +fi + +case $depmode in + auto) + displayed_depmode='..*' # At least one character long. + cfg_deptrack=--enable-dependency-tracking ;; + disabled) + displayed_depmode=none + cfg_deptrack=--disable-dependency-tracking ;; + *) + displayed_depmode="(cached) $depmode" + cfg_deptrack="$cachevar=$depmode" + # Sanity check: ensure the cache variable we force is truly + # used by configure. + $FGREP $cachevar configure \ + || fatal_ "configure lacks required cache variable '$cachevar'";; +esac + +cd_top + +do_test () +{ + cd_top + if test $vpath = no; then + pfx="in-tree build" + else + pfx="$vpath VPATH" + fi + if test $# -gt 0; then + subdir=$1; shift + pfx="$pfx, $subdir" + test -d $subdir || mkdir $subdir || fatal_ "creating directory $subdir" + cd $subdir + fi + pfx="[$pfx]" + case $vpath in + simple) + mkdir -p vpath-simple/build + cd vpath-simple/build + setup_srcdir .. + ;; + long) + mkdir -p vpath-long/src vpath-long/wrk + cd vpath-long/wrk + setup_srcdir ../src/$longpath + ;; + absolute) + mkdir -p vpath-abs/build + cd vpath-abs/build + absdir="`(cd .. && pwd)`" || fatal_ "getting absolute directory" + setup_srcdir "$absdir/vpath-abs" + unset absdir + ;; + no) + mkdir intree + cd intree + setup_srcdir . + ;; + *) + fatal_ "invalid value '$vpath' for variable \$vpath" + ;; + esac + + command_ok_ \ + "$pfx configure" \ + "$srcdir/configure" $cfg_deptrack ${1+"$@"} >stdout + cat stdout + + command_ok_ \ + "$pfx right depmode selected" \ + grep "^checking dependency style .*\.\.\. $displayed_depmode$" stdout + rm -f stdout + + command_ok_ "$pfx simple make" make_ok + # Some bugs in VPATH builds only kick in during a rebuild. + command_ok_ "$pfx clean & rebuild" eval '$MAKE clean && make_ok' + + if test $depmode = disabled; then + command_ok_ "$pfx no dependency files generated" check_no_depfiles + r=ok \ + && grep "[ $tab]depmode=none" Makefile \ + && rewrite "$srcdir"/src/sub2/sub2foo.h echo 'choke me' \ + && delete "$srcdir"/sub/subfoo.h \ + && make_ok \ + || r='not ok' + result_ "$r" "$pfx dependency tracking is truly disabled" + elif grep "[ $tab]depmode=none" Makefile; then + skip_row_ 2 -r "automatic dependency tracking couldn't be activated" + else + command_ok_ "$pfx generated $po files look correct" $MAKE grep-test + r=ok \ + && : "Some checks in the subdir." \ + && $sleep \ + && : "Ensure rebuild rules really kick in." \ + && rewrite "$srcdir"/src/sub2/sub2foo.h echo 'choke me' \ + && cd src \ + && not $MAKE \ + && cd .. \ + && : "Ensure the deleted header bug is fixed." \ + && delete "$srcdir"/src/sub2/sub2foo.h \ + && edit "$srcdir"/src/sub2/sub2foo.c -e 1d \ + && cd src \ + && make_ok \ + && : "Now do similar checks for the parent directory." \ + && cd .. \ + && rewrite "$srcdir"/sub/subfoo.h echo 'choke me' \ + && not $MAKE \ + && delete "$srcdir"/sub/subfoo.h \ + && edit "$srcdir"/sub/subfoo.c -e 1d \ + && edit "$srcdir"/foo.h -e 2d \ + && make_ok \ + || r='not ok' + result_ "$r" "$pfx dependency tracking works" + fi + + command_ok_ "$pfx make distclean" check_distclean + cd_top +} + +for vpath in no simple long absolute; do + do_all_tests +done + +: |