| 1 | This is the VMS version of GNU Make, updated by Hartmut Becker | 
|---|
| 2 |  | 
|---|
| 3 | Changes are based on GNU make 3.80. Latest changes are for OpenVMS/I64 | 
|---|
| 4 | and new VMS CRTLs. | 
|---|
| 5 |  | 
|---|
| 6 | This version was tested on OpenVMS/I64 V8.2 (field test) with hp C | 
|---|
| 7 | X7.1-024 OpenVMS/Alpha V7.3-2 with Compaq C V6.5-001 and OpenVMS/VAX 7.1 | 
|---|
| 8 | with Compaq C V6.2-003 There are still some warning and informational | 
|---|
| 9 | message issued by the compilers. | 
|---|
| 10 |  | 
|---|
| 11 | Build instructions | 
|---|
| 12 | Make a 1st version | 
|---|
| 13 | $ @makefile.com | 
|---|
| 14 | $ rena make.exe 1st-make.exe | 
|---|
| 15 | Use the 1st version to generate a 2nd version | 
|---|
| 16 | $ mc sys$disk:[]1st-make clean | 
|---|
| 17 | $ mc sys$disk:[]1st-make | 
|---|
| 18 | Verify your 2nd version | 
|---|
| 19 | $ rena make.exe 2nd-make.exe | 
|---|
| 20 | $ mc sys$disk:[]2nd-make clean | 
|---|
| 21 | $ mc sys$disk:[]2nd-make | 
|---|
| 22 |  | 
|---|
| 23 | Changes: | 
|---|
| 24 |  | 
|---|
| 25 | . In default.c define variable ARCH as IA64 for VMS on Itanium systems. | 
|---|
| 26 |  | 
|---|
| 27 | . In makefile.vms avoid name collision for glob and globfree. | 
|---|
| 28 |  | 
|---|
| 29 | In newer version of the VMS CRTL there are glob and globfree implemented. | 
|---|
| 30 | Compiling and linking may result in | 
|---|
| 31 |  | 
|---|
| 32 | %ILINK-W-MULDEFLNKG, symbol DECC$GLOBFREE has subsequent linkage definition | 
|---|
| 33 | in module DECC$SHR file SYS$COMMON:[SYSLIB]DECC$SHR.EXE;1 | 
|---|
| 34 | %ILINK-W-MULDEF, symbol DECC$GLOBFREE multiply defined | 
|---|
| 35 | in module DECC$SHR file SYS$COMMON:[SYSLIB]DECC$SHR.EXE;1 | 
|---|
| 36 |  | 
|---|
| 37 | linker messages (and similar for DECC$GLOB). The messages just say, that | 
|---|
| 38 | globfree is a known CRTL whose name was mapped by the compiler to | 
|---|
| 39 | DECC$GLOBFREE.  This is done in glob.c as well, so this name is defined | 
|---|
| 40 | twice. One possible solution is to use the VMS versions of glob and | 
|---|
| 41 | globfree. However, then the build environment needs to figure out if | 
|---|
| 42 | there is a new CRTL supporting these or not. This adds complexity. Even | 
|---|
| 43 | more, these functions return VMS file specifications, which is not | 
|---|
| 44 | expected by the other make sources. There is a switch at run time (a VMS | 
|---|
| 45 | logical DECC$GLOB_UNIX_STYLE), which can be set to get Unix style | 
|---|
| 46 | names. This may conflict with other software. The recommended solution | 
|---|
| 47 | for this is to set this switch just prior to calling main: in an | 
|---|
| 48 | initialization routine. This adds more complexity and more VMS specific | 
|---|
| 49 | code. It is easier to tell the compiler NOT to map the routine names | 
|---|
| 50 | with a simple change in makefile.vms. | 
|---|
| 51 |  | 
|---|
| 52 | Some notes on case sensitive names in rules and on the disk. In the VMS | 
|---|
| 53 | template for CONFIG.H case sensitive rules can be enabled with defining | 
|---|
| 54 | WANT_CASE_SENSITIVE_TARGETS. For recent version of VMS there is a case | 
|---|
| 55 | sensitive file system: ODS5. To make use of that, additionally un-defining | 
|---|
| 56 | the HAVE_CASE_INSENSITIVE_FS is required. As these are C macros, different | 
|---|
| 57 | versions of make need to be built to have any case sensitivity for VMS | 
|---|
| 58 | working. Unfortunately, for ODS5 disks that's not all. | 
|---|
| 59 |  | 
|---|
| 60 | - Usually DCL upcases command line tokens (except strings) and usually the | 
|---|
| 61 | file system is case blind (similar to how Windows systems work) | 
|---|
| 62 | $ set proc/parse=extended/case=sensitive | 
|---|
| 63 | preserves lower and UPPER on the command line and (for this process and all | 
|---|
| 64 | sub-processes) enables case sensitivity in the file system | 
|---|
| 65 |  | 
|---|
| 66 | - Usually the CRTL tries to reverse what DCL did with command line tokens, it | 
|---|
| 67 | lowercases all tokens (except strings) | 
|---|
| 68 | $ define DECC$ARGV_PARSE_STYLE enable | 
|---|
| 69 | passes (the now preserved) lower and UPPER from the command line to main() | 
|---|
| 70 |  | 
|---|
| 71 | - Usually the CRTL upcases the arguments to open() and friends | 
|---|
| 72 | $ define DECC$EFS_CASE_PRESERVE enable | 
|---|
| 73 | preserves the names as is. | 
|---|
| 74 |  | 
|---|
| 75 | It is important to know that not all VMS tools are ready for case sensitivity. | 
|---|
| 76 | With this setup some tools may not work as expected. The setup should not | 
|---|
| 77 | blindly be applied for all users in default login procedures. | 
|---|
| 78 |  | 
|---|
| 79 | Example? The poor coding gives a compiler message, showing that there are | 
|---|
| 80 | different files: | 
|---|
| 81 |  | 
|---|
| 82 | $ dir | 
|---|
| 83 |  | 
|---|
| 84 | Directory ODS5DISK[HB] | 
|---|
| 85 |  | 
|---|
| 86 | A.c;1               B.c;1               c.c;1               X.c;1 | 
|---|
| 87 | x.c;1 | 
|---|
| 88 |  | 
|---|
| 89 | Total of 5 files. | 
|---|
| 90 | $ ods5make x.obj | 
|---|
| 91 | cc    /obj=x.obj x.c | 
|---|
| 92 |  | 
|---|
| 93 | foo(){lowercase_x();} | 
|---|
| 94 | ......^ | 
|---|
| 95 | %CC-I-IMPLICITFUNC, In this statement, the identifier "lowercase_x" is implicitly declared as a function. | 
|---|
| 96 | at line number 1 in file ODS5DISK[HB]x.c;1 | 
|---|
| 97 | $ mc SYS$SYSDEVICE:[HARTMUT.MAKE_3_80P]ods5make X.obj | 
|---|
| 98 | cc    /obj=X.obj X.c | 
|---|
| 99 |  | 
|---|
| 100 | foo() {UPPERCASE_X();} | 
|---|
| 101 | .......^ | 
|---|
| 102 | %CC-I-IMPLICITFUNC, In this statement, the identifier "UPPERCASE_X" is implicitly declared as a function. | 
|---|
| 103 | at line number 1 in file ODS5DISK[HB]X.c;1 | 
|---|
| 104 | $ dir | 
|---|
| 105 |  | 
|---|
| 106 | Directory ODS5DISK[HB] | 
|---|
| 107 |  | 
|---|
| 108 | A.c;1               B.c;1               c.c;1               X.c;1 | 
|---|
| 109 | x.c;1               X.obj;1             x.obj;1 | 
|---|
| 110 |  | 
|---|
| 111 | Total of 7 files. | 
|---|
| 112 | $ | 
|---|
| 113 |  | 
|---|
| 114 |  | 
|---|
| 115 | This is the VMS port of GNU Make done by Hartmut.Becker@compaq.com. | 
|---|
| 116 |  | 
|---|
| 117 | It is based on the specific version 3.77k and on 3.78.1. 3.77k was done | 
|---|
| 118 | by Klaus Kämpf <kkaempf@rmi.de>, the code was based on the VMS port of | 
|---|
| 119 | GNU Make 3.60 by Mike Moretti. | 
|---|
| 120 |  | 
|---|
| 121 | It was ported on OpenVMS/Alpha V7.1, DECC V5.7-006. It was re-build and | 
|---|
| 122 | tested on OpenVMS/Alpha V7.2, OpenVMS/VAX 7.1 and 5.5-2. Different | 
|---|
| 123 | versions of DECC were used. VAXC was tried: it fails; but it doesn't | 
|---|
| 124 | seem worth to get it working. There are still some PTRMISMATCH warnings | 
|---|
| 125 | during the compile. Although perl is working on VMS the test scripts | 
|---|
| 126 | don't work. The function $shell is still missing. | 
|---|
| 127 |  | 
|---|
| 128 | There is a known bug in some of the VMS CRTLs. It is in the shipped | 
|---|
| 129 | versions of VMS V7.2 and V7.2-1 and in the currently (October 1999) | 
|---|
| 130 | available ECOs for VMS V7.1 and newer versions. It is fixed in versions | 
|---|
| 131 | shipped with newer VMS versions and all ECO kits after October 1999. It | 
|---|
| 132 | only shows up during the daylight saving time period (DST): stat() | 
|---|
| 133 | returns a modification time 1 hour ahead. This results in GNU make | 
|---|
| 134 | warning messages. For a just created source you will see: | 
|---|
| 135 |  | 
|---|
| 136 | $ gmake x.exe | 
|---|
| 137 | gmake.exe;1: *** Warning: File `x.c' has modification time in the future (940582863 > 940579269) | 
|---|
| 138 | cc    /obj=x.obj x.c | 
|---|
| 139 | link  x.obj    /exe=x.exe | 
|---|
| 140 | gmake.exe;1: *** Warning:  Clock skew detected.  Your build may be incomplete. | 
|---|
| 141 |  | 
|---|
| 142 |  | 
|---|
| 143 | New in 3.78.1: | 
|---|
| 144 |  | 
|---|
| 145 | Fix a problem with automatically remaking makefiles. GNU make uses an | 
|---|
| 146 | execve to restart itself after a successful remake of the makefile. On | 
|---|
| 147 | UNIX systems execve replaces the running program with a new one and | 
|---|
| 148 | resets all signal handling to the default. On VMS execve creates a child | 
|---|
| 149 | process, signal and exit handlers of the parent are still active, and, | 
|---|
| 150 | unfortunately, corrupt the exit code from the child. Fix in job.c: | 
|---|
| 151 | ignore SIGCHLD. | 
|---|
| 152 |  | 
|---|
| 153 | Added some switches to reflect latest features of DECC. Modifications in | 
|---|
| 154 | makefile.vms. | 
|---|
| 155 |  | 
|---|
| 156 | Set some definitions to reflect latest features of DECC. Modifications in | 
|---|
| 157 | config.h-vms (which is copied to config.h). | 
|---|
| 158 |  | 
|---|
| 159 | Added extern strcmpi declaration to avoid 'implicitly declared' messages. | 
|---|
| 160 | Modification in make.h. | 
|---|
| 161 |  | 
|---|
| 162 | Default rule for C++, conditionals for gcc (GCC_IS_NATIVE) or DEC/Digital/ | 
|---|
| 163 | Compaq c/c++ compilers. Modifications in default.c. | 
|---|
| 164 |  | 
|---|
| 165 | Usage of opendir() and friends, suppress file version. Modifications in dir.c. | 
|---|
| 166 |  | 
|---|
| 167 | Added VMS specific code to handle ctrl+c and ctrl+y to abort make. | 
|---|
| 168 | Modifications in job.c. | 
|---|
| 169 |  | 
|---|
| 170 | Added support to have case sensitive targets and dependencies but to | 
|---|
| 171 | still use case blind file names. This is especially useful for Java | 
|---|
| 172 | makefiles on VMS: | 
|---|
| 173 |  | 
|---|
| 174 | .SUFFIXES : | 
|---|
| 175 | .SUFFIXES :     .class .java | 
|---|
| 176 | .java.class : | 
|---|
| 177 | javac "$< | 
|---|
| 178 | HelloWorld.class :      HelloWorld.java | 
|---|
| 179 |  | 
|---|
| 180 | A new macro WANT_CASE_SENSITIVE_TARGETS in config.h-vms was introduced. | 
|---|
| 181 | It needs to be enabled to get this feature; default is disabled.  The | 
|---|
| 182 | macro HAVE_CASE_INSENSITIVE_FS must not be touched: it is still enabled. | 
|---|
| 183 | Modifications in file.c and config.h-vms. | 
|---|
| 184 |  | 
|---|
| 185 | Bootstrap make to start building make is still makefile.com, but make | 
|---|
| 186 | needs to be re-made with a make to make a correct version: ignore all | 
|---|
| 187 | possible warnings, delete all objects, rename make.exe to a different | 
|---|
| 188 | name and run it. | 
|---|
| 189 |  | 
|---|
| 190 | Made some minor modifications to the bootstrap build makefile.com. | 
|---|
| 191 |  | 
|---|
| 192 |  | 
|---|
| 193 | This is the VMS port of GNU Make. | 
|---|
| 194 |  | 
|---|
| 195 | It is based on the VMS port of GNU Make 3.60 by Mike Moretti. | 
|---|
| 196 |  | 
|---|
| 197 | This port was done by Klaus Kämpf <kkaempf@rmi.de> | 
|---|
| 198 |  | 
|---|
| 199 | There is first-level support available from proGIS Software, Germany. | 
|---|
| 200 | Visit their web-site at http://www.progis.de to get information | 
|---|
| 201 | about other vms software and forthcoming updates to gnu make. | 
|---|
| 202 |  | 
|---|
| 203 | New for 3.77: | 
|---|
| 204 |  | 
|---|
| 205 | /bin/sh style I/O redirection is supported. You can now write lines like | 
|---|
| 206 | mcr sys$disk:[]program.exe < input.txt > output.txt &> error.txt | 
|---|
| 207 |  | 
|---|
| 208 | Makefile variables are looked up in the current environment. You can set | 
|---|
| 209 | symbols or logicals in DCL and evaluate them in the Makefile via | 
|---|
| 210 | $(<name-of-symbol-or-logical>).  Variables defined in the Makefile | 
|---|
| 211 | override VMS symbols/logicals ! | 
|---|
| 212 |  | 
|---|
| 213 | Functions for file names are working now. See the GNU Make manual for | 
|---|
| 214 | $(dir ...)  and $(wildcard ...).  Unix-style and VMS-style names are | 
|---|
| 215 | supported as arguments. | 
|---|
| 216 |  | 
|---|
| 217 | The default rules are set up for GNU C. Building an executable from a | 
|---|
| 218 | single source file is as easy as 'make file.exe'. | 
|---|
| 219 |  | 
|---|
| 220 | The variable $(ARCH) is predefined as ALPHA or VAX resp. Makefiles for | 
|---|
| 221 | different VMS systems can now be written by checking $(ARCH) as in | 
|---|
| 222 | ifeq ($(ARCH),ALPHA) | 
|---|
| 223 | $(ECHO) "On the Alpha" | 
|---|
| 224 | else | 
|---|
| 225 | $(ECHO) "On the VAX" | 
|---|
| 226 | endif | 
|---|
| 227 |  | 
|---|
| 228 | Command lines of excessive length are correctly broken and written to a | 
|---|
| 229 | batch file in sys$scratch for later execution. There's no limit to the | 
|---|
| 230 | lengths of commands (and no need for .opt files :-) any more. | 
|---|
| 231 |  | 
|---|
| 232 | Empty commands are handled correctly and don't end in a new DCL process. | 
|---|
| 233 |  | 
|---|
| 234 |  | 
|---|
| 235 | New for 3.76: | 
|---|
| 236 |  | 
|---|
| 237 | John W. Eaton has updated the VMS port to support libraries and VPATH. | 
|---|
| 238 |  | 
|---|
| 239 |  | 
|---|
| 240 | To build Make, simply type @makefile.  This should compile all the | 
|---|
| 241 | necessary files and link Make.  There is also a file called | 
|---|
| 242 | makefile.vms.  If you already have GNU Make built you can just use | 
|---|
| 243 | Make with this makefile to rebuild. | 
|---|
| 244 |  | 
|---|
| 245 | Here are some notes about GNU Make for VMS: | 
|---|
| 246 |  | 
|---|
| 247 | The cd command is supported if it's called as $(CD). This invokes | 
|---|
| 248 | the 'builtin_cd' command which changes the directory. | 
|---|
| 249 | Calling 'set def' doesn't do the trick, since a sub-shell is | 
|---|
| 250 | spawned for this command, the directory is changed *in this sub-shell* | 
|---|
| 251 | and the sub-shell ends. | 
|---|
| 252 |  | 
|---|
| 253 | Libraries are not supported. They were in GNU Make 3.60 but somehow I | 
|---|
| 254 | didn't care porting the code. If there is enough interest, I'll do it at | 
|---|
| 255 | some later time. | 
|---|
| 256 |  | 
|---|
| 257 | The variable $^ separates files with commas instead of spaces (It's the | 
|---|
| 258 | natural thing to do for VMS). | 
|---|
| 259 |  | 
|---|
| 260 | See defaults.c for VMS default suffixes and my definitions for default | 
|---|
| 261 | rules and variables. | 
|---|
| 262 |  | 
|---|
| 263 | The shell function is not implemented yet. | 
|---|
| 264 |  | 
|---|
| 265 | Load average routines haven't been implemented for VMS yet. | 
|---|
| 266 |  | 
|---|
| 267 | The default include directory for including other makefiles is | 
|---|
| 268 | SYS$SYSROOT:[SYSLIB] (I don't remember why I didn't just use | 
|---|
| 269 | SYS$LIBRARY: instead; maybe it wouldn't work that way). | 
|---|
| 270 |  | 
|---|
| 271 | The default makefiles make looks for are: makefile.vms, gnumakefile, | 
|---|
| 272 | makefile., and gnumakefile. . | 
|---|
| 273 |  | 
|---|
| 274 | The stat() function and handling of time stamps in VMS is broken, so I | 
|---|
| 275 | replaced it with a hack in vmsfunctions.c. I will provide a full rewrite | 
|---|
| 276 | somewhere in the future. Be warned, the time resolution inside make is | 
|---|
| 277 | less than what vms provides. This might be a problem on the faster Alphas. | 
|---|
| 278 |  | 
|---|
| 279 | You can use a : in a filename only if you preceed it with a backslash ('\'). | 
|---|
| 280 | E.g.- hobbes\:[bogas.files] | 
|---|
| 281 |  | 
|---|
| 282 | Make ignores success, informational, or warning errors (-S-, -I-, or | 
|---|
| 283 | -W-).  But it will stop on -E- and -F- errors. (unless you do something | 
|---|
| 284 | to override this in your makefile, or whatever). | 
|---|
| 285 |  | 
|---|
| 286 | Remote stuff isn't implemented yet. | 
|---|
| 287 |  | 
|---|
| 288 | Multiple line DCL commands, such as "if" statements, must be put inside | 
|---|
| 289 | command files.  You can run a command file by using \@. | 
|---|
| 290 |  | 
|---|
| 291 |  | 
|---|
| 292 | VMS changes made for 3.74.3 | 
|---|
| 293 |  | 
|---|
| 294 | Lots of default settings are adapted for VMS. See default.c. | 
|---|
| 295 |  | 
|---|
| 296 | Long command lines are now converted to command files. | 
|---|
| 297 |  | 
|---|
| 298 | Comma (',') as a separator is now allowed. See makefile.vms for an example. | 
|---|
| 299 |  | 
|---|
| 300 | ------------------------------------------------------------------------------- | 
|---|
| 301 | Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, | 
|---|
| 302 | 2006 Free Software Foundation, Inc. | 
|---|
| 303 | This file is part of GNU Make. | 
|---|
| 304 |  | 
|---|
| 305 | GNU Make is free software; you can redistribute it and/or modify it under the | 
|---|
| 306 | terms of the GNU General Public License as published by the Free Software | 
|---|
| 307 | Foundation; either version 2, or (at your option) any later version. | 
|---|
| 308 |  | 
|---|
| 309 | GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY | 
|---|
| 310 | WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR | 
|---|
| 311 | A PARTICULAR PURPOSE.  See the GNU General Public License for more details. | 
|---|
| 312 |  | 
|---|
| 313 | You should have received a copy of the GNU General Public License along with | 
|---|
| 314 | GNU Make; see the file COPYING.  If not, write to the Free Software | 
|---|
| 315 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | 
|---|