Copyright 2011-2012,2013 by Thomas E. Dickey
Tack is a program that can be used to verify or refine a terminfo (terminal information) description of a terminal.
The program's early history is summarized in the HISTORY file in the sources:
Daniel Weaver sent me email in October 1997, suggesting that it might be incorporated into the ncurses project. We discussed this over the next few months, with an unexpected conclusion: RMS persuaded Daniel Weaver to GPL-license tack.
Based on Daniel's initial request, I agreed to make some minor changes to ncurses to allow tack to use some of the undocumented entrypoints and symbols in the ncurses library.
Given suitable disclaimers, RMS saw no problem in distributing tack along with ncurses. So I agreed to do this.
I added tack to the ncurses snapshots starting in April 1999, noting in the NEWS file that it is not part of ncurses.
I designed the ncurses configure script so that it would check for the existence of the tack subdirectory before deciding whether to build it. Thus, tack was simply bundled into the same tar ball, and since it was clearly marked as not being part of ncurses, it was not a problem for ncurses for some time.
Due to its license difference versus ncurses, I made relatively few changes to tack for some time (932 insertions, 653 deletions, less than 10% of the program). Like the Ada95 binding and terminfo database, tack resides in a separate source archive. However, there is a break in its change-log, since it was maintained for some time within the ncurses source repository.
However, early in 2007 I happened to notice more than one of my programs marked with an incorrect license, e.g., diffstat and xterm both as "GPL". That prompted me to look for more cases, and I found several. One was tack (more than one instance).
I discussed this with the package maintainers, pointing out that
During the discussion I noted that tack relied on being built within the ncurses source tree. For one packager, it was enough to provide a way to build it outside the tree (done January 2007. That did not work for openSUSE, so I removed tack from the ncurses tree a few weeks later.
After further discussion, openSUSE moved tack to its own package, as shown here.
As the maintainer for tack, I cannot simply remove it from ncurses without providing for keeping it working. I wrote a configure script. Early on, Daniel Weaver had proposed writing one, but that never happened, since we integrated it directly as a subdirectory of the ncurses tree. To make tack build outside the ncurses tree (and also address the concerns of packagers such as openSUSE who did not want to revise their packages), there were several things to consider:
Depending on the system and configuration, tack may use several private symbols from the ncurses library:
|Symbol||First used||Optional library|
|_nc_find_entry||1.00 (1997)||ncurses, tinfo|
|cur_term or _nc_get_curterm||1.00 (1997)||ncurses, tinfo|
|_nc_get_hash_table||1.00 (1997)||ncurses, tinfo|
|_nc_read_entry||1.00 (1997)||ncurses, tinfo|
|_nc_reset_input||1.00 (1997)||ncurses, tic|
|_nc_tic_expand||1.00 (1997)||ncurses, tic|
|_nc_trans_string||1.00 (1997)||ncurses, tic|
That is, the list doubled in size since the first release of tack. I added a third of the entrypoints to this list after moving tack from the ncurses snapshots to a separate tarball.
Packaging does not stop with a configure script. Starting in early 2010, I began creating package scripts (RPM and Debian) for most of the programs that I maintain. Those use a more restricted build environment than the other test-builds, and help me see dependency issues from the packager's perspective. I added that to tack in September 2010. But right before that, I spent some time on code-cleanup, and reformatted it throughout with the same indentation as that which I use in other programs.
tack (pdf) (postscript) (plain text)