This file describes the development environment for Texinfo.

  Copyright 2002-2022 Free Software Foundation, Inc.

  Copying and distribution of this file, with or without modification,
  are permitted in any medium without royalty provided the copyright
  notice and this notice are preserved.

The development sources for GNU Texinfo are available through git
at Savannah:
  https://savannah.gnu.org/git/?group=texinfo

This distribution uses whatever versions of Automake, Autoconf, and
Gettext are listed in NEWS; usually the latest official releases.  If
you are getting the sources from the development repository (or change
configure.ac), you'll need to have these tools installed to (re)build.
You'll also need help2man.  If you modify texindex/ti.twjr, you'll need
gawk >= 4.0.  All of these programs are available from
http://ftp.gnu.org/gnu.

After getting the development sources, and installing the tools above,
you can run
 ./autogen.sh
and then, for example,
 ./configure -C CFLAGS='-g' PERL_EXT_CFLAGS='-g'
and then
 make

The -C tells configure to cache test results, which usually speeds
things up a bit.

After the initial autogen && configure, simply running make should suffice.

Gettext or help2man not installed do not cause configure to fail,
though configure shows if they were found.  This is because a release
does not require those tools.  Indeed, both prerequisites and
result files are shipped in a release, such that the tools are only
needed if the prerequisite changed.  The tools are needed when building
from developpement sources, however, as result files are not under version
control.  Make will fail with an explicit missing command for help2man,
and with a command not found error for a Gettext utility command.

Running make in one particular subdirectory is possible, for example
make -C info.  However there are interdependencies between the 
subdirectories, notably on gnulib, so if you don't want to run "make", 
you may have to run "make -C gnulib/lib" first.

Additionally, make dist may not work until make has been run at least 
once, because of rules to create man pages under the man/ directory.

"make dist" will fail if the use of Perl XS extension modules is 
disabled and there is no Makefile in the XSParagraph subdirectory.


Using git
---------

This section is if you have write access to the git repository.

Usually commits to the git repository should include a ChangeLog
entry.  Please follow the existing style (the GNU Coding Standards
has a guide).

You can automatically use the contents of the most recent ChangeLog
entry with a git commit hook .git/hooks/prepare-commit-msg

------------------------------------
#!/bin/sh

# $1 - file that contains commit log message
# $2 - source of commit message

outfile="$1"

case $2 in
  message|template|merge|squash|commit)
    ;;
  *)
   # Use latest ChangeLog entry as commit message
   sed -n -e '1,/^\w*$/d' -e '/^[^	]/q' -e '{s/^	//;p}' ChangeLog  >"$outfile"
;;
esac
------------------------------------

When unable to push commits due to other commits being made, please
use "git pull --rebase" (the default for "git pull" complicates the
git history).  To deal with conflicts in the ChangeLog, you should
install the git-merge-changelog program.

You can get better output from "git diff" for Texinfo files by putting
the following section in your .gitconfig file:

[diff "texinfo"]
        xfuncname = "^(@node .*)$"

This shows which node each change occurred in.


Gnulib
------

