This is the VMS version of GNU Make, updated by Hartmut Becker

Changes are based on GNU make 3.82.

This version was built and tested on OpenVMS V7.3 (VAX), V7.3-2 (Alpha) and
V8.3-1H1 (I64).

Build instructions
Make a 1st version
       $ @makefile.com  ! ignore any compiler and/or linker warning
       $ rena make.exe 1st-make.exe
Use the 1st version to generate a 2nd version
       $ mc sys$disk:[]1st-make clean
       $ mc sys$disk:[]1st-make
Verify your 2nd version
       $ rena make.exe 2nd-make.exe
       $ mc sys$disk:[]2nd-make clean
       $ mc sys$disk:[]2nd-make

Changes (3.81.90)

Michael Gehre (at VISTEC-SEMI dot COM) supplied a fix for a problem with
timestamps of object modules in OLBs. The timestamps were not correctly
adjusted to GMT based time, if the local VMS time was using a daylight saving
algorithm and if daylight saving was switched off.

John Eisenbraun (at HP dot COM) supplied fixes and and an enhancement to append
output redirection in action lines.

Rework of ctrl+c and ctrl+y handling.

Fix a problem with cached strings, which showed on case-insensitive file
systems.

Build fixes for const-ified code in VMS specific sources.

Build notes:
- Try to avoid HP C V7.2-001, which has an incompatible change
how __STDC__ is defined. This results at least in compile time warnings.

- On V8.3-1H1, if you press Ctrl+C you may see a traceback, starting with
%SYSTEM-F-CONTROLC, operation completed under CTRL/C
%TRACE-F-TRACEBACK, symbolic stack dump follows
image     module    routine               line      rel PC           abs PC

DECC$SHR  C$SIGNAL  gsignal              27991 0000000000001180
FFFFFFFF84AB2DA0
DECC$SHR  C$SIGNAL  raise                28048 0000000000001280
FFFFFFFF84AB2EA0
DECC$SHR  C$SIGPENDING  decc$$deliver_signals
                                         12475 0000000000000890
FFFFFFFF84C13690
...
This looks like an incompatibility to the Alpha and VAX behavior, so it looks
like a problem in I64 VMS version(s).

- There is no clean build on VAX. In the environment I tested, I had to use GNU
make's alloca which produced a couple of compile time warnings. It seems too
much effort to work on a clean build on VAX.

A note on appending the redirected output. With this change, a simple mechanism
is implemented to make ">>" work in action lines. In VMS there is no simple
feature like ">>" to have DCL command or program output redirected and appended
to a file. GNU make for VMS already implements the redirection of output. If
such a redirection is detected, an ">" on the action line, GNU make creates a
DCL command procedure to execute the action and to redirect its output. Based
on that, now ">>" is also recognized and a similar but different command
procedure is created to implement the append. The main idea here is to create a
temporary file which collects the output and which is appended to the wanted
output file. Then the temporary file is deleted. This is all done in the
command procedure to keep changes in make small and simple. This obviously has
some limitations but it seems good enough compared with the current ">"
implementation. (And in my opinion, redirection is not really what GNU make has
to do.) With this approach, it may happen that the temporary file is not yet
appended and is left in SYS$SCRATCH. The temporary file names look like
"CMDxxxxx.". Any time the created command procedure can not complete, this
happens. Pressing Ctrl+Y to abort make is one case. In case of Ctrl+Y the
associated command procedure is left in SYS$SCRATCH as well. Its name is
CMDxxxxx.COM.

Change in the Ctrl+Y handling

Ctrl+Y was: The CtrlY handler called $forcex for the current child.

Ctrl+Y changed: The CtrlY handler uses $delprc to delete all children. This way
also actions with DCL commands will be stopped. As before Ctrl+Y then sends
SIGQUIT to itself, which is handled in common code.

Change in deleteing temporary command files

Temporary command files were deleted in the main line, after returning from the
vms child termination handler. If Ctrl+C was pressed, the handler is called but
did not return to main line.

Now, temporary command files are deleted in the vms child termination
handler. That deletes the them even if a Ctrl+C was pressed.

The behavior of pressing Ctrl+C is not changed. It still has only an effect,
after the current action is terminated. If that doesn't happen or takes too
long, Ctrl+Y should be used instead.

Changes (3.80)

. In default.c define variable ARCH as IA64 for VMS on Itanium systems.

. In makefile.vms avoid name collision for glob and globfree.

In newer version of the VMS CRTL there are glob and globfree implemented.
Compiling and linking may result in

  %ILINK-W-MULDEFLNKG, symbol DECC$GLOBFREE has subsequent linkage definition
       in module DECC$SHR file SYS$COMMON:[SYSLIB]DECC$SHR.EXE;1
  %ILINK-W-MULDEF, symbol DECC$GLOBFREE multiply defined
       in module DECC$SHR file SYS$COMMON:[SYSLIB]DECC$SHR.EXE;1

