Released: August 2013
1.1 Supported Platforms
1.2 Software Requirements
1.3 Customer Support
2. New Features and Significant Enhancements
2.1 Eclipse Sub-directory Builds
2.2 New Special Atom to Identify Directories
2.3 New Edit Operator Options to Identify Existing Files, Directories or Links
2.4 New Edit Operator options to Quote nmake Metacharacters
2.5 New inode Rule Trigger
2.6 Enhanced Pipe Support for read Statement
3. Detailed List of Changes
3.6 Build Log
4. Changes Impacting nmake 14 Makefiles
5. Known Problems and Remarks
5.1 Known Problems
This document announces the new release of nmake version 15. nmake is fully supported and is in wide production use throughout Alcatel-Lucent, AT&T, and elsewhere.
These nmake 15 Release Notes discuss in detail the new features, and highlight bug fixes, additional enhancements, and known problems.
The nmake 15 release has been ported to many UNIX-based and UNIX-like systems and is available for HP-UX, Linux, Solaris, and Windows (under SFU/Interix). For a current list of platforms and available distribution packages see the nmake 15 release page on the nmake web site, http://www.bell-labs.com/project/nmake/. nmake is generally upward compatible with later OS releases in a series (for example, the series Solaris 2.5 through 2.10). Contact the Customer Support helpdesk (see below) with any compatibility questions or requests for porting to other systems.
nmake 15 provides dependency-based Java build support. This feature currently requires an external Java source scanner called JavaDeps to extract inter-modules dependencies from Java source. nmake 15 requires JavaDeps release lu2.2.4 or greater. The latest version is downloadable from the nmake JavaDeps page. Installation instructions are also on that page. THIS PACKAGE IS ONLY REQUIRED BY PROJECTS PERFORMING JAVA BUILDS USING THE :JAVA: ASSERTION OPERATOR. JavaDeps release lu2.2.4 is itself written in Java; it requires jdk1.2.1 or higher version on its PATH in order to run. (Note that this does not restrict the project being built to jdk1.2.1 or higher.)
The buildlog2html command
requires Java runtime 1.5 or above. It will also use
neato commands, if available, to generate diagrams showing
build log structure. Graphviz versions 2.16 or above are known to work.
buildlog2html generates an HTML log from a
structured build log.
The Windows-based version of nmake is based on the Windows Services for UNIX (SFU/Interix) porting/development environment from Microsoft and requires installation of the SFU package in order to run. The SFU package must be obtained from Microsoft and installed following their installation procedure. For more information see the Support for Windows page.
We provide patch support, where code changes are required, for the latest 2 point releases of nmake (currently releases nmake 15 and 14). Customers using older releases can still acquire help in using the product, but genuine problems found in older releases will not be fixed. Such problems may require an upgrade to a current release or, when possible, a makefile work-around will be provided.
Fee-based services are also available. These include makefile rewrites, conversion of non-nmake makefiles to nmake, integration with vendor tools, build assessments, and porting nmake to new platforms.
Contact Customer Support for any questions regarding nmake.
Integration with Eclipse has been enhanced to support sub-directory builds launched through Eclipse CDT custom make targets. Eclipse sets the PWD environment variable to the root of the project which caused problems when nmake was not launched from the root. nmake now verifies PWD and corrects the value if necessary allowing Eclipse sub-directory builds to run as expected.
.DIRECTORY Special Atom has been added to mark atoms
bound to directories. It is analogous to the
Atom for marking regular files.
.DIRECTORY can be used with
:A edit operator to identify bound directories.
$(VAR:A=.DIRECTORY) will list the bound directories
:P=X edit operator (unbound existing files) has been extended
to optionally list only regular files, directories, symbolic links or any
combination of the three. The default
:P=X behavior is unchanged
to preserve compatibility. The options are as follows.
|:P=X||current behavior - list existing files of any type|
|:P=XP||list existing files using physical test (symbolic links are not followed)|
|:P=X[P]=F||list existing regular files|
|:P=X[P]=D||list existing directories|
|:P=X[P]=L||list existing symbolic links|
Any combination of
FDL may be specified, such as
:P=XP=DLF, etc. Note that
:P=X=L lists nothing since symbolic links are followed and
will resolve as files or directories. To test links use
:Q edit operator (shell quote) has been extended to allow
quoting for regular expression and shell pattern metacharacters used by
nmake. The edit operator quotes each token to remove the special meaning
of any syntactical constructs to allow interpretation as a literal string.
:Q behavior is unchanged to preserve compatibility.
Only one option may be used at a time. The options are as follows.
|:Q||quote for the shell - current behavior|
|:Q=C||quote for :C edit operator regular expression metacharacters|
|:Q=M||quote for :M edit operator regular expression metacharacters|
|:Q=N||quote for :N edit operator shell pattern metacharacters|
.TRIGGER.inode Special Atom can be used to add an inode
comparison to a rule. When a target with
made an extra check is done to compare the target's inode with the inode of
the first file prerequisite. An update is triggered if the inodes are
different. This is in addition to the normal date check and other triggers.
The inode check works for both hard and symbolic links.
.TRIGGER.inode is now used by the
Here is a simple example.
$ cat Makefile t1 : p1 .TRIGGER.inode ln -f $(*) $(<) $ nmake + ln -f p1 t1 $ ls -li p1 t1 514882 -rw-r--r-- 2 richb richb 3 Jun 7 10:27 p1 514882 -rw-r--r-- 2 richb richb 3 Jun 7 10:27 t1 $ rm t1 $ cp -p p1 t1 $ ls -li p1 t1 514882 -rw-r--r-- 1 richb richb 3 Jun 7 10:27 p1 514883 -rw-r--r-- 1 richb richb 3 Jun 7 10:27 t1 $ nmake -e inode mismatch: t1 : p1 + ln -f p1 t1
read statement reads input and assigns the content
to a variable. With the new
-l option it will read one line
at a time, which is useful for reading from pipes. Also two previously
undocumented options have been documented. The
suppresses reading input if no variable is specified, allowing a process
to be initialized for reading without immediately reading input. The
-u[0-9] option reads input from the specified file descriptor.
CC.REPOSITORYprobe variable was set certain custom metarules would not be searched when making
::targets. This is now fixed so custom metarules are searched and used as expected. Note,
CC.REPOSITORYgets set for some C++ compilers.
LIBDIRwithout the install action. The clobber.install common action should continue to be used to remove installed targets.
-goption for specifying a global makefile could lead to an error where nmake was unable to open the global makefile when it recursed into a sub-directory. The error occurred when the global makefile existed in the local viewpath node and was specified with a relative path to the
-goption. In this case when nmake recursed into a sub-directory it would try to reference the global makefile using the same relative path which was no longer correct. This has been fixed so recursive builds refer to the global makefile using the absolute path even when the relative path is originally specified.
clobber_extracan be used to specify additional files to be removed by the clean and clobber common actions respectively. Use the variables to remove files that nmake may not know about, such as files not specified as targets in the makefile but are created as a side-effect of some action or command. Files are listed separated by spaces and may be any mix of file names, shell patterns, nmake variables, nmake functions, and sub-shell commands. The default value of both variables is null.
:Qedit operator (shell quote) has been extended for quoting regular expression and shell pattern metacharacters used by the nmake
:Nedit operators. The quoting style is specified by the options
MAKEPATHvariable was set to a directory holding a prerequisite file with its target created with the same file name in the current directory. During incremental builds the
$(>)automatic variable could expand to null leading to an error from the shell action. This is fixed so the automatic variables expand correctly and the rule is not triggered unnecessarily.
-loption has been added to the nmake
readstatement to read one line at a time. This option restores the old behavior of the
readstatement from release v3.1.2 before it was changed to read an entire file at a time in release lu3.2. Reading a line at a time can be useful for reading from pipes.
:JAR:assertion operator is now compatible with the
nmakelogoutput serializer on Interix.
.BINDto a file or directory could result in missing path information in its bound name. This has been fixed.
.DIRECTORYSpecial Atom marks atoms bound to directories, similar to the
.REGULARSpecial Atom for regular files. Also the
:P=Xedit operator has been extended with the
Loptions to identify only regular files, directories or symbolic links.
.TRIGGER.inodeSpecial Atom on the right-hand-side of the rule to add the inode trigger. The
:LINK:operator now uses
PWDin the environment if it does not match the current directory. A level 2 debug message is emitted when
:LIBRARY:shared library targets into
LIBDIRcan now be disabled by using the
:INSTALLDIR:operator with nothing on the left-hand-side and the library listed on the right-hand-side. This is documented behavior for
:INSTALLDIR:but was previously not working for shared libraries created by
:MAKE:operator now supports file names specified with relative paths in the
MAKEFILESvariable which lists the makefiles to look for when recursing into a directory when no makefile is specified. Previously the files were assumed to be in the current directory only. A warning is now issued for absolute paths in
MAKEFILES, which is not supported.
:LINK:would fail to relink a target when the source of the link was updated by another rule and under certain, rare conditions the link was broken during the update but after its time stamp was touched. The files are now relinked as expected.
ldcommand to better detect when the compiler can be called in place of
ld. In particular, it can now handle cases where the
ldcommand in the PATH is not the
ldcommand native to the compiler being probed.
/bin/shshell on Debian Linux systems. The script detects shells lacking the needed function support and then relaunches itself with
buildlog2htmlnow include time zone information with the time stamps. Hours are also now padded to two digits for consistency (minutes and seconds were already padded).
MAKE=xmakelogwas set in the environment. This would cause recursive builds to run
nmakeand leave incomplete XML output files in each directory instead of one complete file for the entire build. Now, the
xmakelogcommand will issue a warning and unset the
MAKEvariable if it is set.
cppman page has been fixed to eliminate rendering problems on HP-UX and Linux.
npwjhave been moved to proper on-line man pages and updated. Man pages for the
mamdepcommands have been added. A section on the probe hints feature was added to the
probeman page. Rendering problems have been fixed on HP-UX. Going forward, the man pages included in the Reference Manual will be generated directly from the on-line man pages, ensuring that both man page versions stay in sync.
clean_extra- see 120009
clobber_extra- see 120009
global- see 020092
-l- see 060001
debug=5- see 110007
The changes in nmake 15 are largely backward compatible with nmake 14. Every effort has been made to insure code changes do not unexpectedly change the documented behavior of nmake features. For makefiles that conform to nmake's documentation, no makefile updates should be necessary to migrate from nmake 14 to nmake 15.
The following is a list of known problems:
linkvariable) to install targets in any adjacent nodes in viewpathing still exists. You may still use linking to install, but only in alternate nodes -- installation using copying must alternate with installation using linking. The problem occurs with both symbolic and hard linking.
:LINK:does not handle archive files that are generated by
:LIBRARY:assertion operators. Users should avoid use of
:LINK:on archive files.
-I-Sflag is on,
-D-Mis disabled. Users should not use these two flags together.
.LCL.INCLUDEattributes to the header file, and this can result in incorrect
-Ilists in the compiler command lines generated.
SHELLenvironment variable points to ksh93 you may get the following warnings when building your shell scripts:
warning: line 1: `...` obsolete, use $(...). The warning is generated running your script with
ksh -n. To eliminate the warning either update your shell scripts as indicated by the message or set
SHELLto another version of ksh that does not generate the warning, such as ksh88.