Nokia nmake Product Builder
Customer Support Newsletter

Issue No. 44 - August 2013
  1. nmake 15 Released
  2. New Web Site Address
  3. Eclipse Viewpathing FAQ
  4. Example Perl Report Script
  5. read -l Option
  6. Feedback and Suggestions

nmake 15 Released

We are pleased to announce availability of Alcatel-Lucent nmake 15. This release provides several features and enhancements, including the following:

With few exceptions, nmake 15 is upwardly compatible from nmake 14. See the nmake 15 Release Notes for more information including a complete list of changes from the nmake 14 release. Current customers may upgrade free of charge to nmake 15 using existing installed licenses, no license upgrade is required. See the nmake 15 release page for download information and documentation.

New Web Site Address

Some of you may have already noticed the nmake web site has a new, easy-to-remember address at The old site will silently forward nmake web requests to the corresponding page on the new site, but please update any bookmarks and links you have as we don't know how long forwarding will last. The new site contains the same content as the old site, let us know if you experience any trouble.

Eclipse Viewpathing FAQ

An approach to Viewpathing in Eclipse CDT was recently documented and added to the FAQ section of the web site. The document describes an approach to setting up viewpathed projects in Eclipse CDT. nmake projects are commonly structured in multiple build nodes using viewpathing; nmake automatically generates appropriate compilation flags to ensure source and header files are resolved according to the rules for viewpathing. However, without correct setup, the Eclipse CDT indexer will not follow the same rules, leading to incorrect header file resolution. This FAQ describes how to configure Eclipse CDT so that the CDT indexer picks up the correct files.

Example Perl Report Script

An example build log report script written in Perl has been added to the Tool Repository. The script may be downloaded from the page and modified to provide custom reports. The script demonstrates several build log processing techniques in Perl, including how to access single data items such as vpath, filter targets that run nmake recursively, find data elements using relative paths, access job output, find multiple stacked parent makefiles, parse target start/end times and calculate job durations, and test for failed targets. Example output is shown below after running xmakelog to generate the XML build log.

$ perl makelog.xml
vpath /home/richb/projects/nightly/linux /home/richb/projects/nightly/source
builddir /home/richb/projects/nightly/linux/src

target-name almond1.o
exit-code 0
start-time 12:56:32.822873
end-time 12:56:33.126217
duration 0.303344
pwd /home/richb/projects/nightly/linux/src/lib/libtr1

target-name apple1.o
exit-code 0
start-time 12:56:33.311279
end-time 12:56:33.894835
duration 0.583556
pwd /home/richb/projects/nightly/linux/src/lib/libtr1
number of leaf targets found: 458
number of targets with non-zero exit code: 3

read -l Option

The release of nmake 15 adds the -l option to the nmake read command to read input one line at a time. This restores the behavior of the read command prior to release lu3.2 when it was changed to read an entire file. Reading a line at a time can be useful for reading and processing input from another command.

The following example reads the output from ls -l $(MAKELIB), where MAKELIB is the lib/make/ directory of the nmake installation. Each line is read into variable VAR and then printed in place of more elaborate processing.

$ cat Makefile
	read -nu6p "$(%) ; echo .EOF."
	return 6

	local fd var
	fd = $(%:O=1)
	var = $(%:O=2)
		read -lu$(fd) $(var)
	if "$($(var))" == ".EOF."
		return 0
	return 1

targ1 : .MAKE
	FD := $(.OPEN ls -l $(MAKELIB))
	while $(.READLN $(FD) VAR)
		print VAR = "$(VAR)"

$ nmake
VAR = "total 544"
VAR = "-r--r--r--   1 nmake    sablime     9230 May 28 11:34"
VAR = "-r--r--r--   1 nmake    sablime    22324 May 28 11:34"
VAR = "-rw-r--r--   1 nmake    sablime      330 May 28 11:34"
VAR = "-r--r--r--   1 nmake    sablime    83120 May 28 11:34"
VAR = "-r--r--r--   1 nmake    sablime      651 May 28 11:34"
VAR = "-r--r--r--   1 nmake    sablime     1173 May 28 11:34"
VAR = "-r--r--r--   1 nmake    sablime     1231 May 28 11:34"
VAR = "-r--r--r--   1 nmake    sablime     6078 May 28 11:34"
VAR = "-r--r--r--   1 nmake    sablime     7007 May 28 11:34"
VAR = "-r--r--r--   1 nmake    sablime     4685 May 28 11:34"
VAR = "-r--r--r--   1 nmake    sablime     1103 May 28 11:34"
VAR = "-r--r--r--   1 nmake    sablime      672 May 28 11:34"
VAR = "-rw-r--r--   1 nmake    sablime      715 May 28 11:34"
VAR = "-rw-r--r--   1 nmake    sablime    83468 May 28 11:34"
VAR = "-r--r--r--   1 nmake    sablime     1965 May 28 11:34"
VAR = "-r--r--r--   1 nmake    sablime       58 May 28 11:34 version"
VAR = "-r--r--r--   1 nmake    sablime      855 May 28 11:34"

In the Makefile, targ1 is the default target. It is a .MAKE target so its action is executed by nmake and not sent to the shell; the action is composed of nmake commands. Let's go through each line of the action block.

	FD := $(.OPEN ls -l $(MAKELIB))

Here the .OPEN function is called with the command we want to execute. Our .OPEN function uses the nmake read command to launch the specified shell command. Note when the shell command finishes it does an echo .EOF. which will be used later to detect when the output is complete. The read command is run with the -nu6p flags. The -n flag suppresses reading input when no variable is specified. This allows us to launch the command and start reading input later. The -u6 flag specifies to use file descriptor 6 for reading the output of this command. The -p flag reads input from the specified process where -i would be used to specify a file. The .OPEN function returns 6 to tell the calling rule what file descriptor to read, which is placed in the FD variable above.

	while $(.READLN $(FD) VAR)

The next line starts a while loop calling the .READLN function. The file descriptor to read and the variable to store the line are passed to the function. The .READLN function uses read -lu$(fd) to read the input. The -l flag indicates to read only one line. The -u$(fd) flag specifies the file descriptor that we passed to the function. When read hits .EOF. the function returns 0 which stops the while loop, otherwise it returns 1 to keep looping.

		print VAR = "$(VAR)"

Inside the loop we just print the current line. Of course more significant processing of the input can be done here.


Finally we end the loop.

This is just one example of using read -l to simulate a typical read loop for processing input. Other possibilities exist. We hope you find the feature useful.

Feedback and Suggestions

We are interested in any feedback you might have about nmake. Please send comments / suggestions to

We're also open to suggestions for future articles. If there is anything you would like to see in the newsletter please send us a note to Thanks for your support!

<<home / newsletters