This distribution uses Gnulib (http://www.gnu.org/software/gnulib)
to share common files.  Gnulib files used in Texinfo are checked in to
the repository.  A Gnulib directory is setup in two locations, in
the main directory and in tp/Texinfo/XS/.

To update the gnulib files, get a checkout of gnulib in a separate
directory, then run, say

  ../gnulib/gnulib-tool --add-import

in your top-level Texinfo directory and

  ../../../../gnulib/gnulib-tool --add-import

under tp/Texinfo/XS.  (gnulib-tool is in the gnulib source tree.)

The currently-used gnulib modules and other gnulib information are
recorded in gnulib/m4/gnulib-cache.m4.

gnulib-tool --add-import may also be used to add another gnulib module:
  ../gnulib/gnulib-tool --add-import other_gnulib_module

After running gnulib-tool --add-import or otherwise adding modules, it is
necessary to check what files were added or removed (e.g., run "git
status -u") and add new files to the repository with "git add".
Add any new generated files (typically gnulib/lib/foo.h from foo.h.in) 
to the ignore list in .gitignore.


Subdirectories in repository
----------------------------

In addition to the subdirectories listed in README, there is the 
following directory in the source control repository:

js/ - Work on enhanced browsing of HTML manuals with JavaScript
infog/ - HTML-Info reader using WebKitGTK library

Finally, the contrib/ directory contains additional files from users
provided for your reading and/or hacking pleasure.  They aren't part of
Texinfo proper or maintained by the Texinfo developers.




About running the Texinfo programs from a development source tree:

- Once the distribution is built, you can run the compiled programs
(info, install-info) out of the build tree without special settings; 
they don't try to read any installed data files.

- The texi2dvi script and texinfo.tex can be run as-is, since they 
are standalone and don't require compilation.  For the same reasons,
they are officially updated between full Texinfo releases, at
http://ftpmirror.gnu.org/texinfo.

- Regarding texi2any (aka makeinfo), you can run tp/texi2any.pl
directly.  This is the original source file for the program, so it's
convenient to be able to make changes and then run it.

To run the output "tp/texi2any" instead, you can set the environment
variable TEXINFO_DEV_SOURCE to 1.  Otherwise, it will try to use
Texinfo's Perl modules in the installed locations.  "tp/texi2any" uses
the Perl interpreter found by configure, so you might want to run that 
instead of texi2any.pl if it's different to the default interpreter in 
your environment.



References for working on various parts of the system:

If you want to delve into making a new backend for the Perl makeinfo,
the documentation in tp/Texinfo/Convert/Converter.pm is a good starting
point, as it describes the existing backends and other places to look.

If you want to delve into texinfo.tex, a thorough plain TeX reference
is available under the GFDL:
  TeX by Topic - http://www.eijkhout.net/texbytopic/texbytopic.html
Another book on plain TeX, also available under the GFDL, is a GNU package:
  TeX for the Impatient - http://www.gnu.org/software/teximpatient/
Occasionally you may need to know about the details of the PDF format.
A reference for this is the PDF reference, Sixth Edition, version 1.7,  
downloadable at http://www.adobe.com/devnet/pdf/pdf_reference_archive.html

The texindex program is implemented using the TexiWebJR literate
programming system, combining Texinfo and Awk
(https://github.com/arnoldrobbins/texiwebjr).  Running "make ti.pdf"
in the texindex/ subdirectory creates the printable form of the
program.  All the usual Texinfo output formats are possible.



Steps for making a release (pretest or official):

- When close to official release:

check at latest automake/autoconf/gettext version, and mention in NEWS
(to upgrade gettext, run
  gettextize -f --po-dir=po --po-dir=po_document
after installing new version of gettext.
check that this does not actually downgrade files due to files also
being updated from gnulib --add-import)

# Under the top level, and also under tp/Texinfo/XS, which uses
# a separate gnulib import.
gnulib-tool --add-import
'git status -u' and add untracked files

After upgrading automake/autoconf/gettext, run ./autogen.sh
and/or "autoreconf --verbose --force --install" to update ancilliary
files in build-aux and elsewhere.  Check changes before committing.

Use util/srclist-txi for checking files to be copied from gnulib

run all tests with valgrind:
* under info/t, put valgrind in $ginfo, then check t/*.val.log files after
  running test suite
* edit install-info/tests/defs.in, uncomment valgrind line and run
  config.status to regenerate defs

parsetexi memory leak checks with valgrind

NYTProf profiling for Perl code
* e.g. 'perl -d:NYTProf ../tp/texi2any.pl FILE.texi'.  See Devel::NYTProf
  man page.


try groff.texinfo from groff source repo.
Check "make ccheck" and "make vcheck" work in "doc/refcard".
process doc/texinfo-tex-test.texi with TeX and check that output is good.
check for C compiler warnings by configuring with

  ./configure CFLAGS='-Wall -Wdeclaration-after-statement' \
              PERL_EXT_CFLAGS='-Wall -Wdeclaration-after-statement'

-Wdeclaration-after-statement is useful because a) intermixing
declarations with statements is an easy thing to do accidentally,
b) gcc doesn't warn about it by default, and c) other compilers that
don't support it are still widespread.

Not all compiler warnings have to be fixed, though.

Have a look at the output of "git status -u" to check for files that
  should be tracked in git or ignored.
make po-check             # update po/POTFILES.in as needed

check indices of Texinfo manuals and check for duplicates (with <1> in Info)

- Official releases only:
make V=1 pdf and fix underfull/overfull boxes.

- Final (easy) checks:

check OpenCSW build reports at
  https://buildfarm.opencsw.org/buildbot/waterfall?category=texinfo
Check that translations have been updated, e.g.:
  rsync  -Lrtzv  translationproject.org::tp/latest/texinfo/ po
  rsync  -Lrtzv  translationproject.org::tp/latest/texinfo_document/ \
                 po_document # note the trailing slashes in these commands
make
make update-po            # both po and po_document needed, build a dist first
Ensure texinfo.tex, texi2dvi, and htmlxref.cnf are updated on ftp.gnu.org.
Ensure TXI_XLATE in doc/Makefile.am matches actual file list.
Check that LINGUAS under po and po_document match actual file list.
Check that TEXINFO_DTD_VERSION has been updated to the next version in
  configure.ac if the DTD has been modified since the last release.
  See comments in configure.ac, and run (at the top level) make dtd-check.
Check "dist-xz" is in the option list in configure.ac (often removed
for speed when testing).
update version in configure.ac, notice in ChangeLog.
check up to date copyright years in files relevant to --version calls
(tp/texi2any.pl, info/info.c, install-info/install-info.c)
version number in texi2dvi, texi2pdf, txirefcard.tex.
check that texindex version is updated properly
  (cd texindex ; rm texindex.awk ; make)
(cd tp && ./maintain/change_perl_modules_version.sh auto)
  -- this updates all the version numbers in the Perl modules
(cd tp ; maintain/regenerate_file_lists.pl) # list all test results

- Official releases only:
version and date in NEWS.
version number in txirefcard.tex.
(cd tp && maintain/regenerate_documentlanguages-loc.pl)
  -- regenerates tp/Texinfo/Documentlanguages.pm (requires Text::CSV)

one last "git diff" to check release commit looks good
make distcheck
(export MALLOC_CHECK_=2; make distcheck)  # repeat until clean
git commit and push

after uploading distribution,
pretest announcement -> bug-texinfo / beebe / platform-testers to try.
bcc coordinator@translationproject.org.



- To do the actual upload:
pkg=texinfo
ver=7.0

then do one of:
gnupload --to alpha.gnu.org:$pkg $pkg-$ver.tar.xz                #pretest
gnupload --to ftp.gnu.org:$pkg   $pkg-$ver.tar.{gz,xz} *.diff.xz #official
   Use --user option if not using default key
   texinfo.tex and texi2dvi should already be up to date, but check.  Use
gnupload --replace --to ftp.gnu.org:texinfo texi2dvi

#  Official releases only: tag source tree
git tag texinfo-6.6
git push --tags

#  ... set up dtd directory on web pages:
cd $HOME/gnu/www/texinfo/dtd # or wherever webpages checkout is
mkdir $ver && cvs add $ver
cp $tutil/texinfo.dtd $ver
cvs add -kb $ver $ver/texinfo.dtd
cvs commit -m$ver $ver


- When official release is out there ...
update home page (texinfo.html) and commit as needed.
including:
  pod2html $txi/Pod-Simple-Texinfo/pod2texi.pl \
  | grep -Fv 'rev="made"' >manual/pod2texi.html

check for http links that should be changed to https - then delete
this item

Build web documentation with
  make -C doc wwwdoc-build

Copy documentation files to web checkout with, e.g.
  make -C doc \
  wwwdoc-install www_target=../../TEXINFO_WEB_PAGES/texinfo/manual/
Check for removed files with, e.g. ls -ltu $(www_target)/*/html_node, 
followed by cvs rm -f.  Likewise, check for added files with
cvs -qn update, followed by cvs add.  When done, run cvs commit.

#  Official releases only: Contact root@tug.org to update texinfo at tug.org.
# If root@tug.org doesn't reply, can try webmaster@tug.org,
# or (last resort) board@tug.org.


#  For official releases:
send announcement to info-gnu,
  cc bug-texinfo and bcc coordinator@translationproject.org.
news item at savannah.

#  ... post-release, or when development resumes:
configure.ac, util/texi2dvi: add "dev" to versions for clarity,
until it's time to do pretests again.

after next release:
rename old ChangeLog and start a new one
check TODO file and do pending tasks
discuss on mailing list changing the git branch structure to allow quick
  bug fix releases for severe bugs (e.g. glibc 2.34 incompatibility, info crash
  in Brazillian Portuguese locale)
delete these lines from README-hacking


