Cons is a software construction system. A description appears under
"Cons 1.0", below.

$Id: CHANGES,v 1.127 2001/05/25 14:27:29 knight Exp $

Cons 2.3.0
**********

- Require Perl 5.003.

- Add a method `DefaultRules' to allow the user to set explicitly
  the default construction variables.

- Add a method `RuleSet' to allow the user to fetch default construction
  variables (unix or msvc) for a given platform. This helps Windows users
  who do not have the MSVC compiler to have sensible defaults for
  compilers such as gcc.

- Multiple commands can now be an array reference instead of being
  newline-terminated.

- Suppress -I and -L options for local or repository directories
  that don't exist.
  (Based on work by Dean Roehrich.)

- Document %(-%).  Clarify QuickScan documentation.
  (Based on work by Tony Kolarik.)

- Expand %LIBS so it can interpolate other construction variables.
  (Bug reported by David Sanderson.)

- Allow multiple single-character command-line flags to be concatenated.

- Allow multiple -q options to make the build quieter.
  (Based on work by Alex Jacques.)

- Undefined values passed to the internal _Objects method would generate
  errors.  Remove undefined values from the list, collecting a lot of
  common calling logic in one place inside the method.
  (Bug reported by Allan Stokes.)

- Refactor the build::* classes to extract the command-specific
  portions into a new action::command class. This allows us to collect
  all of the command-line manipulation in one place, and creates new
  action::command::{unix,win32} subclasses to handle execution
  differences without an "if ($main::_WIN32)" test each time.

- Add EXPERIMENTAL support for using Perl code references to build
  targets.  The code works, but we can't (yet) generate signatures for
  Perl code to detect when a change requires a target be rebuilt.
  Lots of comments detailing the underlying issues.

- Document the current state of using Perl code references to build
  targets, to encourage people to experiment with it and possibly solve
  some issues.  Use this as an occasion to reorganize a lot of the
  documentation about command-line strings and variable expansion, which
  had gotten thrown into the overly-long description of the Command
  method.

- Put the CVS Id string and version number in (internal) Perl variables
  to help others working on extending the latest CVS checkout.

- Update documentation to mention you can use #include "..." with
  Repository so long as the code that uses #include "..." stays in
  the Repository and is not modified locally.

- Add a -S option that allows specification of a signature-calculation
  package, and a sig::debug package that serves as a factory for
  sig::*::debug packages. This allows debugging of MD5 signatures by
  specifying "-S md5::debug", without having to uncomment lines of code.

- Use the Digest::Perl::MD5 module if it's available, but prefer
  Digest::MD5 or MD5 since they're compiled and faster.

- Add configurable support for content-based derived-file signatures
  through a SourceSignature method and SIGNATURE construction
  variables.
  (Based on work by Wayne Scott.)

Contributions from Alex Jacques <ajacques@morphics.com>

- Fix an unclosed batch label in cons.bat which caused an error
  message on WIN32 systems.

Contributions from Gary Oberbrunner <garyo@genarts.com>

- Add an AfterBuild method to execute perl code after a file has
  been built or evaluated as up-to-date.

Contributions from Johan Holmberg <holmberg@iar.se>

- Fix two internal method calls that still used indirect object syntax,
  preventing the "cons" class from being cleanly sub-classed.

- Two small syntax changes (remove a spurious quote, separate a $ from a
  closing single quote) so cperl-mode will work with the cons.pl source.

- Add support for INCDIRSUFFIX and LIBDIRSUFFIX construction variables,
  mainly to accomodate compilers and linkers that need a trailing '/'
  on directory options.

Cons 2.2.0
**********

- Use the Digest::MD5 module in preference to the now-deprecated MD5
  module.  Use MD5 if Digest::MD5 isn't available.

- Fix the Objects method to return meaningful path names even if the
  object isn't underneath the Conscript directory:  a top-relative
  path name if it's underneath the Construct directory, an
  absolute path name otherwise.

- Fix documentation:  CCOM should be CCCOM. Remove POD directives
  that were showing up in a verbatim paragraph.  The verbatim
  %[-%] example didn't work intuitively.  Change misleading use
  of $ENV for an environment name, which doesn't work because it's
  special to Perl.

- Missed some WIN32-specific -w warnings; now fixed.