linker messages (and similar for DECC$GLOB). The messages just say, that
globfree is a known CRTL whose name was mapped by the compiler to
DECC$GLOBFREE.  This is done in glob.c as well, so this name is defined
twice. One possible solution is to use the VMS versions of glob and
globfree. However, then the build environment needs to figure out if
there is a new CRTL supporting these or not. This adds complexity. Even
more, these functions return VMS file specifications, which is not
expected by the other make sources. There is a switch at run time (a VMS
logical DECC$GLOB_UNIX_STYLE), which can be set to get Unix style
names. This may conflict with other software. The recommended solution
for this is to set this switch just prior to calling main: in an
initialization routine. This adds more complexity and more VMS specific
code. It is easier to tell the compiler NOT to map the routine names
with a simple change in makefile.vms.

Some notes on case sensitive names in rules and on the disk. In the VMS
template for CONFIG.H case sensitive rules can be enabled with defining
WANT_CASE_SENSITIVE_TARGETS. For recent version of VMS there is a case
sensitive file system: ODS5. To make use of that, additionally un-defining
the HAVE_CASE_INSENSITIVE_FS is required. As these are C macros, different
versions of make need to be built to have any case sensitivity for VMS
working. Unfortunately, for ODS5 disks that's not all.

- Usually DCL upcases command line tokens (except strings) and usually the
  file system is case blind (similar to how Windows systems work)
	$ set proc/parse=extended/case=sensitive
  preserves lower and UPPER on the command line and (for this process and all
  sub-processes) enables case sensitivity in the file system

- Usually the CRTL tries to reverse what DCL did with command line tokens, it
  lowercases all tokens (except strings)
	$ define DECC$ARGV_PARSE_STYLE enable
  passes (the now preserved) lower and UPPER from the command line to main()

- Usually the CRTL upcases the arguments to open() and friends
	$ define DECC$EFS_CASE_PRESERVE enable
  preserves the names as is.

It is important to know that not all VMS tools are ready for case sensitivity.
With this setup some tools may not work as expected. The setup should not
blindly be applied for all users in default login procedures.

Example? The poor coding gives a compiler message, showing that there are
different files:

$ dir

Directory ODS5DISK[HB]

A.c;1               B.c;1               c.c;1               X.c;1
x.c;1

Total of 5 files.
$ ods5make x.obj
cc    /obj=x.obj x.c

foo(){lowercase_x();}
......^
%CC-I-IMPLICITFUNC, In this statement, the identifier "lowercase_x" is implicitly declared as a function.
at line number 1 in file ODS5DISK[HB]x.c;1
$ mc SYS$SYSDEVICE:[HARTMUT.MAKE_3_80P]ods5make X.obj
cc    /obj=X.obj X.c

foo() {UPPERCASE_X();}
.......^
%CC-I-IMPLICITFUNC, In this statement, the identifier "UPPERCASE_X" is implicitly declared as a function.
at line number 1 in file ODS5DISK[HB]X.c;1
$ dir

Directory ODS5DISK[HB]

A.c;1               B.c;1               c.c;1               X.c;1
x.c;1               X.obj;1             x.obj;1

Total of 7 files.
$

This is the VMS port of GNU Make done by Hartmut.Becker@compaq.com.

It is based on the specific version 3.77k and on 3.78.1. 3.77k was done
by Klaus Kämpf <kkaempf@rmi.de>, the code was based on the VMS port of
GNU Make 3.60 by Mike Moretti.

It was ported on OpenVMS/Alpha V7.1, DECC V5.7-006. It was re-build and
tested on OpenVMS/Alpha V7.2, OpenVMS/VAX 7.1 and 5.5-2. Different
versions of DECC were used. VAXC was tried: it fails; but it doesn't
seem worth to get it working. There are still some PTRMISMATCH warnings
during the compile. Although perl is working on VMS the test scripts
don't work. The function $shell is still missing.

