1Port of GNU Make to 32-bit protected mode on MSDOS and MS-Windows. 2 3Builds with DJGPP v2 port of GNU C/C++ compiler and utilities. 4 5 6New (since 3.74) DOS-specific features: 7 8 1. Supports long filenames when run from DOS box on Windows 9x. 9 10 2. Supports both stock DOS COMMAND.COM and Unix-style shells 11 (details in ``Notes'' below). 12 13 3. Supports DOS drive letters in dependencies and pattern rules. 14 15 4. Better support for DOS-style backslashes in pathnames (but see 16 ``Notes'' below). 17 18 5. The $(shell) built-in can run arbitrary complex commands, 19 including pipes and redirection, even when COMMAND.COM is your 20 shell. 21 22 6. Can be built without floating-point code (see below). 23 24 7. Supports signals in child programs and restores the original 25 directory if the child was interrupted. 26 27 8. Can be built without (a previous version of) Make. 28 29 9. The build process requires only standard tools. (Optional 30 targets like "install:" and "clean:" still need additional 31 programs, though, see below.) 32 33 10. Beginning with v3.78, the test suite works in the DJGPP 34 environment (requires Perl and auxiliary tools; see below). 35 36 37To install a binary distribution: 38 39 Simply unzip the makNNNb.zip file (where NNN is the version number) 40 preserving the directory structure (-d switch if you use PKUNZIP). 41 If you are installing Make on Windows 9X or Windows 2000, use an 42 unzip program that supports long filenames in zip files. After 43 unzipping, make sure the directory with make.exe is on your PATH, 44 and that's all you need to use Make. 45 46 47To build from sources: 48 49 1. Unzip the archive, preserving the directory structure (-d switch 50 if you use PKUNZIP). If you build Make on Windows 9X or Windows 51 2000, use an unzip program that supports long filenames in zip 52 files. 53 54 If you are unpacking an official GNU source distribution, use 55 either DJTAR (which is part of the DJGPP development 56 environment), or the DJGPP port of GNU Tar. 57 58 2. Invoke the `configure.bat' batch file. 59 60 If you are building Make in-place, i.e. in the same directory 61 where its sources are kept, just type "configure.bat" and press 62 [Enter]. Otherwise, you need to supply the path to the source 63 directory as an argument to the batch file, like this: 64 65 c:\djgpp\gnu\make-3.81\configure.bat c:/djgpp/gnu/make-3.81 66 67 Note the forward slashes in the source path argument: you MUST 68 use them here. 69 70 3. If configure.bat doesn't find a working Make, it will suggest to 71 use the `dosbuild.bat' batch file to build Make. Either do as it 72 suggests or install another Make program (a pre-compiled binary 73 should be available from the usual DJGPP sites) and rerun 74 configure.bat. 75 76 4. If you will need to run Make on machines without an FPU, you 77 might consider building a version of Make which doesn't issue 78 floating-point instructions (they don't help much on MSDOS 79 anyway). To this end, edit the Makefile created by 80 configure.bat and add -DNO_FLOAT to the value of CPPFLAGS. 81 82 5. Invoke Make. 83 84 If you are building from outside of the source directory, you 85 need to tell Make where the sources are, like this: 86 87 make srcdir=c:/djgpp/gnu/make-3.81 88 89 (configure.bat will tell you this when it finishes). You MUST 90 use a full, not relative, name of the source directory here, or 91 else Make might fail. 92 93 6. After Make finishes, if you have a Unix-style shell installed, 94 you can use the `install' target to install the package. You 95 will also need GNU Fileutils and GNU Sed for this (they should 96 be available from the DJGPP sites). 97 98 By default, GNU make will install into your DJGPP installation 99 area. If you wish to use a different directory, override the 100 DESTDIR variable when invoking "make install", like this: 101 102 make install DESTDIR=c:/other/dir 103 104 This causes the make executable to be placed in c:/other/dir/bin, 105 the man pages in c:/other/dir/man, etc. 106 107 Without a Unix-style shell, you will have to install programs 108 and the docs manually. Copy make.exe to a directory on your 109 PATH, make.i* info files to your Info directory, and update the 110 file `dir' in your Info directory by adding the following item 111 to the main menu: 112 113 * Make: (make.info). The GNU make utility. 114 115 If you have the `install-info' program (from the GNU Texinfo 116 package), it will do that for you if you invoke it like this: 117 118 install-info --info-dir=c:/djgpp/info c:/djgpp/info/make.info 119 120 (If your Info directory is other than C:\DJGPP\INFO, change this 121 command accordingly.) 122 123 7. The `clean' targets also require Unix-style shell, and GNU Sed 124 and `rm' programs (the latter from Fileutils). 125 126 8. To run the test suite, type "make check". This requires a Unix 127 shell (I used the DJGPP port of Bash 2.03), Perl, Sed, Fileutils 128 and Sh-utils. 129 130 131Notes: 132----- 133 134 1. The shell issue. 135 136 This is probably the most significant improvement, first 137 introduced in the port of GNU Make 3.75. 138 139 The original behavior of GNU Make is to invoke commands 140 directly, as long as they don't include characters special to 141 the shell or internal shell commands, because that is faster. 142 When shell features like redirection or filename wildcards are 143 involved, Make calls the shell. 144 145 This port supports both DOS shells (the stock COMMAND.COM and its 146 4DOS/NDOS replacements), and Unix-style shells (tested with the 147 venerable Stewartson's `ms_sh' 2.3 and the DJGPP port of `bash' by 148 Daisuke Aoyama <jack@st.rim.or.jp>). 149 150 When the $SHELL variable points to a Unix-style shell, Make 151 works just like you'd expect on Unix, calling the shell for any 152 command that involves characters special to the shell or 153 internal shell commands. The only difference is that, since 154 there is no standard way to pass command lines longer than the 155 infamous DOS 126-character limit, this port of Make writes the 156 command line to a temporary disk file and then invokes the shell 157 on that file. 158 159 If $SHELL points to a DOS-style shell, however, Make will not 160 call it automatically, as it does with Unix shells. Stock 161 COMMAND.COM is too dumb and would unnecessarily limit the 162 functionality of Make. For example, you would not be able to 163 use long command lines in commands that use redirection or 164 pipes. Therefore, when presented with a DOS shell, this port of 165 Make will emulate most of the shell functionality, like 166 redirection and pipes, and shall only call the shell when a 167 batch file or a command internal to the shell is invoked. (Even 168 when a command is an internal shell command, Make will first 169 search the $PATH for it, so that if a Makefile calls `mkdir', 170 you can install, say, a port of GNU `mkdir' and have it called 171 in that case.) 172 173 The key to all this is the extended functionality of `spawn' and 174 `system' functions from the DJGPP library; this port just calls 175 `system' where it would invoke the shell on Unix. The most 176 important aspect of these functions is that they use a special 177 mechanism to pass long (up to 16KB) command lines to DJGPP 178 programs. In addition, `system' emulates some internal 179 commands, like `cd' (so that you can now use forward slashes 180 with it, and can also change the drive if the directory is on 181 another drive). Another aspect worth mentioning is that you can 182 call Unix shell scripts directly, provided that the shell whose 183 name is mentioned on the first line of the script is installed 184 anywhere along the $PATH. It is impossible to tell here 185 everything about these functions; refer to the DJGPP library 186 reference for more details. 187 188 The $(shell) built-in is implemented in this port by calling 189 `popen'. Since `popen' calls `system', the above considerations 190 are valid for $(shell) as well. In particular, you can put 191 arbitrary complex commands, including pipes and redirection, 192 inside $(shell), which is in many cases a valid substitute for 193 the Unix-style command substitution (`command`) feature. 194 195 196 2. "SHELL=/bin/sh" -- or is it? 197 198 Many Unix Makefiles include a line which sets the SHELL, for 199 those versions of Make which don't have this as the default. 200 Since many DOS systems don't have `sh' installed (in fact, most 201 of them don't even have a `/bin' directory), this port takes 202 such directives with a grain of salt. It will only honor such a 203 directive if the basename of the shell name (like `sh' in the 204 above example) can indeed be found in the directory that is 205 mentioned in the SHELL= line (`/bin' in the above example), or 206 in the current working directory, or anywhere on the $PATH (in 207 that order). If the basename doesn't include a filename 208 extension, Make will look for any known extension that indicates 209 an executable file (.exe, .com, .bat, .btm, .sh, and even .sed 210 and .pl). If any such file is found, then $SHELL will be 211 defined to the exact pathname of that file, and that shell will 212 hence be used for the rest of processing. But if the named 213 shell is *not* found, the line which sets it will be effectively 214 ignored, leaving the value of $SHELL as it was before. Since a 215 lot of decisions that this port makes depend on the gender of 216 the shell, I feel it doesn't make any sense to tailor Make's 217 behavior to a shell which is nowhere to be found. 218 219 Note that the above special handling of "SHELL=" only happens 220 for Makefiles; if you set $SHELL in the environment or on the 221 Make command line, you are expected to give the complete 222 pathname of the shell, including the filename extension. 223 224 The default value of $SHELL is computed as on Unix (see the Make 225 manual for details), except that if $SHELL is not defined in the 226 environment, $COMSPEC is used. Also, if an environment variable 227 named $MAKESHELL is defined, it takes precedence over both 228 $COMSPEC and $SHELL. Note that, unlike Unix, $SHELL in the 229 environment *is* used to set the shell (since on MSDOS, it's 230 unlikely that the interactive shell will not be suitable for 231 Makefile processing). 232 233 The bottom line is that you can now write Makefiles where some 234 of the targets require a real (i.e. Unix-like) shell, which will 235 nevertheless work when such shell is not available (provided, of 236 course, that the commands which should always work, don't 237 require such a shell). More important, you can convert Unix 238 Makefiles to MSDOS and leave the line which sets the shell 239 intact, so that people who do have Unixy shell could use it for 240 targets which aren't converted to DOS (like `install' and 241 `uninstall', for example). 242 243 244 3. Default directories. 245 246 GNU Make knows about standard directories where it searches for 247 library and include files mentioned in the Makefile. Since 248 MSDOS machines don't have standard places for these, this port 249 will search ${DJDIR}/lib and ${DJDIR}/include respectively. 250 $DJDIR is defined automatically by the DJGPP startup code as the 251 root of the DJGPP installation tree (unless you've tampered with 252 the DJGPP.ENV file). This should provide reasonable default 253 values, unless you moved parts of DJGPP to other directories. 254 255 256 4. Letter-case in filenames. 257 258 If you run Make on Windows 9x, you should be aware of the 259 letter-case issue. Make is internally case-sensitive, but all 260 file operations are case-insensitive on Windows 9x, so 261 e.g. files `FAQ', `faq' and `Faq' all refer to the same file, as 262 far as Windows is concerned. The underlying DJGPP C library 263 functions honor the letter-case of the filenames they get from 264 the OS, except that by default, they down-case 8+3 DOS filenames 265 which are stored in upper case in the directory and would break 266 many Makefiles otherwise. (The details of which filenames are 267 converted to lower case are explained in the DJGPP libc docs, 268 under the `_preserve_fncase' and `_lfn_gen_short_fname' 269 functions, but as a thumb rule, any filename that is stored in 270 upper case in the directory, is a valid DOS 8+3 filename and 271 doesn't include characters invalid on MSDOS FAT filesystems, 272 will be automatically down-cased.) User reports that I have 273 indicate that this default behavior is generally what you'd 274 expect; however, your input is most welcome. 275 276 In any case, if you hit a situation where you must force Make to 277 get the 8+3 DOS filenames in upper case, set FNCASE=y in the 278 environment or in the Makefile. 279 280 281 5. DOS-style pathnames. 282 283 There are a lot of places throughout the program sources which 284 make implicit assumptions about the pathname syntax. In 285 particular, the directories are assumed to be separated by `/', 286 and any pathname which doesn't begin with a `/' is assumed to be 287 relative to the current directory. This port attempts to 288 support DOS-style pathnames which might include the drive letter 289 and use backslashes instead of forward slashes. However, this 290 support is not complete; I feel that pursuing this support too 291 far might break some more important features, particularly if 292 you use a Unix-style shell (where a backslash is a quote 293 character). I only consider support of backslashes desirable 294 because some Makefiles invoke non-DJGPP programs which don't 295 understand forward slashes. A notable example of such programs 296 is the standard programs which come with MSDOS. Otherwise, you 297 are advised to stay away from backslashes whenever possible. In 298 particular, filename globbing won't work on pathnames with 299 backslashes, because the GNU `glob' library doesn't support them 300 (backslash is special in filename wildcards, and I didn't want 301 to break that). 302 303 One feature which *does* work with backslashes is the filename- 304 related built-in functions such as $(dir), $(notdir), etc. 305 Drive letters in pathnames are also fully supported. 306 307 308 309Bug reports: 310----------- 311 312 Bugs that are clearly related to the MSDOS/DJGPP port should be 313 reported first on the comp.os.msdos.djgpp news group (if you cannot 314 post to Usenet groups, write to the DJGPP mailing list, 315 <djgpp@delorie.com>, which is an email gateway into the above news 316 group). For other bugs, please follow the procedure explained in 317 the "Bugs" chapter of the Info docs. If you don't have an Info 318 reader, look up that chapter in the `make.i1' file with any text 319 browser/editor. 320 321 322 Enjoy, 323 Eli Zaretskii <eliz@is.elta.co.il> 324 325 326------------------------------------------------------------------------------- 327Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 3282006 Free Software Foundation, Inc. 329This file is part of GNU Make. 330 331GNU Make is free software; you can redistribute it and/or modify it under the 332terms of the GNU General Public License as published by the Free Software 333Foundation; either version 2, or (at your option) any later version. 334 335GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY 336WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR 337A PARTICULAR PURPOSE. See the GNU General Public License for more details. 338 339You should have received a copy of the GNU General Public License along with 340GNU Make; see the file COPYING. If not, write to the Free Software 341Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 342