- File name fixes:  Added canonicalization so dir//file and dir/file
  refer to the same file.  Simplified lookups in the root
  directory to avoid reporting /bin/cat as //bin/cat.

- Fix a bug that wouldn't allow SUFOBJ to have more than one dot
  (that is, no object files with names like .arch.o).

- Die with an appropriate message when someone tries to Export ENV or any
  other special Perl variable that can only exist in the main:: package.
  (Bug reported by Johan Holmberg and Eric Brown.)

- Rework Conscript variable namespace maintenance to allow external
  packages to be used.  Remove variable names from the script:: namespace
  instead of undef'ing their values.  Restore names whenever we execute
  perl code instead of a shell command.
  (Based on work by Johan Holmberg.)

- When using the -t option, change how the top is located to avoid
  calling dir::init() too early.  This was causing Cons to use
  full path names for files and causing needless recompiles when
  jumping back and forth between using -t and not.
  (Based on a mailing-list patch by Wayne Scott.)

- When using the -t option, emulate make by printing a "cons: Entering
  directory `xxx'" message when we chdir to the Construct directory,
  to allow the emacs compile feature to keep track of where files with
  build errors really are.
  (Based on a mailing-list patch by Wayne Scott.)

- Allow the Depends method to take an array ref of targets to specify
  multiple target dependencies at once.
  (Bug reported by Zachary Deretsky.)

- The QuickScan method's PATH was hard-coded to use ':' as the separator.
  Fix to use ';' on Windows NT, or to use an array ref of directories.
  (Bug reported by Zachary Deretsky.)

- Fix the SourcePath method so it can process and return an array.

Contributions from Gary Oberbrunner <garyo@genarts.com>

- Support executing perl code instead of shell commands to build a target.

Cons 2.1.2
**********

- Unlink after rename of similarly named files, per Unix98. (Reported
  by Bradley White.)

- Allow %% to insert a single % anywhere in a command line, even when
  surrounded by non-whitespace.  A lone % still gets passed through
  untouched, but a lone %% now becomes %.

- Cons (and all tests) are now completely Perl -w clean.

- Add support for changing directory to the containing directory
  of Conscript files, controlled by a Conscript_chdir() method,
  and disabled by default (preserving current behavior).
  This allows file globbing via Perl's <*.c> syntax.

- When building all targets in a directory, explicitly skip '.' and
  '..' instead of skipping all entries begining with '.', to allow
  specification of targets with initial '.' names.

- Use $Config{} to fetch the platform's file suffixes.  Put these
  in a platform-independent default environment.  Put the rest of
  what used to be the default environment into a separate-but-equal
  UNIX defaults "overrides" hash, like the Win32 overrides.  This will
  all help future portability to other platforms.

- We now call $env->_subst() to expand variables from the construction
  environment in source and target file names for all cons methods.
  Existing tests have been modified to verify this for all tested
  methods.
  (Bug reported by Johan Holmberg.)

- Change the case-insensitive mapping for initial drive letters from
  lower-case to upper-case.  This better conforms to the canonical
  Win32 representation.

- Make futil::copy more robust:  Use chmod() to make the file writable
  before calling utime() (permissions govern the ability to modify file
  times on some operating systems), and then chmod back to the desired
  mode if needed.

- Fetch a command's exit status by looking at the proper upper-order
  bits on Win32, too.  We were reporting an exit status of 1 as 256,
  for example.  Move where this happens so the WIN32 logic is grouped.

- The internal File::Spec::splitpath method wasn't recognizing UNC
  volume names; now it does.
  (Bug reported by Bruce Leverett.)

- Add a file::addsuffix call to the Program method so it can append
  SUFEXE if it's not already there, like the Library method appends
  SUFLIB.  This will increase Construct/Conscript file portability by
  allowing people to drop the ".exe" from the Program specification,
  like they do with ".lib" for libraries.
  (Reported by M. C. Srivas.)

Contributions from Johan Holmberg <holmberg@iar.se>

- Make Cons execute cleanly under "use strict" (-Mstrict).

Cons 2.1.1
**********

- First separate development release.

- Specifying a directory target on the command line wouldn't work with
  -t because it didn't add the updir entry ('..') when it re-blessed
  the target from a generic entry to a directory.
  (Bug reported by Damien Neil.)

- Executing cons -t from the top level directory unnecessarily prefixed
  all targets with the current working directory path name.  No longer.

- Handle WIN32 case-insensitive initial drive letters (C: is the same as
  c:).  Add an internal File::Spec::case_tolerant method (parallel to the
  real interface) to decide whether we should lower-case the volume name.
  (Bug reported by Greg Spencer.)

- Add file name and line numbers to the error messages for ignoring
  a non-existent Conscript file and attempting to build a target two
  different ways.

Contributions from Johan Holmberg <holmberg@iar.se>

- Change an explicit check for "file" targets in a directory being
  built to a less-restrictive check for any non-"dir" targets.  This
  preserves existing behavior if the target is an "entry" (as can
  happen via the Depends directive).

Contributions from Damien Neil <neild@centauri.org>

- Fix %[ %] processing to match multiple whitespace characters and
  suppress zero-length arguments.

- Remove "use File::Spec" since we ship our own internal copy.

Contributions from Gary Oberbrunner <garyo@genarts.com>

- When using -d, add a "Rebuilding" line to the output to identify what's
  being rebuilt (and, implicitly, what's causing the rebuild).

- When computing the signature of a file's contents, add a binmode() call
  to the file handle so end-of-file character values (like ^Z on WIN32)
  won't prematurely terminate signature calculation.

Contributions from Juan Altmayer Pizzorno <juan@port25.com>

- In the Win32 'CXXCOM' command, change the '-c' to '/c' for consistency.

Cons 2.0.1
**********

- Fix a QuickScan regression:  CODREFs that return arrays broke
  because the calling context changed from array to scalar.  Keep it
  in array context and use grep to weed out null entries.

- The map{} function SplitPath returned was using @_, not $_, so it
  would return multiple copies of the whole list, thereby only
  working for a single argument.

- Fix the cons.bat file copyright comments. (pointed out by
  Juan Altmayer Pizzorno <juan@port25.com>)

- Add CXX* default rules for win32. (pointed out by
  Juan Altmayer Pizzorno <juan@port25.com>)

- Documentation fix in "Adding new methods" section. (pointed out
  by Juan Altmayer Pizzorno <juan@port25.com>)

Cons 2.0
********

- Release Version of 1.8b2 (see 1.8b2 for all the changes)

- Redo the copyright to be GNU General Public License.

- Integrate the tests from the cons-test suite into the cons release,
  creating separate tar files with and without the tests.

Cons 1.8b2
**********
Contributions from Wayne Scott <wscott@ichips.intel.com>

- Create subdirectories in the Cache directory if they don't already exist.

- Don't match #include delimiters in comments on the same line.

- Prevent scan::quickscan::scan from adding null entries to its
  include-file list.

Contributions from Damien Neill <neild@segasoft.com>

- An initial '@' on a command line suppresses its printing (a la make).

- Make Cons realize that topdir is part of the file system, allowing
  building/installing in directories more than one level up.

- Add support for rewriting portions of the command line enclosed by
  %[-%] by passing them to a named code ref in the Cons environment.

- Add a -t flag to walk up the directory hierarchy looking for a
  Construct file, allowing invocation from child directories.
  (Contributed with Greg Spencer.)

Contributions from Brad Garcia <bgarcia@home.com>

- Make the default environment '%LINK => '%CXX', which in turn
  transparently maps to '%CC' for anyone not using C++.

Contributions from Greg Spencer <greg_spencer@acm.org>

- Add support for %:b, %:s, %:F and %:a suffixes on pseudo-variables.

- Add Win32 default environment overrides for Microsoft VC++ 6.0.

- Add a -t flag to walk up the directory hierarchy looking for a
  Construct file, allowing invocation from child directories.
  (Contributed with Damien Neill.)   Add hooks to builds an associated
  Linked subdirectory if -t is invoked from a source subdirectory.

- Fix futil::install (and the other futil methods) so they warn,
  not die, and return failure on error.

- Add a Precious method to suppress unlinking a file before building.

Contributions from Eric Shienbrood <ers@wildfire.com>

- Fix the Objects method to return path names relative to the Conscript
  file.

Contributions from Johan Holmberg <holmberg@iar.se>

- Bug fixes in new File::Spec logic for incorrect use of Boolean tests
  instead of string comparisons against ''.

- Performance optimizations:  fix caching values in dir::is_linked
  and futil::mkdir methods.

- CPPPATH as an array ref wasn't properly expanding %-variables,
  causing missed dependencies.

Contributions from Gary Oberbrunner <garyo@genarts.com>

- Have -d print the dependencies in-line with build.  Identify
  what's a Target and what's a dependency we're Checking.

Contributions from Steven Knight <knight@baldmt.com>

- Rewrite all path name manipulation using File::Spec so we're as
  portable as possible (at least between UNIX and NT).  Add support
  for multiple file system volumes through a hash of $root nodes.

- Due to incompatibility problems with some versions of File::Spec
  on some versions of Perl, create our own internal File::Spec class with
  methods cut-and-pasted from the real module, so people don't have to
  install an external File::Spec.

- Rewrite "options" routine; now hash-driven for speed and readability.

- Let Default be called more than once.  Document it.

- Rewrite the dir::lookup and dir::lookupdir methods to avoid changing
  a file node into a dir node if the names match.  This was causing "Can't
  locate object method" errors.  We now enforce a distinction between the
  two node types, so add a dir::lookupfile and dir::lookupdir methods and
  change calls as appropriate.  If someone tries to use a dir as a file
  or vice versa, die and report the error with info about what's wrong,
  where we detected the conflict, and where the node was created.  If a
  dir was created as a file via "FilePath," change it to a dir (preserve
  old behavior), but warn them that they should use "DirPath" instead.
  Add an empty 'entry' subclass for nodes which we don't yet know are
  files or directories.
  (Bug reported by Eric Shienbrood.)

- Have srcsig return a '' signature, not die, if the file can't be read.

- Fix a bunch of perl -w warnings.  There are still a few warnings left.

- Replace the hard-coded global FLAG_CHARACTER and LIB_FLAG_PREFIX
  values with INCDIRPREFIX and LIBDIRPREFIX values in the Cons
  environment, so people can simultaneously use multiple compilers/
  linkers with different calling conventions.
  (Bug reported by Johan Holmberg.)

- Documentation cleanup and updates.

- Minor changes to make sure Cons still executes under Perl 5.003.
  Expand the testing to include Cons under Perl versions 5.00[345]
  as well as 5.6.0.

Cons 1.7
********
Contributions from Rajesh Vaidheeswarran <rv@fore.com>

- Add QuickScan documentation.

- Add Argument passing from cons to Construct.

- Remove modification history feature from cons due to duplication, and
  bloat.

Contributions from Brad Garcia <bgarcia@fore.com>

- Add ability to compile both C and C++ files using the same environment.
  Based off of code written by Michael Polis <mfp@terrasim.com>.

Cons 1.6b1
**********
Contributions from Rajesh Vaidheeswarran <rv@fore.com>

- Fix futil::copy to return undef if unable to copy a target to the cache
  instead of aborting the build process.

Cons 1.6a3
**********
Contributions from <v-ronaar@Exchange.Microsoft.com>

- Fix for Win32: [problem: 'require'ing Win32 won't work when Win32 module
  isn't installed, as is the case for a generic perl installation (not
  ActiveState)].

Contributions from Rajesh Vaidheeswarran <rv@fore.com>

- InstallAs modified to accept either a single file or a list of files as
  source and target.

Cons 1.6a2
**********
Contributions from Rajesh Vaidheeswarran <rv@fore.com>

- Bugfix for Repository to add the path to INC to enable perl packages in
  the local tree to be used in Cons scripts.

- Bugfix for SourcePath to return the correct path in a repositorey enabled
  build.

- Add InstallAs method to link/copy a source file to any arbitrary target
  file name.

- Move all the documentation to cons itself, and get rid of the pod file
  from the distribution. Users can now use perlpod on cons to see the docs.

Cons 1.6a1
**********
Contributions from Steven Knight <knight@baldmt.com>

- Fixed a bug where .consign seems to be closed improperly when
  cons is terminated with a signal, leading to rebuilds of various
  targets that had already been built.

Contributions from Rajesh Vaidheeswarran <rv@fore.com>

- New flag -q (for quiet) to be less verbose about what files were
  `Install'ed (or `Removed' when used in conjunction with -r).

