mirror of
https://github.com/mirror/make.git
synced 2024-12-28 05:40:10 +08:00
314 lines
12 KiB
Plaintext
314 lines
12 KiB
Plaintext
This is the VMS version of GNU Make, updated by Hartmut Becker
|
||
|
||
Changes are based on GNU make 3.80. Latest changes are for OpenVMS/I64
|
||
and new VMS CRTLs.
|
||
|
||
This version was tested on OpenVMS/I64 V8.2 (field test) with hp C
|
||
X7.1-024 OpenVMS/Alpha V7.3-2 with Compaq C V6.5-001 and OpenVMS/VAX 7.1
|
||
with Compaq C V6.2-003 There are still some warning and informational
|
||
message issued by the compilers.
|
||
|
||
Build instructions
|
||
Make a 1st version
|
||
$ @makefile.com
|
||
$ 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:
|
||
|
||
. 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 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 2, 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
|
||
GNU Make; see the file COPYING. If not, write to the Free Software
|
||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|