From cdeb16ae0f034d210bb0a33b477b04f33f94b00a Mon Sep 17 00:00:00 2001 From: "Gary V. Vaughan" Date: Thu, 23 Sep 2010 19:31:10 +0700 Subject: [PATCH] build: don't hardcode repeated long paths in Makefile rules. According to the DRY principle, scattering several copies of something across a file or project leads to pain. Let's not do that! * Makefile.am (Makefile_in, Makefile_inc, defs_in, defs_m4sh), (libtoolize_in, ltmain_m4sh, ltversion_in): New variables to hold the location of important files and targets. (EXTRA_DIST): Add the distributed ones by variable. (libtoolize, libltdl/Makefile.am, libltdl/m4/ltversion.m4) (libltdl/config/ltmain.sh, libltdl/stamp-mk, tests/defs) (tests/defs.in): Use the new variables to reduce noise and repetition. Signed-off-by: Gary V. Vaughan --- ChangeLog | 13 ++++ Makefile.am | 175 ++++++++++++++++++++++++++++++---------------------- 2 files changed, 113 insertions(+), 75 deletions(-) diff --git a/ChangeLog b/ChangeLog index 375014383..3cd519846 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,18 @@ 2010-08-31 Gary V. Vaughan + build: don't hardcode repeated long paths in Makefile rules. + According to the DRY principle, scattering several copies of + something across a file or project leads to pain. Let's not + do that! + * Makefile.am (Makefile_in, Makefile_inc, defs_in, defs_m4sh), + (libtoolize_in, ltmain_m4sh, ltversion_in): New variables to + hold the location of important files and targets. + (EXTRA_DIST): Add the distributed ones by variable. + (libtoolize, libltdl/Makefile.am, libltdl/m4/ltversion.m4) + (libltdl/config/ltmain.sh, libltdl/stamp-mk, tests/defs) + (tests/defs.in): Use the new variables to reduce noise and + repetition. + build: make better use of automatic variables in `Makefile.am'. * Makefile.am (libtoolize, libtoolize.in, libltdl/Makefile.am) (libltdl/config/mkstamp, libltdl/config/ltmain.m4sh) diff --git a/Makefile.am b/Makefile.am index 470890226..6aa9b0aa1 100644 --- a/Makefile.am +++ b/Makefile.am @@ -67,8 +67,7 @@ rebuild = rebuild=:; $(timestamp); revision=$$1 # ---------- # sh_files = $(auxdir)/general.m4sh $(auxdir)/getopt.m4sh -EXTRA_DIST += bootstrap $(srcdir)/libtoolize.in $(auxdir)/ltmain.m4sh \ - $(auxdir)/mkstamp $(sh_files) \ +EXTRA_DIST += bootstrap $(auxdir)/mkstamp $(sh_files) \ ChangeLog.1996 ChangeLog.1997 ChangeLog.1998 \ ChangeLog.1999 ChangeLog.2000 ChangeLog.2001 \ ChangeLog.2002 ChangeLog.2003 ChangeLog.2004 \ @@ -76,6 +75,24 @@ EXTRA_DIST += bootstrap $(srcdir)/libtoolize.in $(auxdir)/ltmain.m4sh \ ChangeLog.2008 ChangeLog.2009 CLEANFILES += libtool libtoolize +## If a file is named several times below, and especially if it +## is a distributed file created during Libtool bootstrap, we +## put it in a variable in accordance with the DRY principle. +## Use `$(srcdir)' for the benefit of non-GNU makes: referring +## to them by their variable makes sure they appear as targets +## and dependencies with `$(srcdir)' consistently. +configure_ac = $(srcdir)/configure.ac +libtoolize_in = $(srcdir)/libtoolize.in +libtoolize_m4sh = $(srcdir)/libtoolize.m4sh +ltmain_in = $(srcdir)/$(auxdir)/ltmain.in +ltmain_m4sh = $(srcdir)/$(auxdir)/ltmain.m4sh +ltmain_sh = $(srcdir)/$(auxdir)/ltmain.sh +ltversion_in = $(srcdir)/$(m4dir)/ltversion.in +ltversion_m4 = $(srcdir)/$(m4dir)/ltversion.m4 + +EXTRA_DIST += $(libtoolize_in) $(libtoolize_m4sh) $(ltmain_m4sh) \ + $(ltmain_sh) $(ltversion_in) $(ltversion_m4) + ## These are the replacements that need to be made at bootstrap time, ## because they must be static in distributed files, and not accidentally ## changed by configure running on the build machine. @@ -102,11 +119,8 @@ bootstrap_edit = sed \ ## We used to do this with a 'stamp-vcl' file, but non-gmake builds ## would rerun configure on every invocation, so now we manually ## check the version numbers from the build rule when necessary. -## Use `$(srcdir)/m4' for the benefit of non-GNU makes: this is -## how ltversion.m4 appears in our dependencies. -EXTRA_DIST += $(m4dir)/ltversion.in $(srcdir)/$(m4dir)/ltversion.m4 CLEANFILES += $(m4dir)/ltversion.tmp -$(srcdir)/$(m4dir)/ltversion.m4: $(m4dir)/ltversion.in configure.ac ChangeLog +$(ltversion_m4): $(ltversion_in) $(configure_ac) ChangeLog @$(rebuild); \ if test -f "$@"; then \ eval `sed -n '/^macro_revision=/p' $@`; \ @@ -119,8 +133,8 @@ $(srcdir)/$(m4dir)/ltversion.m4: $(m4dir)/ltversion.in configure.ac ChangeLog T=$(srcdir)/$(m4dir)/ltversion.tmp; \ rm -f $$T; \ serial=`echo "$$revision" | sed 's,^1[.],,g'`; \ - echo $(bootstrap_edit) $(srcdir)/$(m4dir)/ltversion.in \> $@; \ - $(bootstrap_edit) $(srcdir)/$(m4dir)/ltversion.in > $$T; \ + echo $(bootstrap_edit) $(ltversion_in) \> $@; \ + $(bootstrap_edit) $(ltversion_in) > $$T; \ chmod a-w $$T; \ mv -f $$T $@; \ fi @@ -135,9 +149,8 @@ $(srcdir)/$(m4dir)/ltversion.m4: $(m4dir)/ltversion.in configure.ac ChangeLog ## should make this rule depend on Makefile but that will break ## distcheck (at least) by rebuilding ltmain.sh in the source ## tree whenever config.status regenerates the Makefile. -EXTRA_DIST += $(srcdir)/$(auxdir)/ltmain.sh CLEANFILES += $(srcdir)/$(auxdir)/ltmain.tmp -$(srcdir)/$(auxdir)/ltmain.sh: $(sh_files) $(auxdir)/ltmain.m4sh configure.ac ChangeLog +$(ltmain_sh): $(ltmain_m4sh) $(sh_files) $(configure_ac) ChangeLog @$(rebuild); \ if test -f "$@"; then \ eval `sed -n '/^package_revision=/p' "$@"`; \ @@ -148,34 +161,31 @@ $(srcdir)/$(auxdir)/ltmain.sh: $(sh_files) $(auxdir)/ltmain.m4sh configure.ac Ch done; \ if $$rebuild; then \ T=$(srcdir)/$(auxdir)/ltmain.tmp; \ - rm -f $(srcdir)/$(auxdir)/ltmain.in $$T $@; \ - echo $(LT_M4SH) $(srcdir)/$(auxdir)/ltmain.m4sh \ - \> $(srcdir)/$(auxdir)/ltmain.in; \ - $(LT_M4SH) $(srcdir)/$(auxdir)/ltmain.m4sh \ - > $(srcdir)/$(auxdir)/ltmain.in; \ - echo $(bootstrap_edit) $(srcdir)/$(auxdir)/ltmain.in "> $@"; \ - $(bootstrap_edit) -e '/^: \$${.*="@.*@"}$$/d' \ - $(srcdir)/$(auxdir)/ltmain.in > $$T; \ - rm -f $(srcdir)/$(auxdir)/ltmain.in; \ + rm -f $(ltmain_sh) $$T $@; \ + echo $(LT_M4SH) $(ltmain_m4sh) > $(ltmain_in); \ + $(LT_M4SH) $(ltmain_m4sh) > $(ltmain_in); \ + echo $(bootstrap_edit) $(ltmain_in) "> $@"; \ + $(bootstrap_edit) -e '/^: \$${.*="@.*@"}$$/d' $(ltmain_in) > $$T; \ + rm -f $(ltmain_in); \ chmod a-w $$T; \ mv -f $$T $@; \ fi -# Use `$(srcdir)' for the benefit of non-GNU makes: this is -# how libtoolize.in appears in our dependencies. -EXTRA_DIST += libtoolize.m4sh CLEANFILES += $(srcdir)/libtoolize.tmp -$(srcdir)/libtoolize.in: $(sh_files) libtoolize.m4sh Makefile.am +$(libtoolize_in): $(libtoolize_m4sh) $(sh_files) Makefile.am T=$(srcdir)/libtoolize.tmp; \ rm -f $@ $$T; \ - $(LT_M4SH) $(srcdir)/libtoolize.m4sh > $$T; \ + $(LT_M4SH) $(libtoolize_m4sh) > $$T; \ $(bootstrap_edit) $$T > $@; \ rm -f $$T -$(srcdir)/libltdl/Makefile.am: $(srcdir)/libltdl/Makefile.inc - in=$(srcdir)/libltdl/Makefile.inc; \ +lt_Makefile_am = $(srcdir)/libltdl/Makefile.am +lt_Makefile_in = $(srcdir)/libltdl/Makefile.in +lt_Makefile_inc = $(srcdir)/libltdl/Makefile.inc + +$(lt_Makefile_am): $(lt_Makefile_inc) rm -f $@ - ( $(SED) -n '1,/^.. DO NOT REMOVE THIS LINE -- /p' $$in; \ + ( $(SED) -n '1,/^.. DO NOT REMOVE THIS LINE -- /p' $(lt_Makefile_inc); \ { echo 'ACLOCAL_AMFLAGS = -I m4'; \ echo 'AUTOMAKE_OPTIONS = foreign'; \ echo 'AM_CPPFLAGS ='; \ @@ -189,7 +199,7 @@ $(srcdir)/libltdl/Makefile.am: $(srcdir)/libltdl/Makefile.inc echo 'CLEANFILES ='; \ echo 'MOSTLYCLEANFILES ='; \ }; \ - $(SED) -n '/^.. DO NOT REMOVE THIS LINE -- /,$$p' $$in | \ + $(SED) -n '/^.. DO NOT REMOVE THIS LINE -- /,$$p' $(lt_Makefile_inc) | \ $(SED) -e 's,libltdl_,,; s,libltdl/,,; s,: libltdl/,: ,' \ -e 's,\$$(libltdl_,$$(,' \ ) | \ @@ -200,10 +210,11 @@ $(srcdir)/libltdl/Makefile.am: $(srcdir)/libltdl/Makefile.inc ## Unfortunately, all this bogeyness means that we have to manually ## keep the generated files in libltdl up to date. -LTDL_BOOTSTRAP_DEPS = $(srcdir)/libltdl/aclocal.m4 \ - $(srcdir)/libltdl/stamp-mk \ - $(srcdir)/libltdl/configure \ - $(srcdir)/libltdl/config-h.in +LTDL_BOOTSTRAP_DEPS = \ + $(stamp_mk) \ + $(lt_aclocal_m4) \ + $(lt_config_h_in) \ + $(lt_configure) all-local: $(LTDL_BOOTSTRAP_DEPS) @@ -231,10 +242,10 @@ configure_edit = sed \ bin_SCRIPTS = libtoolize libtool CLEANFILES += libtoolize.tmp -libtoolize: $(srcdir)/libtoolize.in $(top_builddir)/config.status +libtoolize: $(libtoolize_in) $(top_builddir)/config.status T=libtoolize.tmp; \ rm -f $$T $@; \ - $(configure_edit) $(srcdir)/libtoolize.in > $$T; \ + $(configure_edit) $(libtoolize_in) > $$T; \ chmod a+x $$T; \ chmod a-w $$T; \ mv -f $$T $@ @@ -242,7 +253,7 @@ libtoolize: $(srcdir)/libtoolize.in $(top_builddir)/config.status # We used to do this with a 'stamp-vcl' file, but non-gmake builds # would rerun configure on every invocation, so now we manually # check the version numbers from the build rule when necessary. -libtool: $(top_builddir)/config.status $(srcdir)/$(auxdir)/ltmain.sh ChangeLog +libtool: $(ltmain_sh) $(top_builddir)/config.status ChangeLog @$(rebuild); \ if test -f "$@"; then \ eval `sed -n '/^package_revision=/p' "$@"`; \ @@ -271,40 +282,46 @@ configure-subdirs distdir: $(DIST_MAKEFILE_LIST) include libltdl/Makefile.inc -EXTRA_DIST += $(srcdir)/libltdl/stamp-mk $(m4dir)/lt~obsolete.m4 +lt_aclocal_m4 = $(srcdir)/libltdl/aclocal.m4 +lt_config_h_in = $(srcdir)/libltdl/config-h.in +lt_configure = $(srcdir)/libltdl/configure +stamp_mk = $(srcdir)/libltdl/stamp-mk + +lt_obsolete_m4 = $(srcdir)/$(m4dir)/lt~obsolete.m4 + +EXTRA_DIST += $(stamp_mk) $(lt_obsolete_m4) -$(srcdir)/libltdl/Makefile.in: $(srcdir)/libltdl/Makefile.am \ - $(srcdir)/libltdl/aclocal.m4 +$(lt_Makefile_in): $(lt_Makefile_am) $(lt_aclocal_m4) cd $(srcdir)/libltdl && $(AUTOMAKE) Makefile CLEANFILES += $(srcdir)/libltdl/Makefile.tmp -$(srcdir)/libltdl/stamp-mk: $(srcdir)/libltdl/Makefile.in +$(stamp_mk): $(lt_Makefile_in) T=$(srcdir)/libltdl/Makefile.tmp; \ sed -e 's,config/mdate-sh,,' -e 's,config/texinfo.tex,,' \ -e 's,config/mkinstalldirs,,' \ - < $(srcdir)/libltdl/Makefile.in > $$T && \ - mv -f $$T $(srcdir)/libltdl/Makefile.in + < $(lt_Makefile_in) > $$T && \ + mv -f $$T $(lt_Makefile_in) echo stamp > $@ -sub_aclocal_m4_deps = \ - $(srcdir)/libltdl/configure.ac \ +lt_aclocal_m4_deps = \ + $(lt_obsolete_m4) \ + $(ltversion_m4) \ $(m4dir)/libtool.m4 \ $(m4dir)/ltoptions.m4 \ $(m4dir)/ltdl.m4 \ - $(srcdir)/$(m4dir)/ltversion.m4 \ $(m4dir)/ltsugar.m4 \ $(m4dir)/argz.m4 \ - $(m4dir)/lt~obsolete.m4 + $(srcdir)/libltdl/configure.ac -sub_configure_deps = $(sub_aclocal_m4_deps) $(srcdir)/libltdl/aclocal.m4 +lt_configure_deps = $(lt_aclocal_m4) $(lt_aclocal_m4_deps) -$(srcdir)/libltdl/aclocal.m4: $(sub_aclocal_m4_deps) +$(lt_aclocal_m4): $(lt_aclocal_m4_deps) cd $(srcdir)/libltdl && $(ACLOCAL) -I m4 -$(srcdir)/libltdl/configure: $(sub_configure_deps) +$(lt_configure): $(lt_configure_deps) cd $(srcdir)/libltdl && $(AUTOCONF) -$(srcdir)/libltdl/config-h.in: $(sub_configure_deps) +$(lt_config_h_in): $(lt_configure_deps) cd $(srcdir)/libltdl && $(AUTOHEADER) touch $@ @@ -313,26 +330,32 @@ $(srcdir)/libltdl/config-h.in: $(sub_configure_deps) ## Documentation. ## ## -------------- ## +libtool_1 = $(srcdir)/doc/libtool.1 +libtoolize_1 = $(srcdir)/doc/libtoolize.1 +notes_texi = $(srcdir)/doc/notes.texi +notes_txt = $(srcdir)/doc/notes.txt + info_TEXINFOS = doc/libtool.texi -doc_libtool_TEXINFOS = doc/PLATFORMS doc/fdl.texi doc/notes.texi -EXTRA_DIST += $(srcdir)/doc/notes.txt +doc_libtool_TEXINFOS = doc/PLATFORMS doc/fdl.texi $(notes_texi) +EXTRA_DIST += $(notes_txt) ## Workaround for a texinfo bug described here: ## http://thread.gmane.org/gmane.comp.tex.texinfo.bugs/3930 DISTCLEANFILES += libtool.dvi -all-local: $(srcdir)/doc/notes.txt +all-local: $(notes_txt) -$(srcdir)/doc/notes.txt: $(srcdir)/doc/notes.texi - $(MAKEINFO) -P $(srcdir)/doc --no-headers $(MAKEINFOFLAGS) -o $(srcdir)/doc/notes.txt $@ +$(notes_txt): $(notes_texi) + $(MAKEINFO) -P $(srcdir)/doc --no-headers $(MAKEINFOFLAGS) \ + -o $@ $(notes_texi) -dist_man1_MANS = $(srcdir)/doc/libtool.1 $(srcdir)/doc/libtoolize.1 +dist_man1_MANS = $(libtool_1) $(libtoolize_1) MAINTAINERCLEANFILES += $(dist_man1_MANS) update_mans = \ PATH=.$(PATH_SEPARATOR)$$PATH; export PATH; \ $(HELP2MAN) --output=$@ -$(srcdir)/doc/libtool.1: $(srcdir)/$(auxdir)/ltmain.sh +$(libtool_1): $(ltmain_sh) $(update_mans) --help-option=--help-all libtool -$(srcdir)/doc/libtoolize.1: $(srcdir)/libtoolize.in +$(libtoolize_1): $(libtoolize_in) $(update_mans) libtoolize @@ -375,7 +398,7 @@ ltdldatafiles = libltdl/COPYING.LIB \ libltdl/lt__strl.c \ $(libltdl_libltdl_la_SOURCES) -install-data-local: libltdl/Makefile.in +install-data-local: $(lt_Makefile_in) @$(NORMAL_INSTALL) ## Don't install over the top of an old pkgdatadir -rm -rf $(DESTDIR)$(pkgdatadir)/* @@ -410,7 +433,7 @@ install-data-local: libltdl/Makefile.in ## Distribution. ## ## ------------- ## -edit_readme_alpha = $(auxdir)/edit-readme-alpha +edit_readme_alpha = $(srcdir)/$(auxdir)/edit-readme-alpha EXTRA_DIST += $(edit_readme_alpha) @@ -429,11 +452,11 @@ uninstall-hook: dist-hook: ## Edit the README file for alpha releases. case $(VERSION) in \ - *[a-z]) $(SHELL) $(srcdir)/$(edit_readme_alpha) $(distdir)/README ;; \ + *[a-z]) $(SHELL) $(edit_readme_alpha) $(distdir)/README ;; \ esac ## Ensure aclocal has not wrongly picked up old macro definitions. for macro in LT_INIT AC_PROG_LIBTOOL AM_PROG_LIBTOOL; do \ - if grep $$macro $(srcdir)/aclocal.m4 $(srcdir)/libltdl/aclocal.m4; then \ + if grep $$macro $(srcdir)/aclocal.m4 $(lt_aclocal_m4); then \ echo "Bogus $$macro macro contents in an aclocal.m4 file." >&2; \ exit 1; \ else :; fi; \ @@ -510,7 +533,10 @@ TESTSUITE_AT = tests/testsuite.at \ tests/deplibs-mingw.at \ tests/sysroot.at -EXTRA_DIST += $(srcdir)/$(TESTSUITE) $(TESTSUITE_AT) $(srcdir)/tests/package.m4 +package_m4 = $(srcdir)/tests/package.m4 +testsuite = $(srcdir)/$(TESTSUITE) + +EXTRA_DIST += $(testsuite) $(TESTSUITE_AT) $(package_m4) # Be sure to reexport important environment variables: TESTS_ENVIRONMENT = MAKE="$(MAKE)" CC="$(CC)" CFLAGS="$(CFLAGS)" \ @@ -540,15 +566,13 @@ INSTALLCHECK_ENVIRONMENT = \ LIBLTDL="$(libdir)/libltdl.la" \ tst_aclocaldir="$(aclocaldir)" -# Use `$(srcdir)' for the benefit of non-GNU makes: this is -# how `testsuite' appears in our dependencies. -CLEANFILES += $(srcdir)/$(TESTSUITE).tmp -$(srcdir)/$(TESTSUITE): $(srcdir)/tests/package.m4 $(TESTSUITE_AT) Makefile.am - T=$(srcdir)/$(TESTSUITE).tmp; \ +CLEANFILES += $(testsuite).tmp +$(testsuite): $(package_m4) $(TESTSUITE_AT) Makefile.am + T=$(testsuite).tmp; \ $(AUTOTEST) -I $(srcdir)/tests $(TESTSUITE_AT) -o $$T; \ mv -f $$T $@ -$(srcdir)/tests/package.m4: $(srcdir)/configure.ac Makefile.am +$(package_m4): $(configure_ac) Makefile.am { \ echo '# Signature of the current package.'; \ echo 'm4_define([AT_PACKAGE_NAME], [@PACKAGE_NAME@])'; \ @@ -892,7 +916,10 @@ NONINTERACTIVE_TESTS += $(FC_TESTS) endif TESTS = $(NONINTERACTIVE_TESTS) $(INTERACTIVE_TESTS) -EXTRA_DIST += $(srcdir)/tests/defs.in tests/defs.m4sh \ +defs_in = $(srcdir)/tests/defs.in +defs_m4sh = $(srcdir)/tests/defs.m4sh + +EXTRA_DIST += $(defs_in) $(defs_m4sh) \ $(COMMON_TESTS) $(CXX_TESTS) $(F77_TESTS) $(FC_TESTS) \ $(INTERACTIVE_TESTS) DIST_SUBDIRS += $(CONF_SUBDIRS) @@ -900,17 +927,15 @@ DIST_SUBDIRS += $(CONF_SUBDIRS) # The defs script shouldn't be recreated whenever the Makefile is # regenerated since the source tree can be read-only. check-recursive: tests/defs -tests/defs: $(srcdir)/tests/defs.in +tests/defs: $(defs_in) T=tests/defs.tmp; \ rm -f $$T $@; \ - $(configure_edit) $(srcdir)/tests/defs.in > $$T; \ + $(configure_edit) $(defs_in) > $$T; \ mv -f $$T $@ -# Use `$(srcdir)/tests' for the benefit of non-GNU makes: this is -# how defs.in appears in our dependencies. -$(srcdir)/tests/defs.in: $(auxdir)/general.m4sh tests/defs.m4sh Makefile.am +$(defs_in): $(defs_m4sh) $(auxdir)/general.m4sh Makefile.am rm -f $@ - $(LT_M4SH) $(srcdir)/tests/defs.m4sh > $@ + $(LT_M4SH) $(defs_m4sh) > $@ # We need to remove any files that the above tests created. clean-local-legacy: -- 2.47.2