Cons 1.5
********
Contributions from Steven Knight <knight@baldmt.com>

- Added Repository global function, similar to make's VPATH, and
  supporting functions:  Local, Install_Local, Repository_List,
  Repository_Sig_Times_OK.

- Added -R command-line option as a synonym for Repository.

- Bugfix for SplitPath (when given a path with N components,
  it returned N**2 components).

Cons 1.4a3
**********
Contributions from Rajesh Vaidheeswarran <rv@fore.com>

- Construction local help.
  Exported command: Help <string>;

Cons 1.4a2
**********
Contributions from Bob Sidebotham:

- LIBPATH, CPPPATH, and program search path ENV->{PATH} may all now
  be arrays. The old usage (colon separated strings) is deprecated, but
  still supported. In the old form, on Unix, ":"'s separate path components,
  and on Windows, ";" separates them.

- PATH_SEPERATOR was finally changed to PATH_SEPARATOR

Contributions from Steven Knight <knight@baldmt.com>

- Default target support has been added (see RELEASE for details).

Cons 1.4 (alpha1)
*****************

This release of Cons has a number of changes. Briefly, they are:

 - a QuickScan function that makes it trivial to set up
   simple dependency scanners by Bob Sidebotham.

 - improvements in signature calculation for better control of rebuilds

 - a caching mechanism for sharing derived files between builds

 - new global functions: UseCache, Salt, SourcePath, ConsPath.

 - some minor cleanup