There is a known bug in some of the VMS CRTLs. It is in the shipped
versions of VMS V7.2 and V7.2-1 and in the currently (October 1999)
available ECOs for VMS V7.1 and newer versions. It is fixed in versions
shipped with newer VMS versions and all ECO kits after October 1999. It
only shows up during the daylight saving time period (DST): stat()
returns a modification time 1 hour ahead. This results in GNU make
warning messages. For a just created source you will see:

 $ gmake x.exe
 gmake.exe;1: *** Warning: File `x.c' has modification time in the future (940582863 > 940579269)
 cc    /obj=x.obj x.c
 link  x.obj    /exe=x.exe
 gmake.exe;1: *** Warning:  Clock skew detected.  Your build may be incomplete.


New in 3.78.1:

Fix a problem with automatically remaking makefiles. GNU make uses an
execve to restart itself after a successful remake of the makefile. On
UNIX systems execve replaces the running program with a new one and
resets all signal handling to the default. On VMS execve creates a child
process, signal and exit handlers of the parent are still active, and,
unfortunately, corrupt the exit code from the child. Fix in job.c:
ignore SIGCHLD.

Added some switches to reflect latest features of DECC. Modifications in
makefile.vms.

Set some definitions to reflect latest features of DECC. Modifications in
config.h-vms (which is copied to config.h).

Added extern strcmpi declaration to avoid 'implicitly declared' messages.
Modification in make.h.

Default rule for C++, conditionals for gcc (GCC_IS_NATIVE) or DEC/Digital/
Compaq c/c++ compilers. Modifications in default.c.

Usage of opendir() and friends, suppress file version. Modifications in dir.c.

Added VMS specific code to handle ctrl+c and ctrl+y to abort make.
Modifications in job.c.

Added support to have case sensitive targets and dependencies but to
still use case blind file names. This is especially useful for Java
makefiles on VMS:

	.SUFFIXES :
	.SUFFIXES :	.class .java
	.java.class :
		javac "$<
	HelloWorld.class :      HelloWorld.java

A new macro WANT_CASE_SENSITIVE_TARGETS in config.h-vms was introduced.
It needs to be enabled to get this feature; default is disabled.  The
macro HAVE_CASE_INSENSITIVE_FS must not be touched: it is still enabled.
Modifications in file.c and config.h-vms.

Bootstrap make to start building make is still makefile.com, but make
needs to be re-made with a make to make a correct version: ignore all
possible warnings, delete all objects, rename make.exe to a different
name and run it.

Made some minor modifications to the bootstrap build makefile.com.

This is the VMS port of GNU Make.

It is based on the VMS port of GNU Make 3.60 by Mike Moretti.

This port was done by Klaus Kämpf <kkaempf@rmi.de>

There is first-level support available from proGIS Software, Germany.
Visit their web-site at http://www.progis.de to get information
about other vms software and forthcoming updates to gnu make.

New for 3.77:

/bin/sh style I/O redirection is supported. You can now write lines like
	mcr sys$disk:[]program.exe < input.txt > output.txt &> error.txt

Makefile variables are looked up in the current environment. You can set
symbols or logicals in DCL and evaluate them in the Makefile via
$(<name-of-symbol-or-logical>).  Variables defined in the Makefile
override VMS symbols/logicals !

Functions for file names are working now. See the GNU Make manual for
$(dir ...)  and $(wildcard ...).  Unix-style and VMS-style names are
supported as arguments.

The default rules are set up for GNU C. Building an executable from a
single source file is as easy as 'make file.exe'.

The variable $(ARCH) is predefined as ALPHA or VAX resp. Makefiles for
different VMS systems can now be written by checking $(ARCH) as in
  ifeq ($(ARCH),ALPHA)
    $(ECHO) "On the Alpha"
  else
    $(ECHO) "On the VAX"
  endif

Command lines of excessive length are correctly broken and written to a
batch file in sys$scratch for later execution. There's no limit to the
lengths of commands (and no need for .opt files :-) any more.

Empty commands are handled correctly and don't end in a new DCL process.


New for 3.76:

John W. Eaton has updated the VMS port to support libraries and VPATH.


To build Make, simply type @makefile.  This should compile all the
necessary files and link Make.  There is also a file called
makefile.vms.  If you already have GNU Make built you can just use
Make with this makefile to rebuild.

Here are some notes about GNU Make for VMS:

The cd command is supported if it's called as $(CD). This invokes
the 'builtin_cd' command which changes the directory.
Calling 'set def' doesn't do the trick, since a sub-shell is
spawned for this command, the directory is changed *in this sub-shell*
and the sub-shell ends.

Libraries are not supported. They were in GNU Make 3.60 but somehow I
didn't care porting the code. If there is enough interest, I'll do it at
some later time.

The variable $^ separates files with commas instead of spaces (It's the
natural thing to do for VMS).

See defaults.c for VMS default suffixes and my definitions for default
rules and variables.

The shell function is not implemented yet.

Load average routines haven't been implemented for VMS yet.

The default include directory for including other makefiles is
SYS$SYSROOT:[SYSLIB] (I don't remember why I didn't just use
SYS$LIBRARY: instead; maybe it wouldn't work that way).

The default makefiles make looks for are: makefile.vms, gnumakefile,
makefile., and gnumakefile. .

The stat() function and handling of time stamps in VMS is broken, so I
replaced it with a hack in vmsfunctions.c. I will provide a full rewrite
somewhere in the future. Be warned, the time resolution inside make is
less than what vms provides. This might be a problem on the faster Alphas.

You can use a : in a filename only if you preceed it with a backslash ('\').
E.g.- hobbes\:[bogas.files]

Make ignores success, informational, or warning errors (-S-, -I-, or
-W-).  But it will stop on -E- and -F- errors. (unless you do something
to override this in your makefile, or whatever).

Remote stuff isn't implemented yet.

Multiple line DCL commands, such as "if" statements, must be put inside
command files.  You can run a command file by using \@.


VMS changes made for 3.74.3

Lots of default settings are adapted for VMS. See default.c.

Long command lines are now converted to command files.

Comma (',') as a separator is now allowed. See makefile.vms for an example.

-------------------------------------------------------------------------------
Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
This file is part of GNU Make.

GNU Make is free software; you can redistribute it and/or modify it under the
terms of the GNU General Public License as published by the Free Software
Foundation; either version 3 of the License, or (at your option) any later
version.

GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE.  See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with
this program.  If not, see <http://www.gnu.org/licenses/>.
