From db1d9cde803417425d6bfe33538e4c1b15017d01 Mon Sep 17 00:00:00 2001 From: Matthias Paulmier Date: Thu, 28 Jun 2018 12:33:14 +0200 Subject: Add a module for handling Texinfo files * lib/pm/Texi.pm: New module for handling texinfo files. --- bin/automake.in | 546 ++------------------------------------------------ lib/Automake/Texi.pm | 546 ++++++++++++++++++++++++++++++++++++++++++++++++++ lib/Automake/local.mk | 1 + 3 files changed, 565 insertions(+), 528 deletions(-) create mode 100644 lib/Automake/Texi.pm diff --git a/bin/automake.in b/bin/automake.in index e76e19a09..a74b7143d 100755 --- a/bin/automake.in +++ b/bin/automake.in @@ -50,31 +50,32 @@ BEGIN import Thread::Queue; } } -use Automake::Global; -use Automake::General; -use Automake::XFile; -use Automake::Channels; use Automake::ChannelDefs; +use Automake::Channels; +use Automake::CondStack; +use Automake::Condition qw/TRUE FALSE/; +use Automake::ConfVars; use Automake::Configure_ac; -use Automake::FileUtils; +use Automake::DisjConditions; +use Automake::Errors; use Automake::File; +use Automake::FileUtils; +use Automake::General; +use Automake::Global; +use Automake::LangHandling; +use Automake::Language; use Automake::Location; -use Automake::Condition qw/TRUE FALSE/; -use Automake::DisjConditions; use Automake::Options; -use Automake::Variable; -use Automake::VarDef; +use Automake::Requires; use Automake::Rule; use Automake::RuleDef; -use Automake::Wrap 'makefile_wrap'; -use Automake::Language; -use Automake::Utils; -use Automake::CondStack; -use Automake::ConfVars; -use Automake::Errors; -use Automake::LangHandling; use Automake::SilentRules; -use Automake::Requires; +use Automake::Texi; +use Automake::Utils; +use Automake::VarDef; +use Automake::Variable; +use Automake::Wrap 'makefile_wrap'; +use Automake::XFile; use File::Basename; use File::Spec; use Carp; @@ -140,13 +141,10 @@ sub handle_tags (); sub handle_targets (); sub handle_tests (); sub handle_tests_dejagnu (); -sub handle_texinfo (); -sub handle_texinfo_helper; sub handle_user_recursion (); sub initialize_per_input (); sub is_valid_test_extension; sub locate_am; -sub output_texinfo_build_rules; sub parse_arguments (); sub prepend_srcdir; sub print_autodist_files; @@ -157,7 +155,6 @@ sub scan_aclocal_m4 (); sub scan_autoconf_config_files; sub scan_autoconf_files (); sub scan_autoconf_traces; -sub scan_texinfo_file; sub shadow_unconditionally; sub split_config_file_spec; sub substitute_ac_subst_variables; @@ -2413,513 +2410,6 @@ sub handle_scripts () } -## ------------------------ ## -## Handling Texinfo files. ## -## ------------------------ ## - -# ($OUTFILE, $VFILE) -# scan_texinfo_file ($FILENAME) -# ----------------------------- -# $OUTFILE - name of the info file produced by $FILENAME. -# $VFILE - name of the version.texi file used (undef if none). -sub scan_texinfo_file -{ - my ($filename) = @_; - - my $texi = new Automake::XFile "< $filename"; - verb "reading $filename"; - - my ($outfile, $vfile); - while ($_ = $texi->getline) - { - if (/^\@setfilename +(\S+)/) - { - # Honor only the first @setfilename. (It's possible to have - # more occurrences later if the manual shows examples of how - # to use @setfilename...) - next if $outfile; - - $outfile = $1; - if (index ($outfile, '.') < 0) - { - msg 'obsolete', "$filename:$.", - "use of suffix-less info files is discouraged" - } - elsif ($outfile !~ /\.info$/) - { - error ("$filename:$.", - "output '$outfile' has unrecognized extension"); - return; - } - } - # A "version.texi" file is actually any file whose name matches - # "vers*.texi". - elsif (/^\@include\s+(vers[^.]*\.texi)\s*$/) - { - $vfile = $1; - } - } - - if (! $outfile) - { - err_am "'$filename' missing \@setfilename"; - return; - } - - return ($outfile, $vfile); -} - - -# ($DIRSTAMP, @CLEAN_FILES) -# output_texinfo_build_rules ($SOURCE, $DEST, $INSRC, @DEPENDENCIES) -# ------------------------------------------------------------------ -# SOURCE - the source Texinfo file -# DEST - the destination Info file -# INSRC - whether DEST should be built in the source tree -# DEPENDENCIES - known dependencies -sub output_texinfo_build_rules -{ - my ($source, $dest, $insrc, @deps) = @_; - - # Split 'a.texi' into 'a' and '.texi'. - my ($spfx, $ssfx) = ($source =~ /^(.*?)(\.[^.]*)?$/); - my ($dpfx, $dsfx) = ($dest =~ /^(.*?)(\.[^.]*)?$/); - - $ssfx ||= ""; - $dsfx ||= ""; - - # We can output two kinds of rules: the "generic" rules use Make - # suffix rules and are appropriate when $source and $dest do not lie - # in a sub-directory; the "specific" rules are needed in the other - # case. - # - # The former are output only once (this is not really apparent here, - # but just remember that some logic deeper in Automake will not - # output the same rule twice); while the later need to be output for - # each Texinfo source. - my $generic; - my $makeinfoflags; - my $sdir = dirname $source; - if ($sdir eq '.' && dirname ($dest) eq '.') - { - $generic = 1; - $makeinfoflags = '-I $(srcdir)'; - } - else - { - $generic = 0; - $makeinfoflags = "-I $sdir -I \$(srcdir)/$sdir"; - } - - # A directory can contain two kinds of info files: some built in the - # source tree, and some built in the build tree. The rules are - # different in each case. However we cannot output two different - # set of generic rules. Because in-source builds are more usual, we - # use generic rules in this case and fall back to "specific" rules - # for build-dir builds. (It should not be a problem to invert this - # if needed.) - $generic = 0 unless $insrc; - - # We cannot use a suffix rule to build info files with an empty - # extension. Otherwise we would output a single suffix inference - # rule, with separate dependencies, as in - # - # .texi: - # $(MAKEINFO) ... - # foo.info: foo.texi - # - # which confuse Solaris make. (See the Autoconf manual for - # details.) Therefore we use a specific rule in this case. This - # applies to info files only (dvi and pdf files always have an - # extension). - my $generic_info = ($generic && $dsfx) ? 1 : 0; - - # If the resulting file lies in a subdirectory, - # make sure this directory will exist. - my $dirstamp = require_build_directory_maybe ($dest); - - my $dipfx = ($insrc ? '$(srcdir)/' : '') . $dpfx; - - $output_rules .= file_contents ('texibuild', - new Automake::Location, - AM_V_MAKEINFO => verbose_flag('MAKEINFO'), - AM_V_TEXI2DVI => verbose_flag('TEXI2DVI'), - AM_V_TEXI2PDF => verbose_flag('TEXI2PDF'), - DEPS => "@deps", - DEST_PREFIX => $dpfx, - DEST_INFO_PREFIX => $dipfx, - DEST_SUFFIX => $dsfx, - DIRSTAMP => $dirstamp, - GENERIC => $generic, - GENERIC_INFO => $generic_info, - INSRC => $insrc, - MAKEINFOFLAGS => $makeinfoflags, - SILENT => silent_flag(), - SOURCE => ($generic - ? '$<' : $source), - SOURCE_INFO => ($generic_info - ? '$<' : $source), - SOURCE_REAL => $source, - SOURCE_SUFFIX => $ssfx, - TEXIQUIET => verbose_flag('texinfo'), - TEXIDEVNULL => verbose_flag('texidevnull'), - ); - return ($dirstamp, "$dpfx.dvi", "$dpfx.pdf", "$dpfx.ps", "$dpfx.html"); -} - - -# ($MOSTLYCLEAN, $TEXICLEAN, $MAINTCLEAN) -# handle_texinfo_helper ($info_texinfos) -# -------------------------------------- -# Handle all Texinfo source; helper for 'handle_texinfo'. -sub handle_texinfo_helper -{ - my ($info_texinfos) = @_; - my (@infobase, @info_deps_list, @texi_deps); - my %versions; - my $done = 0; - my (@mostly_cleans, @texi_cleans, @maint_cleans) = ('', '', ''); - - # Build a regex matching user-cleaned files. - my $d = var 'DISTCLEANFILES'; - my $c = var 'CLEANFILES'; - my @f = (); - push @f, $d->value_as_list_recursive (inner_expand => 1) if $d; - push @f, $c->value_as_list_recursive (inner_expand => 1) if $c; - @f = map { s|[^A-Za-z_0-9*\[\]\-]|\\$&|g; s|\*|[^/]*|g; $_; } @f; - my $user_cleaned_files = '^(?:' . join ('|', @f) . ')$'; - - foreach my $texi - ($info_texinfos->value_as_list_recursive (inner_expand => 1)) - { - my $infobase = $texi; - if ($infobase =~ s/\.texi$//) - { - 1; # Nothing more to do. - } - elsif ($infobase =~ s/\.(txi|texinfo)$//) - { - msg_var 'obsolete', $info_texinfos, - "suffix '.$1' for Texinfo files is discouraged;" . - " use '.texi' instead"; - } - else - { - # FIXME: report line number. - err_am "texinfo file '$texi' has unrecognized extension"; - next; - } - - push @infobase, $infobase; - - # If 'version.texi' is referenced by input file, then include - # automatic versioning capability. - my ($out_file, $vtexi) = - scan_texinfo_file ("$relative_dir/$texi") - or next; - # Directory of auxiliary files and build by-products used by texi2dvi - # and texi2pdf. - push @mostly_cleans, "$infobase.t2d"; - push @mostly_cleans, "$infobase.t2p"; - - # If the Texinfo source is in a subdirectory, create the - # resulting info in this subdirectory. If it is in the current - # directory, try hard to not prefix "./" because it breaks the - # generic rules. - my $outdir = dirname ($texi) . '/'; - $outdir = "" if $outdir eq './'; - $out_file = $outdir . $out_file; - - # Until Automake 1.6.3, .info files were built in the - # source tree. This was an obstacle to the support of - # non-distributed .info files, and non-distributed .texi - # files. - # - # * Non-distributed .texi files is important in some packages - # where .texi files are built at make time, probably using - # other binaries built in the package itself, maybe using - # tools or information found on the build host. Because - # these files are not distributed they are always rebuilt - # at make time; they should therefore not lie in the source - # directory. One plan was to support this using - # nodist_info_TEXINFOS or something similar. (Doing this - # requires some sanity checks. For instance Automake should - # not allow: - # dist_info_TEXINFOS = foo.texi - # nodist_foo_TEXINFOS = included.texi - # because a distributed file should never depend on a - # non-distributed file.) - # - # * If .texi files are not distributed, then .info files should - # not be distributed either. There are also cases where one - # wants to distribute .texi files, but does not want to - # distribute the .info files. For instance the Texinfo package - # distributes the tool used to build these files; it would - # be a waste of space to distribute them. It's not clear - # which syntax we should use to indicate that .info files should - # not be distributed. Akim Demaille suggested that eventually - # we switch to a new syntax: - # | Maybe we should take some inspiration from what's already - # | done in the rest of Automake. Maybe there is too much - # | syntactic sugar here, and you want - # | nodist_INFO = bar.info - # | dist_bar_info_SOURCES = bar.texi - # | bar_texi_DEPENDENCIES = foo.texi - # | with a bit of magic to have bar.info represent the whole - # | bar*info set. That's a lot more verbose that the current - # | situation, but it is # not new, hence the user has less - # | to learn. - # | - # | But there is still too much room for meaningless specs: - # | nodist_INFO = bar.info - # | dist_bar_info_SOURCES = bar.texi - # | dist_PS = bar.ps something-written-by-hand.ps - # | nodist_bar_ps_SOURCES = bar.texi - # | bar_texi_DEPENDENCIES = foo.texi - # | here bar.texi is dist_ in line 2, and nodist_ in 4. - # - # Back to the point, it should be clear that in order to support - # non-distributed .info files, we need to build them in the - # build tree, not in the source tree (non-distributed .texi - # files are less of a problem, because we do not output build - # rules for them). In Automake 1.7 .info build rules have been - # largely cleaned up so that .info files get always build in the - # build tree, even when distributed. The idea was that - # (1) if during a VPATH build the .info file was found to be - # absent or out-of-date (in the source tree or in the - # build tree), Make would rebuild it in the build tree. - # If an up-to-date source-tree of the .info file existed, - # make would not rebuild it in the build tree. - # (2) having two copies of .info files, one in the source tree - # and one (newer) in the build tree is not a problem - # because 'make dist' always pick files in the build tree - # first. - # However it turned out the be a bad idea for several reasons: - # * Tru64, OpenBSD, and FreeBSD (not NetBSD) Make do not behave - # like GNU Make on point (1) above. These implementations - # of Make would always rebuild .info files in the build - # tree, even if such files were up to date in the source - # tree. Consequently, it was impossible to perform a VPATH - # build of a package containing Texinfo files using these - # Make implementations. - # (Refer to the Autoconf Manual, section "Limitation of - # Make", paragraph "VPATH", item "target lookup", for - # an account of the differences between these - # implementations.) - # * The GNU Coding Standards require these files to be built - # in the source-tree (when they are distributed, that is). - # * Keeping a fresher copy of distributed files in the - # build tree can be annoying during development because - # - if the files is kept under CVS, you really want it - # to be updated in the source tree - # - it is confusing that 'make distclean' does not erase - # all files in the build tree. - # - # Consequently, starting with Automake 1.8, .info files are - # built in the source tree again. Because we still plan to - # support non-distributed .info files at some point, we - # have a single variable ($INSRC) that controls whether - # the current .info file must be built in the source tree - # or in the build tree. Actually this variable is switched - # off in two cases: - # (1) For '.info' files that appear to be cleaned; this is for - # backward compatibility with package such as Texinfo, - # which do things like - # info_TEXINFOS = texinfo.txi info-stnd.texi info.texi - # DISTCLEANFILES = texinfo texinfo-* info*.info* - # # Do not create info files for distribution. - # dist-info: - # in order not to distribute .info files. - # (2) When the undocumented option 'info-in-builddir' is given. - # This is done to allow the developers of GCC, GDB, GNU - # binutils and the GNU bfd library to force the '.info' files - # to be generated in the builddir rather than the srcdir, as - # was once done when the (now removed) 'cygnus' option was - # given. See automake bug#11034 for more discussion. - my $insrc = 1; - my $soutdir = '$(srcdir)/' . $outdir; - - if (option 'info-in-builddir') - { - $insrc = 0; - } - elsif ($out_file =~ $user_cleaned_files) - { - $insrc = 0; - msg 'obsolete', "$am_file.am", < $texi, - VTI => $vti, - STAMPVTI => "${soutdir}stamp-$vti", - VTEXI => "$soutdir$vtexi", - MDDIR => $conf_dir, - DIRSTAMP => $dirstamp); - } - } - - # Handle location of texinfo.tex. - my $need_texi_file = 0; - my $texinfodir; - if (var ('TEXINFO_TEX')) - { - # The user defined TEXINFO_TEX so assume he knows what he is - # doing. - $texinfodir = ('$(srcdir)/' - . dirname (variable_value ('TEXINFO_TEX'))); - } - elsif ($config_aux_dir_set_in_configure_ac) - { - $texinfodir = $am_config_aux_dir; - define_variable ('TEXINFO_TEX', "$texinfodir/texinfo.tex", INTERNAL); - $need_texi_file = 2; # so that we require_conf_file later - } - else - { - $texinfodir = '$(srcdir)'; - $need_texi_file = 1; - } - define_variable ('am__TEXINFO_TEX_DIR', $texinfodir, INTERNAL); - - push (@dist_targets, 'dist-info'); - - if (! option 'no-installinfo') - { - # Make sure documentation is made and installed first. Use - # $(INFO_DEPS), not 'info', because otherwise recursive makes - # get run twice during "make all". - unshift (@all, '$(INFO_DEPS)'); - } - - define_files_variable ("DVIS", @infobase, 'dvi', INTERNAL); - define_files_variable ("PDFS", @infobase, 'pdf', INTERNAL); - define_files_variable ("PSS", @infobase, 'ps', INTERNAL); - define_files_variable ("HTMLS", @infobase, 'html', INTERNAL); - - # This next isn't strictly needed now -- the places that look here - # could easily be changed to look in info_TEXINFOS. But this is - # probably better, in case noinst_TEXINFOS is ever supported. - define_variable ("TEXINFOS", variable_value ('info_TEXINFOS'), INTERNAL); - - # Do some error checking. Note that this file is not required - # when in Cygnus mode; instead we defined TEXINFO_TEX explicitly - # up above. - if ($need_texi_file && ! option 'no-texinfo.tex') - { - if ($need_texi_file > 1) - { - require_conf_file_with_macro (TRUE, 'info_TEXINFOS', FOREIGN, - 'texinfo.tex'); - } - else - { - require_file_with_macro (TRUE, 'info_TEXINFOS', FOREIGN, - 'texinfo.tex'); - } - } - - return (makefile_wrap ("", "\t ", @mostly_cleans), - makefile_wrap ("", "\t ", @texi_cleans), - makefile_wrap ("", "\t ", @maint_cleans)); -} - - -sub handle_texinfo () -{ - reject_var 'TEXINFOS', "'TEXINFOS' is an anachronism; use 'info_TEXINFOS'"; - # FIXME: I think this is an obsolete future feature name. - reject_var 'html_TEXINFOS', "HTML generation not yet supported"; - - my $info_texinfos = var ('info_TEXINFOS'); - my ($mostlyclean, $clean, $maintclean) = ('', '', ''); - if ($info_texinfos) - { - define_verbose_texinfo; - ($mostlyclean, $clean, $maintclean) = handle_texinfo_helper ($info_texinfos); - chomp $mostlyclean; - chomp $clean; - chomp $maintclean; - } - - $output_rules .= file_contents ('texinfos', - new Automake::Location, - AM_V_DVIPS => verbose_flag('DVIPS'), - MOSTLYCLEAN => $mostlyclean, - TEXICLEAN => $clean, - MAINTCLEAN => $maintclean, - 'LOCAL-TEXIS' => !!$info_texinfos, - TEXIQUIET => verbose_flag('texinfo')); -} - - sub handle_man_pages () { reject_var 'MANS', "'MANS' is an anachronism; use 'man_MANS'"; diff --git a/lib/Automake/Texi.pm b/lib/Automake/Texi.pm new file mode 100644 index 000000000..a65b49a94 --- /dev/null +++ b/lib/Automake/Texi.pm @@ -0,0 +1,546 @@ +# Copyright (C) 2018 Matthias Paulmier + +# 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 +# of the License, 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 . + +package Automake::Texi; + +use 5.006; +use strict; + +use Automake::ChannelDefs; +use Automake::Channels; +use Automake::Condition qw (TRUE FALSE); +use Automake::Errors; +use Automake::File; +use Automake::Global; +use Automake::Location; +use Automake::Options; +use Automake::Requires; +use Automake::SilentRules; +use Automake::Utils; +use Automake::Variable; +use Automake::Wrap qw (makefile_wrap); +use Automake::XFile; +use Exporter 'import'; +use File::Basename; + +use vars qw (@EXPORT); + +@EXPORT = qw (scan_texinfo_file output_texinfo_build_rules + handle_texinfo_helper handle_texinfo); + + +# ($OUTFILE, $VFILE) +# scan_texinfo_file ($FILENAME) +# ----------------------------- +# $OUTFILE - name of the info file produced by $FILENAME. +# $VFILE - name of the version.texi file used (undef if none). +sub scan_texinfo_file +{ + my ($filename) = @_; + + my $texi = new Automake::XFile "< $filename"; + verb "reading $filename"; + + my ($outfile, $vfile); + while ($_ = $texi->getline) + { + if (/^\@setfilename +(\S+)/) + { + # Honor only the first @setfilename. (It's possible to have + # more occurrences later if the manual shows examples of how + # to use @setfilename...) + next if $outfile; + + $outfile = $1; + if (index ($outfile, '.') < 0) + { + msg 'obsolete', "$filename:$.", + "use of suffix-less info files is discouraged" + } + elsif ($outfile !~ /\.info$/) + { + error ("$filename:$.", + "output '$outfile' has unrecognized extension"); + return; + } + } + # A "version.texi" file is actually any file whose name matches + # "vers*.texi". + elsif (/^\@include\s+(vers[^.]*\.texi)\s*$/) + { + $vfile = $1; + } + } + + if (! $outfile) + { + err_am "'$filename' missing \@setfilename"; + return; + } + + return ($outfile, $vfile); +} + + +# ($DIRSTAMP, @CLEAN_FILES) +# output_texinfo_build_rules ($SOURCE, $DEST, $INSRC, @DEPENDENCIES) +# ------------------------------------------------------------------ +# SOURCE - the source Texinfo file +# DEST - the destination Info file +# INSRC - whether DEST should be built in the source tree +# DEPENDENCIES - known dependencies +sub output_texinfo_build_rules +{ + my ($source, $dest, $insrc, @deps) = @_; + + # Split 'a.texi' into 'a' and '.texi'. + my ($spfx, $ssfx) = ($source =~ /^(.*?)(\.[^.]*)?$/); + my ($dpfx, $dsfx) = ($dest =~ /^(.*?)(\.[^.]*)?$/); + + $ssfx ||= ""; + $dsfx ||= ""; + + # We can output two kinds of rules: the "generic" rules use Make + # suffix rules and are appropriate when $source and $dest do not lie + # in a sub-directory; the "specific" rules are needed in the other + # case. + # + # The former are output only once (this is not really apparent here, + # but just remember that some logic deeper in Automake will not + # output the same rule twice); while the later need to be output for + # each Texinfo source. + my $generic; + my $makeinfoflags; + my $sdir = dirname $source; + if ($sdir eq '.' && dirname ($dest) eq '.') + { + $generic = 1; + $makeinfoflags = '-I $(srcdir)'; + } + else + { + $generic = 0; + $makeinfoflags = "-I $sdir -I \$(srcdir)/$sdir"; + } + + # A directory can contain two kinds of info files: some built in the + # source tree, and some built in the build tree. The rules are + # different in each case. However we cannot output two different + # set of generic rules. Because in-source builds are more usual, we + # use generic rules in this case and fall back to "specific" rules + # for build-dir builds. (It should not be a problem to invert this + # if needed.) + $generic = 0 unless $insrc; + + # We cannot use a suffix rule to build info files with an empty + # extension. Otherwise we would output a single suffix inference + # rule, with separate dependencies, as in + # + # .texi: + # $(MAKEINFO) ... + # foo.info: foo.texi + # + # which confuse Solaris make. (See the Autoconf manual for + # details.) Therefore we use a specific rule in this case. This + # applies to info files only (dvi and pdf files always have an + # extension). + my $generic_info = ($generic && $dsfx) ? 1 : 0; + + # If the resulting file lies in a subdirectory, + # make sure this directory will exist. + my $dirstamp = require_build_directory_maybe ($dest); + + my $dipfx = ($insrc ? '$(srcdir)/' : '') . $dpfx; + + $output_rules .= file_contents ('texibuild', + new Automake::Location, + AM_V_MAKEINFO => verbose_flag('MAKEINFO'), + AM_V_TEXI2DVI => verbose_flag('TEXI2DVI'), + AM_V_TEXI2PDF => verbose_flag('TEXI2PDF'), + DEPS => "@deps", + DEST_PREFIX => $dpfx, + DEST_INFO_PREFIX => $dipfx, + DEST_SUFFIX => $dsfx, + DIRSTAMP => $dirstamp, + GENERIC => $generic, + GENERIC_INFO => $generic_info, + INSRC => $insrc, + MAKEINFOFLAGS => $makeinfoflags, + SILENT => silent_flag(), + SOURCE => ($generic + ? '$<' : $source), + SOURCE_INFO => ($generic_info + ? '$<' : $source), + SOURCE_REAL => $source, + SOURCE_SUFFIX => $ssfx, + TEXIQUIET => verbose_flag('texinfo'), + TEXIDEVNULL => verbose_flag('texidevnull'), + ); + return ($dirstamp, "$dpfx.dvi", "$dpfx.pdf", "$dpfx.ps", "$dpfx.html"); +} + + +# ($MOSTLYCLEAN, $TEXICLEAN, $MAINTCLEAN) +# handle_texinfo_helper ($info_texinfos) +# -------------------------------------- +# Handle all Texinfo source; helper for 'handle_texinfo'. +sub handle_texinfo_helper +{ + my ($info_texinfos) = @_; + my (@infobase, @info_deps_list, @texi_deps); + my %versions; + my $done = 0; + my (@mostly_cleans, @texi_cleans, @maint_cleans) = ('', '', ''); + + # Build a regex matching user-cleaned files. + my $d = var 'DISTCLEANFILES'; + my $c = var 'CLEANFILES'; + my @f = (); + push @f, $d->value_as_list_recursive (inner_expand => 1) if $d; + push @f, $c->value_as_list_recursive (inner_expand => 1) if $c; + @f = map { s|[^A-Za-z_0-9*\[\]\-]|\\$&|g; s|\*|[^/]*|g; $_; } @f; + my $user_cleaned_files = '^(?:' . join ('|', @f) . ')$'; + + foreach my $texi + ($info_texinfos->value_as_list_recursive (inner_expand => 1)) + { + my $infobase = $texi; + if ($infobase =~ s/\.texi$//) + { + 1; # Nothing more to do. + } + elsif ($infobase =~ s/\.(txi|texinfo)$//) + { + msg_var 'obsolete', $info_texinfos, + "suffix '.$1' for Texinfo files is discouraged;" . + " use '.texi' instead"; + } + else + { + # FIXME: report line number. + err_am "texinfo file '$texi' has unrecognized extension"; + next; + } + + push @infobase, $infobase; + + # If 'version.texi' is referenced by input file, then include + # automatic versioning capability. + my ($out_file, $vtexi) = + scan_texinfo_file ("$relative_dir/$texi") + or next; + # Directory of auxiliary files and build by-products used by texi2dvi + # and texi2pdf. + push @mostly_cleans, "$infobase.t2d"; + push @mostly_cleans, "$infobase.t2p"; + + # If the Texinfo source is in a subdirectory, create the + # resulting info in this subdirectory. If it is in the current + # directory, try hard to not prefix "./" because it breaks the + # generic rules. + my $outdir = dirname ($texi) . '/'; + $outdir = "" if $outdir eq './'; + $out_file = $outdir . $out_file; + + # Until Automake 1.6.3, .info files were built in the + # source tree. This was an obstacle to the support of + # non-distributed .info files, and non-distributed .texi + # files. + # + # * Non-distributed .texi files is important in some packages + # where .texi files are built at make time, probably using + # other binaries built in the package itself, maybe using + # tools or information found on the build host. Because + # these files are not distributed they are always rebuilt + # at make time; they should therefore not lie in the source + # directory. One plan was to support this using + # nodist_info_TEXINFOS or something similar. (Doing this + # requires some sanity checks. For instance Automake should + # not allow: + # dist_info_TEXINFOS = foo.texi + # nodist_foo_TEXINFOS = included.texi + # because a distributed file should never depend on a + # non-distributed file.) + # + # * If .texi files are not distributed, then .info files should + # not be distributed either. There are also cases where one + # wants to distribute .texi files, but does not want to + # distribute the .info files. For instance the Texinfo package + # distributes the tool used to build these files; it would + # be a waste of space to distribute them. It's not clear + # which syntax we should use to indicate that .info files should + # not be distributed. Akim Demaille suggested that eventually + # we switch to a new syntax: + # | Maybe we should take some inspiration from what's already + # | done in the rest of Automake. Maybe there is too much + # | syntactic sugar here, and you want + # | nodist_INFO = bar.info + # | dist_bar_info_SOURCES = bar.texi + # | bar_texi_DEPENDENCIES = foo.texi + # | with a bit of magic to have bar.info represent the whole + # | bar*info set. That's a lot more verbose that the current + # | situation, but it is # not new, hence the user has less + # | to learn. + # | + # | But there is still too much room for meaningless specs: + # | nodist_INFO = bar.info + # | dist_bar_info_SOURCES = bar.texi + # | dist_PS = bar.ps something-written-by-hand.ps + # | nodist_bar_ps_SOURCES = bar.texi + # | bar_texi_DEPENDENCIES = foo.texi + # | here bar.texi is dist_ in line 2, and nodist_ in 4. + # + # Back to the point, it should be clear that in order to support + # non-distributed .info files, we need to build them in the + # build tree, not in the source tree (non-distributed .texi + # files are less of a problem, because we do not output build + # rules for them). In Automake 1.7 .info build rules have been + # largely cleaned up so that .info files get always build in the + # build tree, even when distributed. The idea was that + # (1) if during a VPATH build the .info file was found to be + # absent or out-of-date (in the source tree or in the + # build tree), Make would rebuild it in the build tree. + # If an up-to-date source-tree of the .info file existed, + # make would not rebuild it in the build tree. + # (2) having two copies of .info files, one in the source tree + # and one (newer) in the build tree is not a problem + # because 'make dist' always pick files in the build tree + # first. + # However it turned out the be a bad idea for several reasons: + # * Tru64, OpenBSD, and FreeBSD (not NetBSD) Make do not behave + # like GNU Make on point (1) above. These implementations + # of Make would always rebuild .info files in the build + # tree, even if such files were up to date in the source + # tree. Consequently, it was impossible to perform a VPATH + # build of a package containing Texinfo files using these + # Make implementations. + # (Refer to the Autoconf Manual, section "Limitation of + # Make", paragraph "VPATH", item "target lookup", for + # an account of the differences between these + # implementations.) + # * The GNU Coding Standards require these files to be built + # in the source-tree (when they are distributed, that is). + # * Keeping a fresher copy of distributed files in the + # build tree can be annoying during development because + # - if the files is kept under CVS, you really want it + # to be updated in the source tree + # - it is confusing that 'make distclean' does not erase + # all files in the build tree. + # + # Consequently, starting with Automake 1.8, .info files are + # built in the source tree again. Because we still plan to + # support non-distributed .info files at some point, we + # have a single variable ($INSRC) that controls whether + # the current .info file must be built in the source tree + # or in the build tree. Actually this variable is switched + # off in two cases: + # (1) For '.info' files that appear to be cleaned; this is for + # backward compatibility with package such as Texinfo, + # which do things like + # info_TEXINFOS = texinfo.txi info-stnd.texi info.texi + # DISTCLEANFILES = texinfo texinfo-* info*.info* + # # Do not create info files for distribution. + # dist-info: + # in order not to distribute .info files. + # (2) When the undocumented option 'info-in-builddir' is given. + # This is done to allow the developers of GCC, GDB, GNU + # binutils and the GNU bfd library to force the '.info' files + # to be generated in the builddir rather than the srcdir, as + # was once done when the (now removed) 'cygnus' option was + # given. See automake bug#11034 for more discussion. + my $insrc = 1; + my $soutdir = '$(srcdir)/' . $outdir; + + if (option 'info-in-builddir') + { + $insrc = 0; + } + elsif ($out_file =~ $user_cleaned_files) + { + $insrc = 0; + msg 'obsolete', "$am_file.am", < $texi, + VTI => $vti, + STAMPVTI => "${soutdir}stamp-$vti", + VTEXI => "$soutdir$vtexi", + MDDIR => $conf_dir, + DIRSTAMP => $dirstamp); + } + } + + # Handle location of texinfo.tex. + my $need_texi_file = 0; + my $texinfodir; + if (var ('TEXINFO_TEX')) + { + # The user defined TEXINFO_TEX so assume he knows what he is + # doing. + $texinfodir = ('$(srcdir)/' + . dirname (variable_value ('TEXINFO_TEX'))); + } + elsif ($config_aux_dir_set_in_configure_ac) + { + $texinfodir = $am_config_aux_dir; + define_variable ('TEXINFO_TEX', "$texinfodir/texinfo.tex", INTERNAL); + $need_texi_file = 2; # so that we require_conf_file later + } + else + { + $texinfodir = '$(srcdir)'; + $need_texi_file = 1; + } + define_variable ('am__TEXINFO_TEX_DIR', $texinfodir, INTERNAL); + + push (@dist_targets, 'dist-info'); + + if (! option 'no-installinfo') + { + # Make sure documentation is made and installed first. Use + # $(INFO_DEPS), not 'info', because otherwise recursive makes + # get run twice during "make all". + unshift (@all, '$(INFO_DEPS)'); + } + + define_files_variable ("DVIS", @infobase, 'dvi', INTERNAL); + define_files_variable ("PDFS", @infobase, 'pdf', INTERNAL); + define_files_variable ("PSS", @infobase, 'ps', INTERNAL); + define_files_variable ("HTMLS", @infobase, 'html', INTERNAL); + + # This next isn't strictly needed now -- the places that look here + # could easily be changed to look in info_TEXINFOS. But this is + # probably better, in case noinst_TEXINFOS is ever supported. + define_variable ("TEXINFOS", variable_value ('info_TEXINFOS'), INTERNAL); + + # Do some error checking. Note that this file is not required + # when in Cygnus mode; instead we defined TEXINFO_TEX explicitly + # up above. + if ($need_texi_file && ! option 'no-texinfo.tex') + { + if ($need_texi_file > 1) + { + require_conf_file_with_macro (TRUE, 'info_TEXINFOS', FOREIGN, + 'texinfo.tex'); + } + else + { + require_file_with_macro (TRUE, 'info_TEXINFOS', FOREIGN, + 'texinfo.tex'); + } + } + + return (makefile_wrap ("", "\t ", @mostly_cleans), + makefile_wrap ("", "\t ", @texi_cleans), + makefile_wrap ("", "\t ", @maint_cleans)); +} + + +sub handle_texinfo +{ + reject_var 'TEXINFOS', "'TEXINFOS' is an anachronism; use 'info_TEXINFOS'"; + # FIXME: I think this is an obsolete future feature name. + reject_var 'html_TEXINFOS', "HTML generation not yet supported"; + + my $info_texinfos = var ('info_TEXINFOS'); + my ($mostlyclean, $clean, $maintclean) = ('', '', ''); + if ($info_texinfos) + { + define_verbose_texinfo; + ($mostlyclean, $clean, $maintclean) = handle_texinfo_helper ($info_texinfos); + chomp $mostlyclean; + chomp $clean; + chomp $maintclean; + } + + $output_rules .= file_contents ('texinfos', + new Automake::Location, + AM_V_DVIPS => verbose_flag('DVIPS'), + MOSTLYCLEAN => $mostlyclean, + TEXICLEAN => $clean, + MAINTCLEAN => $maintclean, + 'LOCAL-TEXIS' => !!$info_texinfos, + TEXIQUIET => verbose_flag('texinfo')); +} + +1; diff --git a/lib/Automake/local.mk b/lib/Automake/local.mk index 2a9c43faf..b0e0fca66 100644 --- a/lib/Automake/local.mk +++ b/lib/Automake/local.mk @@ -44,6 +44,7 @@ dist_perllib_DATA = \ %D%/Rule.pm \ %D%/RuleDef.pm \ %D%/SilentRules.pm \ + %D%/Texi.pm \ %D%/Utils.pm \ %D%/VarAppend.pm \ %D%/Variable.pm \ -- cgit v1.2.1