Cons 1.3.1
**********

This is a minor release with limited shared library support contributed by
Gary Oberbrunner <garyo@genarts.com>.

Documentation is now maintained in pod format, thanks to the cons.pod file
from Ulrich Pfeifer.

Cons 1.3
********

This is the first combined Win32 and unix cons contributed by Rajesh
Vaidheeswarran <rv@fore.com>. This contains some significant fixes that
enables the same cons file to be used for both platforms.

Cons 1.2
********

This is the WIN32 port of cons by Chriss Stephens <chriss@fore.com>, Rajesh
Vaidheeswarran <rv@fore.com> and Jochen Schwarze <schwarze@isa.de>.

Cons 1.1
********

This is a minor patch release to cons 1.0. This contains a number of
minor changes, a bug fix affecting multi-target commands, and a couple
of minor new features. A list of changes from 1.0 to 1.1 is included
in the file CHANGES. There are no incompatible changes between 1.0 and
1.1. The NT support is working well here, but it still hasn't been
integrated into an single version of cons. The changes are quite
simple, and if anyone wants it let me know.

Cons 1.0
********

This is a Perl5-based make replacement, but does not provide make
compatibility.

You will need Perl 5.002 or better and the Perl MD5 Extension
(MD5-1.6.tar.gz), available from CPAN.

