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 115 This is the VMS port of GNU Make done by Hartmut.Becker (a] 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 Kmpf <kkaempf (a] 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 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 Kmpf <kkaempf (a] 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. 316