* Various bug fixes.
[make.git] / README.DOS.template
blob5218bb49c2c9fb7ef9f4ce91ab916ac5c517213a
1 Port of GNU Make to 32-bit protected mode on MSDOS and MS-Windows.
3 Builds with DJGPP v2 port of GNU C/C++ compiler and utilities.
6 New (since 3.74) DOS-specific features:
8    1. Supports long filenames when run from DOS box on Windows 9x.
10    2. Supports both stock DOS COMMAND.COM and Unix-style shells
11       (details in ``Notes'' below).
13    3. Supports DOS drive letters in dependencies and pattern rules.
15    4. Better support for DOS-style backslashes in pathnames (but see
16       ``Notes'' below).
18    5. The $(shell) built-in can run arbitrary complex commands,
19       including pipes and redirection, even when COMMAND.COM is your
20       shell.
22    6. Can be built without floating-point code (see below).
24    7. Supports signals in child programs and restores the original
25       directory if the child was interrupted.
27    8. Can be built without (a previous version of) Make.
29    9. The build process requires only standard tools.  (Optional
30       targets like "install:" and "clean:" still need additional
31       programs, though, see below.)
33   10. Beginning with v3.78, the test suite works in the DJGPP
34       environment (requires Perl and auxiliary tools; see below).
37 To install a binary distribution:
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.
47 To build from sources:
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.
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.
58    2. Invoke the `configure.bat' batch file.
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:
65         c:\djgpp\gnu\make-%VERSION%\configure.bat c:/djgpp/gnu/make-%VERSION%
67       Note the forward slashes in the source path argument: you MUST
68       use them here.
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.
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.
82    5. Invoke Make.
84       If you are building from outside of the source directory, you
85       need to tell Make where the sources are, like this:
87                 make srcdir=c:/djgpp/gnu/make-%VERSION%
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.
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).
98       Without a Unix-style shell, you will have to install programs
99       and the docs manually.  Copy make.exe to a directory on your
100       PATH, make.i* info files to your Info directory, and update the
101       file `dir' in your Info directory by adding the following item
102       to the main menu:
104         * Make: (make.info).           The GNU make utility.
106       If you have the `install-info' program (from the GNU Texinfo
107       package), it will do that for you if you invoke it like this:
109         install-info --info-dir=c:/djgpp/info c:/djgpp/info/make.info
111       (If your Info directory is other than C:\DJGPP\INFO, change this
112       command accordingly.)
114    7. The `clean' targets also require Unix-style shell, and GNU Sed
115       and `rm' programs (the latter from Fileutils).
117    8. To run the test suite, type "make check".  This requires a Unix
118       shell (I used the DJGPP port of Bash 2.03), Perl, Sed, Fileutils
119       and Sh-utils.
122 Notes:
123 -----
125    1. The shell issue.
127       This is probably the most significant improvement, first
128       introduced in the port of GNU Make 3.75.
130       The original behavior of GNU Make is to invoke commands
131       directly, as long as they don't include characters special to
132       the shell or internal shell commands, because that is faster.
133       When shell features like redirection or filename wildcards are
134       involved, Make calls the shell.
136       This port supports both DOS shells (the stock COMMAND.COM and its
137       4DOS/NDOS replacements), and Unix-style shells (tested with the
138       venerable Stewartson's `ms_sh' 2.3 and the DJGPP port of `bash' by
139       Daisuke Aoyama <jack@st.rim.or.jp>).
141       When the $SHELL variable points to a Unix-style shell, Make
142       works just like you'd expect on Unix, calling the shell for any
143       command that involves characters special to the shell or
144       internal shell commands.  The only difference is that, since
145       there is no standard way to pass command lines longer than the
146       infamous DOS 126-character limit, this port of Make writes the
147       command line to a temporary disk file and then invokes the shell
148       on that file.
150       If $SHELL points to a DOS-style shell, however, Make will not
151       call it automatically, as it does with Unix shells.  Stock
152       COMMAND.COM is too dumb and would unnecessarily limit the
153       functionality of Make.  For example, you would not be able to
154       use long command lines in commands that use redirection or
155       pipes.  Therefore, when presented with a DOS shell, this port of
156       Make will emulate most of the shell functionality, like
157       redirection and pipes, and shall only call the shell when a
158       batch file or a command internal to the shell is invoked.  (Even
159       when a command is an internal shell command, Make will first
160       search the $PATH for it, so that if a Makefile calls `mkdir',
161       you can install, say, a port of GNU `mkdir' and have it called
162       in that case.)
164       The key to all this is the extended functionality of `spawn' and
165       `system' functions from the DJGPP library; this port just calls
166       `system' where it would invoke the shell on Unix.  The most
167       important aspect of these functions is that they use a special
168       mechanism to pass long (up to 16KB) command lines to DJGPP
169       programs.  In addition, `system' emulates some internal
170       commands, like `cd' (so that you can now use forward slashes
171       with it, and can also change the drive if the directory is on
172       another drive).  Another aspect worth mentioning is that you can
173       call Unix shell scripts directly, provided that the shell whose
174       name is mentioned on the first line of the script is installed
175       anywhere along the $PATH.  It is impossible to tell here
176       everything about these functions; refer to the DJGPP library
177       reference for more details.
179       The $(shell) built-in is implemented in this port by calling
180       `popen'.  Since `popen' calls `system', the above considerations
181       are valid for $(shell) as well.  In particular, you can put
182       arbitrary complex commands, including pipes and redirection,
183       inside $(shell), which is in many cases a valid substitute for
184       the Unix-style command substitution (`command`) feature.
187    2. "SHELL=/bin/sh" -- or is it?
189       Many Unix Makefiles include a line which sets the SHELL, for
190       those versions of Make which don't have this as the default.
191       Since many DOS systems don't have `sh' installed (in fact, most
192       of them don't even have a `/bin' directory), this port takes
193       such directives with a grain of salt.  It will only honor such a
194       directive if the basename of the shell name (like `sh' in the
195       above example) can indeed be found in the directory that is
196       mentioned in the SHELL= line (`/bin' in the above example), or
197       in the current working directory, or anywhere on the $PATH (in
198       that order).  If the basename doesn't include a filename
199       extension, Make will look for any known extension that indicates
200       an executable file (.exe, .com, .bat, .btm, .sh, and even .sed
201       and .pl).  If any such file is found, then $SHELL will be
202       defined to the exact pathname of that file, and that shell will
203       hence be used for the rest of processing.  But if the named
204       shell is *not* found, the line which sets it will be effectively
205       ignored, leaving the value of $SHELL as it was before.  Since a
206       lot of decisions that this port makes depend on the gender of
207       the shell, I feel it doesn't make any sense to tailor Make's
208       behavior to a shell which is nowhere to be found.
210       Note that the above special handling of "SHELL=" only happens
211       for Makefiles; if you set $SHELL in the environment or on the
212       Make command line, you are expected to give the complete
213       pathname of the shell, including the filename extension.
215       The default value of $SHELL is computed as on Unix (see the Make
216       manual for details), except that if $SHELL is not defined in the
217       environment, $COMSPEC is used.  Also, if an environment variable
218       named $MAKESHELL is defined, it takes precedence over both
219       $COMSPEC and $SHELL.  Note that, unlike Unix, $SHELL in the
220       environment *is* used to set the shell (since on MSDOS, it's
221       unlikely that the interactive shell will not be suitable for
222       Makefile processing).
224       The bottom line is that you can now write Makefiles where some
225       of the targets require a real (i.e. Unix-like) shell, which will
226       nevertheless work when such shell is not available (provided, of
227       course, that the commands which should always work, don't
228       require such a shell).  More important, you can convert Unix
229       Makefiles to MSDOS and leave the line which sets the shell
230       intact, so that people who do have Unixy shell could use it for
231       targets which aren't converted to DOS (like `install' and
232       `uninstall', for example).
235    3. Default directories.
237       GNU Make knows about standard directories where it searches for
238       library and include files mentioned in the Makefile.  Since
239       MSDOS machines don't have standard places for these, this port
240       will search ${DJDIR}/lib and ${DJDIR}/include respectively.
241       $DJDIR is defined automatically by the DJGPP startup code as the
242       root of the DJGPP installation tree (unless you've tampered with
243       the DJGPP.ENV file).  This should provide reasonable default
244       values, unless you moved parts of DJGPP to other directories.
247    4. Letter-case in filenames.
249       If you run Make on Windows 9x, you should be aware of the
250       letter-case issue.  Make is internally case-sensitive, but all
251       file operations are case-insensitive on Windows 9x, so
252       e.g. files `FAQ', `faq' and `Faq' all refer to the same file, as
253       far as Windows is concerned.  The underlying DJGPP C library
254       functions honor the letter-case of the filenames they get from
255       the OS, except that by default, they down-case 8+3 DOS filenames
256       which are stored in upper case in the directory and would break
257       many Makefiles otherwise.  (The details of which filenames are
258       converted to lower case are explained in the DJGPP libc docs,
259       under the `_preserve_fncase' and `_lfn_gen_short_fname'
260       functions, but as a thumb rule, any filename that is stored in
261       upper case in the directory, is a valid DOS 8+3 filename and
262       doesn't include characters invalid on MSDOS FAT filesystems,
263       will be automatically down-cased.)  User reports that I have
264       indicate that this default behavior is generally what you'd
265       expect; however, your input is most welcome.
267       In any case, if you hit a situation where you must force Make to
268       get the 8+3 DOS filenames in upper case, set FNCASE=y in the
269       environment or in the Makefile.
272    5. DOS-style pathnames.
274       There are a lot of places throughout the program sources which
275       make implicit assumptions about the pathname syntax.  In
276       particular, the directories are assumed to be separated by `/',
277       and any pathname which doesn't begin with a `/' is assumed to be
278       relative to the current directory.  This port attempts to
279       support DOS-style pathnames which might include the drive letter
280       and use backslashes instead of forward slashes.  However, this
281       support is not complete; I feel that pursuing this support too
282       far might break some more important features, particularly if
283       you use a Unix-style shell (where a backslash is a quote
284       character).  I only consider support of backslashes desirable
285       because some Makefiles invoke non-DJGPP programs which don't
286       understand forward slashes.  A notable example of such programs
287       is the standard programs which come with MSDOS.  Otherwise, you
288       are advised to stay away from backslashes whenever possible.  In
289       particular, filename globbing won't work on pathnames with
290       backslashes, because the GNU `glob' library doesn't support them
291       (backslash is special in filename wildcards, and I didn't want
292       to break that).
294       One feature which *does* work with backslashes is the filename-
295       related built-in functions such as $(dir), $(notdir), etc.
296       Drive letters in pathnames are also fully supported.
300 Bug reports:
301 -----------
303    Bugs that are clearly related to the MSDOS/DJGPP port should be
304    reported first on the comp.os.msdos.djgpp news group (if you cannot
305    post to Usenet groups, write to the DJGPP mailing list,
306    <djgpp@delorie.com>, which is an email gateway into the above news
307    group).  For other bugs, please follow the procedure explained in
308    the "Bugs" chapter of the Info docs.  If you don't have an Info
309    reader, look up that chapter in the `make.i1' file with any text
310    browser/editor.
313    Enjoy,
314                         Eli Zaretskii <eliz@is.elta.co.il>