This program is known to work on a variety of platforms: it's in
production use on versions of SunOS, Solaris, HPUX, AIX, and IRIX.

The current program will not work correctly on Windows/NT, but we do
have an internal version that does appear to work on that platform,
but has not been well tested. If anyone is interested, contact me.

PostScript documentation is in cons.ps.

The following is an excerpt from the introduction in cons.ps:

 Cons is a system for constructing, primarily, software, but is quite
 different from previous software construction systems. Cons was
 designed from the ground up to deal easily with the construction of
 software spread over multiple source directories. Cons makes it easy
 to create build scripts that are simple, understandable and
 maintainable. Cons ensures that complex software is easily and
 accurately reproducible.

 Cons uses a number of techniques to accomplish all of this.
 Construction scripts are just Perl scripts, making them both easy to
 comprehend and very flexible. Global scoping of variables is replaced
 with an import/export mechanism for sharing information between
 scripts, significantly improving the readability and maintainability
 of each script. Construction environments are introduced: these are
 Perl objects that capture the information required for controlling the
 build process. Multiple environments are used when different semantics
 are required for generating products in the build tree. Cons
 implements automatic dependency analysis and uses this to globally
 sequence the entire build. Variant builds are easily produced from a
 single source tree. Intelligent build subsetting is possible, when
 working on localized changes. Overrides can be setup to easily
 override build instructions without modifying any scripts. MD5
 cryptographic signatures are associated with derived files, and are
 used to accurately determine whether a given file needs to be rebuilt.

Complaints, suggestions, kudos, etc. to:

	Bob Sidebotham
	cons-discuss@eng.fore.com

	FORE Systems
	Pittsburgh, PA.
