Compare commits

...

223 Commits
3.74.3 ... 3.76

Author SHA1 Message Date
Paul Smith
e2ffc653aa Minor tweaks for 3.76. 1997-09-16 18:08:59 +00:00
Paul Smith
4e58a6ca4c Changes for GNU make 3.76 1997-09-16 14:19:43 +00:00
Paul Smith
41dcca8426 Changes for GNU make 3.76 1997-09-16 14:17:23 +00:00
Paul Eggert
161a026602 automatically generated from GPLed version 1997-09-11 18:13:19 +00:00
Ulrich Drepper
e244062995 automatically generated from GPLed version 1997-09-11 18:13:19 +00:00
Paul Eggert
24fec5cb53 automatically generated from GPLed version 1997-09-11 18:13:19 +00:00
Ulrich Drepper
b903988475 automatically generated from GPLed version 1997-09-11 18:13:19 +00:00
Paul Smith
6ea87be73b Changes for GNU make 3.75.93. 1997-09-05 21:01:49 +00:00
Paul Smith
f6490d62cf GNU make 3.75.92 1997-08-27 21:14:44 +00:00
Paul Smith
480ad62713 New glob.h to understand __const 1997-08-27 20:43:43 +00:00
Paul Smith
acd666ce50 Updated for GNU make 3.75.92. 1997-08-27 20:36:31 +00:00
Paul Smith
be3fb0ae6d Updates for GNU make 3.75.92. 1997-08-27 20:30:54 +00:00
Paul Smith
dd0c939e78 Last minute 3.75.91 changes. 1997-08-18 20:14:30 +00:00
Paul Smith
fff468765c e the global copy of this lib. 1997-08-18 19:31:49 +00:00
Paul Smith
63dff1e0bc Bug fixes and automake changes. 1997-08-18 18:11:04 +00:00
Paul Smith
e746a9c951 Removed files that are no longer needed now that we use automake. 1997-08-18 16:48:45 +00:00
Paul Smith
74d4418f1c Removed files that are no longer needed now that we use automake. 1997-08-18 15:19:04 +00:00
Miles Bader
062e5f6aae automatically generated from GPLed version 1997-08-14 02:25:35 +00:00
Paul Eggert
c495345f7c automatically generated from GPLed version 1997-08-14 02:16:15 +00:00
Paul Smith
f0239bb0af Final update for 3.75.1. 1997-08-01 06:31:21 +00:00
Karl Berry
2d29a55137 (\email): Let to \uref instead of \code, as a second optional argument
makes sense for this, too.
1997-07-26 19:12:35 +00:00
Richard M. Stallman
806c7aa46c Test __unix' along with unix'. 1997-07-22 21:35:43 +00:00
Jim Meyering
47daa6787e Add comment describing HAVE_PSTAT_GETDYNAMIC. 1997-07-15 13:21:56 +00:00
Karl Berry
eb4d510a74 (\indexdummies): Add \value. 1997-07-14 17:43:41 +00:00
Karl Berry
c86587fb9b (\authorrm): Must use \def instead of \let, as \secrm is not yet
defined.
1997-07-10 17:34:25 +00:00
Richard M. Stallman
fd688f6e9c (\titlefont): Define again, using \titlefonts. 1997-07-10 01:23:38 +00:00
Karl Berry
f96ef9a409 (\startcontents): Leave ^ catcode as other. 1997-07-09 20:45:27 +00:00
Richard M. Stallman
09616e5837 Declare how to hyphenate "whitespace". 1997-07-09 19:40:16 +00:00
Richard M. Stallman
cf9aa5b70b [OSF_ALPHA]: Include sys/mbuf.h, sys/socket.h, net/route.h. 1997-07-06 23:43:39 +00:00
Karl Berry
9033f1a656 (\titlefonts): New macro to set title font styles, so italic etc. work
in @title.
(\titlefont): No longer needed.
(\titlepage): Call \titlefonts instead of \titlefont.
(\chapsf, \ssecsy, \ssecttsl): Correct magstep values.
From: Stephen Gildea <gildea@intouchsys.com>.
1997-07-05 21:51:30 +00:00
Karl Berry
ccfe89b829 (\onepageout): Back up to 2\baselineskip per Stephen.
(\kbdinputstyle): New command.
1997-07-05 21:16:39 +00:00
Richard M. Stallman
35f1bbbe23 [__GNU__]: Test for not NeXT. 1997-07-04 04:45:19 +00:00
gnu
9f88582943 fix TeX overfills -len 1997-07-04 04:42:36 +00:00
Richard M. Stallman
b38d9d2ae9 (\kbdfont, \kbdexamplefont): New macros, parms that
tell @kbd what to do.
(\setkbdinputdistinct, \setkbdinputexample): New commands set them.
(\kbd): Use those parms.
1997-07-04 00:07:28 +00:00
Karl Berry
132e0eda6c (\onepageout): Leave only one line space above the footline, to be more
like plain.  Suggested by Stephen Gildea.
(\evenfootline): Left one too many line spaces here, so reduce by two.

(\ifnottex): Another ignore command.
(\ifnothtml,\ifnotinfo): New commands.
(\doignore): Ignore brace characters, so mismatched braces in ignored
text do not cause complaints.
1997-07-03 20:52:37 +00:00
Karl Berry
c297b2fbd5 (\image): New definition for new @image command. 1997-06-27 19:09:14 +00:00
Richard M. Stallman
ec08feae97 Update FSF address in second place. 1997-06-26 20:56:18 +00:00
Ulrich Drepper
8c7887ac02 update from main archive 970623 1997-06-23 22:48:40 +00:00
Ulrich Drepper
08cf536bfb automatically generated from GPLed version 1997-06-21 04:31:18 +00:00
Paul Eggert
b48b02c7f4 automatically generated from GPLed version 1997-06-21 04:31:18 +00:00
Ulrich Drepper
e7a0e14a43 automatically generated from GPLed version 1997-06-21 04:31:18 +00:00
Paul Eggert
6413a1d08e automatically generated from GPLed version 1997-06-21 04:31:18 +00:00
Miles Bader
8f34c48e3f automatically generated from GPLed version 1997-06-21 04:31:18 +00:00
Paul Eggert
818bb8940c automatically generated from GPLed version 1997-06-21 03:24:49 +00:00
Karl Berry
cc4d91d751 (\oddfootingxxx),
(\onepageout): Leave space for the footline if present.
(\everyfootingxxx, \everyheadingxxx): Call \oddfootingxxx and
\evenfootingxxx instead of repeating their code.
From: Stephen Gildea <gildea@intouchsys.com>.

(\setfilename): Read texinfo.cnf if present.

(\indexdummies, \indexnofonts): No-op additional commands @result @equiv
@expansion @print @error @point.
From: Dave Bodenstab <imdave@ais.net> (for texi2www doc).
1997-06-18 19:58:18 +00:00
Ulrich Drepper
36d804bd51 Undo last change. 1997-06-13 23:19:09 +00:00
Ulrich Drepper
f95d071efc update from main archive 970612 1997-06-12 23:56:51 +00:00
Karl Berry
c0deecf9ee (\setmultitablespacing): Restore bad typing mistake from yesterday. 1997-06-06 14:31:32 +00:00
Karl Berry
dd63648825 (\uref): Write real definition, taking one mandatory argument and one
optional one.
1997-06-05 22:04:25 +00:00
Karl Berry
229ba33d0e * texinfo.tex (\mainmagstep): Define this as a \count variable
instead of with \let, to make changing to \magstep1 more transparent.
 	From: HERBERT@boevm4.vnet.ibm.com.
	(\uref): New command a la \url.
1997-06-04 21:47:40 +00:00
Paul Eggert
ccbe33db90 automatically generated from GPLed version 1997-05-27 03:15:15 +00:00
Paul Eggert
32efbf8dc3 automatically generated from GPLed version 1997-05-27 03:15:15 +00:00
Paul Eggert
6e3b0629f1 automatically generated from GPLed version 1997-05-27 03:15:15 +00:00
Karl Berry
51659ed000 (\deftypemethod, \deftypemethodheader): New macros to implement
new commands @deftypemethod and @deftypemethodx.
Suggestion from: KHMarbaise@p69.ks.fido.de (Karl Heinz Marbaise).
1997-05-24 22:06:39 +00:00
Karl Berry
7827f1bde8 (\opnr, \clnr): Increment/decrement \parencount, for
* texinfo.tex (\opnr, \clnr): Increment/decrement \parencount, for
   	  @defun lines with nested parens.  From Bill Schelter
 	  <wfs@fireant.ma.utexas.edu>.
	(\itemizeitem): Correct \errmessage.
1997-05-23 17:02:00 +00:00
Karl Berry
922730c406 (\codeunder): Use \_ and \ifusingtt to avoid dotaccent from _ in roman
fonts, e.g., @deftypefn.
(\tex): Remove spurious spaces at the end of subdefinitions.
From: "John W. Eaton" <jwe@bevo.che.wisc.edu>.
(\url, \email): \let to \code; no quotes or angle brackets.
1997-05-19 21:34:38 +00:00
Richard M. Stallman
5e91041347 Explain which commands should use CFLAGS. 1997-05-17 19:07:42 +00:00
Karl Berry
9f7ba4a505 (\onepageout): \ifcropmarks, center the page body.
Lost this when merged \croppageout with \onepageout.
Found by Arnold.

(\doprintindex): Do not bother to go into double column mode unless
there actually is a non-empty index.

(\begindoublecolumns): Include any existing \partialpage in the new one,
lest we lose a whole page of output.
Found by M J Morley <mjm@scs.leeds.ac.uk>.

(\chapternofonts): Remove spurious spaces, both in the definitions that
get output to the aux file(s) and in this macro.

Fix comments and rationalize whitespace in various other places.
1997-05-05 21:06:33 +00:00
Karl Berry
2745ed943b Avoid expansion in node titles.
Merge cropmarks code into main output routine.
1997-04-27 19:40:44 +00:00
Paul Eggert
0cb72b4a51 automatically generated from GPLed version 1997-04-18 00:47:55 +00:00
Paul Smith
73fcfdbe24 Last-minute changed for 3.75.1 1997-04-07 18:02:17 +00:00
Paul Smith
0ada207e2d Changes for make 3.75.1 1997-04-07 07:21:16 +00:00
Paul Smith
7bb7ba7849 New file for DJGPP port. 1997-04-07 06:54:40 +00:00
Paul Smith
2a294c52d1 Renamed to config.h.W32 at RMS' request. 1997-04-02 06:03:37 +00:00
Paul Smith
71515366cd Renamed to README.W32 at RMS' request. 1997-04-02 05:59:56 +00:00
Roland McGrath
d78f2db327 Mon Mar 10 23:47:02 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* job.c (construct_command_argv_internal): Don't discard an
	explicit empty argument at the end of the command line.  In the
	slow case return immediately if the command line was empty.
1997-03-12 21:17:08 +00:00
Miles Bader
30c9fcfec3 [__GNU__] (NeXT, host_self):
New macros, to make hurd systems use the NeXT code for getting load averages.
1997-02-23 03:38:49 +00:00
Paul Eggert
e2b79aacf7 automatically generated from GPLed version 1997-01-23 04:23:12 +00:00
Paul Eggert
e981c049f4 automatically generated from GPLed version 1997-01-22 05:25:31 +00:00
Jim Meyering
9012013552 [hpux && HAVE_PSTAT_GETDYNAMIC]: Use HPUX's pstat_getdynamic so
we don't need any special privileges to determine load averages.
Patch from Kaveh Ghazi, based on a sample implementation from
Richard J. Rauenzahn.
Indent cpp-directives to reflect nesting.
1997-01-16 03:33:02 +00:00
Karl Berry
cda4f25fd4 Oops, did inadvertent branch. 1997-01-04 19:24:13 +00:00
Ulrich Drepper
b32b9197ab update from main archive 961217 1996-12-18 03:22:53 +00:00
Paul Eggert
b66145d8bc Spelling fix. 1996-12-17 06:25:17 +00:00
David J. MacKenzie
d2fe84cab3 fix a couple of bugs 1996-12-11 00:49:47 +00:00
Karl Berry
c2ea8e2486 (\deftypevarheader, \deftypevrheader): Remove
* texinfo.tex (\deftypevarheader, \deftypevrheader): Remove
        anything after the first space in the name to be indexed, for the
	sake of tzname[2].
	(\dovarind): New macro.
	From: Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>.
1996-11-19 21:11:43 +00:00
Karl Berry
db2384b9ab \indexbreaks, \realunder, \multitable, \footnotezzz. 1996-11-17 00:12:46 +00:00
Karl Berry
9b0b3a6e70 (\value): Don't call \parsearg, @value takes a simple arg. 1996-11-16 00:20:09 +00:00
Karl Berry
a71d56b4cc (\parsetpheaderline): Don't go through \tptemp when
removing braces from #2, use the macro call directly.
	(\removeemptybraces): Expand to #1 instead of defining \tptemp.
	From: Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>.
	This makes @deftp {Data type} {struct termios} work again.
1996-11-16 00:19:07 +00:00
Karl Berry
10011ce289 (\set, \value): Allow - and _ in @set variable names. 1996-11-09 23:37:11 +00:00
David J. MacKenzie
84a9fd68b7 many bug fixes and a few additions, mostly derived from bug-gnu-utils 1996-11-09 22:19:34 +00:00
Karl Berry
262ca66cb7 (\readauxfile): Leave \catcode`\^ as other;
* texinfo.tex (\readauxfile): Leave \catcode`\^ as other;
 	otherwise, node names containing ^, such as in info/info.texi,
 	cause an error when run through TeX.
	(\setq): Do not call \auxhat.
	(\auxhat): Definition no longer needed.
	Reported by Howard Gayle <howard@hal.com>.
1996-11-09 18:44:09 +00:00
Richard M. Stallman
a1eb3e67cd Talk about which dir Info files, Bison output, etc. should go in.
Add some more utilities that can be used in make commands.
1996-11-07 22:30:30 +00:00
Karl Berry
78a4848b83 (see ChangeLog for Oct 29.) 1996-11-05 19:52:23 +00:00
Karl Berry
b16829dc46 Call \normalturnoffactive for the sake of \write's that include a \. 1996-11-05 19:51:16 +00:00
Jim Meyering
c71e4ac269 [__hpux]: Define hpux. From Eric Backus.
[__sun]: Define sun.  Reported by Kaveh Ghazi.
1996-10-10 03:29:50 +00:00
Karl Berry
82e6316607 Untabify. 1996-09-30 17:47:57 +00:00
Karl Berry
a8de4b93e3 Changes for Texinfo 3.8 release; see ChangeLog. 1996-09-30 17:39:54 +00:00
Karl Berry
6e7fa14c65 (\inforef): Move to more appropriate place.
* texinfo.tex (\inforef): Move to more appropriate place.
	(\pounds): Remove spurious extra $.
	(\email): Typeset argument in angle brackets.
	(\macro): Use \doignore for robustness, instead of just letting TeX
	parse the argument.
	(\unmacro): Define.
1996-09-18 12:15:20 +00:00
Richard M. Stallman
5206d3f2bc (getloadavg): Add new code for SUNOS_5 to use -lkstat. 1996-09-10 19:50:17 +00:00
Richard M. Stallman
e2da48ca55 Describe preinstall and postinstall commands. 1996-09-09 18:06:22 +00:00
Karl Berry
bc26243d90 Formatting change, define @pounds, etc. 1996-09-06 19:24:48 +00:00
Karl Berry
b4db97478e (\centerchfplain): Rewrite to use \chfplain, and to
actually center.
	(\unnchfplain): Just call \chfplain.
	(\chfplain): Rewrite to be generally callable.
	(\centerparametersmaybe): Hook, a no-op except with @centerchap.
1996-09-02 15:14:43 +00:00
Karl Berry
4e361d0f01 (\key): Do not uppercase the argument; key names
can be mixed case, e.g., `Control'.
1996-08-31 19:08:16 +00:00
Roland McGrath
d5d49d2e5a Regenerated for 3.75 1996-08-28 21:13:05 +00:00
Roland McGrath
191dc2b434 . 1996-08-28 18:15:23 +00:00
Roland McGrath
6fa74367b7 Tue Aug 27 01:06:34 1996 Roland McGrath <roland@baalperazim.frob.com>
* main.c (print_version): Print out bug-reporting address.
Mon Aug 26 19:55:47 1996  Roland McGrath  <roland@baalperazim.frob.com>

	* main.c (print_data_base): Don't declare ctime; headers do it for us
 	already.
1996-08-27 11:29:03 +00:00
Roland McGrath
4cee1500a4 Tue Aug 27 01:06:34 1996 Roland McGrath <roland@baalperazim.frob.com>
* version.c: Version 3.75 released.
1996-08-27 10:16:17 +00:00
Karl Berry
2602fb8e71 (\key): Typeset a lozenge around the argument (from
gildea@intouchsys.com).
1996-08-20 18:37:11 +00:00
Karl Berry
bfce132399 (\heading, \subheading, \subsubheading): Can no
* texinfo.tex (\heading, \subheading, \subsubheading): Can no
 	longer call the nonexistent \*secheadingi series. Instead, call
 	\plain*secheading.
	(\plainsubsecheading, \plainsubsubsecheading): New macros, by analogy
	with \plainsecheading.
	(\unnumberedsubseczzz, \unnumberedsubsubseczzz): Call them.
1996-08-05 18:01:12 +00:00
Karl Berry
30cf28ef63 (\HEADINGSdouble, \HEADINGSsingle,
HEADINGSdoubleafter, \HEADINGSsingleafter, \CHAPPAGoff,
\CHAPPAGon, \CHAPPAGodd): Set \contentsalignmacro, analogous to
\pagealignmacro.
(\startcontents): Call \contentsalignmacro instead of \pagealignmacro.
1996-08-03 18:59:17 +00:00
Karl Berry
a7f3831457 Restoring good RCS id. 1996-08-02 15:12:28 +00:00
Karl Berry
bcd11d854b (\indexfonts): Make leading be 12pt. Otherwise, it's too crammed.
(\smalllispx): Remove \setleading{10pt}. That was too small.
(\doprintindex): Do not call \tex ... \Etex.  Index files are Texinfo
source, not TeX source, except for using \ instead of @ as the
escape character (for now).
1996-07-29 19:08:10 +00:00
Roland McGrath
bb01a1a810 . 1996-07-29 05:46:07 +00:00
Roland McGrath
c622dd9bdf Sun Jul 28 15:37:09 1996 Rob Tulloh (tulloh@tivoli.com)
* w32/include/pathstuff.h: Added prototype for the new
	function convert_vpath_to_win32. Deleted macro for same.
1996-07-29 05:44:09 +00:00
Roland McGrath
7092951361 Sun Jul 28 15:37:09 1996 Rob Tulloh (tulloh@tivoli.com)
* w32/pathstuff.c: Turned convert_vpath_to_win32() into a
	real function. This was done so that VPATH could contain
	white space separated pathnames. Please note that directory
	paths (in VPATH/vpath context) containing white space are not
	supported (just as they are not under Unix). See README.WIN32
	for suggestions.
1996-07-29 05:44:06 +00:00
Roland McGrath
88d39b2a22 Sun Jul 28 15:37:09 1996 Rob Tulloh (tulloh@tivoli.com)
* w32/pathstuff.c: Turned convert_vpath_to_win32() into a
	real function. This was done so that VPATH could contain
	white space separated pathnames. Please note that directory
	paths (in VPATH/vpath context) containing white space are not
	supported (just as they are not under Unix). See README.WIN32
	for suggestions.
	* README.WIN32: Added some notes about why I chose not to try
	and support pathnames which contain white space and some
	workaround suggestions.
1996-07-29 05:44:03 +00:00
Karl Berry
3863dbeb03 (paragraphindent): Move to more reasonable place in the source file.
(chapfonts, secfonts, subsecfonts, indexfonts): Call \setleading.
(\chfplain, \secheading, \plainsecheading, \subsecheading,
 \subsubheading): Rewrite to properly \hangindent the title.
(\sectionheading): New generic macro to print section titles.
1996-07-28 20:57:40 +00:00
Karl Berry
cca242e6e3 Initial revision 1996-07-28 20:55:30 +00:00
Roland McGrath
7082394702 . 1996-07-26 02:33:47 +00:00
Roland McGrath
1f0bf7b4db Thu Jul 25 19:53:31 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* GNUmakefile (mkdep-nolib): Use -MM option unconditionally.
1996-07-26 02:33:35 +00:00
Roland McGrath
b18ce15130 Regenerated 1996-07-26 02:29:30 +00:00
Roland McGrath
c41efad63b Regenerated 1996-07-26 00:35:16 +00:00
Roland McGrath
683c716de3 autoconf 1996-07-26 00:35:09 +00:00
Roland McGrath
29253a9683 Regenerated for 3.74.7 1996-07-26 00:34:58 +00:00
Roland McGrath
9cc98648fd Updated from libc 1996-07-26 00:34:37 +00:00
Roland McGrath
d3c192e4a6 . 1996-07-26 00:33:49 +00:00
Roland McGrath
08905cdcbc Thu Jul 25 19:53:31 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* main.c (define_makeflags): Back up P to point at null terminator
	when killing final space and dash before setting MFLAGS.
1996-07-26 00:33:25 +00:00
Roland McGrath
4b72e38789 . 1996-07-26 00:06:10 +00:00
Roland McGrath
ce17fda12f Thu Jul 25 19:53:31 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* GNUmakefile (win32files): Add NMakefile.
1996-07-26 00:05:44 +00:00
Roland McGrath
2df6034eb6 Thu Jul 25 19:53:31 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
From Robert Hoehne <robert.hoehne@Mathematik.TU-Chemnitz.DE>:
	* dir.c [__MSDOS__] [DJGPP > 1]: Include <libc/dosio.h> and defin
	`__opendir_flags' initialized to 0.
	[__MSDOS__] (dosify) [DJGPP > 1]: Return name unchanged if _USE_LFN.
	(find_directory) [__MSDOS__ && DJGPP > 1]: If _USE_LGN, set
	__opendir_flags to __OPENDIR_PRESERVE_CASE.
1996-07-26 00:05:41 +00:00
Roland McGrath
dd0fe8f1ee Thu Jul 25 19:53:31 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* GNUmakefile (win32files): Add NMakefile.
	* NMakefile (LDFLAGS_debug): Value fixed by tulloh.
1996-07-26 00:05:37 +00:00
Roland McGrath
37fbc32ba4 Thu Jul 25 19:53:31 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* vmsfunctions.c (vms_stat): `sys$dassgn (DevChan);' added by kkaempf.
1996-07-26 00:05:34 +00:00
Roland McGrath
64bdaa521f . 1996-07-20 11:13:47 +00:00
Roland McGrath
37ce7efdca Sat Jul 20 12:32:10 1996 Klaus Kmpf (kkaempf@progis.de)
* remake.c (f_mtime) [VMS]: Add missing `if' conditional for future
	modtime check.
	* config.h-vms, makefile.vms, readme.vms, vmsify.c: Update address.
1996-07-20 11:13:04 +00:00
Roland McGrath
4b92c539d4 Sat Jul 20 05:29:43 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* configure.in: Require autoconf 2.10 or later.
1996-07-20 09:30:04 +00:00
Roland McGrath
a22f67aaf7 Regenerated for 3.74.6 1996-07-19 22:18:36 +00:00
Roland McGrath
9fc574683d Updated from libc 1996-07-19 22:18:33 +00:00
Roland McGrath
c8e016d07a 3.74.6 1996-07-19 21:43:36 +00:00
Roland McGrath
c396f06a21 . 1996-07-19 21:42:21 +00:00
Roland McGrath
fc47a2c83c updated w32 code by tulloh 1996-07-19 21:41:07 +00:00
Roland McGrath
561b384313 Fri Jul 19 16:57:27 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* GNUmakefile (win32files): New variable.
	(distfiles): Add it.
	* w32: Updated by Rob Tulloh.
1996-07-19 21:40:29 +00:00
Roland McGrath
88942403a6 Fri Jul 19 16:57:27 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* makefile.vms (LOADLIBES): Fix typo.
1996-07-19 21:40:25 +00:00
Roland McGrath
8733fbd646 . 1996-07-14 19:59:40 +00:00
Roland McGrath
cf2db2cf3c Sun Jul 14 12:59:27 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* job.c (construct_command_argv_internal): Fix up #else, #endifs.
1996-07-14 19:59:13 +00:00
Roland McGrath
f0cea20864 Sun Jul 14 12:59:27 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* remake.c (f_mtime): Don't compare MTIME to NOW if MTIME == -1.
1996-07-14 19:59:04 +00:00
Roland McGrath
fcb18b988b Sun Jul 14 12:59:27 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* configh.dos: Define HAVE_DIRENT_H instead of DIRENT.
1996-07-14 19:58:54 +00:00
Roland McGrath
8b24ec18b0 xref nonunix ports 1996-07-14 19:54:36 +00:00
Roland McGrath
df5ba0ef96 Regenerated for 3.74.5 1996-07-14 17:10:20 +00:00
Roland McGrath
74475bb939 Updated from libc 1996-07-14 17:09:51 +00:00
Roland McGrath
22ffba3660 . 1996-07-14 17:07:54 +00:00
Roland McGrath
9603eb13a0 . 1996-07-14 17:07:27 +00:00
Roland McGrath
fde68d03f3 Sun Jul 14 12:59:27 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* main.c (main): Exit with status 2 when update_goal_chain returns 2.
1996-07-14 17:07:13 +00:00
Mark Seaborn
56162c4968 formatting tweaks 1996-07-03 23:05:19 +00:00
Roland McGrath
f78bcc2e72 . 1996-06-22 22:00:43 +00:00
Roland McGrath
0c23819036 Sat Jun 22 14:56:05 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* configure.in: Don't check for _sys_siglist.
	* make.h [HAVE__SYS_SIGLIST]: Don't test this; just punt if there is
	no strsignal or sys_siglist.
1996-06-22 22:00:31 +00:00
Roland McGrath
91a7257252 . 1996-06-22 21:42:29 +00:00
Roland McGrath
d5f0b88095 Sat Jun 22 14:56:05 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* job.c (start_job_command): Call block_sigs.
	(block_sigs): New function, broken out of start_job_command.
	(reap_children): Block fatal signals around removing dead child from
	chain and adjusting job_slots_used.
	* job.h: Declare block_sigs.
1996-06-22 21:42:15 +00:00
Roland McGrath
3024918fcd Sat Jun 22 14:56:05 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* file.c (file_hash_enter): Allow renaming :: to : when latter is
	non-target, or : to :: when former is non-target.
1996-06-22 21:42:13 +00:00
Roland McGrath
bdc49369eb Sat Jun 22 14:56:05 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* job.c (reap_children): Don't call die if handling_fatal_signal.
	* job.c (start_job_command): Call block_sigs.
	(block_sigs): New function, broken out of start_job_command.
	(reap_children): Block fatal signals around removing dead child from
	chain and adjusting job_slots_used.
	* job.h: Declare block_sigs.
	* job.c (reap_children): Quiescent value of shell_function_pid is
	zero, not -1.
1996-06-22 21:42:10 +00:00
Roland McGrath
610526fee7 Sat Jun 22 14:56:05 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* remote-stub.c (remote_setup, remote_cleanup): New (empty) functions.
	* main.c (main): Call remote_setup.
	(die): Call remote_cleanup.
	* main.c (print_version): Add 96 to copyright years.
1996-06-22 21:42:06 +00:00
Roland McGrath
3f60c36245 Sat Jun 22 14:56:05 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* read.c (conditional_line): Strip ws in `ifeq (a , b)' so it is the
	same as `ifeq (a, b)'.
1996-06-22 21:42:02 +00:00
Roland McGrath
bd88059c38 (Wildcard Function): fix typo 1996-06-22 21:21:30 +00:00
Roland McGrath
63f3cf925b Updated from libc 1996-06-22 21:14:22 +00:00
Roland McGrath
8541e3345d . 1996-06-22 19:31:26 +00:00
Roland McGrath
d86e4a26c8 Sat Jun 22 14:56:05 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* remote-stub.c (remote_setup, remote_cleanup): New (empty) functions.
	* main.c (main): Call remote_setup.
	(die): Call remote_cleanup.
	* main.c (print_version): Add 96 to copyright years.
1996-06-22 19:31:12 +00:00
Roland McGrath
2c973c0b46 Sat Jun 22 14:56:05 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* remote-stub.c (remote_setup, remote_cleanup): New (empty) functions.
	* main.c (main): Call remote_setup.
	(die): Call remote_cleanup.
1996-06-22 19:31:06 +00:00
Roland McGrath
e0620ee179 Sat Jun 22 14:56:05 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* job.c (start_job_command): Call block_sigs.
	(block_sigs): New function, broken out of start_job_command.
	(reap_children): Block fatal signals around removing dead child from
	chain and adjusting job_slots_used.
	* job.c (reap_children): Quiescent value of shell_function_pid is
	zero, not -1.
1996-06-22 19:30:59 +00:00
Roland McGrath
dac23b2d0b Wed May 15 17:37:26 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* dir.c (print_dir_data_base): Use %ld dev and ino and cast them to
	long.
1996-06-22 19:30:04 +00:00
Roland McGrath
783e6680b2 Sat Jun 15 20:30:01 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* read.c (find_char_unquote): Avoid calling strlen on every call
	just to throw away the value most of the time.
1996-06-22 19:26:13 +00:00
Richard M. Stallman
2529deb2bf Describe lispdir variable. 1996-06-12 21:50:54 +00:00
Karl Heuer
3d3252b8de [SOLARIS2]: Define SUNOS_5. 1996-05-28 00:17:16 +00:00
Roland McGrath
b14b16769c Note win32 port 1996-05-27 00:58:20 +00:00
Roland McGrath
e7a525c5d5 Wed May 15 10:14:14 CDT 1996 Rob Tulloh <tulloh@tivoli.com>
* dir.c: WIN32 does not support inode. For now, fully qualified
	pathname along with st_mtime will be keys for files.
	Fixed problem where vpath can be confused when files
	are added to a directory after the directory has already been
	read in. The code now attempts to reread the directory if it
	discovers that the datestamp on the directory has changed since
	it was cached by make. This problem only seems to occur on WIN32
	right now so it is lumped under port #ifdef WIN32.

	* function.c: WIN32: call subproc library (CreateProcess()) instead of
	fork/exec.

	* job.c: WIN32: Added the code to do fork/exec/waitpid style processing
	on WIN32 systems via calls to subproc library.

	* main.c: WIN32: Several things added here. First, there is code
	for dealing with PATH and SHELL defaults. Make tries to figure
	out if the user has %PATH% set in the environment and sets it to
	%Path% if it is not set already. Make also looks to see if sh.exe
	is anywhere to be found. Code path through job.c will change
	based on existence of a working Bourne shell. The checking for
	default shell is done twice: once before makefiles are read in
	and again after. Fall back to MSDOS style execution mode if no sh.exe
	is found. Also added some debug support that allows user to pause make
	with -D switch and attach a debugger. This is especially useful for
	debugging recursive calls to make where problems appear only in the
	sub-make.

	* make.h: WIN32: A few macros and header files for WIN32 support.

	* misc.c: WIN32: Added a function end_of_token_w32() to assist
	in parsing code in read.c.

	* read.c: WIN32: Fixes similar to MSDOS which allow colon to
	appear in filenames. Use of colon in filenames would otherwise
	confuse make.

	* remake.c: WIN32: Added include of io.h to eliminate compiler
	warnings. Added some code to default LIBDIR if it is not set
	on WIN32.

	* variable.c: WIN32: Added support for detecting Path/PATH
	and converting them to semicolon separated lists for make's
	internal use. New function sync_Path_environment()
	which is called in job.c and function.c before creating a new
	process. Caller must set Path in environment since we don't
	have fork() to do this for us.

	* vpath.c: WIN32: Added detection for filenames containing
	forward or backward slashes.

	* NMakefile: WIN32: Visual C compatible makefile for use with nmake.
	Use this to build GNU make the first time on Windows NT or Windows 95.

	* README.WIN32: WIN32: Contains some helpful notes.

	* build_w32.bat: WIN32: If you don't like nmake, use this the first
	time you build GNU make on Windows NT or Windows 95.

	* config.h.WIN32: WIN32 version of config.h

	* subproc.bat: WIN32: A bat file used to build the
	subproc library from the top-level NMakefile. Needed because
	WIndows 95 (nmake) doesn't allow you to cd in a make rule.

	* w32/include/dirent.h
	* w32/compat/dirent.c: WIN32: opendir, readdir, closedir, etc.

	* w32/include/pathstuff.h: WIN32: used by files needed functions
	defined in pathstuff.c (prototypes).

	* w32/include/sub_proc.h: WIN32: prototypes for subproc.lib functions.

	* w32/include/w32err.h: WIN32: prototypes for w32err.c.

	* w32/pathstuff.c: WIN32: File and Path/Path conversion functions.

	* w32/subproc/build.bat: WIN32: build script for subproc library
	if you don't wish to use nmake.

	* w32/subproc/NMakefile: WIN32: Visual C compatible makefile for use
	with nmake. Used to build subproc library.

	* w32/subproc/misc.c: WIN32: subproc library support code
	* w32/subproc/proc.h: WIN32: subproc library support code
	* w32/subproc/sub_proc.c: WIN32: subproc library source code
	* w32/subproc/w32err.c: WIN32: subproc library support code
1996-05-22 21:51:45 +00:00
Roland McGrath
d369e0531a [WIN32]: No-op as for [MSDOS]. 1996-05-22 21:47:37 +00:00
Roland McGrath
6701f24bbb . 1996-05-22 21:25:55 +00:00
Roland McGrath
e76076e334 Wed May 22 17:24:51 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* makefile.vms: Set LOADLIBES.
	* makefile.com (link_using_library): Fix typo.
1996-05-22 21:25:45 +00:00
Roland McGrath
673e04af3a Mon May 13 14:37:42 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* GNUmakefile (vmsfiles): Fix typo.
1996-05-13 23:22:17 +00:00
Roland McGrath
bc8ac28654 . 1996-05-13 23:21:36 +00:00
Roland McGrath
95744a1491 Regenerated for 3.74.4 1996-05-13 23:16:46 +00:00
Roland McGrath
78f280d541 Updated from libc 1996-05-13 23:16:23 +00:00
Roland McGrath
44811ac351 . 1996-05-13 23:14:45 +00:00
Roland McGrath
6cf0e549f7 Updated from libc 1996-05-13 20:30:33 +00:00
Roland McGrath
25d9818333 . 1996-05-13 20:22:24 +00:00
Roland McGrath
2a905c5e5a Sun May 12 19:19:43 1996 Aaron Digulla <digulla@fh-konstanz.de>
* dir.c: New function: amigafy() to fold filenames
	Changes HASH() to HASHI() to fold filenames on Amiga.
	Stringcompares use strieq() instead of streq()
	The current directory on Amiga is "" instead of "."
	* file.c: Likewise.
1996-05-13 20:22:05 +00:00
Roland McGrath
0ddf0df13c Sun May 12 19:19:43 1996 Aaron Digulla <digulla@fh-konstanz.de>
* main.c: (main), variable.c Changed handling of ENV-vars. Make
	stores now the names of the variables only and reads their contents
	when they are accessed to reflect that these variables are really
	global (ie. they CAN change WHILE make runs !) This handling is
	made in lookup_variable()
	* variable.c: Handling of ENV variable happens inside lookup_variable()
1996-05-13 18:40:28 +00:00
Roland McGrath
b4dcc6f6bd Sun May 12 19:19:43 1996 Aaron Digulla <digulla@fh-konstanz.de>
* job.h: No envp on Amiga
1996-05-13 18:40:22 +00:00
Roland McGrath
c8484a6170 Sun May 12 19:19:43 1996 Aaron Digulla <digulla@fh-konstanz.de>
* main.c: (main), variable.c Changed handling of ENV-vars. Make
	stores now the names of the variables only and reads their contents
	when they are accessed to reflect that these variables are really
	global (ie. they CAN change WHILE make runs !) This handling is
	made in lookup_variable()
1996-05-13 18:40:11 +00:00
Roland McGrath
7431536bed Mon May 13 14:37:42 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* GNUmakefile (amigafiles): Add amiga.h.
Sun May 12 19:19:43 1996  Aaron Digulla   <digulla@fh-konstanz.de>

	* amiga.h: New file. Prototypes for amiga.c
1996-05-13 18:39:59 +00:00
Roland McGrath
678b14fb7e Sun May 12 19:19:43 1996 Aaron Digulla <digulla@fh-konstanz.de>
* function.c: Use special function wildcard_expansion() for
	$(wildcard ) to allow Amiga wildcards
	The current directory on Amiga is "" instead of "."
1996-05-13 18:39:52 +00:00
Roland McGrath
efbe1b6411 Sun May 12 19:19:43 1996 Aaron Digulla <digulla@fh-konstanz.de>
* README.Amiga: updated feature list
1996-05-13 18:39:46 +00:00
Roland McGrath
5fb14db85f Sun May 12 19:19:43 1996 Aaron Digulla <digulla@fh-konstanz.de>
* Makefile.ami: renamed file.h to filedep.h
	Updated dependencies
1996-05-13 18:39:40 +00:00
Roland McGrath
df99d7af1f Mon May 13 14:37:42 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* GNUmakefile (amigafiles): Add amiga.h.
1996-05-13 18:39:33 +00:00
Roland McGrath
db561cfc3e Sun May 12 19:19:43 1996 Aaron Digulla <digulla@fh-konstanz.de>
* read.c: "find_semicolon" is declared as static but never defined.
	No difference between Makefile and makefile on Amiga; added
	SMakefile to *default_makefiles[].
	(read_makefile) SAS/C want's two_colon and pattern_percent be set
	before use.
	The current directory on Amiga is "" instead of "."
	Strange #endif moved.
1996-05-13 18:39:02 +00:00
Roland McGrath
0feb1dd25f Sun May 12 19:19:43 1996 Aaron Digulla <digulla@fh-konstanz.de>
* make.h: Added HASHI(). This is the same as HASH() but converts
	it's second parameter to lowercase on Amiga to fold filenames.
1996-05-13 18:38:38 +00:00
Roland McGrath
e2d8bf4aa4 Sun May 12 19:19:43 1996 Aaron Digulla <digulla@fh-konstanz.de>
* job.c: No Pipes on Amiga, too
	(load_too_high) Neither on Amiga
	ENV variable on Amiga are in a special directory and are not
	passed as third argument to main().
1996-05-13 18:38:29 +00:00
Roland McGrath
dc27ebc311 Sun May 12 19:19:43 1996 Aaron Digulla <digulla@fh-konstanz.de>
* dir.c: New function: amigafy() to fold filenames
	Changes HASH() to HASHI() to fold filenames on Amiga.
	Stringcompares use strieq() instead of streq()
	The current directory on Amiga is "" instead of "."
1996-05-13 18:38:20 +00:00
Roland McGrath
989d9ecaae Sun May 12 19:19:43 1996 Aaron Digulla <digulla@fh-konstanz.de>
* amiga.c: New function wildcard_expansion(). Allows to use
	Amiga wildcards with $(wildcard )
	* amiga.h: New file. Prototypes for amiga.c
1996-05-13 18:38:15 +00:00
Roland McGrath
b0098dfd6a Sun May 12 19:19:43 1996 Aaron Digulla <digulla@fh-konstanz.de>
* read.c: "find_semicolon" is declared as static but never defined.
	No difference between Makefile and makefile on Amiga; added
	SMakefile to *default_makefiles[].
	(read_makefile) SAS/C want's two_colon and pattern_percent be set
	before use.
	The current directory on Amiga is "" instead of "."
	Strange #endif moved.
	* SMakefile: Updated dependencies
1996-05-13 18:38:10 +00:00
Roland McGrath
40a08e8a62 . 1996-05-09 20:07:56 +00:00
Roland McGrath
5e728dfa57 Thu May 9 13:54:49 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* commands.c (fatal_error_signal) [SIGQUIT]: Make SIGQUIT check
	conditional.
1996-05-09 20:07:14 +00:00
Roland McGrath
085eac4c74 Mention amiga port 1996-05-09 18:40:55 +00:00
Roland McGrath
085caaa900 Updated from libc 1996-05-09 18:29:30 +00:00
Roland McGrath
cc28a52f40 . 1996-05-09 18:28:25 +00:00
Roland McGrath
1e38c11f3c Thu May 9 13:54:49 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* function.c (expand_function) [_AMIGA]: Fix some typos.
	(patsubst_expand): Make len vars unsigned.
1996-05-09 18:28:15 +00:00
Roland McGrath
58af8d9dd1 Thu May 9 13:54:49 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* read.c (parse_file_seq): Use `int' for char arg to avoid widening
	conflict issues.
	* dep.h: Fix prototype.
1996-05-09 18:28:09 +00:00
Roland McGrath
abe5f64440 Thu May 9 13:54:49 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* main.c (main): Use unsigned for fread return.
1996-05-09 18:28:03 +00:00
Roland McGrath
68b9650616 Updated from libc 1996-05-09 18:16:24 +00:00
Roland McGrath
5dfa403ec8 (libc-srcdir): Use ../libc. 1996-05-09 18:10:49 +00:00
Roland McGrath
f7ecda9a35 Updated from libc 1996-05-09 18:06:45 +00:00
Roland McGrath
e99a3aca7e Thu May 9 13:54:49 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* GNUmakefile (globfiles): Add AmigaDOS support files.
	(distfiles): Add $(amigafiles).
	(amigafiles): New variable.

Thu Nov  7 10:18:16 1995  Aaron Digulla   <digulla@fh-konstanz.de>

	* Added Amiga support in commands.c, dir.c, function.c,
	job.c, main.c, make.h, read.c, remake.c
	* commands.c: Amiga has neither SIGHUP nor SIGQUIT
	* dir.c: Amiga has filenames with Upper- and Lowercase,
	but "FileName" is the same as "filename". Added strieq()
	which is use to compare filenames. This is like streq()
	on all other systems. Also there is no such thing as
	"." under AmigaDOS.
	* function.c: On Amiga, the environment is not passed as envp,
	there are no pipes and Amiga can't fork. Use my own function
	to create a new child.
	* job.c: default_shell is "" (The system automatically chooses
	a shell for me). Have to use the same workaround as MSDOS for
	running batch commands. Added HAVE_SYS_PARAM_H. NOFILE isn't
	known on Amiga. Cloned code to run children from MSDOS. Own
	version of sh_chars[] and sh_cmds[]. No dup2() or dup() on Amiga.
	* main.c: Force stack to 20000 bytes. Read environment from ENV:
	device. On Amiga, exec_command() does return, so I exit()
	afterwards.
	* make.h: Added strieq() to compare filenames.
	* read.c: Amiga needs special extension to have passwd. Only
	one include-dir. "Makefile" and "makefile" are the same.
	Added "SMakefile".  Added special code to handle device names (xxx:)
	and "./" in rules.
	* remake.c: Only one lib-dir. Amiga link-libs are named "%s.lib"
	instead of "lib%s.a".
	* main.c, rule.c, variable.c: Avoid floats at all costs.
	* vpath.c: Get rid of as many alloca()s as possible.
1996-05-09 18:02:06 +00:00
Roland McGrath
73c52a3b12 Thu May 9 13:20:43 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* read.c (read_makefile): Grok `sinclude' as alias for `-include'.
1996-05-09 17:28:47 +00:00
Roland McGrath
4679c702de Document "sinclude". 1996-05-09 17:25:54 +00:00
Roland McGrath
59cb26b58b Note "sinclude". 1996-05-09 17:24:04 +00:00
Roland McGrath
386e27b622 Update date to 20 March 96 1996-05-09 17:07:56 +00:00
Richard M. Stallman
68db062e1e Avoid symlinks if possible. 1996-05-06 03:45:23 +00:00
Roland McGrath
a67e842fb1 . 1996-03-20 15:01:50 +00:00
Roland McGrath
712c43dde1 [HAVE_STRING_H]: Include string.h. 1996-03-20 14:59:27 +00:00
Roland McGrath
c0e8c1012d moved to filedef.h 1996-03-20 14:58:34 +00:00
Roland McGrath
c97502625c Wed Mar 20 09:52:27 1996 Roland McGrath <roland@charlie-brown.gnu.ai.mit.edu>
* GNUmakefile (vmsfiles): New variable.
	(distfiles): Include $(vmsfiles).
1996-03-20 14:58:18 +00:00
Roland McGrath
9e443adaf6 Tue Mar 19 20:21:34 1996 Roland McGrath <roland@charlie-brown.gnu.ai.mit.edu>
Merged VMS port from Klaus Kaempf <kkaempf@didymus.rmi.de>.
	* make.h (PARAMS): New macro.
	* config.h-vms: New file.
	* makefile.com: New file.
	* makefile.vms: New file.
	* readme.vms: New file.
	* vmsdir.h: New file.
	* vmsfunctions.c: New file.
	* vmsify.c: New file.
	* file.h: Renamed to filedef.h to avoid conflict with VMS system hdr.
	* ar.c: Added prototypes and changes for VMS.
	* commands.c: Likewise.
	* commands.h: Likewise.
	* default.c: Likewise.
	* dep.h: Likewise.
	* dir.c: Likewise.
	* expand.c: Likewise.
	* file.c: Likewise.
	* function.c: Likewise.
	* implicit.c: Likewise.
	* job.c: Likewise.
	* job.h: Likewise.
	* main.c: Likewise.
	* make.h: Likewise.
	* misc.c: Likewise.
	* read.c: Likewise.
	* remake.c: Likewise.
	* remote-stub.c: Likewise.
	* rule.c: Likewise.
	* rule.h: Likewise.
	* variable.c: Likewise.
	* variable.h: Likewise.
	* vpath.c: Likewise.
	* compatMakefile (srcs): Rename file.h to filedef.h.
1996-03-20 14:57:41 +00:00
Roland McGrath
dfefc77263 Regenerated 1996-03-20 14:55:13 +00:00
Roland McGrath
ee7af57e3c Updated from libc 1996-03-20 03:12:54 +00:00
Roland McGrath
46a1497b8e (NULL): Define only if not already defined. 1996-03-20 01:08:11 +00:00
Roland McGrath
4603f9f8c6 [HAVE_STRING_H]: Include string.h.
[HAVE_STDLIB_H]: Include stdlib.h.
1996-03-20 01:07:36 +00:00
Roland McGrath
b2a22df721 RMS documented his .SECONDARY feature. 1996-03-20 00:58:43 +00:00
Roland McGrath
89785948f6 . 1996-03-20 00:57:43 +00:00
Roland McGrath
8b2aca5930 Sun Jul 30 00:49:53 1995 Richard Stallman <rms@mole.gnu.ai.mit.edu>
* file.h (struct file): New field `secondary'.
	* file.c (snap_deps): Check for .INTERMEDIATE and .SECONDARY.
	(remove_intermediates): Don't delete .SECONDARY files.
1996-03-20 00:56:52 +00:00
Roland McGrath
b8ea37e31c Sat Aug 19 23:11:00 1995 Richard Stallman <rms@mole.gnu.ai.mit.edu>
* remake.c (check_dep): For a secondary file, try implicit and
	default rules if appropriate.
Wed Aug  2 04:29:42 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>

	* remake.c (check_dep): If an intermediate file exists,
	do consider its actual date.
1996-03-20 00:56:45 +00:00
Roland McGrath
e044fe76f6 Add '96 to copyright years. 1996-03-04 17:59:44 +00:00
Roland McGrath
557392f016 Minor tweaks to fix overfull & underfull hboxes in fmting make man. 1996-03-04 17:57:41 +00:00
Roland McGrath
eaecc11501 . 1996-03-02 21:27:49 +00:00
Roland McGrath
b25f811f51 Sat Mar 2 16:26:52 1996 Roland McGrath <roland@charlie-brown.gnu.ai.mit.edu>
* compatMakefile (srcs): Add getopt.h; prepend $(srcdir)/ to getopt*.
1996-03-02 21:27:40 +00:00
Roland McGrath
34b0c6b3b4 (Standard Targets): Use @smallexample. 1996-03-01 21:47:33 +00:00
106 changed files with 18989 additions and 7657 deletions

50
AUTHORS Normal file
View File

@@ -0,0 +1,50 @@
-----------------------------------
GNU make development up to version 3.75 by:
Roland McGrath <roland@gnu.ai.mit.edu>
GNU Make User's Manual written by:
Richard M. Stallman <rms@gnu.ai.mit.edu>
User's Manual edited by:
Roland McGrath <roland@gnu.ai.mit.edu>
Bob Chassell <bob@gnu.ai.mit.edu>
Melissa Weisshaus <melissa@gnu.ai.mit.edu>
Development and maintenance starting with GNU make 3.76 by:
Paul D. Smith <psmith@gnu.ai.mit.edu>
-----------------------------------
GNU Make porting efforts:
Port to VMS by:
Klaus Kaempf <kkaempf@progis.de>
Archive support/Bug fixes by John W. Eaton <jwe@bevo.che.wisc.edu>
Port to Amiga by:
Aaron Digulla <digulla@fh-konstanz.de>
Port to MS-DOS (DJGPP) and MS-Windows 95/NT by:
DJ Delorie <dj@delorie.com>
Rob Tulloh <rob_tulloh@tivoli.com>
Eli Zaretskii <eliz@is.elta.co.il>
-----------------------------------
Other contributors:
Janet Carson <janet_carson@tivoli.com>
Paul Eggert <eggert@twinsun.com>
Klaus Heinz <kamar@ease.rhein-main.de>
Michael Joosten
Jim Kelton <jim_kelton@tivoli.com>
David Lubbren <uhay@rz.uni-karlsruhe.de>
Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
Carl Staelin (Princeton University)
Ian Stewartson (Data Logic Limited)
With suggestions/comments/bug reports from a cast of ... well ...
hundreds, anyway :)

View File

@@ -2,7 +2,8 @@
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
675 Mass Ave, Cambridge, MA 02139, USA
59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
@@ -305,7 +306,7 @@ the "copyright" line and a pointer to where the full notice is found.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Also add information on how to contact you by electronic and paper mail.

763
ChangeLog
View File

@@ -1,10 +1,769 @@
Tue Sep 16 10:18:22 1997 Paul D. Smith <psmith@baynetworks.com>
* Version 3.76 released.
Tue Sep 2 10:07:39 1997 Paul D. Smith <psmith@baynetworks.com>
* function.c (expand_function): When processing $(shell...)
translate a CRLF (\r\n) sequence as well as a newline (\n) to a
space. Also remove an ending \r\n sequence.
* make.texinfo (Shell Function): Document it.
Fri Aug 29 12:59:06 1997 Rob Tulloh <rob_tulloh@tivoli.com>
* w32/pathstuff.c (convert_Path_to_windows32): Fix problem where
paths which contain single character entries like `.' are not
handled correctly.
* README.W32: Document path handling issues on Windows systems.
Fri Aug 29 02:01:27 1997 Paul D. Smith <psmith@baynetworks.com>
* Version 3.75.93.
Thu Aug 28 19:39:06 1997 Rob Tulloh <rob_tulloh@tivoli.com>
* job.c (exec_command): [WINDOWS32] If exec_command() is invoked
from main() to re-exec make, the call to execvp() would
incorrectly return control to parent shell before the exec'ed
command could run to completion. I believe this is a feature of
the way that execvp() is implemented on top of WIN32 APIs. To
alleviate the problem, use the supplied process launch function in
the sub_proc library and suspend the parent process until the
child process has run. When the child exits, exit the parent make
with the exit code of the child make.
Thu Aug 28 17:04:47 1997 Paul D. Smith <psmith@baynetworks.com>
* Makefile.DOS.template (distdir): Fix a line that got wrapped in
email.
* Makefile.am (loadavg): Give the necessary cmdline options when
linking loadavg.
* configure.in: Check for pstat_getdynamic for getloadvg on HP.
* job.c (start_job_command): [VMS,_AMIGA] Don't perform empty
command optimization on these systems; it doesn't make sense.
Wed Aug 27 17:09:32 1997 Paul D. Smith <psmith@baynetworks.com>
* Version 3.75.92
Tue Aug 26 11:59:15 1997 Paul D. Smith <psmith@baynetworks.com>
* main.c (print_version): Add '97 to copyright years.
* read.c (do_define): Check the length of the array before looking
at a particular offset.
* job.c (construct_command_argv_internal): Examine the last byte
of the previous arg, not the byte after that.
Sat Aug 23 1997 Eli Zaretskii <eliz@is.elta.co.il>
* Makefile.DOS.template: New file (converted to Makefile.DOS in
the distribution).
* configure.bat: Rewrite to use Makefile.DOS instead of editing
Makefile.in. Add support for building from outside of the source
directory. Fail if the environment block is too small.
* configh.dos: Use <sys/config.h>.
* README.DOS: Update instructions.
Fri Aug 22 1997 Eli Zaretskii <eliz@is.elta.co.il>
* job.c (start_job_command): [__MSDOS__] Don't test for "/bin/sh"
literally, use value of unixy_shell instead.
* filedef.h (NEW_MTIME): Use 1 less than maximum possible value if
time_t is unsigned.
Sat Aug 16 00:56:15 1997 John W. Eaton <jwe@bevo.che.wisc.edu>
* vmsify.c (vmsify, case 11): After translating `..' elements, set
nstate to N_OPEN if there are still more elements to process.
(vmsify, case 2): After translating `foo/bar' up to the slash,
set nstate to N_OPEN, not N_DOT.
Fri Aug 8 15:18:09 1997 John W. Eaton <jwe@bevo.che.wisc.edu>
* dir.c (vmsstat_dir): Leave name unmodified on exit.
* make.h (PATH_SEPARATOR_CHAR): Set to comma for VMS.
* vpath.c: Fix comments to refer to path separator, not colon.
(selective_vpath_search): Avoid Unixy slash handling for VMS.
Thu Aug 7 22:24:03 1997 John W. Eaton <jwe@bevo.che.wisc.edu>
* ar.c: [VMS] Don't declare ar_member_touch.
Delete VMS version of ar_member_date.
Enable non-VMS versions of ar_member_date and ar_member_date_1 for
VMS too.
* arscan.c (VMS_get_member_info): New function.
(ar_scan): Provide version for VMS systems.
(ar_name_equal): Simply compare name and mem on VMS systems.
Don't define ar_member_pos or ar_member_touch on VMS systems.
* config.h-vms (pid_t, uid_t): Don't define.
* remake.c: Delete declaration of vms_stat.
(name_mtime): Don't call vms_stat.
(f_mtime): [VMS] Funky time value manipulation no longer necessary.
* file.c (print_file): [VMS] Use ctime, not cvt_time.
* make.h: [VMS] Don't define POSIX.
* makefile.com (filelist): Include ar and arscan.
Also include them in the link commands.
Don't define NO_ARCHIVES in cc command.
* makefile.vms (ARCHIVES, ARCHIVES_SRC): Uncomment.
(defines): Delete NO_ARCHIVES from list.
* remake.c (f_mtime): Only check to see if intermediate file is
out of date if it also exists (i.e., mtime != (time_t) -1).
* vmsdir.h (u_long, u_short): Skip typedefs if using DEC C.
Fri Jun 20 23:02:07 1997 Rob Tulloh <rob_tulloh@tivoli.com>
* w32/subproc/sub_proc.c: Get W32 sub_proc to handle shebang
(#!/bin/sh) in script files correctly.
Fixed a couple of memory leaks.
Fixed search order in find_file() (w32/subproc/sub_proc.c) so that
files with extensions are preferred over files without extensions.
Added search for files with .cmd extension too.
* w32/subproc/misc.c (arr2envblk): Fixed memory leak.
Mon Aug 18 09:41:08 1997 Paul D. Smith <psmith@baynetworks.com>
* Version 3.75.91
Fri Aug 15 13:50:54 1997 Paul D. Smith <psmith@baynetworks.com>
* read.c (do_define): Remember to count the newline after the endef.
Thu Aug 14 23:14:37 1997 Paul D. Smith <psmith@baynetworks.com>
* many: Rewrote builds to use Automake 1.2.
* AUTHORS: New file.
* maintMakefile: Contains maintainer-only make snippets.
* GNUmakefile: This now only runs the initial auto* tools.
* COPYING,texinfo.tex,mkinstalldirs,install-sh: Removed (obtained
automatically by automake).
* compatMakefile: Removed (not needed anymore).
* README,build.sh.in: Removed (built from templates).
* config.h.in,Makefile.in: Removed (built by tools).
Wed Aug 13 02:22:08 1997 Paul D. Smith <psmith@baynetworks.com>
* make.texinfo: Updates for DOS/Windows information (Eli Zaretskii)
* README,README.DOS: Ditto.
* remake.c (update_file_1,f_mtime): Fix GPATH handling.
* vpath.c (gpath_search): Ditto.
* file.c (rename_file): New function: rehash, but also rename to
the hashname.
* filedef.h: Declare it.
* variable.c (merge_variable_set_lists): Remove free() of variable
set; since various files can share variable sets we don't want to
free them here.
Tue Aug 12 10:51:54 1997 Paul D. Smith <psmith@baynetworks.com>
* configure.in: Require autoconf 2.12
* make.texinfo: Replace all "cd subdir; $(MAKE)" examples with a
more stylistically correct "cd subdir && $(MAKE)".
* main.c: Global variable `clock_skew_detected' defined.
(main): Print final warning if it's set.
* make.h: Declare it.
* remake.c (f_mtime): Test and set it.
* job.c (start_job_command): Add special optimizations for
"do-nothing" rules, containing just the shell no-op ":". This is
useful for timestamp files and can make a real difference if you
have a lot of them (requested by Fergus Henderson <fjh@cs.mu.oz.au>).
* configure.in,Makefile.in: Rewrote to use the new autoconf
program_transform_name macro.
* function.c (function_strip): Strip newlines as well as spaces
and TABs.
Fri Jun 6 23:41:04 1997 Rob Tulloh <rob_tulloh@tivoli.com>
* remake.c (f_mtime): Datestamps on FAT-based files are rounded to
even seconds when stored, so if the date check fails on WINDOWS32
systems, see if this "off-by-one" error is the problem.
* General: If your TZ environment variable is not set correctly
then all your timestamps will be off by hours. So, set it!
Mon Apr 7 02:06:22 1997 Paul D. Smith <psmith@baynetworks.com>
* Version 3.75.1
* compatMakefile (objs): Define & use the $(GLOB) variable so
that it's removed correctly from build.sh.in when it's built.
* configure.in: On Solaris we can use the kstat_*() functions to
get load averages without needing special permissions. Add a
check for -lkstat to see if we have it.
* getloadavg.c (getloadavg): Use HAVE_LIBKSTAT instead of SUN5 as
the test to enable kstat_open(), etc. processing.
Fri Apr 4 20:21:18 1997 Eli Zaretskii <eliz@is.elta.co.il>
* <lots>: Fixes to work in the DJGPP DOS environment.
Mon Mar 31 02:42:52 1997 Paul D. Smith <psmith@baynetworks.com>
* function.c (expand_function): Added new function $(wordlist).
* make.texinfo (Filename Functions): Document $(wordlist) function.
* vpath.c (build_vpath_lists): Construct the GPATH variable
information in the same manner we used to construct VPATH.
(gpath_search): New function to search GPATH.
* make.h: Declare the new function.
* remake.c (update_file_1): Call it, and keep VPATH if it's found.
* make.texinfo (Search Algorithm): Document GPATH variable.
Sun Mar 30 20:57:16 1997 Paul D. Smith <psmith@baynetworks.com>
* main.c (handle_non_switch_argument): Defined the MAKECMDGOALS
variable to contain the user options passed in on the cmd line.
* make.texinfo (Goals): Document MAKECMDGOALS variable.
* remake.c (f_mtime): Print a warning if we detect a clock skew
error, rather than failing.
* main.c (main): If we rebuild any makefiles and need to re-exec,
add "-o<mkfile>" options for each makefile rebuilt to avoid
infinite looping.
Fri Mar 28 15:26:05 1997 Paul D. Smith <psmith@baynetworks.com>
* job.c (construct_command_argv_internal): Track whether the last
arg in the cmd string was empty or not (Roland).
(construct_command_argv_internal): If the shell line is empty,
don't do anything (Roland).
* glob/glob.h,glob/glob.c,glob/fnmatch.c,glob/fnmatch.h: Install
the latest changes from the GLIBC version of glob (Ulrich Drepper).
* getloadavg.c,make-stds.texi: New version (Roland).
* (ALL): Changed WIN32 to W32 or WINDOWS32 (RMS).
Mon Mar 24 15:33:34 1997 Rob Tulloh <rob_tulloh@tivoli.com>
* README.W32: Describe preliminary FAT support.
* build_w32.bat: Use a variable for the final exe name.
* dir.c (find_directory): W32: Find the filesystem type.
(dir_contents_file_exists_p): W32: for FAT filesystems, always
rehash since FAT doesn't change directory mtime on change.
* main.c (handle_runtime_exceptions): W32: Add an
UnhandledExceptionFilter so that when make bombs due to ^C or a
bug, it won't cause a GUI requestor to pop up unless debug is
turned on.
(main): Call it.
Mon Mar 24 00:57:34 1997 Paul D. Smith <psmith@baynetworks.com>
* configure.in, config.h.in, config.ami, config.h-vms, config.h.w32:
Check for memmove() function.
* make.h (bcopy): If memmove() available, define bcopy() to use it.
Otherwise just use bcopy(). Don't use memcpy(); it's not guaranteed
to handle overlapping moves.
* read.c (read_makefile): Fix some uninitialized memory reads
(reported by Purify).
* job.c (construct_command_argv_internal): Use bcopy() not
strcpy(); strcpy() isn't guaranteed to handle overlapping moves.
* Makefile.in: Change install-info option ``--infodir'' to
``--info-dir'' for use with new texinfo.
* function.c (expand_function): $(basename) and $(suffix) should
only search for suffixes as far back as the last directory (e.g.,
only the final filename in the path).
Sun Mar 23 00:13:05 1997 Paul D. Smith <psmith@baynetworks.com>
* make.texinfo: Add @dircategory/@direntry information.
(Top): Remove previous reference to (dir) (from RMS).
(Static Usage): Add "all:" rule to example.
(Automatic Dependencies): fix .d file creation example.
* Install VPATH+ patch:
* filedef.h (struct file): Add in hname field to store the hashed
filename, and a flag to remember if we're using the vpath filename
or not. Renamed a few functions for more clarity.
* file.c (lookup_file,enter_file,file_hash_enter): Store filenames
in the hash table based on their "hash name". We can change this
while keeping the original target in "name".
(rehash_file): Renamed from "rename_file" to be more accurate.
Changes the hash name, but not the target name.
* remake.c (update_file_1): Modify -d output for more detailed
VPATH info. If we don't need to rebuild, use the VPATH name.
(f_mtime): Don't search for vpath if we're ignoring it. Call
renamed function rehash_file. Call name_mtime instead of
file_mtime, to avoid infinite recursion since the file wasn't
actually renamed.
* implicit.c (pattern_search): if we find an implicit file in
VPATH, save the original name not the VPATH name.
* make.texinfo (Directory Search): Add a section on the new VPATH
functionality.
Sun Dec 1 18:36:04 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* dir.c (file_exists_p, file_impossible, file_impossible_p): If
dirname is empty replace it by the name of the root directory.
Note that this doesn't work (yet) for W32, Amiga, or VMS.
Tue Oct 08 13:57:03 1996 Rob Tulloh <tulloh@tivoli.com>
* main.c (main): W32 bug fix for PATH vars.
Tue Sep 17 1996 Paul Eggert <eggert@twinsun.com>
* filedef.h (NEW_MTIME): Don't assume that time_t is a signed
32-bit quantity.
* make.h: (CHAR_BIT, INTEGER_TYPE_SIGNED, INTEGER_TYPE_MAXIMUM,
INTEGER_TYPE_MINIMUM): New macros.
Tue Aug 27 01:06:34 1996 Roland McGrath <roland@baalperazim.frob.com>
* Version 3.75 released.
* main.c (print_version): Print out bug-reporting address.
Mon Aug 26 19:55:47 1996 Roland McGrath <roland@baalperazim.frob.com>
* main.c (print_data_base): Don't declare ctime; headers do it for us
already.
Sun Jul 28 15:37:09 1996 Rob Tulloh (tulloh@tivoli.com)
* w32/pathstuff.c: Turned convert_vpath_to_w32() into a
real function. This was done so that VPATH could contain
white space separated pathnames. Please note that directory
paths (in VPATH/vpath context) containing white space are not
supported (just as they are not under Unix). See README.W32
for suggestions.
* w32/include/pathstuff.h: Added prototype for the new
function convert_vpath_to_w32. Deleted macro for same.
* README.W32: Added some notes about why I chose not to try
and support pathnames which contain white space and some
workaround suggestions.
Thu Jul 25 19:53:31 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* GNUmakefile (mkdep-nolib): Use -MM option unconditionally.
* Version 3.74.7.
* main.c (define_makeflags): Back up P to point at null terminator
when killing final space and dash before setting MFLAGS.
From Robert Hoehne <robert.hoehne@Mathematik.TU-Chemnitz.DE>:
* dir.c [__MSDOS__] [DJGPP > 1]: Include <libc/dosio.h> and defin
`__opendir_flags' initialized to 0.
[__MSDOS__] (dosify) [DJGPP > 1]: Return name unchanged if _USE_LFN.
(find_directory) [__MSDOS__ && DJGPP > 1]: If _USE_LGN, set
__opendir_flags to __OPENDIR_PRESERVE_CASE.
* vmsfunctions.c (vms_stat): `sys$dassgn (DevChan);' added by kkaempf.
* GNUmakefile (w32files): Add NMakefile.
* NMakefile (LDFLAGS_debug): Value fixed by tulloh.
Sat Jul 20 12:32:10 1996 Klaus Kämpf (kkaempf@progis.de)
* remake.c (f_mtime) [VMS]: Add missing `if' conditional for future
modtime check.
* config.h-vms, makefile.vms, readme.vms, vmsify.c: Update address.
Sat Jul 20 05:29:43 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* configure.in: Require autoconf 2.10 or later.
Fri Jul 19 16:57:27 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* Version 3.74.6.
* GNUmakefile (w32files): New variable.
(distfiles): Add it.
* w32: Updated by Rob Tulloh.
* makefile.vms (LOADLIBES): Fix typo.
Sun Jul 14 12:59:27 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* job.c (construct_command_argv_internal): Fix up #else, #endifs.
* configh.dos: Define HAVE_DIRENT_H instead of DIRENT.
* remake.c (f_mtime): Don't compare MTIME to NOW if MTIME == -1.
* Version 3.74.5.
* main.c (main): Exit with status 2 when update_goal_chain returns 2.
Sat Jun 22 14:56:05 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* configure.in: Don't check for _sys_siglist.
* make.h [HAVE__SYS_SIGLIST]: Don't test this; just punt if there is
no strsignal or sys_siglist.
* read.c (conditional_line): Strip ws in `ifeq (a , b)' so it is the
same as `ifeq (a, b)'.
* job.c (reap_children): Don't call die if handling_fatal_signal.
* file.c (file_hash_enter): Allow renaming :: to : when latter is
non-target, or : to :: when former is non-target.
* job.c (start_job_command): Call block_sigs.
(block_sigs): New function, broken out of start_job_command.
(reap_children): Block fatal signals around removing dead child from
chain and adjusting job_slots_used.
* job.h: Declare block_sigs.
* remote-stub.c (remote_setup, remote_cleanup): New (empty) functions.
* main.c (main): Call remote_setup.
(die): Call remote_cleanup.
* job.c (reap_children): Quiescent value of shell_function_pid is
zero, not -1.
* main.c (print_version): Add 96 to copyright years.
Sat Jun 15 20:30:01 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* read.c (find_char_unquote): Avoid calling strlen on every call
just to throw away the value most of the time.
Sun Jun 2 12:24:01 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* main.c (decode_env_switches): Prepend '-' to ARGV[1] if it contains
no '=', regardless of ARGC.
(define_makeflags): Elide leading '-' from MAKEFLAGS value if first
word is short option, regardless of WORDS.
Wed May 22 17:24:51 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* makefile.vms: Set LOADLIBES.
* makefile.com (link_using_library): Fix typo.
Wed May 15 17:37:26 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* dir.c (print_dir_data_base): Use %ld dev and ino and cast them to
long.
Wed May 15 10:14:14 CDT 1996 Rob Tulloh <tulloh@tivoli.com>
* dir.c: W32 does not support inode. For now, fully qualified
pathname along with st_mtime will be keys for files.
Fixed problem where vpath can be confused when files
are added to a directory after the directory has already been
read in. The code now attempts to reread the directory if it
discovers that the datestamp on the directory has changed since
it was cached by make. This problem only seems to occur on W32
right now so it is lumped under port #ifdef WINDOWS32.
* function.c: W32: call subproc library (CreateProcess()) instead of
fork/exec.
* job.c: W32: Added the code to do fork/exec/waitpid style processing
on W32 systems via calls to subproc library.
* main.c: W32: Several things added here. First, there is code
for dealing with PATH and SHELL defaults. Make tries to figure
out if the user has %PATH% set in the environment and sets it to
%Path% if it is not set already. Make also looks to see if sh.exe
is anywhere to be found. Code path through job.c will change
based on existence of a working Bourne shell. The checking for
default shell is done twice: once before makefiles are read in
and again after. Fall back to MSDOS style execution mode if no sh.exe
is found. Also added some debug support that allows user to pause make
with -D switch and attach a debugger. This is especially useful for
debugging recursive calls to make where problems appear only in the
sub-make.
* make.h: W32: A few macros and header files for W32 support.
* misc.c: W32: Added a function end_of_token_w32() to assist
in parsing code in read.c.
* read.c: W32: Fixes similar to MSDOS which allow colon to
appear in filenames. Use of colon in filenames would otherwise
confuse make.
* remake.c: W32: Added include of io.h to eliminate compiler
warnings. Added some code to default LIBDIR if it is not set
on W32.
* variable.c: W32: Added support for detecting Path/PATH
and converting them to semicolon separated lists for make's
internal use. New function sync_Path_environment()
which is called in job.c and function.c before creating a new
process. Caller must set Path in environment since we don't
have fork() to do this for us.
* vpath.c: W32: Added detection for filenames containing
forward or backward slashes.
* NMakefile: W32: Visual C compatible makefile for use with nmake.
Use this to build GNU make the first time on Windows NT or Windows 95.
* README.W32: W32: Contains some helpful notes.
* build_w32.bat: W32: If you don't like nmake, use this the first
time you build GNU make on Windows NT or Windows 95.
* config.h.W32: W32 version of config.h
* subproc.bat: W32: A bat file used to build the
subproc library from the top-level NMakefile. Needed because
WIndows 95 (nmake) doesn't allow you to cd in a make rule.
* w32/include/dirent.h
* w32/compat/dirent.c: W32: opendir, readdir, closedir, etc.
* w32/include/pathstuff.h: W32: used by files needed functions
defined in pathstuff.c (prototypes).
* w32/include/sub_proc.h: W32: prototypes for subproc.lib functions.
* w32/include/w32err.h: W32: prototypes for w32err.c.
* w32/pathstuff.c: W32: File and Path/Path conversion functions.
* w32/subproc/build.bat: W32: build script for subproc library
if you don't wish to use nmake.
* w32/subproc/NMakefile: W32: Visual C compatible makefile for use
with nmake. Used to build subproc library.
* w32/subproc/misc.c: W32: subproc library support code
* w32/subproc/proc.h: W32: subproc library support code
* w32/subproc/sub_proc.c: W32: subproc library source code
* w32/subproc/w32err.c: W32: subproc library support code
Mon May 13 14:37:42 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* Version 3.74.4.
* GNUmakefile (vmsfiles): Fix typo.
* GNUmakefile (amigafiles): Add amiga.h.
Sun May 12 19:19:43 1996 Aaron Digulla <digulla@fh-konstanz.de>
* dir.c: New function: amigafy() to fold filenames
Changes HASH() to HASHI() to fold filenames on Amiga.
Stringcompares use strieq() instead of streq()
The current directory on Amiga is "" instead of "."
* file.c: Likewise.
* amiga.c: New function wildcard_expansion(). Allows to use
Amiga wildcards with $(wildcard )
* amiga.h: New file. Prototypes for amiga.c
* function.c: Use special function wildcard_expansion() for
$(wildcard ) to allow Amiga wildcards
The current directory on Amiga is "" instead of "."
* job.c: No Pipes on Amiga, too
(load_too_high) Neither on Amiga
ENV variable on Amiga are in a special directory and are not
passed as third argument to main().
* job.h: No envp on Amiga
* make.h: Added HASHI(). This is the same as HASH() but converts
it's second parameter to lowercase on Amiga to fold filenames.
* main.c: (main), variable.c Changed handling of ENV-vars. Make
stores now the names of the variables only and reads their contents
when they are accessed to reflect that these variables are really
global (ie. they CAN change WHILE make runs !) This handling is
made in lookup_variable()
* Makefile.ami: renamed file.h to filedep.h
Updated dependencies
* read.c: "find_semicolon" is declared as static but never defined.
No difference between Makefile and makefile on Amiga; added
SMakefile to *default_makefiles[].
(read_makefile) SAS/C want's two_colon and pattern_percent be set
before use.
The current directory on Amiga is "" instead of "."
Strange #endif moved.
* README.Amiga: updated feature list
* SMakefile: Updated dependencies
* variable.c: Handling of ENV variable happens inside lookup_variable()
Sat May 11 17:58:32 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* variable.c (try_variable_definition): Count parens in lhs variable
refs to avoid seeing =/:=/+= inside a ref.
Thu May 9 13:54:49 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* commands.c (fatal_error_signal) [SIGQUIT]: Make SIGQUIT check
conditional.
* main.c (main): Use unsigned for fread return.
* read.c (parse_file_seq): Use `int' for char arg to avoid widening
conflict issues.
* dep.h: Fix prototype.
* function.c (expand_function) [_AMIGA]: Fix some typos.
(patsubst_expand): Make len vars unsigned.
* GNUmakefile (globfiles): Add AmigaDOS support files.
(distfiles): Add $(amigafiles).
(amigafiles): New variable.
Thu Nov 7 10:18:16 1995 Aaron Digulla <digulla@fh-konstanz.de>
* Added Amiga support in commands.c, dir.c, function.c,
job.c, main.c, make.h, read.c, remake.c
* commands.c: Amiga has neither SIGHUP nor SIGQUIT
* dir.c: Amiga has filenames with Upper- and Lowercase,
but "FileName" is the same as "filename". Added strieq()
which is use to compare filenames. This is like streq()
on all other systems. Also there is no such thing as
"." under AmigaDOS.
* function.c: On Amiga, the environment is not passed as envp,
there are no pipes and Amiga can't fork. Use my own function
to create a new child.
* job.c: default_shell is "" (The system automatically chooses
a shell for me). Have to use the same workaround as MSDOS for
running batch commands. Added HAVE_SYS_PARAM_H. NOFILE isn't
known on Amiga. Cloned code to run children from MSDOS. Own
version of sh_chars[] and sh_cmds[]. No dup2() or dup() on Amiga.
* main.c: Force stack to 20000 bytes. Read environment from ENV:
device. On Amiga, exec_command() does return, so I exit()
afterwards.
* make.h: Added strieq() to compare filenames.
* read.c: Amiga needs special extension to have passwd. Only
one include-dir. "Makefile" and "makefile" are the same.
Added "SMakefile". Added special code to handle device names (xxx:)
and "./" in rules.
* remake.c: Only one lib-dir. Amiga link-libs are named "%s.lib"
instead of "lib%s.a".
* main.c, rule.c, variable.c: Avoid floats at all costs.
* vpath.c: Get rid of as many alloca()s as possible.
Thu May 9 13:20:43 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* read.c (read_makefile): Grok `sinclude' as alias for `-include'.
Wed Mar 20 09:52:27 1996 Roland McGrath <roland@charlie-brown.gnu.ai.mit.edu>
* GNUmakefile (vmsfiles): New variable.
(distfiles): Include $(vmsfiles).
Tue Mar 19 20:21:34 1996 Roland McGrath <roland@charlie-brown.gnu.ai.mit.edu>
Merged VMS port from Klaus Kaempf <kkaempf@didymus.rmi.de>.
* make.h (PARAMS): New macro.
* config.h-vms: New file.
* makefile.com: New file.
* makefile.vms: New file.
* readme.vms: New file.
* vmsdir.h: New file.
* vmsfunctions.c: New file.
* vmsify.c: New file.
* file.h: Renamed to filedef.h to avoid conflict with VMS system hdr.
* ar.c: Added prototypes and changes for VMS.
* commands.c: Likewise.
* commands.h: Likewise.
* default.c: Likewise.
* dep.h: Likewise.
* dir.c: Likewise.
* expand.c: Likewise.
* file.c: Likewise.
* function.c: Likewise.
* implicit.c: Likewise.
* job.c: Likewise.
* job.h: Likewise.
* main.c: Likewise.
* make.h: Likewise.
* misc.c: Likewise.
* read.c: Likewise.
* remake.c: Likewise.
* remote-stub.c: Likewise.
* rule.c: Likewise.
* rule.h: Likewise.
* variable.c: Likewise.
* variable.h: Likewise.
* vpath.c: Likewise.
* compatMakefile (srcs): Rename file.h to filedef.h.
Sat Aug 19 23:11:00 1995 Richard Stallman <rms@mole.gnu.ai.mit.edu>
* remake.c (check_dep): For a secondary file, try implicit and
default rules if appropriate.
Wed Aug 2 04:29:42 1995 Richard Stallman <rms@mole.gnu.ai.mit.edu>
* remake.c (check_dep): If an intermediate file exists,
do consider its actual date.
Sun Jul 30 00:49:53 1995 Richard Stallman <rms@mole.gnu.ai.mit.edu>
* file.h (struct file): New field `secondary'.
* file.c (snap_deps): Check for .INTERMEDIATE and .SECONDARY.
(remove_intermediates): Don't delete .SECONDARY files.
Sat Mar 2 16:26:52 1996 Roland McGrath <roland@charlie-brown.gnu.ai.mit.edu>
* compatMakefile (srcs): Add getopt.h; prepend $(srcdir)/ to getopt*.
Fri Mar 1 12:04:47 1996 Roland McGrath <roland@charlie-brown.gnu.ai.mit.edu>
* Version 3.74.3.
* remake.c (f_mtime): Move future modtime check before FILE is
clobbered by :: loop.
* Version 3.74.3.
* dir.c: Use canonical code from autoconf manual for dirent include.
[_D_NAMLEN]: Redefine NAMLEN using this.
(dir_contents_file_exists_p): Use NAMLEN macro.

View File

@@ -1,288 +1,54 @@
# GNU Make-specific makefile for GNU Make.
# Copyright (C) 1990, 91, 92, 93, 94, 95 Free Software Foundation, Inc.
# This file is part of GNU Make.
# This is a maintainer's-only makefile
#
# 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.
# It bootstraps a GNU make maintainer's directory
#
# 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.
.SUFFIXES:
NORECURSE = true
# If the user asked for a specific target, invoke the Mkaefile instead.
#
# 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, 675 Mass Ave, Cambridge, MA 02139, USA.
.DEFAULT:
@[ -f Makefile.in -a -f configure -a -f aclocal.m4 -a -f config.h.in ] \
|| $(MAKE) __cfg NORECURSE=
@[ -f Makefile ] \
|| ./configure
$(MAKE) -f Makefile $@
.PHONY: default
default:
.PHONY: __cfg __cfg_basic TAGS
# Set `ARCH' to a string for the type of machine.
ifndef ARCH
ifdef machine
ARCH = $(machine)
endif # machine
endif # not ARCH
# This is variable since the glob subdirectory doesn't use it.
#
ACCONFIG = acconfig.h
override srcdir := .
override CC := $(CC)
ifeq ($(ARCH),hp300)
#customs=yes
endif
ifdef customs
override REMOTE := cstms
else
override REMOTE := stub
__cfg: __cfg_basic config.h.in TAGS
cd glob && $(MAKE) -f ../GNUmakefile __cfg_basic ACCONFIG=
ifdef NORECURSE
@echo ""; echo "Now you should run one of:"; echo ""; \
echo " make all"; \
echo " make dist"; \
echo " make distdir"; \
echo " make distcheck"; echo ""; \
echo "Or similar to proceed.";\
echo ""
endif
# Get most of the information from the Unix-compatible makefile.
include compatMakefile
__cfg_basic: aclocal.m4 stamp-h.in configure Makefile.in
MAKE = $(MAKE_COMMAND) $(MAKEOVERRIDES)
aclocal.m4: configure.in
aclocal
# Remove autoconf magic.
prefix = /usr/local
exec_prefix = $(prefix)
extras := $(filter-out getloadavg.o @%@,$(extras)) getloadavg.o
LOADLIBES := $(filter-out @%@,$(LOADLIBES))
ALLOCA := $(filter-out @%@,$(ALLOCA))
CPPFLAGS := $(filter-out @%@,$(defines) $(CPPFLAGS)) -DHAVE_CONFIG_H
config.h.in: stamp-h.in
stamp-h.in: configure.in aclocal.m4 $(ACCONFIG)
autoheader
echo timestamp > $@
ifdef AC_MACRODIR
configure config.h.in: $(patsubst %,$(AC_MACRODIR)/%.m4,acspecific acgeneral)
config.h.in: $(AC_MACRODIR)/acconfig.h
endif
configure: configure.in aclocal.m4
autoconf $(ACFLAGS)
test -d CVS && cvs commit -m'autoconf $(ACFLAGS)' $@
config.h.in: configure.in aclocal.m4
autoheader $(ACFLAGS)
test -d CVS && cvs commit -m'autoheader $(ACFLAGS)' $@
autoconf
ifdef customs
defines := $(defines) -Ipmake/customs -Ipmake/lib/include
LOADLIBES := $(addprefix pmake/customs/,customslib.o rpc.o xlog.o) \
pmake/lib/sprite/libsprite.a
endif
Makefile.in: configure.in config.h.in Makefile.am aclocal.m4
automake --add-missing
ifdef ARCH
ifndef no_libc
libc_dir = /home/gd2/gnu/libc/$(ARCH)
ifneq ($(wildcard $(libc_dir)),)
ifneq ($(wildcard $(libc_dir)/works-for-make),)
#CPPFLAGS := -I$(libc_dir)/include
#LDFLAGS := -nostdlib $(libc_dir)/lib/start.o
#LOADLIBES := $(LOADLIBES) \
# $(libc_dir)/lib/mcheck-init.o \
# $(libc_dir)/lib/libc.a \
# -lgcc \
# $(libc_dir)/lib/libc.a
CC := $(CC) -b glibc
# getopt is in libc.
GETOPT =
#GETOPT_SRC = Don't clear this or dist will break.
# glob is in libc too.
GLOB =
else
endif # works-for-make
endif # $(libc_dir)
endif # !no_libc
# We know the type of machine, so put the binaries in subdirectories.
$(ARCH)/%.o: %.c
$(COMPILE.c) -Iglob $< $(OUTPUT_OPTION)
$(ARCH)/glob/libglob.a: FORCE
$(MAKE) -C $(@D) $(@F)
FORCE:
objs := $(addprefix $(ARCH)/,$(objs))
prog := $(ARCH)/make
archpfx = $(ARCH)/
$(archpfx)load.o: load.c
$(COMPILE.c) $(LOAD_AVG) $< -o $@
$(archpfx)load.dep: load.c
$(mkdep) $(LOAD_AVG) $< | sed 's,$*\.o,& $@,' > $@
CPPFLAGS := -I$(ARCH) -Iglob -DHAVE_CONFIG_H $(filter-out @%@,$(CPPFLAGS))
ifneq "$(wildcard $(ARCH)/makefile)" ""
include $(ARCH)/makefile
endif
objs := $(objs) $(addprefix $(ARCH)/,$(ALLOCA) $(extras))
else # Not ARCH
prog := make
endif
ifneq "$(findstring gcc,$(CC))" ""
CFLAGS = -g -Wall -Wtraditional -Wid-clash-31 -Wpointer-arith \
-Wbad-function-cast -Wconversion
else
CFLAGS = -g
endif
LDFLAGS = -g
# Define the command to make dependencies.
ifneq "$(findstring gcc,$(CC))" ""
# Don't include system directories.
mkdep-nolib = $(CC) -MM $(CPPFLAGS)
else
mkdep-nolib = $(mkdep)
endif
mkdep = $(CC) -M $(CPPFLAGS)
depfiles = $(patsubst %.o,%.dep,$(filter %.o,$(objs)))
.PHONY: default
default: $(prog)
$(prog): $(objs) $(globdep) #$(addprefix $(ARCH)/,gmalloc.o mcheck.o)
$(CC) $(LDFLAGS) $^ $(globlib) $(LOADLIBES) -o $@.new
mv -f $@.new $@
libc-srcdir = /home/gd/gnu/libc
globfiles = $(addprefix glob/,COPYING.LIB configure.in configure Makefile.in \
configure.bat glob.c fnmatch.c glob.h fnmatch.h)
$(globfiles): stamp-glob ;
stamp-glob: $(libc-srcdir)/posix/glob.tar
-rm -f stamp-glob glob/*
tar xvf $< glob
cvs commit -m'Updated from libc' glob
touch $@
$(libc-srcdir)/posix/glob.tar: force
$(MAKE) -C $(@D) $(@F) no_deps=t
.PHONY: force
force:
# Make the Unix-compatible Makefile to be distributed by appending
# the automatically-generated dependencies to compatMakefile.
ifeq ($(mkdep),$(mkdep-nolib))
nolib-deps = $(depfiles)
else
%.dep: %.c
$(mkdep-nolib) $< | sed -e 's,$*\.o,$(@:.dep=.o) $@,' > $(@:.dep=.dtm)
mv -f $(@:.dep=.dtm) $@
nolib-deps = $(patsubst $(archpfx)%,%,$(depfiles))
endif
# The distributed Makefile.in should contain deps for remote-stub only.
Makefile.in: compatMakefile $(nolib-deps:remote-%.dep=remote-stub.dep)
(sed 's/^MAKE[ ]*=.*$$/@SET_MAKE@/' $<; \
echo '# Automatically generated dependencies.'; \
sed -e 's/ [^ ]*\.dep//' -e 's=$(archpfx)==' $(filter-out $<,$^) \
) > $@
cvs commit -mRegenerated $@
.SUFFIXES: .dep
# Maintain the automatically-generated dependencies.
ifndef no_deps
include $(depfiles)
endif
$(archpfx)%.dep: %.c
$(mkdep) $< | sed 's,$*\.o,$(@:.dep=.o) $@,' > $@
ETAGS = etags -T # for v19 etags
# Run the tests.
.PHONY: tests
testdir := $(shell ls -d1 make-test-?.? | sort -n +0.10 -0.11 +0.12 | tail -1l)
tests:# $(testdir)/run_make_tests.pl $(prog)
# cd $(<D); MAKELEVEL=0 perl $(<F)
build.sh.in: build.template compatMakefile
sed -e 's@%objs%@$(filter-out remote-% $(GLOB) $(ALLOCA) $(extras),\
$(patsubst $(archpfx)%,%,$(objs)))\
$(patsubst %.c,%.o,$(filter %.c,$(globfiles)))@' \
$< > $@.new
chmod a+x $@.new
mv -f $@.new $@
cvs commit -mRegenerated $@
# Make the distribution tar files.
.PHONY: dist
# Figure out the version number from the source of `version.c'.
version := \
$(strip $(shell sed -e '/=/!d' -e 's/^.*"\(.*\)";$$/\1/' < version.c))
tarfiles := make # make-doc
tarfiles := $(addsuffix -$(version).tar,$(tarfiles))
tarfiles := $(tarfiles:%=%.gz) # no more compress $(tarfiles:%=%.Z)
# Depend on default and doc so we don't ship anything that won't compile.
dist: cvs-mark default info dvi tests tarfiles
.PHONY: tarfiles
tarfiles: $(tarfiles)
distfiles=README INSTALL COPYING ChangeLog NEWS \
configure Makefile.in configure.in build.sh.in mkinstalldirs \
configh.dos configure.bat \
aclocal.m4 acconfig.h $(srcs) remote-*.c $(globfiles) \
make.texinfo make-stds.texi \
make.?? make.??s make.toc make.aux make.man texinfo.tex TAGS tags \
install-sh \
make.info make.info*
ifndef dist-flavor
dist-flavor = alpha
endif
.PHONY: cvs-mark
cvs-mark: $(distfiles)
cvs tag -F make-$(subst .,-,$(version))
dist: local-inst
.PHONY: local-inst
local-inst: $(prog)
install -c -g kmem -o $(USER) -m 2755 $< /usr/local/gnubin/make
# Put the alpha distribution files in the anonymous FTP directory.
alpha-files = $(tarfiles) GNUmakefile compatMakefile $(testdir).tar.Z
dist: alpha
.PHONY: alpha
alpha-dir := ~ftp/gnu
alpha-files := $(addprefix $(alpha-dir)/,$(alpha-files))
alpha: $(alpha-dir) $(alpha-files)
$(alpha-dir)/%: %
@rm -f $@
cp $< $@
# Implicit rule to make README and README-doc.
%: %.template version.c
rm -f $@
sed 's/VERSION/$(version)/' < $< > $@
# Make sure I don't edit it by accident.
chmod a-w $@
cvs commit -m'Regenerated for $(version)' $@
define make-tar
@rm -fr make-$(version)
ln -s . make-$(version)
tar cvhof $@ $(addprefix make-$(version)/,$^)
rm -f make-$(version)
endef
%.Z: %; compress -c $< > $@
%.gz: %; gzip -9 -c -v $< > $@
make-$(version).tar: $(distfiles)
$(make-tar)
ifneq (,)
tests := $(filter-out %~,$(wildcard tests/*))
make-tests-$(version).tar.Z: $(tests)
@rm -fr make-tests-$(version)
ln -s tests make-tests-$(version)
tar cvhf $(@:.Z=) $(patsubst tests/%,make-tests-$(version)/%,$^)
rm -f make-tests-$(version)
compress -f $(@:.Z=)
endif
$(archpfx)loadtest: $(archpfx)load.o
TAGS:
find . -name '*.[ch]' -print | etags -

View File

@@ -167,7 +167,9 @@ operates.
`--quiet'
`--silent'
`-q'
Do not print messages saying which checks are being made.
Do not print messages saying which checks are being made. To
suppress all normal output, redirect it to `/dev/null' (any error
messages will still be shown).
`--srcdir=DIR'
Look for the package's source code in directory DIR. Usually

483
Makefile.DOS.template Normal file
View File

@@ -0,0 +1,483 @@
# -*-Makefile-*- template for DJGPP
# Makefile.in generated automatically by automake 1.2 from Makefile.am
# Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
# This Makefile.DOS is free software; the Free Software Foundation
# gives unlimited permission to copy, distribute and modify it.
# -*-Makefile-*-, or close enough
SHELL = /bin/sh
srcdir = .
VPATH = $(srcdir)
# $DJDIR is defined automatically by DJGPP to point
# to the root of the DJGPP installation tree.
prefix = ${DJDIR}
exec_prefix = ${prefix}
bindir = ${exec_prefix}/bin
datadir = ${prefix}/share
libdir = ${prefix}/lib
infodir = ${prefix}/info
# DJGPP doesn't have separate man tree, use info instead.
mandir = ${prefix}/info
includedir = ${prefix}/include
oldincludedir = c:/djgpp/include
pkgdatadir = $(datadir)/make
pkglibdir = $(libdir)/make
pkgincludedir = $(includedir)/make
INSTALL = ${bindir}/ginstall -c
INSTALL_PROGRAM = ${bindir}/ginstall -c
INSTALL_DATA = ${bindir}/ginstall -c -m 644
INSTALL_SCRIPT = ${bindir}/ginstall -c
transform = s,x,x,
# This will fail even if they don't have a Unix-like shell (stock DOS
# shell doesn't know about `false'). The only difference is that they
# get "Error -1" instead of "Error 1".
EXIT_FAIL = false
NORMAL_INSTALL = true
PRE_INSTALL = true
POST_INSTALL = true
NORMAL_UNINSTALL = true
PRE_UNINSTALL = true
POST_UNINSTALL = true
AR = ar
CC = gcc
CPP = gcc -E
LIBOBJS =
MAKEINFO = ${bindir}/makeinfo
PACKAGE = make
RANLIB = ranlib
REMOTE = stub
VERSION = %VERSION%
AUTOMAKE_OPTIONS = 1.2
bin_PROGRAMS = %PROGRAMS%
make_SOURCES = %SOURCES%
# This should include the glob/ prefix
libglob_a_SOURCES = %GLOB_SOURCES%
make_LDADD = glob/libglob.a
info_TEXINFOS = make.texinfo
INCLUDES = -I$(srcdir)/glob -DLIBDIR=\"c:/djgpp/lib\" -DINCLUDEDIR=\"c:/djgpp/include\"
BUILT_SOURCES = README build.sh.in
EXTRA_DIST = make.man $(BUILT_SOURCES) remote-cstms.c make-stds.texi texinfo.tex SCOPTIONS SMakefile Makefile.ami README.Amiga config.ami amiga.c amiga.h NMakefile README.DOS configh.dos configure.bat makefile.com README.W32 build_w32.bat config.h.W32 subproc.bat make.lnk config.h-vms makefile.vms readme.vms vmsdir.h vmsfunctions.c vmsify.c
SUBDIRS = glob
mkinstalldirs = ${bindir}/gmkdir -p
CONFIG_HEADER = config.h
CONFIG_CLEAN_FILES = build.sh
PROGRAMS = $(bin_PROGRAMS)
DEFS = -I. -I$(srcdir) -I.
CPPFLAGS = -DHAVE_CONFIG_H
LDFLAGS =
LIBS =
make_OBJECTS = %OBJECTS%
make_DEPENDENCIES = glob/libglob.a
make_LDFLAGS =
libglob_a_LIBADD =
libglob_a_OBJECTS = %GLOB_OBJECTS%
noinst_LIBRARIES = glob/libglob.a
CFLAGS = -O2 -g
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS)
LINK = $(CC) $(CFLAGS) $(LDFLAGS) -o $@
TEXI2DVI = texi2dvi
TEXINFO_TEX = $(srcdir)/texinfo.tex
INFO_DEPS = make.info
DVIS = make.dvi
TEXINFOS = make.texinfo
DIST_COMMON = README AUTHORS COPYING ChangeLog INSTALL Makefile.am Makefile.in NEWS acconfig.h aclocal.m4 alloca.c build.sh.in config.h.in configure configure.in getloadavg.c install-sh missing mkinstalldirs stamp-h.in texinfo.tex
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
TAR = gtar
GZIP = --best
SOURCES = $(make_SOURCES)
OBJECTS = $(make_OBJECTS)
HEADERS = $(wildcard $(srcdir)/*.h)
default: all
.SUFFIXES:
.SUFFIXES: .c .dvi .info .o .ps .texi .texinfo
distclean-hdr:
rm -f config.h
maintainer-clean-hdr:
mostlyclean-binPROGRAMS:
clean-binPROGRAMS:
test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
distclean-binPROGRAMS:
maintainer-clean-binPROGRAMS:
install-binPROGRAMS: $(bin_PROGRAMS)
@$(NORMAL_INSTALL)
$(mkinstalldirs) $(bindir)
@list='$(bin_PROGRAMS)'; for p in $$list; do if test -f $$p; then echo " $(INSTALL_PROGRAM) $$p $(bindir)/`echo $$p | sed '$(transform)'`"; $(INSTALL_PROGRAM) $$p $(bindir)/`echo $$p | sed '$(transform)'`; else :; fi; done
uninstall-binPROGRAMS:
$(NORMAL_UNINSTALL)
list='$(bin_PROGRAMS)'; for p in $$list; do rm -f $(bindir)/`echo $$p|sed '$(transform)'`; done
.c.o:
$(COMPILE) -c $<
clean-noinstLIBRARIES:
test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
mostlyclean-compile:
rm -f *.o *.exe make.new core
clean-compile:
distclean-compile:
rm -f *.tab.c
maintainer-clean-compile:
make: $(make_OBJECTS) $(make_DEPENDENCIES)
@command.com /c if exist make del make
@command.com /c if exist make.exe del make.exe
$(LINK) $(make_LDFLAGS) $(make_OBJECTS) $(make_LDADD) $(LIBS)
make.info: make.texinfo
make.dvi: make.texinfo
DVIPS = dvips
.texi.info:
$(MAKEINFO) $(srcdir)/$< -o ./$@
.texi.dvi:
TEXINPUTS="$(srcdir);$$TEXINPUTS" MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) $<
.texi:
$(MAKEINFO) $(srcdir)/$< -o ./$@
.texinfo.info:
$(MAKEINFO) $(srcdir)/$< -o ./$@
.texinfo:
$(MAKEINFO) $(srcdir)/$< -o ./$@
.texinfo.dvi:
TEXINPUTS="$(srcdir);$$TEXINPUTS" MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) $<
.dvi.ps:
$(DVIPS) $< -o $@
install-info-am: $(INFO_DEPS)
@$(NORMAL_INSTALL)
$(mkinstalldirs) $(infodir)
@for file in $(INFO_DEPS) make.i; do d=$(srcdir); for ifile in `cd $$d && echo $$file $$file-[0-9] $$file-[0-9][0-9] $$file[0-9] $$file[0-9][0-9]`; do if test -f $$d/$$ifile; then echo " $(INSTALL_DATA) $$d/$$ifile $(infodir)/$$ifile"; $(INSTALL_DATA) $$d/$$ifile $(infodir)/$$ifile; else : ; fi; done; done
@$(POST_INSTALL)
@if $(SHELL) -c 'install-info --version | sed 1q | fgrep -s -v -i debian' >/dev/null 2>&1; then for file in $(INFO_DEPS); do echo " install-info --info-dir=$(infodir) $(infodir)/$$file"; install-info --info-dir=$(infodir) $(infodir)/$$file || :; done; else : ; fi
uninstall-info:
$(PRE_UNINSTALL)
@if $(SHELL) -c 'install-info --version | sed 1q | fgrep -s -v -i debian' >/dev/null 2>&1; then ii=yes; else ii=; fi; for file in $(INFO_DEPS); do test -z $ii || install-info --info-dir=$(infodir) --remove $$file; done
$(NORMAL_UNINSTALL)
for file in $(INFO_DEPS) make.i; do (cd $(infodir) && rm -f $$file $$file-[0-9] $$file-[0-9][0-9] $$file[0-9] $$file[0-9][0-9]); done
dist-info: $(INFO_DEPS)
for base in $(INFO_DEPS); do d=$(srcdir); for file in `cd $$d && eval echo $$base*`; do test -f $(distdir)/$$file || ln $$d/$$file $(distdir)/$$file 2> /dev/null || cp -p $$d/$$file $(distdir)/$$file; done; done
mostlyclean-aminfo:
rm -f make.aux make.cp make.cps make.dvi make.fn make.fns make.ky make.log make.pg make.toc make.tp make.tps make.vr make.vrs make.op make.tr make.cv
clean-aminfo:
distclean-aminfo:
maintainer-clean-aminfo:
for i in $(INFO_DEPS) make.i; do rm -f `eval echo $$i*`; done
# Assume that the only thing to do in glob is to build libglob.a,
# but do a sanity check: if $SUBDIRS will ever have more than
# a single directory, yell bloody murder.
all-recursive:
ifeq ($(words $(SUBDIRS)), 1)
@command.com /c if not exist glob\\nul md glob
@echo Making all in $(SUBDIRS)
$(MAKE) -C $(SUBDIRS) -f ../Makefile INCLUDES='-I$(srcdir) -I$(srcdir)/glob' DEFS='-I.. -I$(srcdir)' VPATH=$(srcdir)/glob libglob.a
else
@echo FATAL: There is more than one directory in "($(SUBDIRS))"
@$(EXIT_FAIL)
endif
$(SUBDIRS):
command.com /c md $@
libglob.a: $(libglob_a_OBJECTS)
command.com /c if exist libglob.a del libglob.a
$(AR) cru libglob.a $(libglob_a_OBJECTS) $(libglob_a_LIBADD)
$(RANLIB) libglob.a
mostlyclean-recursive clean-recursive distclean-recursive maintainer-clean-recursive:
ifeq ($(words $(SUBDIRS)), 1)
@echo Making $(shell echo $@ | sed s/-recursive//) in $(SUBDIRS)
$(MAKE) -C $(SUBDIRS) -f ../Makefile $(shell echo $@ | sed s/-recursive//)-am
else
@echo FATAL: There is more than one directory in "($(SUBDIRS))"
@$(EXIT_FAIL)
endif
tags-in-glob: $(libglob_a_SOURCES)
etags $(addprefix $(srcdir)/,$^) -o ./glob/TAGS
tags-recursive:
ifeq ($(words $(SUBDIRS)), 1)
$(MAKE) tags-in-glob
else
@echo FATAL: There is more than one directory in "($(SUBDIRS))"
@$(EXIT_FAIL)
endif
tags: TAGS
ID: $(HEADERS) $(SOURCES)
mkid $(srcdir)/$(SOURCES) $(srcdir)/$(libglob_a_SOURCES) ./config.h $(HEADERS)
TAGS: tags-recursive $(HEADERS) $(srcdir)/$(SOURCES) config.h $(TAGS_DEPENDENCIES)
etags -i ./glob/TAGS $(ETAGS_ARGS) $(srcdir)/$(SOURCES) ./config.h $(HEADERS)
mostlyclean-tags:
clean-tags:
distclean-tags:
rm -f TAGS ID
maintainer-clean-tags:
distdir = $(PACKAGE)-$(VERSION)
top_distdir = $(distdir)
# This target untars the dist file and tries a VPATH configuration. Then
# it guarantees that the distribution is self-contained by making another
# tarfile.
distcheck: dist
rm -rf $(distdir)
GZIP=$(GZIP) $(TAR) zxf $(distdir).tar.gz
mkdir $(distdir)/=build
mkdir $(distdir)/=inst
dc_install_base=`cd $(distdir)/=inst && pwd`; cd $(distdir)/=build && ../configure --srcdir=.. --prefix=$$dc_install_base && $(MAKE) && $(MAKE) dvi && $(MAKE) check && $(MAKE) install && $(MAKE) installcheck && $(MAKE) dist
rm -rf $(distdir)
@echo "========================"; echo "$(distdir).tar.gz is ready for distribution"; echo "========================"
dist: distdir
-chmod -R a+r $(distdir)
GZIP=$(GZIP) $(TAR) chozf $(distdir).tar.gz $(distdir)
rm -rf $(distdir)
dist-all: distdir
-chmod -R a+r $(distdir)
GZIP=$(GZIP) $(TAR) chozf $(distdir).tar.gz $(distdir)
rm -rf $(distdir)
distdir: $(DISTFILES)
rm -rf $(distdir)
mkdir $(distdir)
-chmod 777 $(distdir)
@for file in $(DISTFILES); do d=$(srcdir); test -f $(distdir)/$$file || ln $$d/$$file $(distdir)/$$file 2> /dev/null || cp -p $$d/$$file $(distdir)/$$file; done; for subdir in $(SUBDIRS); do test -d $(distdir)/$$subdir || mkdir $(distdir)/$$subdir || exit 1; chmod 777 $(distdir)/$$subdir; (cd $$subdir && $(MAKE) top_distdir=../$(top_distdir)/$$subdir distdir=../$(distdir)/$$subdir distdir) || exit 1; done
$(MAKE) top_distdir="$(top_distdir)" distdir="$(distdir)" dist-info
$(MAKE) top_distdir="$(top_distdir)" distdir="$(distdir)" dist-hook
alloca.o alloca.lo: alloca.c config.h
ar.o ar.lo: ar.c make.h config.h filedef.h dep.h glob/fnmatch.h
arscan.o arscan.lo: arscan.c make.h config.h
commands.o commands.lo: commands.c make.h config.h dep.h filedef.h variable.h job.h commands.h
default.o default.lo: default.c make.h config.h rule.h dep.h filedef.h job.h commands.h variable.h
dir.o dir.lo: dir.c make.h config.h glob/glob.h
expand.o expand.lo: expand.c make.h config.h filedef.h job.h commands.h variable.h
file.o file.lo: file.c make.h config.h dep.h filedef.h job.h commands.h variable.h
function.o function.lo: function.c make.h config.h filedef.h variable.h dep.h job.h commands.h
getloadavg.o getloadavg.lo: getloadavg.c config.h
getopt.o getopt.lo: getopt.c config.h getopt.h
getopt1.o getopt1.lo: getopt1.c config.h getopt.h
implicit.o implicit.lo: implicit.c make.h config.h rule.h dep.h filedef.h
job.o job.lo: job.c make.h config.h job.h filedef.h commands.h variable.h
main.o main.lo: main.c make.h config.h dep.h filedef.h variable.h job.h commands.h getopt.h
misc.o misc.lo: misc.c make.h config.h dep.h
read.o read.lo: read.c make.h config.h dep.h filedef.h job.h commands.h variable.h glob/glob.h
remake.o remake.lo: remake.c make.h config.h filedef.h job.h commands.h dep.h
remote-stub.o remote-stub.lo: remote-stub.c make.h config.h filedef.h job.h commands.h
rule.o rule.lo: rule.c make.h config.h dep.h filedef.h job.h commands.h variable.h rule.h
signame.o signame.lo: signame.c config.h signame.h
variable.o variable.lo: variable.c make.h config.h dep.h filedef.h job.h commands.h variable.h
version.o version.lo: version.c config.h
vpath.o vpath.lo: vpath.c make.h config.h filedef.h variable.h
fnmatch.o fnmatch.lo: fnmatch.c fnmatch.h ../config.h
glob.o glob.lo: glob.c fnmatch.h glob.h ../config.h
info: $(INFO_DEPS) info-recursive
dvi: $(DVIS) dvi-recursive
check: all-am
$(MAKE) check-recursive check-local
installcheck: installcheck-recursive
all-recursive-am: config.h
$(MAKE) all-recursive
all-am: Makefile $(INFO_DEPS) $(PROGRAMS) config.h
install-exec-am: install-binPROGRAMS
install-data-am: install-info-am
uninstall-am: uninstall-binPROGRAMS uninstall-info
install-exec: install-exec-recursive install-exec-am
@$(NORMAL_INSTALL)
install-data: install-data-recursive install-data-am
@$(NORMAL_INSTALL)
install: install-recursive install-exec-am install-data-am
@:
uninstall: uninstall-recursive uninstall-am
all: all-recursive-am all-am
install-strip:
$(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' INSTALL_SCRIPT='$(INSTALL_PROGRAM)' install
installdirs: installdirs-recursive
$(mkinstalldirs) $(bindir) $(infodir)
mostlyclean-generic:
test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
clean-generic:
test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
distclean-generic:
rm -f Makefile $(DISTCLEANFILES)
rm -f config.cache config.log stamp-h stamp-h[0-9]*
test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
maintainer-clean-generic:
test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
mostlyclean-am: mostlyclean-hdr mostlyclean-binPROGRAMS mostlyclean-compile mostlyclean-aminfo mostlyclean-tags mostlyclean-generic
clean-am: clean-hdr clean-binPROGRAMS clean-compile clean-aminfo clean-tags clean-generic mostlyclean-am
distclean-am: distclean-hdr distclean-binPROGRAMS distclean-compile distclean-aminfo distclean-tags distclean-generic clean-am
maintainer-clean-am: maintainer-clean-hdr maintainer-clean-binPROGRAMS maintainer-clean-compile maintainer-clean-aminfo maintainer-clean-tags maintainer-clean-generic distclean-am
mostlyclean: mostlyclean-recursive mostlyclean-am
clean: clean-noinstLIBRARIES clean-recursive clean-am
distclean: distclean-recursive distclean-am
rm -f config.status
maintainer-clean: maintainer-clean-recursive maintainer-clean-am
@echo "This command is intended for maintainers to use;"
@echo "it deletes files that may require special tools to rebuild."
rm -f config.status
.PHONY: default mostlyclean-hdr distclean-hdr clean-hdr \
maintainer-clean-hdr mostlyclean-binPROGRAMS distclean-binPROGRAMS \
clean-binPROGRAMS maintainer-clean-binPROGRAMS uninstall-binPROGRAMS \
install-binPROGRAMS mostlyclean-compile distclean-compile clean-compile \
maintainer-clean-compile install-info-am uninstall-info \
mostlyclean-aminfo distclean-aminfo clean-aminfo \
maintainer-clean-aminfo install-data-recursive uninstall-data-recursive \
install-exec-recursive uninstall-exec-recursive installdirs-recursive \
uninstalldirs-recursive all-recursive check-recursive \
installcheck-recursive info-recursive dvi-recursive \
mostlyclean-recursive distclean-recursive clean-recursive \
maintainer-clean-recursive tags tags-recursive mostlyclean-tags \
distclean-tags clean-tags maintainer-clean-tags distdir \
mostlyclean-depend distclean-depend clean-depend \
maintainer-clean-depend info dvi check-local installcheck \
all-recursive-am all-am install-exec-am install-data-am uninstall-am \
install-exec install-data install uninstall all installdirs \
mostlyclean-generic distclean-generic clean-generic \
maintainer-clean-generic clean mostlyclean distclean maintainer-clean
# --------------- Local DIST Section
# Install the w32 subdirectory
#
dist-hook:
(cd $(srcdir); \
w32=`find w32 -follow \( -name CVS -prune \) -o -type f -print`; \
tar chf - $$w32) \
| (cd $(distdir); tar xfBp -)
# --------------- Local CHECK Section
check-local: check-loadavg check-regression
.PHONY: check-loadavg check-regression
# > check-loadavg
#
loadavg: loadavg.c config.h
@rm -f loadavg
$(LINK) -DTEST $(make_LDFLAGS) loadavg.c $(LIBS)
# We copy getloadavg.c into a different file rather than compiling it
# directly because some compilers clobber getloadavg.o in the process.
loadavg.c: getloadavg.c
ln $(srcdir)/getloadavg.c loadavg.c || \
cp $(srcdir)/getloadavg.c loadavg.c
check-loadavg: loadavg
@echo The system uptime program believes the load average to be:
-uptime
@echo The GNU load average checking code believes:
-./loadavg
# > check-regression
#
# Look for the make test suite, and run it if found. Look in MAKE_TEST if
# specified, or else in the srcdir or the distdir, their parents, and _their_
# parents.
#
check-regression:
here=`pwd`; testdir=""; \
case "$(MAKE_TEST)" in "") \
for d1 in $$here $(srcdir); do \
for d2 in ../.. .. .; do \
all=`echo $$d1/$$d2/make-test-[0-9]*/run_make_tests`; \
case "$$all" in \
"$$d1/$$d2/make-test-[0-9]*/run_make_tests") : ;; \
*) try=`for x in $$all; do echo $$x; done | sort | tail -1`;\
testdir=`dirname $$try` ;; esac; \
done; done ;; \
*) testdir="$(MAKE_TEST)" ;; \
esac; \
case "$$testdir" in \
"") echo "Couldn't find make-test-* test suite."; exit 0;; \
esac; \
echo "cd $$testdir && ./run_make_tests -make_path $$here/make"; \
cd $$testdir && ./run_make_tests -make_path $$here/make
# --------------- Maintainer's Section
# Note this requires GNU make. Not to worry, since it will only be included
# in the Makefile if we're in the maintainer's environment.
#include $(srcdir)/maintMakefile
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:

95
Makefile.am Normal file
View File

@@ -0,0 +1,95 @@
# -*-Makefile-*-, or close enough
AUTOMAKE_OPTIONS = 1.2
bin_PROGRAMS = make
make_SOURCES = main.c commands.c job.c dir.c file.c misc.c read.c remake.c \
rule.c implicit.c default.c variable.c expand.c function.c \
vpath.c version.c ar.c arscan.c remote-$(REMOTE).c \
commands.h dep.h filedef.h job.h make.h rule.h variable.h \
signame.c signame.h \
getopt.c getopt1.c getopt.h
make_LDADD = @LIBOBJS@ @ALLOCA@ glob/libglob.a
info_TEXINFOS = make.texinfo
INCLUDES = -I$(srcdir)/glob -DLIBDIR=\"$(libdir)\" -DINCLUDEDIR=\"$(includedir)\"
BUILT_SOURCES = README build.sh.in
EXTRA_DIST = make.man $(BUILT_SOURCES) remote-cstms.c\
make-stds.texi texinfo.tex SCOPTIONS SMakefile\
README.Amiga Makefile.ami config.ami make.lnk amiga.c amiga.h\
README.DOS Makefile.DOS configure.bat dosbuild.bat configh.dos\
README.W32 NMakefile config.h.W32 build_w32.bat subproc.bat\
readme.vms makefile.vms makefile.com config.h-vms vmsdir.h\
vmsfunctions.c vmsify.c
SUBDIRS = glob
# --------------- Local DIST Section
# Install the w32 subdirectory
#
dist-hook:
(cd $(srcdir); \
w32=`find w32 -follow \( -name CVS -prune \) -o -type f -print`; \
tar chf - $$w32) \
| (cd $(distdir); tar xfBp -)
# --------------- Local CHECK Section
check-local: check-loadavg check-regression
.PHONY: check-loadavg check-regression
# > check-loadavg
#
loadavg: loadavg.c config.h
@rm -f loadavg
$(LINK) -I. -I$(srcdir) -DHAVE_CONFIG_H -DTEST $(make_LDFLAGS) loadavg.c $(LIBS)
# We copy getloadavg.c into a different file rather than compiling it
# directly because some compilers clobber getloadavg.o in the process.
loadavg.c: getloadavg.c
ln $(srcdir)/getloadavg.c loadavg.c || \
cp $(srcdir)/getloadavg.c loadavg.c
check-loadavg: loadavg
@echo The system uptime program believes the load average to be:
-uptime
@echo The GNU load average checking code believes:
-./loadavg
# > check-regression
#
# Look for the make test suite, and run it if found. Look in MAKE_TEST if
# specified, or else in the srcdir or the distdir, their parents, and _their_
# parents.
#
check-regression:
here=`pwd`; testdir=""; \
case "$(MAKE_TEST)" in "") \
for d1 in $$here $(srcdir); do \
for d2 in ../.. .. .; do \
all=`echo $$d1/$$d2/make-test-[0-9]*/run_make_tests`; \
case "$$all" in \
"$$d1/$$d2/make-test-[0-9]*/run_make_tests") : ;; \
*) try=`for x in $$all; do echo $$x; done | sort | tail -1`;\
testdir=`dirname $$try` ;; esac; \
done; done ;; \
*) testdir="$(MAKE_TEST)" ;; \
esac; \
case "$$testdir" in \
"") echo "Couldn't find make-test-* test suite."; exit 0;; \
esac; \
echo "cd $$testdir && ./run_make_tests -make_path $$here/make"; \
cd $$testdir && ./run_make_tests -make_path $$here/make
# --------------- Maintainer's Section
if MAINT_MAKEFILE
# Note this requires GNU make. Not to worry, since it will only be included
# in the Makefile if we're in the maintainer's environment.
include $(srcdir)/maintMakefile
endif

View File

@@ -1,7 +1,7 @@
# NOTE: If you have no `make' program at all to process this makefile, run
# `build.sh' instead.
#
# Copyright (C) 1988,89,91,92,93,94,95,96 Free Software Foundation, Inc.
# Copyright (C) 1988, 89, 91, 92, 93, 94, 1995 Free Software Foundation, Inc.
# This file is part of GNU Make.
#
# GNU Make is free software; you can redistribute it and/or modify
@@ -11,7 +11,7 @@
#
# 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
# 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
@@ -22,16 +22,12 @@
# Makefile for GNU Make
#
# Ultrix 2.2 make doesn't expand the value of VPATH.
VPATH = @srcdir@
# This must repeat the value, because configure will remove `VPATH = .'.
srcdir = @srcdir@
CC = sc
RM = delete
CC = @CC@
CFLAGS = @CFLAGS@
CPPFLAGS = @CPPFLAGS@
LDFLAGS = @LDFLAGS@
CFLAGS =
CPPFLAGS =
LDFLAGS =
# Define these for your system as follows:
# -DNO_ARCHIVES To disable `ar' archive support.
@@ -42,40 +38,53 @@ LDFLAGS = @LDFLAGS@
# so beware.
# NeXT 1.0a uses an old version of GCC, which required -D__inline=inline.
# See also `config.h'.
defines = @DEFS@ -DLIBDIR=\"$(libdir)\" -DINCLUDEDIR=\"$(includedir)\"
defines =
# Which flavor of remote job execution support to use.
# The code is found in `remote-$(REMOTE).c'.
REMOTE = @REMOTE@
REMOTE = stub
# If you are using the GNU C library, or have the GNU getopt functions in
# your C library, you can comment these out.
GETOPT = getopt.o getopt1.o
GETOPT_SRC = $(srcdir)getopt.c $(srcdir)getopt1.c $(srcdir)getopt.h
# If you are using the GNU C library, or have the GNU glob functions in
# your C library, you can comment this out. GNU make uses special hooks
# into the glob functions to be more efficient (by using make's directory
# cache for globbing), so you must use the GNU functions even if your
# system's C library has the 1003.2 glob functions already. Also, the glob
# functions in the AIX and HPUX C libraries are said to be buggy.
GLOB = glob/glob.lib
# If your system doesn't have alloca, or the one provided is bad, define this.
ALLOCA = @ALLOCA@
ALLOCA_SRC = $(srcdir)/alloca.c
ALLOCA = alloca.o
ALLOCA_SRC = $(srcdir)alloca.c
# If your system needs extra libraries loaded in, define them here.
# System V probably need -lPW for alloca. HP-UX 7.0's alloca in
# libPW.a is broken on HP9000s300 and HP9000s400 machines. Use
# alloca.c instead on those machines.
LOADLIBES = @LIBS@
LOADLIBES =
# Any extra object files your system needs.
extras = @LIBOBJS@
extras = amiga.o
# Common prefix for machine-independent installed files.
prefix = @prefix@
prefix =
# Common prefix for machine-dependent installed files.
exec_prefix = @exec_prefix@
exec_prefix =
# Directory to install `make' in.
bindir = $(exec_prefix)/bin
bindir = sc:c
# Directory to find libraries in for `-lXXX'.
libdir = $(exec_prefix)/lib
libdir = lib:
# Directory to search by default for included makefiles.
includedir = $(prefix)/include
includedir = include:
# Directory to install the Info files in.
infodir = $(prefix)/info
infodir = doc:
# Directory to install the man page in.
mandir = $(prefix)/man/man$(manext)
mandir = t:
# Number to put on the man page filename.
manext = 1
# Prefix to put on installed `make' binary file name.
@@ -87,16 +96,16 @@ manprefix = $(binprefix)
# The value should be either `true' or `false'.
# On many systems, the getloadavg function (used to implement the `-l'
# switch) will not work unless make is installed setgid kmem.
install_setgid = @NEED_SETGID@
install_setgid = false
# Install make setgid to this group so it can read /dev/kmem.
group = @KMEM_GROUP@
group = sys
# Program to install `make'.
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_PROGRAM = copy
# Program to install the man page.
INSTALL_DATA = @INSTALL_DATA@
INSTALL_DATA = copy
# Generic install program.
INSTALL = @INSTALL@
INSTALL = copy
# Program to format Texinfo source into Info files.
MAKEINFO = makeinfo
@@ -109,21 +118,20 @@ CTAGS = ctags -w
objs = commands.o job.o dir.o file.o misc.o main.o read.o remake.o \
rule.o implicit.o default.o variable.o expand.o function.o \
vpath.o version.o ar.o arscan.o signame.o remote-$(REMOTE).o \
getopt.o getopt1.o glob/libglob.a \
$(ALLOCA) $(extras)
srcs = $(srcdir)/commands.c $(srcdir)/job.c $(srcdir)/dir.c \
$(srcdir)/file.c $(srcdir)/getloadavg.c $(srcdir)/misc.c \
$(srcdir)/main.c $(srcdir)/read.c $(srcdir)/remake.c \
$(srcdir)/rule.c $(srcdir)/implicit.c $(srcdir)/default.c \
$(srcdir)/variable.c $(srcdir)/expand.c $(srcdir)/function.c \
$(srcdir)/vpath.c $(srcdir)/version.c \
$(srcdir)/remote-$(REMOTE).c \
$(srcdir)/ar.c $(srcdir)/arscan.c \
$(srcdir)/signame.c $(srcdir)/signame.h getopt.c getopt1.c \
$(srcdir)/commands.h $(srcdir)/dep.h $(srcdir)/file.h \
$(srcdir)/job.h $(srcdir)/make.h $(srcdir)/rule.h \
$(srcdir)/variable.h $(ALLOCA_SRC) $(srcdir)/config.h.in
vpath.o version.o ar.o arscan.o signame.o remote-$(REMOTE).o \
$(GETOPT) $(ALLOCA) $(extras)
srcs = $(srcdir)commands.c $(srcdir)job.c $(srcdir)dir.c \
$(srcdir)file.c $(srcdir)getloadavg.c $(srcdir)misc.c \
$(srcdir)main.c $(srcdir)read.c $(srcdir)remake.c \
$(srcdir)rule.c $(srcdir)implicit.c $(srcdir)default.c \
$(srcdir)variable.c $(srcdir)expand.c $(srcdir)function.c \
$(srcdir)vpath.c $(srcdir)version.c \
$(srcdir)remote-$(REMOTE).c \
$(srcdir)ar.c $(srcdir)arscan.c \
$(srcdir)signame.c $(srcdir)signame.h $(GETOPT_SRC) \
$(srcdir)commands.h $(srcdir)dep.h $(srcdir)filedep.h \
$(srcdir)job.h $(srcdir)make.h $(srcdir)rule.h \
$(srcdir)variable.h $(ALLOCA_SRC) $(srcdir)config.h.in
.SUFFIXES:
@@ -136,46 +144,50 @@ dvi: make.dvi
.PHONY: all check info dvi
make.info: make.texinfo
$(MAKEINFO) -I$(srcdir) $(srcdir)/make.texinfo -o make.info
$(MAKEINFO) -I$(srcdir) $(srcdir)make.texinfo -o make.info
make.dvi: make.texinfo
$(TEXI2DVI) $(srcdir)/make.texinfo
$(TEXI2DVI) $(srcdir)make.texinfo
make.ps: make.dvi
dvi2ps make.dvi > make.ps
make: $(objs)
$(CC) $(LDFLAGS) $(objs) $(LOADLIBES) -o make.new
mv -f make.new make
make: $(objs) $(GLOB)
$(CC) Link $(LDFLAGS) $(objs) Lib $(GLOB) $(LOADLIBES) To make.new
-delete make
rename make.new make
TMPFILE = t:Make$$
$(GLOB):
cd glob @@\
$(MAKE) -$(MAKEFLAGS) -f Makefile
# -I. is needed to find config.h in the build directory.
OUTPUT_OPTION =
.c.o:
$(CC) $(defines) -c -I. -I$(srcdir) -I$(srcdir)/glob \
$(CC) $(defines) IDir "" IDir glob \
$(CPPFLAGS) $(CFLAGS) $< $(OUTPUT_OPTION)
# For some losing Unix makes.
SHELL = /bin/sh
@SET_MAKE@
#@SET_MAKE@
glob/libglob.a: FORCE config.h
cd glob; $(MAKE) libglob.a
FORCE:
tagsrcs = $(srcs) $(srcdir)/remote-*.c
TAGS: $(tagsrcs)
$(ETAGS) $(tagsrcs)
tags: $(tagsrcs)
$(CTAGS) $(tagsrcs)
tagsrcs = $(srcs) $(srcdir)remote-*.c
.PHONY: install installdirs
install: installdirs \
$(bindir)/$(binprefix)make $(infodir)/make.info \
$(mandir)/$(manprefix)make.$(manext)
$(bindir)$(binprefix)make $(infodir)make.info \
$(mandir)$(manprefix)make.$(manext)
installdirs:
$(SHELL) ${srcdir}/mkinstalldirs $(bindir) $(infodir) $(mandir)
$(bindir)/$(binprefix)make: make
$(bindir)$(binprefix)make: make
$(INSTALL_PROGRAM) make $@.new
@if $(install_setgid); then \
if chgrp $(group) $@.new && chmod g+s $@.new; then \
@@ -187,11 +199,11 @@ $(bindir)/$(binprefix)make: make
fi; \
else true; fi
# Some systems can't deal with renaming onto a running binary.
-rm -f $@.old
-$(RM) $@.old
-mv $@ $@.old
mv $@.new $@
$(infodir)/make.info: make.info
$(infodir)make.info: make.info
if [ -r ./make.info ]; then dir=.; else dir=$(srcdir); fi; \
for file in $${dir}/make.info*; do \
name="`basename $$file`"; \
@@ -208,8 +220,8 @@ $(infodir)/make.info: make.info
install-info --infodir=$(infodir) $$dir/make.info; \
else true; fi
$(mandir)/$(manprefix)make.$(manext): make.man
$(INSTALL_DATA) $(srcdir)/make.man $@
$(mandir)$(manprefix)make.$(manext): make.man
$(INSTALL_DATA) $(srcdir)make.man $@
loadavg: loadavg.c config.h
@@ -218,8 +230,8 @@ loadavg: loadavg.c config.h
# We copy getloadavg.c into a different file rather than compiling it
# directly because some compilers clobber getloadavg.o in the process.
loadavg.c: getloadavg.c
ln $(srcdir)/getloadavg.c loadavg.c || \
cp $(srcdir)/getloadavg.c loadavg.c
ln $(srcdir)getloadavg.c loadavg.c || \
cp $(srcdir)getloadavg.c loadavg.c
check-loadavg: loadavg
@echo The system uptime program believes the load average to be:
-uptime
@@ -230,34 +242,23 @@ check: check-loadavg
.PHONY: clean realclean distclean mostlyclean
clean: glob-clean
-rm -f make loadavg *.o core make.dvi
-$(RM) make loadavg "#?.o" core make.dvi
distclean: clean glob-realclean
-rm -f Makefile config.h config.status build.sh stamp-config
-rm -f config.log config.cache
-rm -f TAGS tags
-rm -f make.?? make.??s make.log make.toc make.*aux
-rm -f loadavg.c
-$(RM) Makefile config.h config.status build.sh stamp-config
-$(RM) config.log config.cache
-$(RM) TAGS tags
-$(RM) make.?? make.??s make.log make.toc make.*aux
-$(RM) loadavg.c
realclean: distclean
-rm -f make.info*
-$(RM) make.info*
mostlyclean: clean
.PHONY: glob-clean glob-realclean
glob-clean glob-realclean:
cd glob; $(MAKE) $@
Makefile: config.status $(srcdir)/Makefile.in
$(SHELL) config.status
glob/Makefile: config.status $(srcdir)/glob/Makefile.in
$(SHELL) config.status
config.h: stamp-config ;
stamp-config: config.status $(srcdir)/config.h.in
$(SHELL) config.status
touch stamp-config
#configure: configure.in aclocal.m4
# cd $(srcdir) && autoconf $(ACFLAGS)
#config.h.in: configure.in aclocal.m4
# cd $(srcdir) && autoheader $(ACFLAGS)
cd glob @@\
$(MAKE) $@
# This tells versions [3.59,3.63) of GNU make not to export all variables.
.NOEXPORT:
@@ -270,27 +271,34 @@ $(objs): config.h
# Automatically generated dependencies will be put at the end of the file.
# Automatically generated dependencies.
commands.o: commands.c make.h dep.h commands.h file.h variable.h job.h
job.o: job.c make.h commands.h job.h file.h variable.h
commands.o: commands.c make.h dep.h filedef.h variable.h job.h \
commands.h
job.o: job.c make.h job.h filedef.h commands.h variable.h
dir.o: dir.c make.h
file.o: file.c make.h commands.h dep.h file.h variable.h
file.o: file.c make.h dep.h filedef.h job.h commands.h variable.h
misc.o: misc.c make.h dep.h
main.o: main.c make.h commands.h dep.h file.h variable.h job.h \
main.o: main.c make.h dep.h filedef.h variable.h job.h commands.h \
getopt.h
read.o: read.c make.h commands.h dep.h file.h variable.h glob/glob.h
remake.o: remake.c make.h commands.h job.h dep.h file.h
rule.o: rule.c make.h commands.h dep.h file.h variable.h rule.h
implicit.o: implicit.c make.h rule.h dep.h file.h
default.o: default.c make.h rule.h dep.h file.h commands.h variable.h
variable.o: variable.c make.h commands.h variable.h dep.h file.h
expand.o: expand.c make.h commands.h file.h variable.h
function.o: function.c make.h variable.h dep.h commands.h job.h
vpath.o: vpath.c make.h file.h variable.h
read.o: read.c make.h dep.h filedef.h job.h commands.h variable.h \
glob/glob.h
remake.o: remake.c make.h filedef.h job.h commands.h dep.h
rule.o: rule.c make.h dep.h filedef.h job.h commands.h variable.h \
rule.h
implicit.o: implicit.c make.h rule.h dep.h filedef.h
default.o: default.c make.h rule.h dep.h filedef.h job.h commands.h \
variable.h
variable.o: variable.c make.h dep.h filedef.h job.h commands.h \
variable.h
expand.o: expand.c make.h filedef.h job.h commands.h variable.h
function.o: function.c make.h filedef.h variable.h dep.h job.h \
commands.h amiga.h
vpath.o: vpath.c make.h filedef.h variable.h
version.o: version.c
ar.o: ar.c make.h file.h dep.h
ar.o: ar.c make.h filedef.h dep.h
arscan.o: arscan.c make.h
signame.o: signame.c signame.h
remote-stub.o: remote-stub.c make.h commands.h
remote-stub.o: remote-stub.c make.h filedef.h job.h commands.h
getopt.o: getopt.c
getopt1.o: getopt1.c getopt.h
getopt1.o : getopt1.c getopt.h
getloadavg.o: getloadavg.c
amiga.o: amiga.c make.h variable.h amiga.h

64
NEWS
View File

@@ -1,10 +1,57 @@
GNU make NEWS -- history of user-visible changes. 28 February 1996
GNU make NEWS -*-indented-text-*-
History of user-visible changes.
18 Aug 1997
Copyright (C) 1992, 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
See the end for copying conditions.
Please send GNU make bug reports to bug-gnu-utils@prep.ai.mit.edu.
Version 3.76
* GNU make now uses automake to control Makefile.in generation. This
should make it more consistent with the GNU standards.
* VPATH functionality has been changed to incorporate the VPATH+ patch,
previously maintained by Paul Smith <psmith@baynetworks.com>. See the
manual.
* Make defines a new variable, `MAKECMDGOALS', to contain the goals that
were specified on the command line, if any. Modifying this variable
has no effect on the operation of make.
* A new function, `$(wordlist S,E,TEXT)', is available: it returns a
list of words from number S to number E (inclusive) of TEXT.
* Instead of an error, detection of future modification times gives a
warning and continues. The warning is repeated just before GNU make
exits, so it is less likely to be lost.
* Fix the $(basename) and $(suffix) functions so they only operate on
the last filename, not the entire string:
Command Old Result New Result
------- ---------- ----------
$(basename a.b) a a
$(basename a.b/c) a a.b/c
$(suffix a.b) b b
$(suffix a.b/c) b/c <empty>
* The $(strip) function now removes newlines as well as TABs and spaces.
* The $(shell) function now changes CRLF (\r\n) pairs to a space as well
as newlines (\n).
* Updates to the Windows 95/NT port from Rob Tulloh (see README.W32).
* Eli Zaretskii has updated the port to 32-bit protected mode on MSDOS
and MS-Windows, building with the DJGPP v2 port of GNU C/C++ compiler
and utilities. See README.DOS for details, and direct all questions
concerning this port to Eli Zaretskii <eliz@is.elta.co.il> or DJ
Delorie <dj@delorie.com>.
* John W. Eaton has updated the VMS port to support libraries and VPATH.
Version 3.75
* The directory messages printed by `-w' and implicitly in sub-makes,
@@ -15,6 +62,16 @@ Version 3.75
can result from unsynchronized clocks, or archived distributions
containing bogus timestamps; they confuse Make's dependency engine
thoroughly.
* The new directive `sinclude' is now recognized as another name for
`-include', for compatibility with some other Makes.
* Aaron Digulla has contributed a port to AmigaDOS. See README.Amiga for
details, and direct all Amiga-related questions to <digulla@fh-konstanz.de>.
* Rob Tulloh of Tivoli Systems has contributed a port to Windows NT or 95.
See README.W32 for details, and direct all Windows-related questions to
<rob_tulloh@tivoli.com>.
Version 3.73
@@ -29,7 +86,8 @@ Version 3.72
* DJ Delorie has ported Make to MS-DOS using the GO32 extender.
He is maintaining the DOS port, not the GNU Make maintainer;
please direct bugs and questions for DOS to <djgpp@sun.soe.clarkson.edu>.
MS-DOS binaries are available for FTP from oak.oakland.edu:pub/msdos/djgpp.
MS-DOS binaries are available for FTP from ftp.simtel.net in
/pub/simtelnet/gnu/djgpp/.
* The `MAKEFLAGS' variable (in the environment or in a makefile) can now
contain variable definitions itself; these are treated just like

141
NMakefile.template Normal file
View File

@@ -0,0 +1,141 @@
# NOTE: If you have no `make' program at all to process this makefile, run
# `build_w32.bat' instead.
#
# Copyright (C) 1988,89,91,92,93,94,95,96,97 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, 675 Mass Ave, Cambridge, MA 02139, USA.
#
# NMakefile for GNU Make
#
LINK = link
CC = cl
OUTDIR=.
MAKEFILE=NMakefile
SUBPROC_MAKEFILE=NMakefile
CFLAGS_any = /nologo /MT /W3 /GX /Zi /YX /I . /I glob /I w32/include /D WIN32 /D WINDOWS32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES
CFLAGS_debug = $(CFLAGS_any) /Od /D _DEBUG /FR.\WinDebug/ /Fp.\WinDebug/make.pch /Fo.\WinDebug/ /Fd.\WinDebug/make.pdb
CFLAGS_release = $(CFLAGS_any) /O2 /D NDEBUG /FR.\WinRel/ /Fp.\WinRel/make.pch /Fo.\WinRel/
LDFLAGS_debug = w32\subproc\WinDebug\subproc.lib /NOLOGO /SUBSYSTEM:console\
/INCREMENTAL:no /PDB:WinDebug/make.pdb /MACHINE:I386 \
/OUT:WinDebug/make.exe /DEBUG
LDFLAGS_release = w32\subproc\WinRel\subproc.lib /NOLOGO /SUBSYSTEM:console\
/INCREMENTAL:no /MACHINE:I386 /OUT:WinRel/make.exe
all: config.h subproc Release Debug
#
# Make sure we build the subproc library first. It has it's own
# makefile. To be portable to Windows 95, we put the instructions
# on how to build the library into a batch file. On NT, we could
# simply have done foo && bar && dog, but this doesn't port.
#
subproc: w32/subproc/WinDebug/subproc.lib w32/subproc/WinRel/subproc.lib
w32/subproc/WinDebug/subproc.lib w32/subproc/WinRel/subproc.lib:
subproc.bat $(SUBPROC_MAKEFILE)
config.h: config.h.W32
copy $? $@
Release:
nmake /f $(MAKEFILE) LDFLAGS="$(LDFLAGS_release)" CFLAGS="$(CFLAGS_release)" OUTDIR=WinRel WinRel/make.exe
Debug:
nmake /f $(MAKEFILE) LDFLAGS="$(LDFLAGS_debug)" CFLAGS="$(CFLAGS_debug)" OUTDIR=WinDebug WinDebug/make.exe
clean:
rmdir /s /q WinDebug WinRel
rmdir /s /q w32\subproc\WinDebug w32\subproc\WinRel
erase config.h
$(OUTDIR):
if not exist .\$@\nul mkdir .\$@
LIBS = kernel32.lib user32.lib advapi32.lib
OBJS = \
$(OUTDIR)/ar.obj \
$(OUTDIR)/arscan.obj \
$(OUTDIR)/commands.obj \
$(OUTDIR)/default.obj \
$(OUTDIR)/dir.obj \
$(OUTDIR)/expand.obj \
$(OUTDIR)/file.obj \
$(OUTDIR)/function.obj \
$(OUTDIR)/getloadavg.obj \
$(OUTDIR)/getopt.obj \
$(OUTDIR)/getopt1.obj \
$(OUTDIR)/implicit.obj \
$(OUTDIR)/job.obj \
$(OUTDIR)/main.obj \
$(OUTDIR)/misc.obj \
$(OUTDIR)/read.obj \
$(OUTDIR)/remake.obj \
$(OUTDIR)/remote-stub.obj \
$(OUTDIR)/rule.obj \
$(OUTDIR)/signame.obj \
$(OUTDIR)/variable.obj \
$(OUTDIR)/version.obj \
$(OUTDIR)/vpath.obj \
$(OUTDIR)/glob.obj \
$(OUTDIR)/fnmatch.obj \
$(OUTDIR)/dirent.obj \
$(OUTDIR)/pathstuff.obj
$(OUTDIR)/make.exe: $(OUTDIR) $(OBJS)
$(LINK) @<<
$(LDFLAGS) $(LIBS) $(OBJS)
<<
.c{$(OUTDIR)}.obj:
$(CC) $(CFLAGS) /c $<
$(OUTDIR)/ar.obj : ar.c make.h filedef.h dep.h
$(OUTDIR)/arscan.obj : arscan.c make.h
$(OUTDIR)/commands.obj : commands.c
$(OUTDIR)/default.obj : default.c make.h rule.h dep.h filedef.h job.h commands.h variable.h
$(OUTDIR)/dir.obj : dir.c make.h
$(OUTDIR)/expand.obj : expand.c make.h filedef.h job.h commands.h variable.h
$(OUTDIR)/file.obj : file.c make.h dep.h filedef.h job.h commands.h variable.h
$(OUTDIR)/function.obj : function.c make.h filedef.h variable.h dep.h job.h commands.h
$(OUTDIR)/getloadavg.obj : getloadavg.c
$(OUTDIR)/getopt.obj : getopt.c
$(OUTDIR)/getopt1.obj : getopt1.c getopt.h
$(OUTDIR)/implicit.obj : implicit.c make.h rule.h dep.h filedef.h
$(OUTDIR)/job.obj : job.c make.h job.h filedef.h commands.h variable.h
$(OUTDIR)/main.obj : main.c make.h dep.h filedef.h variable.h job.h commands.h getopt.h
$(OUTDIR)/misc.obj : misc.c make.h dep.h
$(OUTDIR)/read.obj : read.c make.h dep.h filedef.h job.h commands.h variable.h glob/glob.h
$(OUTDIR)/remake.obj : remake.c make.h filedef.h job.h commands.h dep.h
$(OUTDIR)/remote-stub.obj : remote-stub.c make.h filedef.h job.h commands.h
$(OUTDIR)/rule.obj : rule.c make.h dep.h filedef.h job.h commands.h variable.h rule.h
$(OUTDIR)/signame.obj : signame.c signame.h
$(OUTDIR)/variable.obj : variable.c make.h dep.h filedef.h job.h commands.h variable.h
$(OUTDIR)/version.obj : version.c
$(OUTDIR)/vpath.obj : vpath.c make.h filedef.h variable.h
$(OUTDIR)/glob.obj : glob/glob.c
$(CC) $(CFLAGS) /c $?
$(OUTDIR)/fnmatch.obj : glob/fnmatch.c
$(CC) $(CFLAGS) /c $?
$(OUTDIR)/dirent.obj : w32/compat/dirent.c
$(CC) $(CFLAGS) /c $?
$(OUTDIR)/pathstuff.obj : w32/pathstuff.c
$(CC) $(CFLAGS) /c $?

32
README
View File

@@ -1,32 +0,0 @@
This directory contains the 3.74.3 test release of GNU Make.
All bugs reported for previous test releases have been fixed.
Some bugs surely remain.
For general building and installation instructions, see the file INSTALL.
If you need to build GNU Make and have no other `make' program to use,
you can use the shell script `build.sh' instead. To do this, first run
`configure' as described in INSTALL. Then, instead of typing `make' to
build the program, type `sh build.sh'. This should compile the program
in the current directory. Then you will have a Make program that you can
use for `make install', or whatever else.
Some systems' Make programs are broken and cannot process the Makefile for
GNU Make. If you get errors from your system's Make when building GNU
Make, try using `build.sh' instead.
It has been reported that the XLC 1.2 compiler on AIX 3.2 is buggy such
that if you compile make with `cc -O' on AIX 3.2, it will not work correctly.
It is said that using `cc' without `-O' does work.
One area that is often a problem in configuration and porting is the code
to check the system's current load average. To make it easier to test and
debug this code, you can do `make check-loadavg' to see if it works
properly on your system. (You must run `configure' beforehand, but you
need not build Make itself to run this test.)
See the file NEWS for what has changed since previous releases.
GNU Make is fully documented in make.texinfo. See the section entitled
`Problems and Bugs' for information on submitting bug reports.
GNU Make is free software. See the file COPYING for copying conditions.

61
README.Amiga Normal file
View File

@@ -0,0 +1,61 @@
Short: Port of GNU make with SAS/C (no ixemul.library required)
Author: GNU, Amiga port by Aaron "Optimizer" Digulla
Uploader: Aaron "Optimizer" Digulla (digulla@fh-konstanz.de)
Type: dev/c
This is a pure Amiga port of GNU make. It needs no extra libraries or
anything. It has the following features (in addition to any features of
GNU make):
- Runs Amiga-Commands with SystemTags() (Execute)
- Can run multi-line statements
- Allows to use Device-Names in targets:
c:make : make.o
is ok. To distinguish between device-names and target : or ::, MAKE
looks for spaces. If there are any around :, it's taken as a target
delimiter, if there are none, it's taken as the name of a device. Note
that "make:make.o" tries to create "make.o" on the device "make:".
- Replaces @@ by a newline in any command line:
if exists make @@\
delete make.bak quiet @@\
rename make make.bak @@\
endif @@\
$(CC) Link Make.o To make
works. Note that the @@ must stand alone (ie. "make@@\" is illegal).
Also be carefull that there is a space after the "\" (ie, at the
beginning of the next line).
- Can be made resident to save space and time
- Amiga specific wildcards can be used in $(wildcard ...)
BUGS:
- The line
dummy.h : src/*.c
tries to make dummy.h from "src/*.c" (ie. no wildcard-expansion takes
place). You have to use "$(wildcard src/*.c)" instead.
COMPILING FROM SCRATCH
----------------------
To recompile, you need SAS/C 6.51. make itself is not neccessary, there
is an smakefile.
1. Copy config.ami to config.h
2. If you use make to compie, copy Makefile.ami to Makefile and
glob/Makefile.ami to glob/Makefile. Copy make into the current
directory.
3. Run smake/make
INSTALLATION
Copy make somewhere in your search path (eg. sc:c or sc:bin).
If you plan to use recursive makes, install make resident:
Resident make Add

293
README.DOS.template Normal file
View File

@@ -0,0 +1,293 @@
Port of GNU Make to 32-bit protected mode on MSDOS and MS-Windows.
Builds with DJGPP v2 port of GNU C/C++ compiler and utilities.
New (since 3.74) DOS-specific features:
1. Supports long filenames when run from DOS box on Windows 95.
2. Supports both stock DOS COMMAND.COM and Unix-style shells
(details in ``Notes'' below).
3. Supports DOS drive letters in dependencies and pattern rules.
4. Better support for DOS-style backslashes in pathnames (but see
``Notes'' below).
5. The $(shell) built-in can run arbitrary complex commands,
including pipes and redirection, even when COMMAND.COM is your
shell.
6. Can be built without floating-point code (see below).
7. Supports signals in child programs and restores the original
directory if the child was interrupted.
8. Can be built without (a previous version of) Make.
9. The build process requires only standard tools. (Optional
targets like "install:" and "clean:" still need additional
programs, though, see below.)
To build:
1. Unzip the archive, preserving the directory structure (-d switch
if you use PKUNZIP). If you build Make on Windows 95, use an
unzip program that supports long filenames in zip files.
2. Invoke the `configure.bat' batch file.
If you are building Make in-place, i.e. in the same directory
where its sources are kept, just type "configure.bat" and press
[Enter]. Otherwise, you need to supply the path to the source
directory as an argument to the batch file, like this:
configure.bat c:/djgpp/gnu/make-3.76
Note the forward slashes: you MUST use them here.
3. If configure.bat doesn't find a working Make, it will suggest to
use the `dosbuild.bat' batch file to build Make. Either do as it
suggests or install another Make program (a pre-compiled binary
should be available from the usual DJGPP sites) and rerun
configure.bat.
4. If you will need to run Make on machines without an FPU, you
might consider building a version of Make which doesn't issue
floating-point instructions (they don't help much on MSDOS
anyway). To this end, edit the Makefile created by
configure.bat and add -DNO_FLOAT to the value of CPPFLAGS.
5. Invoke Make.
If you are building from outside of the source directory, you
need to tell Make where the sources are, like this:
make srcdir=c:/djgpp/gnu/make-3.76
(configure.bat will tell you this when it finishes). You MUST
use a full, not relative, name of the source directory here, or
else Make might fail.
6. After Make finishes, if you have a Unix-style shell installed,
you can use the `install' target to install the package. You
will also need GNU Fileutils and GNU Sh-utils for this (they
should be available from the DJGPP sites).
Without a Unix-style shell, you will have to install programs
and the docs manually. Copy make.exe to a directory on your
PATH, make.i* info files to your Info directory, and update the
file `dir' in your Info directory by adding the following item
to the main menu:
* GNU make: (make.info). The GNU make utility.
If you have the `install-info' program (from the GNU Texinfo
package), it will do that for you if you invoke it like this:
install-info --info-dir=c:/djgpp/info c:/djgpp/info/make.info
(If your Info directory is other than C:\DJGPP\INFO, change this
command accordingly.)
7. The `clean' targets also require Unix-style shell and `test' and
`rm' programs (from Fileutils and Sh-utils, accordingly).
Notes:
-----
1. The shell issue.
This is probably the most significant improvement, first
introduced in the port of GNU Make 3.75.
The original behavior of GNU Make is to invoke commands
directly, as long as they don't include characters special to
the shell or internal shell commands, because that is faster.
When shell features like redirection or filename wildcards are
involved, Make calls the shell.
This port supports both DOS shells (the stock COMMAND.COM and its
4DOS/NDOS replacements), and Unix-style shells (tested with the
venerable Stewartson's `ms_sh' 2.3 and the DJGPP port of `bash' by
Daisuke Aoyama <jack@st.rim.or.jp>).
When the $SHELL variable points to a Unix-style shell, Make
works just like you'd expect on Unix, calling the shell for any
command that involves characters special to the shell or
internal shell commands. The only difference is that, since
there is no standard way to pass command lines longer than the
infamous DOS 126-character limit, this port of Make writes the
command line to a temporary disk file and then invokes the shell
on that file.
If $SHELL points to a DOS-style shell, however, Make will not
call it automatically, as it does with Unix shells. Stock
COMMAND.COM is too dumb and would unnecessarily limit the
functionality of Make. For example, you would not be able to
use long command lines in commands that use redirection or
pipes. Therefore, when presented with a DOS shell, this port of
Make will emulate most of the shell functionality, like
redirection and pipes, and shall only call the shell when a
batch file or a command internal to the shell is invoked. (Even
when a command is an internal shell command, Make will first
search the $PATH for it, so that if a Makefile calls `mkdir',
you can install, say, a port of GNU `mkdir' and have it called
in that case.)
The key to all this is the extended functionality of `spawn' and
`system' functions from the DJGPP library; this port just calls
`system' where it would invoke the shell on Unix. The most
important aspect of these functions is that they use a special
mechanism to pass long (up to 16KB) command lines to DJGPP
programs. In addition, `system' emulates some internal
commands, like `cd' (so that you can now use forward slashes
with it, and can also change the drive if the directory is on
another drive). Another aspect worth mentioning is that you can
call Unix shell scripts directly, provided that the shell whose
name is mentioned on the first line of the script is installed
anywhere along the $PATH. It is impossible to tell here
everything about these functions; refer to the DJGPP library
reference for more details.
The $(shell) built-in is implemented in this port by calling
`popen'. Since `popen' calls `system', the above considerations
are valid for $(shell) as well. In particular, you can put
arbitrary complex commands, including pipes and redirection,
inside $(shell), which is in many cases a valid substitute for
the Unix-style command substitution (`command`) feature.
2. "SHELL=/bin/sh" -- or is it?
Many Unix Makefiles include a line which sets the SHELL, for
those versions of Make which don't have this as the default.
Since many DOS systems don't have `sh' installed (in fact, most
of them don't even have a `/bin' directory), this port takes
such directives with a grain of salt. It will only honor such a
directive if the basename of the shell name (like `sh' in the
above example) can indeed be found in the directory that is
mentioned in the SHELL= line (`/bin' in the above example), or
in the current working directory, or anywhere on the $PATH (in
that order). If the basename doesn't include a filename
extension, Make will look for any known extension that indicates
an executable file (.exe, .com, .bat, .btm, .sh, and even .sed
and .pl). If any such file is found, then $SHELL will be
defined to the exact pathname of that file, and that shell will
hence be used for the rest of processing. But if the named
shell is *not* found, the line which sets it will be effectively
ignored, leaving the value of $SHELL as it was before. Since a
lot of decisions that this port makes depend on the gender of
the shell, I feel it doesn't make any sense to tailor Make's
behavior to a shell which is nowhere to be found.
Note that the above special handling of "SHELL=" only happens
for Makefiles; if you set $SHELL in the environment or on the
Make command line, you are expected to give the complete
pathname of the shell, including the filename extension.
The default value of $SHELL is computed as on Unix (see the Make
manual for details), except that if $SHELL is not defined in the
environment, $COMSPEC is used. Also, if an environment variable
named $MAKESHELL is defined, it takes precedence over both
$COMSPEC and $SHELL. Note that, unlike Unix, $SHELL in the
environment *is* used to set the shell (since on MSDOS, it's
unlikely that the interactive shell will not be suitable for
Makefile processing).
The bottom line is that you can now write Makefiles where some
of the targets require a real (i.e. Unix-like) shell, which will
nevertheless work when such shell is not available (provided, of
course, that the commands which should always work, don't
require such a shell). More important, you can convert Unix
Makefiles to MSDOS and leave the line which sets the shell
intact, so that people who do have Unixy shell could use it for
targets which aren't converted to DOS (like `install' and
`uninstall', for example).
3. Default directories.
GNU Make knows about standard directories where it searches for
library and include files mentioned in the Makefile. Since
MSDOS machines don't have standard places for these, this port
will search ${DJDIR}/lib and ${DJDIR}/include respectively.
$DJDIR is defined automatically by the DJGPP startup code as the
root of the DJGPP installation tree (unless you've tampered with
the DJGPP.ENV file). This should provide reasonable default
values, unless you moved parts of DJGPP to other directories.
4. Letter-case in filenames.
If you run Make on Windows 95, you should be aware of the
letter-case issue. Make is internally case-sensitive, but all
file operations are case-insensitive on Windows 95, so
e.g. files `FAQ', `faq' and `Faq' all refer to the same file, as
far as Windows is concerned. The underlying DJGPP C library
functions honor the letter-case of the filenames they get from
the OS, except that by default, they down-case 8+3 DOS filenames
which are stored in upper case in the directory and would break
many Makefiles otherwise. (The details of which filenames are
converted to lower case are explained in the DJGPP libc docs,
under the `_preserve_fncase' and `_lfn_gen_short_fname'
functions, but as a thumb rule, any filename that is stored in
upper case in the directory, is a legal DOS 8+3 filename and
doesn't include characters illegal on MSDOS FAT filesystems,
will be automatically down-cased.) User reports that I have
indicate that this default behavior is generally what you'd
expect; however, since support for long filenames in the DJGPP
port of GNU Make is relatively new, your input is most welcome.
In any case, if you hit a situation where you must force Make to
get the 8+3 DOS filenames in upper case, set FNCASE=y in the
environment or in the Makefile.
5. DOS-style pathnames.
There are a lot of places throughout the program sources which
make implicit assumptions about the pathname syntax. In
particular, the directories are assumed to be separated by `/',
and any pathname which doesn't begin with a `/' is assumed to be
relative to the current directory. This port attempts to
support DOS-style pathnames which might include the drive letter
and use backslashes instead of forward slashes. However, this
support is not complete; I feel that pursuing this support too
far might break some more important features, particularly if
you use a Unix-style shell (where a backslash is a quote
character). I only consider support of backslashes desirable
because some Makefiles invoke non-DJGPP programs which don't
understand forward slashes. A notable example of such programs
is the standard programs which come with MSDOS. Otherwise, you
are advised to stay away from backslashes whenever possible. In
particular, filename globbing won't work on pathnames with
backslashes, because the GNU `glob' library doesn't support them
(backslash is special in filename wildcards, and I didn't want
to break that).
One feature which *does* work with backslashes is the filename-
related built-in functions such as $(dir), $(notdir), etc.
Drive letters in pathnames are also fully supported.
Bug reports:
-----------
Bugs that are clearly related to the MSDOS/DJGPP port should be
reported first on the comp.os.msdos.djgpp news group (if you cannot
post to Usenet groups, write to the DJGPP mailing list,
<djgpp@delorie.com>, which is an email gateway into the above news
group). For other bugs, please follow the the procedure explained
in the "Bugs" chapter of the Info docs. If you don't have an Info
reader, look up that chapter in the `make.i1' file with any text
browser/editor.
Enjoy,
Eli Zaretskii <eliz@is.elta.co.il>

161
README.W32 Normal file
View File

@@ -0,0 +1,161 @@
Port of GNU make to Windows NT and Windows 95
Builds natively with MSVC 2.x or MSVC 4.x compilers.
To build with nmake on Windows NT or Windows 95:
1. Make sure cl.exe is in your %Path%. Example:
set Path=%Path%;c:/msdev/bin
2. Make sure %include% is set to msvc include directory. Example:
set include=c:/msdev/include
3. Make sure %lib% is set to msvc lib directory. Example:
set lib=c:/msdev/lib
4. nmake /f NMakefile
There is a bat file (build_w32.bat) for folks who have fear of nmake.
Outputs:
WinDebug/make.exe
WinRel/make.exe
-- Notes/Caveats --
GNU make and sh.exe:
This port prefers you have a working sh.exe somewhere on your
system. If you don't have sh.exe, port falls back to
MSDOS mode for launching programs (via a batch file).
The MSDOS mode style execution has not been tested too
carefully though (I use GNU bash as sh.exe).
There are very few true ports of Bourne shell for NT right now.
There is a version of GNU bash available from Cygnus gnu-win32
porting effort. Other possibilities are to get the MKS version
of sh.exe or to build your own with a package like
NutCracker (DataFocus) or Portage (Consensys).
Tivoli uses a homegrown port of GNU bash which is not (yet)
freely available. It may be available someday, but I am not in control
of this decision nor do I influence it. Sorry!
GNU make handling of drive letters in pathnames (PATH, vpath, VPATH):
There is a caveat that should be noted with respect to handling
single character pathnames on Windows systems. When colon is
used in PATH variables, make tries to be smart about knowing when
you are using colon as a separator versus colon as a drive
letter. Unfortunately, something as simple as the string 'x:/'
could be interpreted 2 ways: (x and /) or (x:/).
Make chooses to interpret a letter plus colon (e.g. x:/) as a
drive letter pathname. If it is necessary to use single
character directories in paths (VPATH, vpath, Path, PATH), the
user must do one of two things:
a. Use semicolon as the separator to disambiguate colon. For
example use 'x;/' if you want to say 'x' and '/' are
separate components.
b. Qualify the directory name so that there is more than
one character in the path(s) used. For example, none
of these settings are ambiguous:
./x:./y
/some/path/x:/some/path/y
x:/some/path/x:x:/some/path/y
These caveats affect Windows systems only (Windows NT and
Windows 95) and can be ignored for other platforms.
Please note that you are free to mix colon and semi-colon in the
specification of paths. Make is able to figure out the intended
result and convert the paths internally to the format needed
when interacting with the operating system.
You are encouraged to use colon as the separator character.
This should ease the pain of deciding how to handle various path
problems which exist between platforms. If colon is used on
both Unix and Windows systems, then no ifdef'ing will be
necessary in the makefile source.
GNU make test suite:
I verified all functionality with a slightly modified version
of make-test-0.4.5 (modifications to get test suite to run
on Windows NT). All tests pass in an environment that includes
sh.exe. Tested on both Windows NT and Windows 95.
Building GNU make on Windows NT and Windows 95 with Microsoft Visual C
I did not provide a Visual C project file with this port as
the project file would not be considered freely distributable
(or so I think). It is easy enough to create one though if
you know how to use Visual C.
I build the program statically to avoid problems locating DLL's
on machines that may not have MSVC runtime installed. If you
prefer, you can change make to build with shared libraries by
changing /MT to /MD in the NMakefile (or build_w32.bat).
Program has not been built under non-Intel architectures (yet).
I have not tried to build with any other compilers than MSVC.
Pathnames and white space:
Unlike Unix, Windows 95/NT systems encourage pathnames which
contain white space (e.g. C:\Program Files\). These sorts of pathnames
are legal under Unix too, but are never encouraged. There is
at least one place in make (VPATH/vpath handling) where paths
containing white space will simply not work. There may be others
too. I chose to not try and port make in such a way so that
these sorts of paths could be handled. I offer these suggestions
as workarounds:
1. Use 8.3 notation
2. Rename the directory so it does not contain white space.
If you are unhappy with this choice, this is free software
and you are free to take a crack at making this work. The code
in w32/pathstuff.c and vpath.c would be the places to start.
SAMBA/NTFS/VFAT:
I have not had any success building the debug version of this
package using SAMBA as my file server. The reason seems to be
related to the way VC++ 4.0 changes the case name of the pdb
filename it is passed on the command line. It seems to change
the name always to to lower case. I contend that
the VC++ compiler should not change the casename of files that
are passed as arguments on the command line. I don't think this
was a problem in MSVC 2.x, but I know it is a problem in MSVC 4.x.
The package builds fine on VFAT and NTFS filesystems.
Most all of the development I have done to date has been using
NTFS and long file names. I have not done any considerable work
under VFAT. VFAT users may wish to be aware that this port
of make does respect case sensitivity.
Version 3.76 contains some preliminary support for FAT. Make
now tries to work around some difficulties with stat'ing of
files and caching of filenames and directories internally.
There is still a known problem with filenames sometimes being
found to have modification dates in the future which cause make
to complain about the file and exit (remake.c).
Bug reports:
Please submit bugs via the normal bug reporting mechanism
which is described in one of the Texinfo files. If you don't
have Texinfo for Windows NT or Windows 95, these files are simple
text files and can be read with a text editor.

View File

@@ -1,5 +1,5 @@
This directory contains the VERSION test release of GNU Make.
All bugs reported for previous test releases have been fixed.
This directory contains the %VERSION% release of GNU Make.
All bugs reported for previous releases have been fixed.
Some bugs surely remain.
For general building and installation instructions, see the file INSTALL.
@@ -14,6 +14,17 @@ Some systems' Make programs are broken and cannot process the Makefile for
GNU Make. If you get errors from your system's Make when building GNU
Make, try using `build.sh' instead.
- See README.W32 for details about GNU Make on Windows NT or 95.
- See README.Amiga for details about GNU Make on AmigaDOS.
- See README.DOS for compilation instructions on MS-DOS and MS-Windows
using DJGPP tools.
A precompiled binary of the MSDOS port of GNU Make is available as part
of DJGPP; see the WWW page http://www.delorie.com/djgpp/ for more
information.
It has been reported that the XLC 1.2 compiler on AIX 3.2 is buggy such
that if you compile make with `cc -O' on AIX 3.2, it will not work correctly.
It is said that using `cc' without `-O' does work.

13
SCOPTIONS Normal file
View File

@@ -0,0 +1,13 @@
ERRORREXX
OPTIMIZE
NOVERSION
OPTIMIZERTIME
OPTIMIZERALIAS
DEFINE INCLUDEDIR="include:"
DEFINE LIBDIR="lib:"
DEFINE NO_ALLOCA
DEFINE NO_FLOAT
DEFINE NO_ARCHIVES
IGNORE=161
IGNORE=100
STARTUP=cres

276
SMakefile.template Normal file
View File

@@ -0,0 +1,276 @@
# NOTE: If you have no `make' program at all to process this makefile, run
# `build.sh' instead.
#
# Copyright (C) 1988, 89, 91, 92, 93, 94, 1995 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, 675 Mass Ave, Cambridge, MA 02139, USA.
#
# Makefile for GNU Make
#
# Ultrix 2.2 make doesn't expand the value of VPATH.
VPATH = /make-3.74/
# This must repeat the value, because configure will remove `VPATH = .'.
srcdir = /make-3.74/
CC = sc
RM = delete
MAKE = smake
CFLAGS =
CPPFLAGS =
LDFLAGS =
# Define these for your system as follows:
# -DNO_ARCHIVES To disable `ar' archive support.
# -DNO_FLOAT To avoid using floating-point numbers.
# -DENUM_BITFIELDS If the compiler isn't GCC but groks enum foo:2.
# Some compilers apparently accept this
# without complaint but produce losing code,
# so beware.
# NeXT 1.0a uses an old version of GCC, which required -D__inline=inline.
# See also `config.h'.
defines =
# Which flavor of remote job execution support to use.
# The code is found in `remote-$(REMOTE).c'.
REMOTE = stub
# If you are using the GNU C library, or have the GNU getopt functions in
# your C library, you can comment these out.
GETOPT = getopt.o getopt1.o
GETOPT_SRC = $(srcdir)getopt.c $(srcdir)getopt1.c $(srcdir)getopt.h
# If you are using the GNU C library, or have the GNU glob functions in
# your C library, you can comment this out. GNU make uses special hooks
# into the glob functions to be more efficient (by using make's directory
# cache for globbing), so you must use the GNU functions even if your
# system's C library has the 1003.2 glob functions already. Also, the glob
# functions in the AIX and HPUX C libraries are said to be buggy.
GLOB = Lib glob/glob.lib
# If your system doesn't have alloca, or the one provided is bad, define this.
ALLOCA = alloca.o
ALLOCA_SRC = $(srcdir)alloca.c
# If your system needs extra libraries loaded in, define them here.
# System V probably need -lPW for alloca. HP-UX 7.0's alloca in
# libPW.a is broken on HP9000s300 and HP9000s400 machines. Use
# alloca.c instead on those machines.
LOADLIBES =
# Any extra object files your system needs.
extras = amiga.o
# Common prefix for machine-independent installed files.
prefix =
# Common prefix for machine-dependent installed files.
exec_prefix =
# Directory to install `make' in.
bindir = sc:c
# Directory to find libraries in for `-lXXX'.
libdir = lib:
# Directory to search by default for included makefiles.
includedir = include:
# Directory to install the Info files in.
infodir = doc:
# Directory to install the man page in.
mandir = t:
# Number to put on the man page filename.
manext = 1
# Prefix to put on installed `make' binary file name.
binprefix =
# Prefix to put on installed `make' man page file name.
manprefix = $(binprefix)
# Whether or not make needs to be installed setgid.
# The value should be either `true' or `false'.
# On many systems, the getloadavg function (used to implement the `-l'
# switch) will not work unless make is installed setgid kmem.
install_setgid = false
# Install make setgid to this group so it can read /dev/kmem.
group = sys
# Program to install `make'.
INSTALL_PROGRAM = copy
# Program to install the man page.
INSTALL_DATA = copy
# Generic install program.
INSTALL = copy
# Program to format Texinfo source into Info files.
MAKEINFO = makeinfo
# Program to format Texinfo source into DVI files.
TEXI2DVI = texi2dvi
# Programs to make tags files.
ETAGS = etags -w
CTAGS = ctags -w
objs = commands.o job.o dir.o file.o misc.o main.o read.o remake.o \
rule.o implicit.o default.o variable.o expand.o function.o \
vpath.o version.o ar.o arscan.o signame.o remote-$(REMOTE).o \
$(GLOB) $(GETOPT) $(ALLOCA) $(extras)
srcs = $(srcdir)commands.c $(srcdir)job.c $(srcdir)dir.c \
$(srcdir)file.c $(srcdir)getloadavg.c $(srcdir)misc.c \
$(srcdir)main.c $(srcdir)read.c $(srcdir)remake.c \
$(srcdir)rule.c $(srcdir)implicit.c $(srcdir)default.c \
$(srcdir)variable.c $(srcdir)expand.c $(srcdir)function.c \
$(srcdir)vpath.c $(srcdir)version.c \
$(srcdir)remote-$(REMOTE).c \
$(srcdir)ar.c $(srcdir)arscan.c \
$(srcdir)signame.c $(srcdir)signame.h $(GETOPT_SRC) \
$(srcdir)commands.h $(srcdir)dep.h $(srcdir)file.h \
$(srcdir)job.h $(srcdir)make.h $(srcdir)rule.h \
$(srcdir)variable.h $(ALLOCA_SRC) $(srcdir)config.h.in
.SUFFIXES:
.SUFFIXES: .o .c .h .ps .dvi .info .texinfo
all: make
info: make.info
dvi: make.dvi
# Some makes apparently use .PHONY as the default goal if it is before `all'.
.PHONY: all check info dvi
make.info: make.texinfo
$(MAKEINFO) -I$(srcdir) $(srcdir)make.texinfo -o make.info
make.dvi: make.texinfo
$(TEXI2DVI) $(srcdir)make.texinfo
make.ps: make.dvi
dvi2ps make.dvi > make.ps
make: $(objs) glob/glob.lib
$(CC) Link $(LDFLAGS) $(objs) $(LOADLIBES) To make.new
-delete quiet make
rename make.new make
# -I. is needed to find config.h in the build directory.
.c.o:
$(CC) $(defines) IDir "" IDir $(srcdir)glob \
$(CPPFLAGS) $(CFLAGS) $< $(OUTPUT_OPTION)
glob/glob.lib:
execute <<
cd glob
smake
<
tagsrcs = $(srcs) $(srcdir)remote-*.c
TAGS: $(tagsrcs)
$(ETAGS) $(tagsrcs)
tags: $(tagsrcs)
$(CTAGS) $(tagsrcs)
.PHONY: install installdirs
install:
copy make sc:c
loadavg: loadavg.c config.h
$(CC) $(defines) -DTEST -I. -I$(srcdir) $(CFLAGS) $(LDFLAGS) \
loadavg.c $(LOADLIBES) -o $@
clean: glob-clean
-$(RM) -f make loadavg *.o core make.dvi
distclean: clean glob-realclean
-$(RM) -f Makefile config.h config.status build.sh stamp-config
-$(RM) -f config.log config.cache
-$(RM) -f TAGS tags
-$(RM) -f make.?? make.??s make.log make.toc make.*aux
-$(RM) -f loadavg.c
realclean: distclean
-$(RM) -f make.info*
mostlyclean: clean
.PHONY: glob-clean glob-realclean
glob-clean glob-realclean:
execute <<
cd glob
smake $@
<
# The automatically generated dependencies below may omit config.h
# because it is included with ``#include <config.h>'' rather than
# ``#include "config.h"''. So we add the explicit dependency to make sure.
$(objs): config.h
# Automatically generated dependencies will be put at the end of the file.
# Automatically generated dependencies.
commands.o: commands.c make.h dep.h filedef.h variable.h job.h \
commands.h
job.o: job.c make.h job.h filedef.h commands.h variable.h
dir.o: dir.c make.h
file.o: file.c make.h dep.h filedef.h job.h commands.h variable.h
misc.o: misc.c make.h dep.h
main.o: main.c make.h dep.h filedef.h variable.h job.h commands.h \
getopt.h
read.o: read.c make.h dep.h filedef.h job.h commands.h variable.h \
glob/glob.h
remake.o: remake.c make.h filedef.h job.h commands.h dep.h
rule.o: rule.c make.h dep.h filedef.h job.h commands.h variable.h \
rule.h
implicit.o: implicit.c make.h rule.h dep.h filedef.h
default.o: default.c make.h rule.h dep.h filedef.h job.h commands.h \
variable.h
variable.o: variable.c make.h dep.h filedef.h job.h commands.h \
variable.h
expand.o: expand.c make.h filedef.h job.h commands.h variable.h
function.o: function.c make.h filedef.h variable.h dep.h job.h \
commands.h amiga.h
vpath.o: vpath.c make.h filedef.h variable.h
version.o: version.c
ar.o: ar.c make.h filedef.h dep.h
arscan.o: arscan.c make.h
signame.o: signame.c signame.h
remote-stub.o: remote-stub.c make.h filedef.h job.h commands.h
getopt.o: getopt.c
getopt1.o : getopt1.c getopt.h
getloadavg.o: getloadavg.c
amiga.o: amiga.c make.h variable.h amiga.h

51
TODO.private Normal file
View File

@@ -0,0 +1,51 @@
-*-Indented-Text-*-
GNU Make TODO List
------------------
This list comes both from the authors and from users of GNU make.
They are listed in no particular order!
Also, I don't gaurantee that all of them will be ultimately deemed "good
ideas" and implemented. These are just the ones that, at first blush,
seem to have some merit (and that I can remember).
However, if you see something here you really, really want, speak up.
All other things being equal, I will tend to implement things that seem
to maximize user satisfaction.
Also, this list doesn't include things which I'm pretty sure would
require serious, fundamental change to GNU make; those things belong on
the mythical "Make 4.0" list. I admit, that line can be somewhat fuzzy :)
* Per-target variable definitions (a la SunOS make's ":=" feature, but
note the syntax here will definitely be different!)
* Multi-token pattern rule matching (allow %1/%2.c : %1/obj/%2.o, etc.)
* More robust clock skew detection algorithm.
* Provide MAKETARGETS and MAKEVARIABLES variables, containing the
names of the targets and variables defined in the makefile.
* If the user asks for parallelization, rebuild any "include"'d files
in parallel as well (helps esp. when there are many .d files to be
built).
* Allow variables/functions to expand to other make rules which are
then interpreted, with newlines handled correctly.
* More intelligent submake handling when doing parallel makes:
currently each submake gets a "-j 1" option. It would be good if
make was smart enough to give some/all its slots to the submake
(esp. if there is no other rule that can be run by the parent in
parallel, a common situation). Doing this perfectly might be too
hard, but something less than perfect is certainly possible.
* Option to check more than timestamps to determine if targets have
changed (MD5 checksumming?)
* Some sort of operating-system independent way of handling paths
would be outstanding, so makefiles can be written for UNIX, VMS,
DOS, MS-Windows, Amiga, etc. with a minimum of specialization.

View File

@@ -1,3 +1,9 @@
/* Name of this package (needed by automake) */
#undef PACKAGE
/* Version of this package (needed by automake) */
#undef VERSION
/* Define to the name of the SCCS `get' command. */
#undef SCCS_GET

19
aclocal.m4 vendored
View File

@@ -1,19 +0,0 @@
dnl
dnl Check for a symbol
dnl
AC_DEFUN(AC_CHECK_SYMBOL, [dnl
AC_MSG_CHECKING(for $1)
AC_CACHE_VAL(ac_cv_check_symbol_$1, [dnl
AC_TRY_LINK(,
changequote(,)dnl
extern char *$1[]; puts(*$1);,
changequote([,])dnl
ac_cv_check_symbol_$1=yes, ac_cv_check_symbol_$1=no)])
if test "$ac_cv_check_symbol_$1" = yes; then
changequote(,)dnl
ac_tr_symbol=`echo $1 | tr '[a-z]' '[A-Z]'`
changequote([,])dnl
AC_DEFINE_UNQUOTED(HAVE_${ac_tr_symbol})
fi
AC_MSG_RESULT($ac_cv_check_symbol_$1)])dnl
dnl

View File

@@ -25,6 +25,13 @@
#include <config.h>
#endif
#ifdef HAVE_STRING_H
#include <string.h>
#endif
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#ifdef emacs
#include "blockinput.h"
#endif
@@ -66,7 +73,9 @@ typedef void *pointer;
typedef char *pointer;
#endif
#ifndef NULL
#define NULL 0
#endif
/* Different portions of Emacs need to call different versions of
malloc. The Emacs executable needs alloca to call xmalloc, because
@@ -171,7 +180,7 @@ alloca (size)
#endif
/* Reclaim garbage, defined as all alloca'd storage that
was allocated from deeper in the stack than currently. */
was allocated from deeper in the stack than currently. */
{
register header *hp; /* Traverses linked list. */
@@ -341,7 +350,7 @@ struct stk_trailer
#ifdef CRAY2
/* Determine a "stack measure" for an arbitrary ADDRESS.
I doubt that "lint" will like this much. */
I doubt that "lint" will like this much. */
static long
i00afunc (long *address)

122
amiga.c Normal file
View File

@@ -0,0 +1,122 @@
/* Running commands on Amiga
Copyright (C) 1995, 1996 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, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "make.h"
#include "variable.h"
#include "amiga.h"
#include <assert.h>
#include <exec/memory.h>
#include <dos/dostags.h>
#include <proto/exec.h>
#include <proto/dos.h>
static const char Amiga_version[] = "$VER: Make 3.74.3 (12.05.96) \n"
"Amiga Port by A. Digulla (digulla@home.lake.de)";
int
MyExecute (argv)
char ** argv;
{
char * buffer, * ptr;
char ** aptr;
int len = 0;
int status;
for (aptr=argv; *aptr; aptr++)
{
len += strlen (*aptr) + 4;
}
buffer = AllocMem (len, MEMF_ANY);
if (!buffer)
fatal ("MyExecute: Cannot allocate space for calling a command");
ptr = buffer;
for (aptr=argv; *aptr; aptr++)
{
if (((*aptr)[0] == ';' && !(*aptr)[1]))
{
*ptr ++ = '"';
strcpy (ptr, *aptr);
ptr += strlen (ptr);
*ptr ++ = '"';
}
else if ((*aptr)[0] == '@' && (*aptr)[1] == '@' && !(*aptr)[2])
{
*ptr ++ = '\n';
continue;
}
else
{
strcpy (ptr, *aptr);
ptr += strlen (ptr);
}
*ptr ++ = ' ';
*ptr = 0;
}
ptr[-1] = '\n';
status = SystemTags (buffer,
SYS_UserShell, TRUE,
TAG_END);
FreeMem (buffer, len);
if (SetSignal(0L,0L) & SIGBREAKF_CTRL_C)
status = 20;
/* Warnings don't count */
if (status == 5)
status = 0;
return status;
}
char *
wildcard_expansion (wc, o)
char * wc, * o;
{
# define PATH_SIZE 1024
struct AnchorPath * apath;
if ( (apath = AllocMem (sizeof (struct AnchorPath) + PATH_SIZE,
MEMF_CLEAR))
)
{
apath->ap_Strlen = PATH_SIZE;
if (MatchFirst (wc, apath) == 0)
{
do
{
o = variable_buffer_output (o, apath->ap_Buf,
strlen (apath->ap_Buf));
o = variable_buffer_output (o, " ",1);
} while (MatchNext (apath) == 0);
}
MatchEnd (apath);
FreeMem (apath, sizeof (struct AnchorPath) + PATH_SIZE);
}
return o;
}

21
amiga.h Normal file
View File

@@ -0,0 +1,21 @@
/* Definitions for amiga specific things
Copyright (C) 1995, 1996 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, 675 Mass Ave, Cambridge, MA 02139, USA. */
extern int MyExecute PARAMS ((char ** argv));
extern char * wildcard_expansion PARAMS ((char * wc, char * o));

30
ar.c
View File

@@ -1,5 +1,5 @@
/* Interface to `ar' archives for GNU Make.
Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
Copyright (C) 1988,89,90,91,92,93,97 Free Software Foundation, Inc.
This file is part of GNU Make.
GNU Make is free software; you can redistribute it and/or modify
@@ -20,15 +20,16 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#ifndef NO_ARCHIVES
#include "file.h"
#include "filedef.h"
#include "dep.h"
#include <fnmatch.h>
/* Defined in arscan.c. */
extern long int ar_scan ();
extern int ar_member_touch ();
extern int ar_name_equal ();
extern long int ar_scan PARAMS ((char *archive, long int (*function) (), long int arg));
extern int ar_name_equal PARAMS ((char *name, char *mem, int truncated));
#ifndef VMS
extern int ar_member_touch PARAMS ((char *arname, char *memname));
#endif
/* Return nonzero if NAME is an archive-member reference, zero if not.
An archive-member reference is a name like `lib(member)'.
@@ -40,7 +41,7 @@ ar_name (name)
char *name;
{
char *p = index (name, '('), *end = name + strlen (name) - 1;
if (p == 0 || p == name || *end != ')')
return 0;
@@ -66,9 +67,10 @@ ar_parse_name (name, arname_p, memname_p)
if (memname_p != 0)
*memname_p = savestring (p + 1, end - (p + 1));
}
}
static long int ar_member_date_1 ();
static long int ar_member_date_1 PARAMS ((int desc, char *mem, int truncated, long int hdrpos,
long int datapos, long int size, long int date, int uid, int gid, int mode, char *name));
/* Return the modtime of NAME. */
@@ -130,6 +132,15 @@ ar_member_date_1 (desc, mem, truncated,
/* Set the archive-member NAME's modtime to now. */
#ifdef VMS
int
ar_touch (name)
char *name;
{
error ("touch archive member is not available on VMS");
return -1;
}
#else
int
ar_touch (name)
char *name;
@@ -182,6 +193,7 @@ ar_touch (name)
return val;
}
#endif /* !VMS */
/* State of an `ar_glob' run, passed to `ar_glob_match'. */

205
arscan.c
View File

@@ -1,19 +1,19 @@
/* Library function for scanning an archive file.
Copyright (C) 1987, 89, 91, 92, 93, 94, 95 Free Software Foundation, Inc.
Copyright (C) 1987,89,91,92,93,94,95,97 Free Software Foundation, Inc.
This program 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.
This program 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.
This program 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.
This program 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 this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "make.h"
@@ -25,6 +25,171 @@
#ifndef NO_ARCHIVES
#ifdef VMS
#include <lbrdef.h>
#include <mhddef.h>
#include <credef.h>
#include <descrip.h>
#include <ctype.h>
#if __DECC
#include <unixlib.h>
#include <lbr$routines.h>
#endif
#define uppercasify(str) {char *str1; for (str1 = str; *str1; str1++) *str1 = _toupper(*str1);}
static void *VMS_lib_idx;
static char *VMS_saved_memname;
static time_t VMS_member_date;
static long int (*VMS_function) ();
static int
VMS_get_member_info (module, rfa)
struct dsc$descriptor_s *module;
unsigned long *rfa;
{
int status, i;
long int fnval;
time_t val;
static struct dsc$descriptor_s bufdesc =
{ 0, DSC$K_DTYPE_T, DSC$K_CLASS_S, NULL };
struct mhddef *mhd;
char filename[128];
bufdesc.dsc$a_pointer = filename;
bufdesc.dsc$w_length = sizeof (filename);
status = lbr$set_module (&VMS_lib_idx, rfa, &bufdesc,
&bufdesc.dsc$w_length, 0);
if (! status)
{
error ("lbr$set_module failed to extract module info, status = %d",
status);
lbr$close (&VMS_lib_idx);
return 0;
}
mhd = (struct mhddef *) filename;
val = decc$fix_time (&mhd->mhd$l_datim);
for (i = 0; i < module->dsc$w_length; i++)
filename[i] = _tolower (module->dsc$a_pointer[i]);
filename[i] = '\0';
VMS_member_date = (time_t) -1;
fnval =
(*VMS_function) (-1, filename, 0, 0, 0, 0, val, 0, 0, 0,
VMS_saved_memname);
if (fnval)
{
VMS_member_date = fnval;
return 0;
}
else
return 1;
}
/* Takes three arguments ARCHIVE, FUNCTION and ARG.
Open the archive named ARCHIVE, find its members one by one,
and for each one call FUNCTION with the following arguments:
archive file descriptor for reading the data,
member name,
member name might be truncated flag,
member header position in file,
member data position in file,
member data size,
member date,
member uid,
member gid,
member protection mode,
ARG.
NOTE: on VMS systems, only name, date, and arg are meaningful!
The descriptor is poised to read the data of the member
when FUNCTION is called. It does not matter how much
data FUNCTION reads.
If FUNCTION returns nonzero, we immediately return
what FUNCTION returned.
Returns -1 if archive does not exist,
Returns -2 if archive has invalid format.
Returns 0 if have scanned successfully. */
long int
ar_scan (archive, function, arg)
char *archive;
long int (*function) ();
long int arg;
{
char *p;
static struct dsc$descriptor_s libdesc =
{ 0, DSC$K_DTYPE_T, DSC$K_CLASS_S, NULL };
unsigned long func = LBR$C_READ;
unsigned long type = LBR$C_TYP_UNK;
unsigned long index = 1;
int status;
status = lbr$ini_control (&VMS_lib_idx, &func, &type, 0);
if (! status)
{
error ("lbr$ini_control failed with status = %d",status);
return -2;
}
libdesc.dsc$a_pointer = archive;
libdesc.dsc$w_length = strlen (archive);
status = lbr$open (&VMS_lib_idx, &libdesc, 0, 0, 0, 0, 0);
if (! status)
{
error ("unable to open library `%s' to lookup member `%s'",
archive, (char *)arg);
return -1;
}
VMS_saved_memname = (char *)arg;
/* For comparison, delete .obj from arg name. */
p = rindex (VMS_saved_memname, '.');
if (p)
*p = '\0';
VMS_function = function;
lbr$get_index (&VMS_lib_idx, &index, VMS_get_member_info, 0);
/* Undo the damage. */
if (p)
*p = '.';
lbr$close (&VMS_lib_idx);
return VMS_member_date > 0 ? VMS_member_date : 0;
}
#else /* !VMS */
/* SCO Unix's compiler defines both of these. */
#ifdef M_UNIX
#undef M_XENIX
@@ -203,7 +368,7 @@ ar_scan (archive, function, arg)
(void) close (desc);
return -2;
}
name[name_len] = 0;
sscanf (member_header.ar_date, "%12ld", &dateval);
@@ -277,7 +442,7 @@ ar_scan (archive, function, arg)
&& name[2] == '/')
{
int namesize = atoi (name + 3);
name = (char *) alloca (namesize + 1);
nread = read (desc, name, namesize);
if (nread != namesize)
@@ -351,7 +516,7 @@ ar_scan (archive, function, arg)
(void) close (desc);
return -2;
}
/* The names are separated by newlines. Some formats have
a trailing slash. Null terminate the strings for
convenience. */
@@ -365,7 +530,7 @@ ar_scan (archive, function, arg)
clear[-1] = '\0';
}
}
is_namemap = 0;
}
@@ -379,6 +544,7 @@ ar_scan (archive, function, arg)
close (desc);
return 0;
}
#endif /* !VMS */
/* Return nonzero iff NAME matches MEM.
If TRUNCATED is nonzero, MEM may be truncated to
@@ -426,7 +592,7 @@ ar_name_equal (name, mem, truncated)
}
#else /* AIX or APOLLO. */
#ifndef VMS
if (truncated)
{
#ifdef AIAMAG
@@ -435,7 +601,7 @@ ar_name_equal (name, mem, truncated)
#else
struct ar_hdr hdr;
return !strncmp (name, mem,
sizeof (hdr.ar_name) -
sizeof (hdr.ar_name) -
#if !defined (__hpux) && !defined (cray)
1
#else
@@ -444,12 +610,14 @@ ar_name_equal (name, mem, truncated)
);
#endif
}
#endif /* !VMS */
return !strcmp (name, mem);
#endif
}
#ifndef VMS
/* ARGSUSED */
static long int
ar_member_pos (desc, mem, truncated,
@@ -532,6 +700,7 @@ ar_member_touch (arname, memname)
errno = i;
return -3;
}
#endif
#ifdef TEST

View File

@@ -1,69 +0,0 @@
#!/bin/sh
# Shell script to build GNU Make in the absence of any `make' program.
# @configure_input@
# Copyright (C) 1993, 1994 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, 675 Mass Ave, Cambridge, MA 02139, USA.
# See Makefile.in for comments describing these variables.
srcdir='@srcdir@'
CC='@CC@'
CFLAGS='@CFLAGS@'
CPPFLAGS='@CPPFLAGS@'
LDFLAGS='@LDFLAGS@'
defines='@DEFS@ -DLIBDIR="${libdir}" -DINCLUDEDIR="${includedir}"'
ALLOCA='@ALLOCA@'
LOADLIBES='@LIBS@'
extras='@LIBOBJS@'
REMOTE='@REMOTE@'
# Common prefix for machine-independent installed files.
prefix='@prefix@'
# Common prefix for machine-dependent installed files.
exec_prefix='@exec_prefix@'
# Directory to find libraries in for `-lXXX'.
libdir=${exec_prefix}/lib
# Directory to search by default for included makefiles.
includedir=${prefix}/include
# Exit as soon as any command fails.
set -e
# These are all the objects we need to link together.
objs="commands.o job.o dir.o file.o misc.o main.o read.o remake.o rule.o implicit.o default.o variable.o expand.o function.o vpath.o version.o ar.o arscan.o signame.o getopt.o getopt1.o glob/libglob.a glob/glob.o glob/fnmatch.o remote-${REMOTE}.o ${extras} ${ALLOCA}"
# Compile the source files into those objects.
for file in `echo ${objs} | sed 's/\.o/.c/g'`; do
echo compiling ${file}...
$CC $defines $CPPFLAGS $CFLAGS \
-c -I. -I${srcdir} -I${srcdir}/glob ${srcdir}/$file
done
# The object files were actually all put in the current directory.
# Remove the source directory names from the list.
srcobjs="$objs"
objs=
for obj in $srcobjs; do
objs="$objs `basename $obj`"
done
# Link all the objects together.
echo linking make...
$CC $LDFLAGS $objs $LOADLIBES -o make.new
echo done
mv -f make.new make

View File

@@ -2,9 +2,9 @@
# Shell script to build GNU Make in the absence of any `make' program.
# @configure_input@
# Copyright (C) 1993, 1994 Free Software Foundation, Inc.
# Copyright (C) 1993, 1994, 1997 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)
@@ -14,7 +14,7 @@
# 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, 675 Mass Ave, Cambridge, MA 02139, USA.

137
build_w32.bat Normal file
View File

@@ -0,0 +1,137 @@
set make=gnumake
cd w32\subproc
echo "Creating the subproc library"
%ComSpec% /c build.bat
cd ..\..
del link.dbg link.rel
del config.h
copy config.h.W32 config.h
echo off
echo "Creating GNU make for Windows 95/NT"
echo on
if not exist .\WinDebug\nul mkdir .\WinDebug
cl.exe /nologo /MT /W3 /GX /Zi /YX /Od /I . /I glob /I w32/include /D TIVOLI /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c variable.c
echo WinDebug\variable.obj >>link.dbg
cl.exe /nologo /MT /W3 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c rule.c
echo WinDebug\rule.obj >>link.dbg
cl.exe /nologo /MT /W3 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c remote-stub.c
echo WinDebug\remote-stub.obj >>link.dbg
cl.exe /nologo /MT /W3 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c commands.c
echo WinDebug\commands.obj >>link.dbg
cl.exe /nologo /MT /W3 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c file.c
echo WinDebug\file.obj >>link.dbg
cl.exe /nologo /MT /W3 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c getloadavg.c
echo WinDebug\getloadavg.obj >>link.dbg
cl.exe /nologo /MT /W3 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c default.c
echo WinDebug\default.obj >>link.dbg
cl.exe /nologo /MT /W3 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c signame.c
echo WinDebug\signame.obj >>link.dbg
cl.exe /nologo /MT /W3 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c expand.c
echo WinDebug\expand.obj >>link.dbg
cl.exe /nologo /MT /W3 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c dir.c
echo WinDebug\dir.obj >>link.dbg
cl.exe /nologo /MT /W3 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c main.c
echo WinDebug\main.obj >>link.dbg
cl.exe /nologo /MT /W3 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c getopt1.c
echo WinDebug\getopt1.obj >>link.dbg
cl.exe /nologo /MT /W3 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c job.c
echo WinDebug\job.obj >>link.dbg
cl.exe /nologo /MT /W3 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c read.c
echo WinDebug\read.obj >>link.dbg
cl.exe /nologo /MT /W3 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c version.c
echo WinDebug\version.obj >>link.dbg
cl.exe /nologo /MT /W3 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c getopt.c
echo WinDebug\getopt.obj >>link.dbg
cl.exe /nologo /MT /W3 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c arscan.c
echo WinDebug\arscan.obj >>link.dbg
cl.exe /nologo /MT /W3 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c remake.c
echo WinDebug\remake.obj >>link.dbg
cl.exe /nologo /MT /W3 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c misc.c
echo WinDebug\misc.obj >>link.dbg
cl.exe /nologo /MT /W3 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c ar.c
echo WinDebug\ar.obj >>link.dbg
cl.exe /nologo /MT /W3 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c function.c
echo WinDebug\function.obj >>link.dbg
cl.exe /nologo /MT /W3 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c vpath.c
echo WinDebug\vpath.obj >>link.dbg
cl.exe /nologo /MT /W3 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c implicit.c
echo WinDebug\implicit.obj >>link.dbg
cl.exe /nologo /MT /W3 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c .\w32\compat\dirent.c
echo WinDebug\dirent.obj >>link.dbg
cl.exe /nologo /MT /W3 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c .\glob\glob.c
echo WinDebug\glob.obj >>link.dbg
cl.exe /nologo /MT /W3 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c .\glob\fnmatch.c
echo WinDebug\fnmatch.obj >>link.dbg
cl.exe /nologo /MT /W3 /GX /Zi /YX /Od /I . /I glob /I w32/include /D _DEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinDebug/ /Fp.\WinDebug/%make%.pch /Fo.\WinDebug/ /Fd.\WinDebug/%make%.pdb /c .\w32\pathstuff.c
echo WinDebug\pathstuff.obj >>link.dbg
echo off
echo "Linking WinDebug/%make%.exe"
rem link.exe kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib w32\subproc\windebug\subproc.lib /NOLOGO /SUBSYSTEM:console /INCREMENTAL:yes /PDB:.\WinDebug/%make%.pdb /DEBUG /MACHINE:I386 /OUT:.\WinDebug/%make%.exe .\WinDebug/variable.obj .\WinDebug/rule.obj .\WinDebug/remote-stub.obj .\WinDebug/commands.obj .\WinDebug/file.obj .\WinDebug/getloadavg.obj .\WinDebug/default.obj .\WinDebug/signame.obj .\WinDebug/expand.obj .\WinDebug/dir.obj .\WinDebug/main.obj .\WinDebug/getopt1.obj .\WinDebug/job.obj .\WinDebug/read.obj .\WinDebug/version.obj .\WinDebug/getopt.obj .\WinDebug/arscan.obj .\WinDebug/remake.obj .\WinDebug/misc.obj .\WinDebug/ar.obj .\WinDebug/function.obj .\WinDebug/vpath.obj .\WinDebug/implicit.obj .\WinDebug/dirent.obj .\WinDebug/glob.obj .\WinDebug/fnmatch.obj .\WinDebug/pathstuff.obj
echo kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib w32\subproc\windebug\subproc.lib >>link.dbg
link.exe /NOLOGO /SUBSYSTEM:console /INCREMENTAL:yes /PDB:.\WinDebug/%make%.pdb /DEBUG /MACHINE:I386 /OUT:.\WinDebug/%make%.exe @link.dbg
if not exist .\WinDebug/%make%.exe echo "WinDebug build failed"
if exist .\WinDebug/%make%.exe echo "WinDebug build succeeded!"
if not exist .\WinRel\nul mkdir .\WinRel
echo on
cl.exe /nologo /MT /W3 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /D TIVOLI /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c variable.c
echo WinRel\variable.obj >>link.rel
cl.exe /nologo /MT /W3 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c rule.c
echo WinRel\rule.obj >>link.rel
cl.exe /nologo /MT /W3 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c remote-stub.c
echo WinRel\remote-stub.obj >>link.rel
cl.exe /nologo /MT /W3 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c commands.c
echo WinRel\commands.obj >>link.rel
cl.exe /nologo /MT /W3 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c file.c
echo WinRel\file.obj >>link.rel
cl.exe /nologo /MT /W3 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c getloadavg.c
echo WinRel\getloadavg.obj >>link.rel
cl.exe /nologo /MT /W3 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c default.c
echo WinRel\default.obj >>link.rel
cl.exe /nologo /MT /W3 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c signame.c
echo WinRel\signame.obj >>link.rel
cl.exe /nologo /MT /W3 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c expand.c
echo WinRel\expand.obj >>link.rel
cl.exe /nologo /MT /W3 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c dir.c
echo WinRel\dir.obj >>link.rel
cl.exe /nologo /MT /W3 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c main.c
echo WinRel\main.obj >>link.rel
cl.exe /nologo /MT /W3 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c getopt1.c
echo WinRel\getopt1.obj >>link.rel
cl.exe /nologo /MT /W3 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c job.c
echo WinRel\job.obj >>link.rel
cl.exe /nologo /MT /W3 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c read.c
echo WinRel\read.obj >>link.rel
cl.exe /nologo /MT /W3 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c version.c
echo WinRel\version.obj >>link.rel
cl.exe /nologo /MT /W3 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c getopt.c
echo WinRel\getopt.obj >>link.rel
cl.exe /nologo /MT /W3 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c arscan.c
echo WinRel\arscan.obj >>link.rel
cl.exe /nologo /MT /W3 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c remake.c
echo WinRel\remake.obj >>link.rel
cl.exe /nologo /MT /W3 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c misc.c
echo WinRel\misc.obj >>link.rel
cl.exe /nologo /MT /W3 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c ar.c
echo WinRel\ar.obj >>link.rel
cl.exe /nologo /MT /W3 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c function.c
echo WinRel\function.obj >>link.rel
cl.exe /nologo /MT /W3 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c vpath.c
echo WinRel\vpath.obj >>link.rel
cl.exe /nologo /MT /W3 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c implicit.c
echo WinRel\implicit.obj >>link.rel
cl.exe /nologo /MT /W3 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c .\w32\compat\dirent.c
echo WinRel\dirent.obj >>link.rel
cl.exe /nologo /MT /W3 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c .\glob\glob.c
echo WinRel\glob.obj >>link.rel
cl.exe /nologo /MT /W3 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c .\glob\fnmatch.c
echo WinRel\fnmatch.obj >>link.rel
cl.exe /nologo /MT /W3 /GX /YX /O2 /I . /I glob /I w32/include /D NDEBUG /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /D NO_ARCHIVES /FR.\WinRel/ /Fp.\WinRel/%make%.pch /Fo.\WinRel/ /c .\w32\pathstuff.c
echo WinRel\pathstuff.obj >>link.rel
echo off
echo "Linking WinRel/%make%.exe"
rem link.exe kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib w32\subproc\winrel\subproc.lib /NOLOGO /SUBSYSTEM:console /INCREMENTAL:no /PDB:.\WinRel/%make%.pdb /MACHINE:I386 /OUT:.\WinRel/%make%.exe .\WinRel/variable.obj .\WinRel/rule.obj .\WinRel/remote-stub.obj .\WinRel/commands.obj .\WinRel/file.obj .\WinRel/getloadavg.obj .\WinRel/default.obj .\WinRel/signame.obj .\WinRel/expand.obj .\WinRel/dir.obj .\WinRel/main.obj .\WinRel/getopt1.obj .\WinRel/job.obj .\WinRel/read.obj .\WinRel/version.obj .\WinRel/getopt.obj .\WinRel/arscan.obj .\WinRel/remake.obj .\WinRel/misc.obj .\WinRel/ar.obj .\WinRel/function.obj .\WinRel/vpath.obj .\WinRel/implicit.obj .\WinRel/dirent.obj .\WinRel/glob.obj .\WinRel/fnmatch.obj .\WinRel/pathstuff.obj
echo kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib w32\subproc\winrel\subproc.lib >>link.rel
link.exe /NOLOGO /SUBSYSTEM:console /INCREMENTAL:no /PDB:.\WinRel/%make%.pdb /MACHINE:I386 /OUT:.\WinRel/%make%.exe @link.rel
if not exist .\WinRel/%make%.exe echo "WinRel build failed"
if exist .\WinRel/%make%.exe echo "WinRel build succeeded!"
echo on

View File

@@ -1,5 +1,5 @@
/* Command processing for GNU Make.
Copyright (C) 1988, 89, 91, 92, 93, 94, 95 Free Software Foundation, Inc.
Copyright (C) 1988,89,91,92,93,94,95,96,97 Free Software Foundation, Inc.
This file is part of GNU Make.
GNU Make is free software; you can redistribute it and/or modify
@@ -18,12 +18,12 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "make.h"
#include "dep.h"
#include "commands.h"
#include "file.h"
#include "filedef.h"
#include "variable.h"
#include "job.h"
#include "commands.h"
extern int remote_kill ();
extern int remote_kill PARAMS ((int id, int sig));
#ifndef HAVE_UNISTD_H
extern int getpid ();
@@ -154,8 +154,11 @@ set_file_variables (file)
bcopy (c, cp, len);
cp += len;
#if VMS
*cp++ = ',';
#else
*cp++ = ' ';
#endif
if (! d->changed)
qmark_len -= len + 1; /* Don't space in $? for this one. */
}
@@ -193,13 +196,20 @@ set_file_variables (file)
bcopy (c, cp, len);
cp += len;
#if VMS
*cp++ = ',';
#else
*cp++ = ' ';
#endif
if (d->changed)
{
bcopy (c, qp, len);
qp += len;
#if VMS
*qp++ = ',';
#else
*qp++ = ' ';
#endif
}
}
@@ -359,10 +369,25 @@ RETSIGTYPE
fatal_error_signal (sig)
int sig;
{
#ifdef __MSDOS__
#ifdef __MSDOS__
extern int dos_status, dos_command_running;
if (dos_command_running)
{
/* That was the child who got the signal, not us. */
dos_status |= (sig << 8);
return;
}
remove_intermediates (1);
exit (1);
#else /* Not MSDOS. */
#else /* not __MSDOS__ */
#ifdef _AMIGA
remove_intermediates (1);
if (sig == SIGINT)
fputs ("*** Break.\n", stderr);
exit (10);
#else /* not Amiga */
handling_fatal_signal = 1;
/* Set the handling for this signal to the default.
@@ -383,7 +408,14 @@ fatal_error_signal (sig)
/* If we got a signal that means the user
wanted to kill make, remove pending targets. */
if (sig == SIGTERM || sig == SIGINT || sig == SIGHUP || sig == SIGQUIT)
if (sig == SIGTERM || sig == SIGINT
#ifdef SIGHUP
|| sig == SIGHUP
#endif
#ifdef SIGQUIT
|| sig == SIGQUIT
#endif
)
{
register struct child *c;
@@ -410,16 +442,19 @@ fatal_error_signal (sig)
remove_intermediates (1);
#ifdef SIGQUIT
if (sig == SIGQUIT)
/* We don't want to send ourselves SIGQUIT, because it will
cause a core dump. Just exit instead. */
exit (1);
exit (EXIT_FAILURE);
#endif
/* Signal the same code; this time it will really be fatal. The signal
will be unblocked when we return and arrive then to kill us. */
if (kill (getpid (), sig) < 0)
pfatal_with_name ("kill");
#endif /* MSDOS. */
#endif /* not Amiga */
#endif /* not __MSDOS__ */
}
/* Delete FILE unless it's precious or not actually a file (phony),

View File

@@ -36,7 +36,7 @@ struct commands
#define COMMANDS_SILENT 2 /* Silent: @. */
#define COMMANDS_NOERROR 4 /* No errors: -. */
extern void execute_file_commands ();
extern void print_commands ();
extern void delete_child_targets ();
extern void chop_commands ();
extern void execute_file_commands PARAMS ((struct file *file));
extern void print_commands PARAMS ((struct commands *cmds));
extern void delete_child_targets PARAMS ((struct child *child));
extern void chop_commands PARAMS ((struct commands *cmds));

View File

@@ -1,271 +0,0 @@
# NOTE: If you have no `make' program at all to process this makefile, run
# `build.sh' instead.
#
# Copyright (C) 1988,89,91,92,93,94,95,96 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, 675 Mass Ave, Cambridge, MA 02139, USA.
#
# Makefile for GNU Make
#
# Ultrix 2.2 make doesn't expand the value of VPATH.
VPATH = @srcdir@
# This must repeat the value, because configure will remove `VPATH = .'.
srcdir = @srcdir@
CC = @CC@
CFLAGS = @CFLAGS@
CPPFLAGS = @CPPFLAGS@
LDFLAGS = @LDFLAGS@
# Define these for your system as follows:
# -DNO_ARCHIVES To disable `ar' archive support.
# -DNO_FLOAT To avoid using floating-point numbers.
# -DENUM_BITFIELDS If the compiler isn't GCC but groks enum foo:2.
# Some compilers apparently accept this
# without complaint but produce losing code,
# so beware.
# NeXT 1.0a uses an old version of GCC, which required -D__inline=inline.
# See also `config.h'.
defines = @DEFS@ -DLIBDIR=\"$(libdir)\" -DINCLUDEDIR=\"$(includedir)\"
# Which flavor of remote job execution support to use.
# The code is found in `remote-$(REMOTE).c'.
REMOTE = @REMOTE@
# If your system doesn't have alloca, or the one provided is bad, define this.
ALLOCA = @ALLOCA@
ALLOCA_SRC = $(srcdir)/alloca.c
# If your system needs extra libraries loaded in, define them here.
# System V probably need -lPW for alloca. HP-UX 7.0's alloca in
# libPW.a is broken on HP9000s300 and HP9000s400 machines. Use
# alloca.c instead on those machines.
LOADLIBES = @LIBS@
# Any extra object files your system needs.
extras = @LIBOBJS@
# Common prefix for machine-independent installed files.
prefix = @prefix@
# Common prefix for machine-dependent installed files.
exec_prefix = @exec_prefix@
# Directory to install `make' in.
bindir = $(exec_prefix)/bin
# Directory to find libraries in for `-lXXX'.
libdir = $(exec_prefix)/lib
# Directory to search by default for included makefiles.
includedir = $(prefix)/include
# Directory to install the Info files in.
infodir = $(prefix)/info
# Directory to install the man page in.
mandir = $(prefix)/man/man$(manext)
# Number to put on the man page filename.
manext = 1
# Prefix to put on installed `make' binary file name.
binprefix =
# Prefix to put on installed `make' man page file name.
manprefix = $(binprefix)
# Whether or not make needs to be installed setgid.
# The value should be either `true' or `false'.
# On many systems, the getloadavg function (used to implement the `-l'
# switch) will not work unless make is installed setgid kmem.
install_setgid = @NEED_SETGID@
# Install make setgid to this group so it can read /dev/kmem.
group = @KMEM_GROUP@
# Program to install `make'.
INSTALL_PROGRAM = @INSTALL_PROGRAM@
# Program to install the man page.
INSTALL_DATA = @INSTALL_DATA@
# Generic install program.
INSTALL = @INSTALL@
# Program to format Texinfo source into Info files.
MAKEINFO = makeinfo
# Program to format Texinfo source into DVI files.
TEXI2DVI = texi2dvi
# Programs to make tags files.
ETAGS = etags -w
CTAGS = ctags -w
objs = commands.o job.o dir.o file.o misc.o main.o read.o remake.o \
rule.o implicit.o default.o variable.o expand.o function.o \
vpath.o version.o ar.o arscan.o signame.o remote-$(REMOTE).o \
getopt.o getopt1.o glob/libglob.a \
$(ALLOCA) $(extras)
srcs = $(srcdir)/commands.c $(srcdir)/job.c $(srcdir)/dir.c \
$(srcdir)/file.c $(srcdir)/getloadavg.c $(srcdir)/misc.c \
$(srcdir)/main.c $(srcdir)/read.c $(srcdir)/remake.c \
$(srcdir)/rule.c $(srcdir)/implicit.c $(srcdir)/default.c \
$(srcdir)/variable.c $(srcdir)/expand.c $(srcdir)/function.c \
$(srcdir)/vpath.c $(srcdir)/version.c \
$(srcdir)/remote-$(REMOTE).c \
$(srcdir)/ar.c $(srcdir)/arscan.c \
$(srcdir)/signame.c $(srcdir)/signame.h getopt.c getopt1.c \
$(srcdir)/commands.h $(srcdir)/dep.h $(srcdir)/file.h \
$(srcdir)/job.h $(srcdir)/make.h $(srcdir)/rule.h \
$(srcdir)/variable.h $(ALLOCA_SRC) $(srcdir)/config.h.in
.SUFFIXES:
.SUFFIXES: .o .c .h .ps .dvi .info .texinfo
all: make
info: make.info
dvi: make.dvi
# Some makes apparently use .PHONY as the default goal if it is before `all'.
.PHONY: all check info dvi
make.info: make.texinfo
$(MAKEINFO) -I$(srcdir) $(srcdir)/make.texinfo -o make.info
make.dvi: make.texinfo
$(TEXI2DVI) $(srcdir)/make.texinfo
make.ps: make.dvi
dvi2ps make.dvi > make.ps
make: $(objs)
$(CC) $(LDFLAGS) $(objs) $(LOADLIBES) -o make.new
mv -f make.new make
# -I. is needed to find config.h in the build directory.
.c.o:
$(CC) $(defines) -c -I. -I$(srcdir) -I$(srcdir)/glob \
$(CPPFLAGS) $(CFLAGS) $< $(OUTPUT_OPTION)
# For some losing Unix makes.
SHELL = /bin/sh
MAKE = make
glob/libglob.a: FORCE config.h
cd glob; $(MAKE) libglob.a
FORCE:
tagsrcs = $(srcs) $(srcdir)/remote-*.c
TAGS: $(tagsrcs)
$(ETAGS) $(tagsrcs)
tags: $(tagsrcs)
$(CTAGS) $(tagsrcs)
.PHONY: install installdirs
install: installdirs \
$(bindir)/$(binprefix)make $(infodir)/make.info \
$(mandir)/$(manprefix)make.$(manext)
installdirs:
$(SHELL) ${srcdir}/mkinstalldirs $(bindir) $(infodir) $(mandir)
$(bindir)/$(binprefix)make: make
$(INSTALL_PROGRAM) make $@.new
@if $(install_setgid); then \
if chgrp $(group) $@.new && chmod g+s $@.new; then \
echo "chgrp $(group) $@.new && chmod g+s $@.new"; \
else \
echo "$@ needs to be owned by group $(group) and setgid;"; \
echo "otherwise the \`-l' option will probably not work."; \
echo "You may need special privileges to install $@."; \
fi; \
else true; fi
# Some systems can't deal with renaming onto a running binary.
-rm -f $@.old
-mv $@ $@.old
mv $@.new $@
$(infodir)/make.info: make.info
if [ -r ./make.info ]; then dir=.; else dir=$(srcdir); fi; \
for file in $${dir}/make.info*; do \
name="`basename $$file`"; \
$(INSTALL_DATA) $$file \
`echo $@ | sed "s,make.info\$$,$$name,"`; \
done
# Run install-info only if it exists.
# Use `if' instead of just prepending `-' to the
# line so we notice real errors from install-info.
# We use `$(SHELL) -c' because some shells do not
# fail gracefully when there is an unknown command.
if $(SHELL) -c 'install-info --version' >/dev/null 2>&1; then \
if [ -r ./make.info ]; then dir=.; else dir=$(srcdir); fi; \
install-info --infodir=$(infodir) $$dir/make.info; \
else true; fi
$(mandir)/$(manprefix)make.$(manext): make.man
$(INSTALL_DATA) $(srcdir)/make.man $@
loadavg: loadavg.c config.h
$(CC) $(defines) -DTEST -I. -I$(srcdir) $(CFLAGS) $(LDFLAGS) \
loadavg.c $(LOADLIBES) -o $@
# We copy getloadavg.c into a different file rather than compiling it
# directly because some compilers clobber getloadavg.o in the process.
loadavg.c: getloadavg.c
ln $(srcdir)/getloadavg.c loadavg.c || \
cp $(srcdir)/getloadavg.c loadavg.c
check-loadavg: loadavg
@echo The system uptime program believes the load average to be:
-uptime
@echo The GNU load average checking code believes:
./loadavg
check: check-loadavg
.PHONY: clean realclean distclean mostlyclean
clean: glob-clean
-rm -f make loadavg *.o core make.dvi
distclean: clean glob-realclean
-rm -f Makefile config.h config.status build.sh stamp-config
-rm -f config.log config.cache
-rm -f TAGS tags
-rm -f make.?? make.??s make.log make.toc make.*aux
-rm -f loadavg.c
realclean: distclean
-rm -f make.info*
mostlyclean: clean
.PHONY: glob-clean glob-realclean
glob-clean glob-realclean:
cd glob; $(MAKE) $@
Makefile: config.status $(srcdir)/Makefile.in
$(SHELL) config.status
glob/Makefile: config.status $(srcdir)/glob/Makefile.in
$(SHELL) config.status
config.h: stamp-config ;
stamp-config: config.status $(srcdir)/config.h.in
$(SHELL) config.status
touch stamp-config
#configure: configure.in aclocal.m4
# cd $(srcdir) && autoconf $(ACFLAGS)
#config.h.in: configure.in aclocal.m4
# cd $(srcdir) && autoheader $(ACFLAGS)
# This tells versions [3.59,3.63) of GNU make not to export all variables.
.NOEXPORT:
# The automatically generated dependencies below may omit config.h
# because it is included with ``#include <config.h>'' rather than
# ``#include "config.h"''. So we add the explicit dependency to make sure.
$(objs): config.h
# Automatically generated dependencies will be put at the end of the file.

280
config.ami.template Normal file
View File

@@ -0,0 +1,280 @@
/* config.h.in. Generated automatically from configure.in by autoheader. */
/* Define if on AIX 3.
System headers sometimes define this.
We just want to avoid a redefinition error message. */
#ifndef _ALL_SOURCE
#undef _ALL_SOURCE
#endif
/* Define if using alloca.c. */
#define C_ALLOCA
/* Define to empty if the keyword does not work. */
#undef const
/* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems.
This function is required for alloca.c support on those systems. */
#undef CRAY_STACKSEG_END
/* Define for DGUX with <sys/dg_sys_info.h>. */
#undef DGUX
/* Define if the `getloadavg' function needs to be run setuid or setgid. */
#undef GETLOADAVG_PRIVILEGED
/* Define to `int' if <sys/types.h> doesn't define. */
#define gid_t int
/* Define if you have alloca, as a function or macro. */
#undef HAVE_ALLOCA
/* Define if you have <alloca.h> and it should be used (not on Ultrix). */
#undef HAVE_ALLOCA_H
/* Define if you have the memmove function. */
#define HAVE_MEMMOVE 1
/* Define if you don't have vprintf but do have _doprnt. */
#undef HAVE_DOPRNT
/* Define if your system has its own `getloadavg' function. */
#undef HAVE_GETLOADAVG
/* Define if you have the getmntent function. */
#undef HAVE_GETMNTENT
/* Define if the `long double' type works. */
#undef HAVE_LONG_DOUBLE
/* Define if you support file names longer than 14 characters. */
#define HAVE_LONG_FILE_NAMES
/* Define if you have a working `mmap' system call. */
#undef HAVE_MMAP
/* Define if system calls automatically restart after interruption
by a signal. */
#undef HAVE_RESTARTABLE_SYSCALLS
/* Define if your struct stat has st_blksize. */
#undef HAVE_ST_BLKSIZE
/* Define if your struct stat has st_blocks. */
#undef HAVE_ST_BLOCKS
/* Define if you have the strcoll function and it is properly defined. */
#define HAVE_STRCOLL
/* Define if your struct stat has st_rdev. */
#define HAVE_ST_RDEV
/* Define if you have the strftime function. */
#define HAVE_STRFTIME
/* Define if you have <sys/wait.h> that is POSIX.1 compatible. */
#undef HAVE_SYS_WAIT_H
/* Define if your struct tm has tm_zone. */
#undef HAVE_TM_ZONE
/* Define if you don't have tm_zone but do have the external array
tzname. */
#define HAVE_TZNAME
/* #define tzname __tzname */
/* Define if you have <unistd.h>. */
#define HAVE_UNISTD_H
/* Define if utime(file, NULL) sets file's timestamp to the present. */
#undef HAVE_UTIME_NULL
/* Define if you have <vfork.h>. */
#undef HAVE_VFORK_H
/* Define if you have the vprintf function. */
#define HAVE_VPRINTF
/* Define if you have the wait3 system call. */
#undef HAVE_WAIT3
/* Define if on MINIX. */
#undef _MINIX
/* Define if your struct nlist has an n_un member. */
#undef NLIST_NAME_UNION
/* Define if you have <nlist.h>. */
#undef NLIST_STRUCT
/* Define if your C compiler doesn't accept -c and -o together. */
#undef NO_MINUS_C_MINUS_O
/* Define to `int' if <sys/types.h> doesn't define. */
#define pid_t int
/* Define if the system does not provide POSIX.1 features except
with this defined. */
#undef _POSIX_1_SOURCE
/* Define if you need to in order for stat and other things to work. */
#undef _POSIX_SOURCE
/* Define as the return type of signal handlers (int or void). */
#define RETSIGTYPE void
/* Define if the setvbuf function takes the buffering type as its second
argument and the buffer pointer as the third, as on System V
before release 3. */
#undef SETVBUF_REVERSED
/* If using the C implementation of alloca, define if you know the
direction of stack growth for your system; otherwise it will be
automatically deduced at run-time.
STACK_DIRECTION > 0 => grows toward higher addresses
STACK_DIRECTION < 0 => grows toward lower addresses
STACK_DIRECTION = 0 => direction of growth unknown
*/
#define STACK_DIRECTION -1
/* Define if the `S_IS*' macros in <sys/stat.h> do not work properly. */
#undef STAT_MACROS_BROKEN
/* Define if you have the ANSI C header files. */
#define STDC_HEADERS
/* Define on System V Release 4. */
#undef SVR4
/* Define if `sys_siglist' is declared by <signal.h>. */
#undef SYS_SIGLIST_DECLARED
/* Define to `int' if <sys/types.h> doesn't define. */
#define uid_t int
/* Define for Encore UMAX. */
#undef UMAX
/* Define for Encore UMAX 4.3 that has <inq_status/cpustats.h>
instead of <sys/cpustats.h>. */
#undef UMAX4_3
/* Define vfork as fork if vfork does not work. */
#undef vfork
/* Name of this package (needed by automake) */
#define PACKAGE "%PACKAGE%"
/* Version of this package (needed by automake) */
#define VERSION "%VERSION%"
/* Define to the name of the SCCS `get' command. */
#define SCCS_GET "get"
/* Define this if the SCCS `get' command understands the `-G<file>' option. */
#undef SCCS_GET_MINUS_G
/* Define this if the C library defines the variable `sys_siglist'. */
#undef HAVE_SYS_SIGLIST
/* Define this if the C library defines the variable `_sys_siglist'. */
#undef HAVE__SYS_SIGLIST
/* Define this if you have the `union wait' type in <sys/wait.h>. */
#undef HAVE_UNION_WAIT
/* Define this if the POSIX.1 call `sysconf (_SC_OPEN_MAX)' works properly. */
#undef HAVE_SYSCONF_OPEN_MAX
/* Define if you have the dup2 function. */
#undef HAVE_DUP2
/* Define if you have the getcwd function. */
#define HAVE_GETCWD
/* Define if you have the getdtablesize function. */
#undef HAVE_GETDTABLESIZE
/* Define if you have the getgroups function. */
#undef HAVE_GETGROUPS
/* Define if you have the mktemp function. */
#define HAVE_MKTEMP
/* Define if you have the psignal function. */
#undef HAVE_PSIGNAL
/* Define if you have the setegid function. */
#undef HAVE_SETEGID
/* Define if you have the seteuid function. */
#undef HAVE_SETEUID
/* Define if you have the setlinebuf function. */
#undef HAVE_SETLINEBUF
/* Define if you have the setregid function. */
#undef HAVE_SETREGID
/* Define if you have the setreuid function. */
#undef HAVE_SETREUID
/* Define if you have the sigsetmask function. */
#undef HAVE_SIGSETMASK
/* Define if you have the strerror function. */
#define HAVE_STRERROR
/* Define if you have the strsignal function. */
#undef HAVE_STRSIGNAL
/* Define if you have the wait3 function. */
#undef HAVE_WAIT3
/* Define if you have the waitpid function. */
#undef HAVE_WAITPID
/* Define if you have the <dirent.h> header file. */
#define HAVE_DIRENT_H
/* Define if you have the <fcntl.h> header file. */
#define HAVE_FCNTL_H
/* Define if you have the <limits.h> header file. */
#define HAVE_LIMITS_H
/* Define if you have the <mach/mach.h> header file. */
#undef HAVE_MACH_MACH_H
/* Define if you have the <memory.h> header file. */
#undef HAVE_MEMORY_H
/* Define if you have the <ndir.h> header file. */
#undef HAVE_NDIR_H
/* Define if you have the <string.h> header file. */
#define HAVE_STRING_H
/* Define if you have the <sys/dir.h> header file. */
#define HAVE_SYS_DIR_H
/* Define if you have the <sys/ndir.h> header file. */
#undef HAVE_SYS_NDIR_H
/* Define if you have the <sys/param.h> header file. */
#undef HAVE_SYS_PARAM_H
/* Define if you have the <sys/timeb.h> header file. */
#undef HAVE_SYS_TIMEB_H
/* Define if you have the <sys/wait.h> header file. */
#undef HAVE_SYS_WAIT_H
/* Define if you have the <unistd.h> header file. */
#define HAVE_UNISTD_H
/* Define if you have the dgc library (-ldgc). */
#undef HAVE_LIBDGC
/* Define if you have the sun library (-lsun). */
#undef HAVE_LIBSUN

301
config.h-vms.template Normal file
View File

@@ -0,0 +1,301 @@
/* config.h-vms. Generated by hand by Klaus Kämpf <kkaempf@progis.de> */
/* config.h. Generated automatically by configure. */
/* config.h.in. Generated automatically from configure.in by autoheader. */
/* Define if on AIX 3.
System headers sometimes define this.
We just want to avoid a redefinition error message. */
#ifndef _ALL_SOURCE
/* #undef _ALL_SOURCE */
#endif
/* Define if using alloca.c. */
/* #undef C_ALLOCA */
/* Define to empty if the keyword does not work. */
/* #undef const */
/* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems.
This function is required for alloca.c support on those systems. */
/* #undef CRAY_STACKSEG_END */
/* Define for DGUX with <sys/dg_sys_info.h>. */
/* #undef DGUX */
/* Define if the `getloadavg' function needs to be run setuid or setgid. */
/* #undef GETLOADAVG_PRIVILEGED 1 */
/* Define to `int' if <sys/types.h> doesn't define. */
/* #undef gid_t */
/* Define if you have alloca, as a function or macro. */
#define HAVE_ALLOCA 1
/* Define if you have <alloca.h> and it should be used (not on Ultrix). */
/* #undef HAVE_ALLOCA_H 1 */
/* Define if you have the memmove function. */
#define HAVE_MEMMOVE 1
/* Define if you don't have vprintf but do have _doprnt. */
/* #undef HAVE_DOPRNT */
/* Define if your system has its own `getloadavg' function. */
/* #undef HAVE_GETLOADAVG */
/* Define if you have the getmntent function. */
/* #undef HAVE_GETMNTENT */
/* Define if the `long double' type works. */
/* #undef HAVE_LONG_DOUBLE */
/* Define if you support file names longer than 14 characters. */
#define HAVE_LONG_FILE_NAMES 1
/* Define if you have a working `mmap' system call. */
/* #undef HAVE_MMAP */
/* Define if system calls automatically restart after interruption
by a signal. */
/* #undef HAVE_RESTARTABLE_SYSCALLS */
/* Define if your struct stat has st_blksize. */
/* #undef HAVE_ST_BLKSIZE */
/* Define if your struct stat has st_blocks. */
/* #undef HAVE_ST_BLOCKS */
/* Define if you have the strcoll function and it is properly defined. */
/* #undef HAVE_STRCOLL 1 */
/* Define if your struct stat has st_rdev. */
/* #undef HAVE_ST_RDEV */
/* Define if you have the strftime function. */
/* #undef HAVE_STRFTIME */
/* Define if you have <sys/wait.h> that is POSIX.1 compatible. */
/* #undef HAVE_SYS_WAIT_H 1 */
/* Define if your struct tm has tm_zone. */
/* #undef HAVE_TM_ZONE */
/* Define if you don't have tm_zone but do have the external array
tzname. */
/* #undef HAVE_TZNAME */
/* Define if you have <unistd.h>. */
#ifdef __DECC
#define HAVE_UNISTD_H 1
#endif
/* Define if utime(file, NULL) sets file's timestamp to the present. */
/* #undef HAVE_UTIME_NULL */
/* Define if you have <vfork.h>. */
/* #undef HAVE_VFORK_H 1 */
/* Define if you have the vprintf function. */
#define HAVE_VPRINTF 1
/* Define if you have the wait3 system call. */
/* #undef HAVE_WAIT3 1 */
/* Define if on MINIX. */
/* #undef _MINIX */
/* Define if your struct nlist has an n_un member. */
/* #undef NLIST_NAME_UNION */
/* Define if you have <nlist.h>. */
/* #undef NLIST_STRUCT 1 */
/* Define if your C compiler doesn't accept -c and -o together. */
/* #undef NO_MINUS_C_MINUS_O */
/* Define to `int' if <sys/types.h> doesn't define. */
/* #undef pid_t */
/* Define if the system does not provide POSIX.1 features except
with this defined. */
/* #undef _POSIX_1_SOURCE */
/* Define if you need to in order for stat and other things to work. */
/* #undef _POSIX_SOURCE */
/* Define as the return type of signal handlers (int or void). */
#define RETSIGTYPE void
/* Define if the setvbuf function takes the buffering type as its second
argument and the buffer pointer as the third, as on System V
before release 3. */
/* #undef SETVBUF_REVERSED 1 */
/* If using the C implementation of alloca, define if you know the
direction of stack growth for your system; otherwise it will be
automatically deduced at run-time.
STACK_DIRECTION > 0 => grows toward higher addresses
STACK_DIRECTION < 0 => grows toward lower addresses
STACK_DIRECTION = 0 => direction of growth unknown
*/
/* #undef STACK_DIRECTION */
/* Define if the `S_IS*' macros in <sys/stat.h> do not work properly. */
/* #undef STAT_MACROS_BROKEN */
/* Define if you have the ANSI C header files. */
/* #undef STDC_HEADERS */
/* Define on System V Release 4. */
/* #undef SVR4 */
/* Define if `sys_siglist' is declared by <signal.h>. */
/* #undef SYS_SIGLIST_DECLARED */
/* Define to `int' if <sys/types.h> doesn't define. */
/* #undef uid_t */
/* Define for Encore UMAX. */
/* #undef UMAX */
/* Define for Encore UMAX 4.3 that has <inq_status/cpustats.h>
instead of <sys/cpustats.h>. */
/* #undef UMAX4_3 */
/* Name of this package (needed by automake) */
#define PACKAGE "%PACKAGE%"
/* Version of this package (needed by automake) */
#define VERSION "%VERSION%"
/* Define vfork as fork if vfork does not work. */
/* #undef vfork */
/* Define to the name of the SCCS `get' command. */
/* #undef SCCS_GET "/usr/sccs/get" */
/* Define this if the SCCS `get' command understands the `-G<file>' option. */
/* #undef SCCS_GET_MINUS_G 1 */
/* Define this if the C library defines the variable `sys_siglist'. */
/* #undefine HAVE_SYS_SIGLIST 1 */
/* Define this if the C library defines the variable `_sys_siglist'. */
/* #undef HAVE__SYS_SIGLIST */
/* Define this if you have the `union wait' type in <sys/wait.h>. */
/* #undef HAVE_UNION_WAIT */
/* Define this if the POSIX.1 call `sysconf (_SC_OPEN_MAX)' works properly. */
/* #undef HAVE_SYSCONF_OPEN_MAX */
/* Define if you have the dup2 function. */
#define HAVE_DUP2 1
/* Define if you have the getcwd function. */
#define HAVE_GETCWD 1
/* Define if you have the getdtablesize function. */
/* #undef HAVE_GETDTABLESIZE 1 */
/* Define if you have the getgroups function. */
/* #undef HAVE_GETGROUPS 1 */
/* Define if you have the mktemp function. */
#define HAVE_MKTEMP 1
/* Define if you have the psignal function. */
/* #undef HAVE_PSIGNAL 1 */
/* Define if you have the setegid function. */
/* #undef HAVE_SETEGID 1 */
/* Define if you have the seteuid function. */
/* #undef HAVE_SETEUID 1 */
/* Define if you have the setlinebuf function. */
/* #undef HAVE_SETLINEBUF 1 */
/* Define if you have the setregid function. */
/* #undefine HAVE_SETREGID 1 */
/* Define if you have the setreuid function. */
/* #define HAVE_SETREUID 1 */
/* Define if you have the sigsetmask function. */
#define HAVE_SIGSETMASK 1
/* Define if you have the strerror function. */
#define HAVE_STRERROR 1
/* Define if you have the strsignal function. */
/* #undef HAVE_STRSIGNAL */
/* Define if you have the wait3 function. */
/* #define HAVE_WAIT3 1 */
/* Define if you have the waitpid function. */
/* #undef HAVE_WAITPID 1 */
/* Define if you have the <dirent.h> header file. */
/* #unddef HAVE_DIRENT_H 1 */
/* Define if you have the <fcntl.h> header file. */
#ifdef __DECC
#define HAVE_FCNTL_H 1
#endif
/* Define if you have the <limits.h> header file. */
#define HAVE_LIMITS_H 1
/* Define if you have the <mach/mach.h> header file. */
/* #undef HAVE_MACH_MACH_H */
/* Define if you have the <memory.h> header file. */
/* #undef HAVE_MEMORY_H 1 */
/* Define if you have the <ndir.h> header file. */
/* #undef HAVE_NDIR_H */
/* Define if you have the <string.h> header file. */
#define HAVE_STRING_H 1
/* Define if you have the <pwd.h> header file. */
/* #undef HAVE_PWD_H */
/* Define if you have the <sys/dir.h> header file. */
/* #undef HAVE_SYS_DIR_H */
/* Define if you have the <sys/ndir.h> header file. */
/* #undef HAVE_SYS_NDIR_H */
/* Define if you have the <sys/param.h> header file. */
/* #undef HAVE_SYS_PARAM_H 1 */
/* Define if you have the <sys/timeb.h> header file. */
#define HAVE_SYS_TIMEB_H 1
/* Define if you have the <sys/wait.h> header file. */
/* #undef HAVE_SYS_WAIT_H 1 */
/* Define if you have the dgc library (-ldgc). */
/* #undef HAVE_LIBDGC */
/* Define if you have the sun library (-lsun). */
/* #undef HAVE_LIBSUN */
/* VMS specific */
#define HAVE_VMSDIR_H 1
#define HAVE_STDLIB_H 1
#define INCLUDEDIR "sys$sysroot:[syslib]"
#define LIBDIR "sys$sysroot:[syslib]"
#if defined (__cplusplus) || (defined (__STDC__) && __STDC__)
#undef PARAMS
#define PARAMS(protos) protos
#else /* Not C++ or ANSI C. */
#undef PARAMS
#define PARAMS(protos) ()
#endif /* C++ or ANSI C. */

View File

@@ -25,13 +25,19 @@
/* Define to `int' if <sys/types.h> doesn't define. */
#undef gid_t
#define gid_t int
/* Define if you have alloca, as a function or macro. */
#undef HAVE_ALLOCA
#define HAVE_ALLOCA
/* Define if you have <alloca.h> and it should be used (not on Ultrix). */
#undef HAVE_ALLOCA_H
/* Define if you have the memmove function. */
#undef HAVE_MEMMOVE
#define HAVE_MEMMOVE 1
/* Define if you don't have vprintf but do have _doprnt. */
#undef HAVE_DOPRNT
@@ -46,6 +52,7 @@
/* Define if you support file names longer than 14 characters. */
#undef HAVE_LONG_FILE_NAMES
#define HAVE_LONG_FILE_NAMES
/* Define if you have a working `mmap' system call. */
#undef HAVE_MMAP
@@ -62,12 +69,15 @@
/* Define if you have the strcoll function and it is properly defined. */
#undef HAVE_STRCOLL
#define HAVE_STRCOLL
/* Define if your struct stat has st_rdev. */
#undef HAVE_ST_RDEV
#define HAVE_ST_RDEV
/* Define if you have the strftime function. */
#undef HAVE_STRFTIME
#define HAVE_STRFTIME
/* Define if you have <sys/wait.h> that is POSIX.1 compatible. */
#undef HAVE_SYS_WAIT_H
@@ -78,18 +88,21 @@
/* Define if you don't have tm_zone but do have the external array
tzname. */
#undef HAVE_TZNAME
#define HAVE_TZNAME
/* Define if you have <unistd.h>. */
#undef HAVE_UNISTD_H
/* Define if utime(file, NULL) sets file's timestamp to the present. */
#undef HAVE_UTIME_NULL
#define HAVE_UTIME_NULL
/* Define if you have <vfork.h>. */
#undef HAVE_VFORK_H
/* Define if you have the vprintf function. */
#undef HAVE_VPRINTF
#define HAVE_VPRINTF
/* Define if you have the wait3 system call. */
#undef HAVE_WAIT3
@@ -108,6 +121,7 @@
/* Define to `int' if <sys/types.h> doesn't define. */
#undef pid_t
#define pid_t int
/* Define if the system does not provide POSIX.1 features except
with this defined. */
@@ -115,9 +129,11 @@
/* Define if you need to in order for stat and other things to work. */
#undef _POSIX_SOURCE
#define _POSIX_SOURCE
/* Define as the return type of signal handlers (int or void). */
#undef RETSIGTYPE
#define RETSIGTYPE void
/* Define if the setvbuf function takes the buffering type as its second
argument and the buffer pointer as the third, as on System V
@@ -138,6 +154,7 @@
/* Define if you have the ANSI C header files. */
#undef STDC_HEADERS
#define STDC_HEADERS
/* Define on System V Release 4. */
#undef SVR4
@@ -147,6 +164,7 @@
/* Define to `int' if <sys/types.h> doesn't define. */
#undef uid_t
#define uid_t int
/* Define for Encore UMAX. */
#undef UMAX
@@ -158,8 +176,15 @@
/* Define vfork as fork if vfork does not work. */
#undef vfork
/* Name of this package (needed by automake) */
#define PACKAGE "%PACKAGE%"
/* Version of this package (needed by automake) */
#define VERSION "%VERSION%"
/* Define to the name of the SCCS `get' command. */
#undef SCCS_GET
#define SCCS_GET "echo no sccs get"
/* Define this if the SCCS `get' command understands the `-G<file>' option. */
#undef SCCS_GET_MINUS_G
@@ -175,15 +200,18 @@
/* Define if you have the dup2 function. */
#undef HAVE_DUP2
#define HAVE_DUP2
/* Define if you have the getcwd function. */
#undef HAVE_GETCWD
#define HAVE_GETCWD
/* Define if you have the getgroups function. */
#undef HAVE_GETGROUPS
/* Define if you have the mktemp function. */
#undef HAVE_MKTEMP
#define HAVE_MKTEMP
/* Define if you have the psignal function. */
#undef HAVE_PSIGNAL
@@ -208,6 +236,7 @@
/* Define if you have the strerror function. */
#undef HAVE_STRERROR
#define HAVE_STRERROR
/* Define if you have the strsignal function. */
#undef HAVE_STRSIGNAL
@@ -220,24 +249,29 @@
/* Define if you have the <dirent.h> header file. */
#undef HAVE_DIRENT_H
#define HAVE_DIRENT_H
/* Define if you have the <fcntl.h> header file. */
#undef HAVE_FCNTL_H
#define HAVE_FCNTL_H
/* Define if you have the <limits.h> header file. */
#undef HAVE_LIMITS_H
#define HAVE_LIMITS_H
/* Define if you have the <mach/mach.h> header file. */
#undef HAVE_MACH_MACH_H
/* Define if you have the <memory.h> header file. */
#undef HAVE_MEMORY_H
#define HAVE_MEMORY_H
/* Define if you have the <ndir.h> header file. */
#undef HAVE_NDIR_H
/* Define if you have the <string.h> header file. */
#undef HAVE_STRING_H
#define HAVE_STRING_H
/* Define if you have the <sys/dir.h> header file. */
#undef HAVE_SYS_DIR_H
@@ -250,6 +284,7 @@
/* Define if you have the <sys/timeb.h> header file. */
#undef HAVE_SYS_TIMEB_H
#define HAVE_SYS_TIMEB_H
/* Define if you have the <sys/wait.h> header file. */
#undef HAVE_SYS_WAIT_H

View File

@@ -1,68 +1,24 @@
/* Generated automatically from configure.in by autoheader. DO NOT EDIT! */
#define INCLUDEDIR "c:/djgpp/include"
#define LIBDIR "c:/djgpp/lib"
/* Many things are defined already by a system header. */
#include <sys/config.h>
/* Define if you have dirent.h. */
#define DIRENT
/* Name of this package (needed by automake) */
#define PACKAGE "%PACKAGE%"
/* Define if you have the strcoll function and it is properly defined. */
#define HAVE_STRCOLL
/* Version of this package (needed by automake) */
#define VERSION "%VERSION%"
/* Define if you have unistd.h. */
#define HAVE_UNISTD_H
/* Define as the return type of signal handlers (int or void). */
#define RETSIGTYPE void
/* Define if you have the ANSI C header files. */
#ifndef STDC_HEADERS
#define STDC_HEADERS
#endif
/* Define if `sys_siglist' is declared by <signal.h>. */
#define SYS_SIGLIST_DECLARED
/* Define if you have getdtablesize. */
#define HAVE_GETDTABLESIZE
/* Define if you have dup2. */
#define HAVE_DUP2
/* Define if you have sys_siglist. */
#undef HAVE_SYS_SIGLIST
/* Define if you have _sys_siglist. */
#undef HAVE__SYS_SIGLIST
/* Define if you have psignal. */
#define HAVE_PSIGNAL
/* Define if you have getcwd. */
#define HAVE_GETCWD
/* Define NSIG. */
#define NSIG SIGMAX
/* Define if you have sigsetmask. */
#define HAVE_SIGSETMASK
/* Define if you have setlinebuf. */
#define HAVE_SETLINEBUF
/* Define if you have the <limits.h> header file. */
#define HAVE_LIMITS_H
/* Define if you have the <sys/param.h> header file. */
#undef HAVE_SYS_PARAM_H
/* Define if you have the <fcntl.h> header file. */
#define HAVE_FCNTL_H
/* Define if you have the <string.h> header file. */
#define HAVE_STRING_H
#define HAVE_SIGSETMASK 1
/* Define if you have the <memory.h> header file. */
#define HAVE_MEMORY_H
#define HAVE_MEMORY_H 1
/* Define if you have the `strerror' function. */
#define HAVE_STRERROR
/* Define if you have the memmove function. */
#define HAVE_MEMMOVE 1
#define SCCS_GET "get"

3120
configure vendored

File diff suppressed because it is too large Load Diff

View File

@@ -1,44 +1,44 @@
@echo off
echo Configuring MAKE for go32
rem This batch file assumes a unix-type "sed" program
echo Configuring MAKE for DJGPP
update configh.dos config.h
rem The SmallEnv trick protects against too small environment block,
rem in which case the values will be truncated and the whole thing
rem goes awry. COMMAND.COM will say "Out of environment space", but
rem many people don't care, so we force them to care by refusing to go.
echo # Makefile generated by "configure.bat"> Makefile
rem Where is the srcdir?
set XSRC=.
if not "%XSRC%"=="." goto SmallEnv
if "%1%"=="" goto SrcDone
set XSRC=%1
if not "%XSRC%"=="%1" goto SmallEnv
if exist config.sed del config.sed
:SrcDone
echo ": try_sl ">> config.sed
echo "/\\$/ { ">> config.sed
echo " N ">> config.sed
echo " s/[ ]*\\\n[ ]*/ / ">> config.sed
echo " b try_sl ">> config.sed
echo "} ">> config.sed
update %XSRC%/configh.dos ./config.h
echo "s/@srcdir@/./ ">> config.sed
echo "s/@CC@/gcc/ ">> config.sed
echo "s/@CFLAGS@/-O2 -g/ ">> config.sed
echo "s/@CPPFLAGS@/-DHAVE_CONFIG_H/ ">> config.sed
echo "s/@LDFLAGS@// ">> config.sed
echo "s/@RANLIB@/ranlib/ ">> config.sed
echo "s/@DEFS@// ">> config.sed
echo "s/@REMOTE@/stub/ ">> config.sed
echo "s/@ALLOCA@// ">> config.sed
echo "s/@LIBS@// ">> config.sed
echo "s/@LIBOBJS@// ">> config.sed
echo "s/@SET_MAKE@// ">> config.sed
echo "s/^Makefile *:/_Makefile:/ ">> config.sed
echo "s/^config.h *:/_config.h:/ ">> config.sed
echo "s/^defines *=.*$/defines =/ ">> config.sed
echo "/mv -f make.new make/d ">> config.sed
rem Do they have Make?
redir -o junk.$$$ -eo make -n -f NUL
rem REDIR will return 1 if it cannot run Make.
rem If it can run Make, it will usually return 2,
rem but 0 is also OK with us.
if errorlevel 2 goto MakeOk
if not errorlevel 1 goto MakeOk
if exist junk.$$$ del junk.$$$
echo No Make program found--use DOSBUILD.BAT to build Make.
goto End
echo "s/cd glob; $(MAKE)/$(MAKE) -C glob/ ">> config.sed
rem They do have Make. Generate the Makefile.
sed -e "s/^\"//" -e "s/\"$//" -e "s/[ ]*$//" config.sed > config2.sed
sed -f config2.sed Makefile.in >> Makefile
del config.sed
del config2.sed
:MakeOk
del junk.$$$
update %XSRC%/Makefile.DOS ./Makefile
echo Done.
if not "%XSRC%"=="." echo Invoke Make thus: "make srcdir=%XSRC%"
goto End
cd glob
call configure
cd ..
:SmallEnv
echo Your environment is too small. Please enlarge it and run me again.
:End
set XRSC=

View File

@@ -1,14 +1,21 @@
dnl Process this file with autoconf to produce a configure script.
AC_REVISION([$Id$])
AC_PREREQ(2.1)dnl dnl Minimum Autoconf version required.
AC_PREREQ(2.12)dnl dnl Minimum Autoconf version required.
AC_INIT(vpath.c)dnl dnl A distinctive file to look for in srcdir.
AC_CONFIG_HEADER(config.h)
AC_CONFIG_SUBDIRS(glob) dnl Run configure in glob subdirectory.
AM_INIT_AUTOMAKE(make, 3.76)
AM_CONFIG_HEADER(config.h)
AC_CONFIG_SUBDIRS(glob)
AM_CONDITIONAL(MAINT_MAKEFILE, test -r $srcdir/maintMakefile)
dnl Regular configure stuff
AC_PROG_MAKE_SET
AC_PROG_CC
AC_PROG_INSTALL
AC_PROG_CPP dnl Later checks need this.
AC_ARG_PROGRAM
AC_AIX
AC_ISC_POSIX
AC_MINIX
@@ -38,15 +45,15 @@ changequote([,])dnl
fi
AC_MSG_RESULT($ac_cv_check_symbol_$1)])dnl
AC_CHECK_FUNCS(psignal mktemp \
AC_CHECK_FUNCS(memmove psignal mktemp pstat_getdynamic \
dup2 getcwd sigsetmask getgroups setlinebuf \
seteuid setegid setreuid setregid strerror strsignal)
AC_CHECK_SYMBOL(sys_siglist)
AC_CHECK_SYMBOL(_sys_siglist)
AC_FUNC_ALLOCA
AC_FUNC_VFORK
AC_FUNC_SETVBUF_REVERSED
AC_FUNC_GETLOADAVG
AC_CHECK_LIB(kstat, kstat_open)
AC_FUNC_STRCOLL
# Check out the wait reality.

114
default.c
View File

@@ -19,7 +19,8 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "make.h"
#include "rule.h"
#include "dep.h"
#include "file.h"
#include "filedef.h"
#include "job.h"
#include "commands.h"
#include "variable.h"
@@ -35,9 +36,15 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
a `.c' or `.p' or ... file rather than from a .s file. */
static char default_suffixes[]
#ifdef VMS
= ".exe .olb .ln .obj .c .cc .pas .p .for .f .r .y .l .mar \
.mod .sym .def .h .info .dvi .tex .texinfo .texi .txinfo \
.w .ch .cweb .web .com .sh .elc .el";
#else
= ".out .a .ln .o .c .cc .C .p .f .F .r .y .l .s .S \
.mod .sym .def .h .info .dvi .tex .texinfo .texi .txinfo \
.w .ch .web .sh .elc .el";
#endif
static struct pspec default_pattern_rules[] =
{
@@ -47,9 +54,13 @@ static struct pspec default_pattern_rules[] =
/* The X.out rules are only in BSD's default set because
BSD Make has no null-suffix rules, so `foo.out' and
`foo' are the same thing. */
#ifdef VMS
{ "%.exe", "%",
"copy $< $@" },
#else
{ "%.out", "%",
"@rm -f $@ \n cp $< $@" },
#endif
/* Syntax is "ctangle foo.w foo.ch foo.c". */
{ "%.c", "%.w %.ch",
"$(CTANGLE) $^ $@" },
@@ -61,6 +72,20 @@ static struct pspec default_pattern_rules[] =
static struct pspec default_terminal_rules[] =
{
#ifdef VMS
/* RCS. */
{ "%", "%$$5lv", /* Multinet style */
"if f$$search($@) .nes. \"\" then +$(CHECKOUT,v)" },
{ "%", "[.$$rcs]%$$5lv", /* Multinet style */
"if f$$search($@) .nes. \"\" then +$(CHECKOUT,v)" },
{ "%", "%_v", /* Normal style */
"if f$$search($@) .nes. \"\" then +$(CHECKOUT,v)" },
{ "%", "[.rcs]%_v", /* Normal style */
"if f$$search($@) .nes. \"\" then +$(CHECKOUT,v)" },
/* SCCS. */
/* ain't no SCCS on vms */
#else
/* RCS. */
{ "%", "%,v",
"$(CHECKOUT,v)" },
@@ -72,12 +97,53 @@ static struct pspec default_terminal_rules[] =
"$(GET) $(GFLAGS) $(SCCS_OUTPUT_OPTION) $<" },
{ "%", "SCCS/s.%",
"$(GET) $(GFLAGS) $(SCCS_OUTPUT_OPTION) $<" },
#endif /* !VMS */
{ 0, 0, 0 }
};
static char *default_suffix_rules[] =
{
#ifdef VMS
".obj.exe",
"$(LINK.obj) $^ $(LOADLIBES) $(LDLIBS) /exe=$@",
".mar.exe",
"$(LINK.mar) $^ $(LOADLIBES) $(LDLIBS) /exe=$@",
".c.exe",
"$(COMPILE.c) $^ \n $(LINK.obj) $(subst .c,.obj,$^) $(LOADLIBES) $(LDLIBS) /exe=$@",
".cc.exe",
"$(COMPILE.cc) $^ \n $(LINK.obj) $(subst .cc,.obj,$^) $(LOADLIBES) $(LDLIBS) /exe=$@",
".for.exe",
"$(COMPILE.for) $^ \n $(LINK.obj) $(subst .for,.obj,$^) $(LOADLIBES) $(LDLIBS) /exe=$@",
".pas.exe",
"$(COMPILE.pas) $^ \n $(LINK.obj) $(subst .pas,.obj,$^) $(LOADLIBES) $(LDLIBS) /exe=$@",
".com",
"copy $< >$@",
".mar.obj",
"$(COMPILE.mar) /obj=$@ $<",
".c.obj",
"$(COMPILE.c) /obj=$@ $<",
".cc.obj",
"$(COMPILE.cc) /obj=$@ $<",
".for.obj",
"$(COMPILE.for) /obj=$@ $<",
".pas.obj",
"$(COMPILE.pas) /obj=$@ $<",
".y.c",
"$(YACC.y) $< \n rename y_tab.c $@",
".l.c",
"$(LEX.l) $< \n rename lexyy.c $@",
".texinfo.info",
"$(MAKEINFO) $<",
".tex.dvi",
"$(TEX) $<",
#else /* ! VMS */
".o",
"$(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@",
".s",
@@ -195,11 +261,52 @@ static char *default_suffix_rules[] =
".web.tex",
"$(WEAVE) $<",
#endif /* !VMS */
0, 0,
};
static char *default_variables[] =
{
#ifdef VMS
"AR", "library/obj",
"ARFLAGS", "/replace",
"AS", "macro",
"CC", "cc",
"C++", "gcc/plus",
"CXX", "gcc/plus",
"CO", "co",
"CPP", "$(CC) /preprocess_only",
"FC", "fortran",
/* System V uses these, so explicit rules using them should work.
However, there is no way to make implicit rules use them and FC. */
"F77", "$(FC)",
"F77FLAGS", "$(FFLAGS)",
"LD", "link",
"LEX", "lex",
"PC", "pascal",
"YACC", "yacc", /* Or "bison -y" */
"MAKEINFO", "makeinfo",
"TEX", "tex",
"TEXINDEX", "texindex",
"RM", "delete/nolog",
"LINK.obj", "$(LD) $(LDFLAGS)",
"COMPILE.c", "$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH)",
"COMPILE.cc", "$(C++) $(C++FLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c",
"YACC.y", "$(YACC) $(YFLAGS)",
"LEX.l", "$(LEX) $(LFLAGS)",
"COMPILE.for", "$(FC) $(FFLAGS) $(TARGET_ARCH)",
"COMPILE.pas", "$(PC) $(PFLAGS) $(CPPFLAGS) $(TARGET_ARCH)",
"COMPILE.mar", "$(AS) $(ASFLAGS) $(TARGET_MACH)",
"LINT.c", "$(LINT) $(LINTFLAGS) $(CPPFLAGS) $(TARGET_ARCH)",
"MV", "rename/new_version",
"CP", "copy",
#else /* !VMS */
"AR", "ar",
"ARFLAGS", "rv",
"AS", "as",
@@ -310,6 +417,7 @@ static char *default_variables[] =
"SCCS_OUTPUT_OPTION", "-G$@",
#endif
#endif /* !VMS */
0, 0
};

15
dep.h
View File

@@ -1,5 +1,5 @@
/* Definitions of dependency data structures for GNU Make.
Copyright (C) 1988, 1989, 1991, 1992, 1993 Free Software Foundation, Inc.
Copyright (C) 1988, 1989, 1991, 1992, 1993, 1996 Free Software Foundation, Inc.
This file is part of GNU Make.
GNU Make is free software; you can redistribute it and/or modify
@@ -40,11 +40,16 @@ struct nameseq
};
extern struct nameseq *multi_glob (), *parse_file_seq ();
extern char *tilde_expand ();
extern struct nameseq *multi_glob PARAMS ((struct nameseq *chain, unsigned int size));
#ifdef VMS
extern struct nameseq *parse_file_seq ();
#else
extern struct nameseq *parse_file_seq PARAMS ((char **stringp, int stopchar, unsigned int size, int strip));
#endif
extern char *tilde_expand PARAMS ((char *name));
#ifndef NO_ARCHIVES
extern struct nameseq *ar_glob ();
extern struct nameseq *ar_glob PARAMS ((char *arname, char *member_pattern, unsigned int size));
#endif
#ifndef iAPX286
@@ -54,7 +59,7 @@ extern struct nameseq *ar_glob ();
extern char *dep_name ();
#endif
extern struct dep *read_all_makefiles ();
extern struct dep *read_all_makefiles PARAMS ((char **makefiles));
/* Flag bits for the second argument to `read_makefile'.
These flags are saved in the `changed' field of each

465
dir.c
View File

@@ -1,5 +1,5 @@
/* Directory hashing for GNU Make.
Copyright (C) 1988, 89, 91, 92, 93, 94, 95, 96 Free Software Foundation, Inc.
Copyright (C) 1988,89,91,92,93,94,95,96,97 Free Software Foundation, Inc.
This file is part of GNU Make.
GNU Make is free software; you can redistribute it and/or modify
@@ -33,6 +33,9 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
# ifdef HAVE_NDIR_H
# include <ndir.h>
# endif
# ifdef HAVE_VMSDIR_H
# include "vmsdir.h"
# endif /* HAVE_VMSDIR_H */
#endif
/* In GNU systems, <dirent.h> defines this macro for us. */
@@ -41,7 +44,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#define NAMLEN(d) _D_NAMLEN(d)
#endif
#if defined (POSIX) && !defined (__GNU_LIBRARY__)
#if (defined (POSIX) || defined (WINDOWS32)) && !defined (__GNU_LIBRARY__)
/* Posix does not require that the d_ino field be present, and some
systems do not provide it. */
#define REAL_DIR_ENTRY(dp) 1
@@ -53,6 +56,12 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#ifdef __MSDOS__
#include <ctype.h>
#include <fcntl.h>
/* If it's MSDOS that doesn't have _USE_LFN, disable LFN support. */
#ifndef _USE_LFN
#define _USE_LFN 0
#endif
static char *
dosify (filename)
@@ -62,9 +71,11 @@ dosify (filename)
char *df;
int i;
if (filename == 0)
return 0;
if (filename == 0 || _USE_LFN)
return filename;
/* FIXME: what about filenames which violate
8+3 constraints, like "config.h.in", or ".emacs"? */
if (strpbrk (filename, "\"*+,;<=>?[\\]|") != 0)
return filename;
@@ -92,7 +103,99 @@ dosify (filename)
*df = 0;
return dos_filename;
}
#endif /* __MSDOS__ */
#ifdef WINDOWS32
#include "pathstuff.h"
#endif
#ifdef _AMIGA
#include <ctype.h>
static char *
amigafy (filename)
char *filename;
{
static char amiga_filename[136];
char *df;
int i;
if (filename == 0)
return 0;
df = amiga_filename;
/* First, transform the name part. */
for (i = 0; *filename != '\0'; ++i)
{
*df++ = tolower (*filename);
++filename;
}
*df = 0;
return amiga_filename;
}
#endif /* _AMIGA */
#ifdef VMS
static int
vms_hash (name)
char *name;
{
int h = 0;
int g;
while (*name)
{
h = (h << 4) + *name++;
g = h & 0xf0000000;
if (g)
{
h = h ^ (g >> 24);
h = h ^ g;
}
}
return h;
}
/* fake stat entry for a directory */
static int
vmsstat_dir (name, st)
char *name;
struct stat *st;
{
char *s;
int h;
DIR *dir;
dir = opendir (name);
if (dir == 0)
return -1;
closedir (dir);
s = strchr (name, ':'); /* find device */
if (s)
{
*s++ = 0;
st->st_dev = (char *)vms_hash (name);
h = vms_hash (s);
*(s-1) = ':';
}
else
{
st->st_dev = 0;
s = name;
h = vms_hash (s);
}
st->st_ino[0] = h & 0xff;
st->st_ino[1] = h & 0xff00;
st->st_ino[2] = h >> 16;
return 0;
}
#endif /* VMS */
/* Hash table of directories. */
@@ -104,8 +207,29 @@ struct directory_contents
{
struct directory_contents *next;
int dev, ino; /* Device and inode numbers of this dir. */
dev_t dev; /* Device and inode numbers of this dir. */
#ifdef WINDOWS32
/*
* Inode means nothing on WINDOWS32. Even file key information is
* unreliable because it is random per file open and undefined
* for remote filesystems. The most unique attribute I can
* come up with is the fully qualified name of the directory. Beware
* though, this is also unreliable. I'm open to suggestion on a better
* way to emulate inode.
*/
char *path_key;
int mtime; /* controls check for stale directory cache */
int fs_flags; /* FS_FAT, FS_NTFS, ... */
#define FS_FAT 0x1
#define FS_NTFS 0x2
#define FS_UNKNOWN 0x4
#else
#ifdef VMS
ino_t ino[3];
#else
ino_t ino;
#endif
#endif /* WINDOWS32 */
struct dirfile **files; /* Files in this directory. */
DIR *dirstream; /* Stream reading this directory. */
};
@@ -149,7 +273,8 @@ struct dirfile
#define DIRFILE_BUCKETS 107
#endif
static int dir_contents_file_exists_p ();
static int dir_contents_file_exists_p PARAMS ((struct directory_contents *dir, char *filename));
static struct directory *find_directory PARAMS ((char *name));
/* Find the directory named NAME and return its `struct directory'. */
@@ -160,13 +285,27 @@ find_directory (name)
register unsigned int hash = 0;
register char *p;
register struct directory *dir;
#ifdef WINDOWS32
char* w32_path;
char fs_label[BUFSIZ];
char fs_type[BUFSIZ];
long fs_serno;
long fs_flags;
long fs_len;
#endif
#ifdef VMS
if ((*name == '.') && (*(name+1) == 0))
name = "[]";
else
name = vmsify (name,1);
#endif
for (p = name; *p != '\0'; ++p)
HASH (hash, *p);
HASHI (hash, *p);
hash %= DIRECTORY_BUCKETS;
for (dir = directories[hash]; dir != 0; dir = dir->next)
if (streq (dir->name, name))
if (strieq (dir->name, name))
break;
if (dir == 0)
@@ -183,21 +322,50 @@ find_directory (name)
/* The directory is not in the name hash table.
Find its device and inode numbers, and look it up by them. */
#ifdef VMS
if (vmsstat_dir (name, &st) < 0)
#else
if (stat (name, &st) < 0)
#endif
{
/* Couldn't stat the directory. Mark this by
setting the `contents' member to a nil pointer. */
dir->contents = 0;
dir->contents = 0;
}
else
{
/* Search the contents hash table; device and inode are the key. */
struct directory_contents *dc;
#ifdef WINDOWS32
w32_path = w32ify(name, 1);
hash = ((unsigned int) st.st_dev << 16) | (unsigned int) st.st_ctime;
#else
#ifdef VMS
hash = ((unsigned int) st.st_dev << 16)
| ((unsigned int) st.st_ino[0]
+ (unsigned int) st.st_ino[1]
+ (unsigned int) st.st_ino[2]);
#else
hash = ((unsigned int) st.st_dev << 16) | (unsigned int) st.st_ino;
#endif
#endif
hash %= DIRECTORY_BUCKETS;
for (dc = directories_contents[hash]; dc != 0; dc = dc->next)
if (dc->dev == st.st_dev && dc->ino == st.st_ino)
#ifdef WINDOWS32
if (!strcmp(dc->path_key, w32_path))
#else
if (dc->dev == st.st_dev
#ifdef VMS
&& dc->ino[0] == st.st_ino[0]
&& dc->ino[1] == st.st_ino[1]
&& dc->ino[2] == st.st_ino[2])
#else
&& dc->ino == st.st_ino)
#endif
#endif /* WINDOWS32 */
break;
if (dc == 0)
@@ -209,15 +377,46 @@ find_directory (name)
/* Enter it in the contents hash table. */
dc->dev = st.st_dev;
#ifdef WINDOWS32
dc->path_key = strdup(w32_path);
dc->mtime = st.st_mtime;
/*
* NTFS is the only WINDOWS32 filesystem that bumps mtime
* on a directory when files are added/deleted from
* a directory.
*/
w32_path[3] = '\0';
if (GetVolumeInformation(w32_path,
fs_label, sizeof (fs_label),
&fs_serno, &fs_len,
&fs_flags, fs_type, sizeof (fs_type)) == FALSE)
dc->fs_flags = FS_UNKNOWN;
else if (!strcmp(fs_type, "FAT"))
dc->fs_flags = FS_FAT;
else if (!strcmp(fs_type, "NTFS"))
dc->fs_flags = FS_NTFS;
else
dc->fs_flags = FS_UNKNOWN;
#else
#ifdef VMS
dc->ino[0] = st.st_ino[0];
dc->ino[1] = st.st_ino[1];
dc->ino[2] = st.st_ino[2];
#else
dc->ino = st.st_ino;
#endif
#endif /* WINDOWS32 */
dc->next = directories_contents[hash];
directories_contents[hash] = dc;
dc->dirstream = opendir (name);
if (dc->dirstream == 0)
{
/* Couldn't open the directory. Mark this by
setting the `files' member to a nil pointer. */
dc->files = 0;
dc->files = 0;
}
else
{
/* Allocate an array of buckets for files and zero it. */
@@ -255,21 +454,36 @@ dir_contents_file_exists_p (dir, filename)
register char *p;
register struct dirfile *df;
register struct dirent *d;
#ifdef WINDOWS32
struct stat st;
int rehash = 0;
#endif
if (dir == 0 || dir->files == 0)
{
/* The directory could not be stat'd or opened. */
return 0;
return 0;
}
#ifdef __MSDOS__
filename = dosify (filename);
#endif
#ifdef _AMIGA
filename = amigafy (filename);
#endif
#ifdef VMS
filename = vmsify (filename,0);
#endif
hash = 0;
if (filename != 0)
{
if (*filename == '\0')
{
/* Checking if the directory exists. */
return 1;
return 1;
}
for (p = filename; *p != '\0'; ++p)
HASH (hash, *p);
@@ -278,16 +492,45 @@ dir_contents_file_exists_p (dir, filename)
/* Search the list of hashed files. */
for (df = dir->files[hash]; df != 0; df = df->next)
if (streq (df->name, filename))
return !df->impossible;
{
if (strieq (df->name, filename))
{
return !df->impossible;
}
}
}
/* The file was not found in the hashed list.
Try to read the directory further. */
if (dir->dirstream == 0)
{
#ifdef WINDOWS32
/*
* Check to see if directory has changed since last read. FAT
* filesystems force a rehash always as mtime does not change
* on directories (ugh!).
*/
if (dir->path_key &&
(dir->fs_flags & FS_FAT ||
(stat(dir->path_key, &st) == 0 &&
st.st_mtime > dir->mtime))) {
/* reset date stamp to show most recent re-process */
dir->mtime = st.st_mtime;
/* make sure directory can still be opened */
dir->dirstream = opendir(dir->path_key);
if (dir->dirstream)
rehash = 1;
else
return 0; /* couldn't re-read - fail */
} else
#endif
/* The directory has been all read in. */
return 0;
return 0;
}
while ((d = readdir (dir->dirstream)) != 0)
{
@@ -301,19 +544,41 @@ dir_contents_file_exists_p (dir, filename)
len = NAMLEN (d);
for (i = 0; i < len; ++i)
HASH (newhash, d->d_name[i]);
HASHI (newhash, d->d_name[i]);
newhash %= DIRFILE_BUCKETS;
#ifdef WINDOWS32
/*
* If re-reading a directory, check that this file isn't already
* in the cache.
*/
if (rehash) {
for (df = dir->files[newhash]; df != 0; df = df->next)
if (streq(df->name, d->d_name))
break;
} else
df = 0;
/*
* If re-reading a directory, don't cache files that have
* already been discovered.
*/
if (!df) {
#endif
df = (struct dirfile *) xmalloc (sizeof (struct dirfile));
df->next = dir->files[newhash];
dir->files[newhash] = df;
df->name = savestring (d->d_name, len);
df->impossible = 0;
#ifdef WINDOWS32
}
#endif
/* Check if the name matches the one we're searching for. */
if (filename != 0
&& newhash == hash && streq (d->d_name, filename))
return 1;
&& newhash == hash && strieq (d->d_name, filename))
{
return 1;
}
}
/* If the directory has been completely read in,
@@ -324,7 +589,6 @@ dir_contents_file_exists_p (dir, filename)
closedir (dir->dirstream);
dir->dirstream = 0;
}
return 0;
}
@@ -355,13 +619,39 @@ file_exists_p (name)
return ar_member_date (name) != (time_t) -1;
#endif
#ifdef VMS
dirend = rindex (name, ']');
dirend++;
if (dirend == (char *)1)
return dir_file_exists_p ("[]", name);
#else /* !VMS */
dirend = rindex (name, '/');
#if defined (WINDOWS32) || defined (__MSDOS__)
/* Forward and backslashes might be mixed. We need the rightmost one. */
{
char *bslash = rindex(name, '\\');
if (!dirend || bslash > dirend)
dirend = bslash;
/* The case of "d:file" is unhandled. But I don't think
such names can happen here. */
}
#endif /* WINDOWS32 || __MSDOS__ */
if (dirend == 0)
#ifndef _AMIGA
return dir_file_exists_p (".", name);
#else /* !VMS && !AMIGA */
return dir_file_exists_p ("", name);
#endif /* AMIGA */
#endif /* VMS */
dirname = (char *) alloca (dirend - name + 1);
bcopy (name, dirname, dirend - name);
dirname[dirend - name] = '\0';
if (dirend == name)
dirname = "/";
else
{
dirname = (char *) alloca (dirend - name + 1);
bcopy (name, dirname, dirend - name);
dirname[dirend - name] = '\0';
}
return dir_file_exists_p (dirname, dirend + 1);
}
@@ -379,20 +669,47 @@ file_impossible (filename)
register struct directory *dir;
register struct dirfile *new;
#ifdef VMS
dirend = rindex (p, ']');
dirend++;
if (dirend == (char *)1)
dir = find_directory ("[]");
#else
dirend = rindex (p, '/');
#if defined (WINDOWS32) || defined (__MSDOS__)
/* Forward and backslashes might be mixed. We need the rightmost one. */
{
char *bslash = rindex(p, '\\');
if (!dirend || bslash > dirend)
dirend = bslash;
/* The case of "d:file" is unhandled. But I don't think
such names can happen here. */
}
#endif /* WINDOWS32 or __MSDOS__ */
if (dirend == 0)
#ifdef _AMIGA
dir = find_directory ("");
#else /* !VMS && !AMIGA */
dir = find_directory (".");
#endif /* AMIGA */
#endif /* VMS */
else
{
char *dirname = (char *) alloca (dirend - p + 1);
bcopy (p, dirname, dirend - p);
dirname[dirend - p] = '\0';
char *dirname;
if (dirend == p)
dirname = "/";
else
{
dirname = (char *) alloca (dirend - p + 1);
bcopy (p, dirname, dirend - p);
dirname[dirend - p] = '\0';
}
dir = find_directory (dirname);
filename = p = dirend + 1;
}
for (hash = 0; *p != '\0'; ++p)
HASH (hash, *p);
HASHI (hash, *p);
hash %= DIRFILE_BUCKETS;
if (dir->contents == 0)
@@ -401,7 +718,18 @@ file_impossible (filename)
structure for it, but leave it out of the contents hash table. */
dir->contents = (struct directory_contents *)
xmalloc (sizeof (struct directory_contents));
#ifdef WINDOWS32
dir->contents->path_key = NULL;
dir->contents->mtime = 0;
#else /* WINDOWS32 */
#ifdef VMS
dir->contents->dev = 0;
dir->contents->ino[0] = dir->contents->ino[1] =
dir->contents->ino[2] = 0;
#else
dir->contents->dev = dir->contents->ino = 0;
#endif
#endif /* WINDOWS32 */
dir->contents->files = 0;
dir->contents->dirstream = 0;
}
@@ -436,14 +764,40 @@ file_impossible_p (filename)
register struct directory_contents *dir;
register struct dirfile *next;
dirend = rindex (filename, '/');
#ifdef VMS
dirend = rindex (filename, ']');
if (dirend == 0)
dir = find_directory ("[]")->contents;
#else
dirend = rindex (filename, '/');
#if defined (WINDOWS32) || defined (__MSDOS__)
/* Forward and backslashes might be mixed. We need the rightmost one. */
{
char *bslash = rindex(filename, '\\');
if (!dirend || bslash > dirend)
dirend = bslash;
/* The case of "d:file" is unhandled. But I don't think
such names can happen here. */
}
#endif /* WINDOWS32 || __MSDOS__ */
if (dirend == 0)
#ifdef _AMIGA
dir = find_directory ("")->contents;
#else /* !VMS && !AMIGA */
dir = find_directory (".")->contents;
#endif /* AMIGA */
#endif /* VMS */
else
{
char *dirname = (char *) alloca (dirend - filename + 1);
bcopy (p, dirname, dirend - p);
dirname[dirend - p] = '\0';
char *dirname;
if (dirend == filename)
dirname = "/";
else
{
dirname = (char *) alloca (dirend - filename + 1);
bcopy (p, dirname, dirend - p);
dirname[dirend - p] = '\0';
}
dir = find_directory (dirname)->contents;
p = filename = dirend + 1;
}
@@ -455,13 +809,19 @@ file_impossible_p (filename)
#ifdef __MSDOS__
p = filename = dosify (p);
#endif
#ifdef _AMIGA
p = filename = amigafy (p);
#endif
#ifdef VMS
p = filename = vmsify (p, 1);
#endif
for (hash = 0; *p != '\0'; ++p)
HASH (hash, *p);
hash %= DIRFILE_BUCKETS;
for (next = dir->files[hash]; next != 0; next = next->next)
if (streq (filename, next->name))
if (strieq (filename, next->name))
return next->impossible;
return 0;
@@ -495,8 +855,21 @@ print_dir_data_base ()
if (dir->contents == 0)
printf ("# %s: could not be stat'd.\n", dir->name);
else if (dir->contents->files == 0)
printf ("# %s (device %d, inode %d): could not be opened.\n",
dir->name, dir->contents->dev, dir->contents->ino);
#ifdef WINDOWS32
printf ("# %s (key %s, mtime %d): could not be opened.\n",
dir->name, dir->contents->path_key,dir->contents->mtime);
#else /* WINDOWS32 */
#ifdef VMS
printf ("# %s (device %d, inode [%d,%d,%d]): could not be opened.\n",
dir->name, dir->contents->dev,
dir->contents->ino[0], dir->contents->ino[1],
dir->contents->ino[2]);
#else
printf ("# %s (device %ld, inode %ld): could not be opened.\n",
dir->name, (long int) dir->contents->dev,
(long int) dir->contents->ino);
#endif
#endif /* WINDOWS32 */
else
{
register unsigned int f = 0, im = 0;
@@ -508,8 +881,20 @@ print_dir_data_base ()
++im;
else
++f;
#ifdef WINDOWS32
printf ("# %s (key %s, mtime %d): ",
dir->name, dir->contents->path_key, dir->contents->mtime);
#else /* WINDOWS32 */
#ifdef VMS
printf ("# %s (device %d, inode [%d,%d,%d]): ",
dir->name, dir->contents->dev,
dir->contents->ino[0], dir->contents->ino[1],
dir->contents->ino[2]);
#else
printf ("# %s (device %d, inode %d): ",
dir->name, dir->contents->dev, dir->contents->ino);
#endif
#endif /* WINDOWS32 */
if (f == 0)
fputs ("No", stdout);
else
@@ -557,15 +942,15 @@ struct dirstream
};
/* Forward declarations. */
static __ptr_t open_dirstream __P ((const char *));
static struct dirent *read_dirstream __P ((__ptr_t));
static __ptr_t open_dirstream PARAMS ((const char *));
static struct dirent *read_dirstream PARAMS ((__ptr_t));
static __ptr_t
open_dirstream (directory)
const char *directory;
{
struct dirstream *new;
struct directory *dir = find_directory (directory);
struct directory *dir = find_directory ((char *)directory);
if (dir->contents == 0 || dir->contents->files == 0)
/* DIR->contents is nil if the directory could not be stat'd.

42
dosbuild.bat Normal file
View File

@@ -0,0 +1,42 @@
@echo Building Make for MSDOS
@rem Echo ON so they will see what is going on.
@echo on
gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g commands.c -o commands.o
gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g job.c -o job.o
gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g dir.c -o dir.o
gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g file.c -o file.o
gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g misc.c -o misc.o
gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g main.c -o main.o
gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g read.c -o read.o
gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g remake.c -o remake.o
gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g rule.c -o rule.o
gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g implicit.c -o implicit.o
gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g default.c -o default.o
gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g variable.c -o variable.o
gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g expand.c -o expand.o
gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g function.c -o function.o
gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g vpath.c -o vpath.o
gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g version.c -o version.o
gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g ar.c -o ar.o
gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g arscan.c -o arscan.o
gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g signame.c -o signame.o
gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g remote-stub.c -o remote-stub.o
gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g getopt.c -o getopt.o
gcc -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g getopt1.c -o getopt1.o
@cd glob
@if exist libglob.a del libglob.a
gcc -I. -c -DHAVE_CONFIG_H -I.. -O2 -g glob.c -o glob.o
gcc -I. -c -DHAVE_CONFIG_H -I.. -O2 -g fnmatch.c -o fnmatch.o
ar rv libglob.a glob.o fnmatch.o
@echo off
cd ..
echo commands.o > respf.$$$
for %%f in (job dir file misc main read remake rule implicit default variable) do echo %%f.o >> respf.$$$
for %%f in (expand function vpath version ar arscan signame remote-stub getopt getopt1) do echo %%f.o >> respf.$$$
echo glob/libglob.a >> respf.$$$
@echo Linking...
@echo on
gcc -o make.new @respf.$$$
@if exist make.exe echo Make.exe is now built!
@if not exist make.exe echo Make.exe build failed...
@if exist make.exe del respf.$$$

View File

@@ -17,8 +17,9 @@ along with GNU Make; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "make.h"
#include "filedef.h"
#include "job.h"
#include "commands.h"
#include "file.h"
#include "variable.h"
/* The next two describe the variable output buffer.

161
file.c
View File

@@ -1,5 +1,5 @@
/* Target file hash table management for GNU Make.
Copyright (C) 1988, 89, 90, 91, 92, 93, 94, 1995 Free Software Foundation, Inc.
Copyright (C) 1988,89,90,91,92,93,94,95,96,97 Free Software Foundation, Inc.
This file is part of GNU Make.
GNU Make is free software; you can redistribute it and/or modify
@@ -17,9 +17,10 @@ along with GNU Make; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "make.h"
#include "commands.h"
#include "dep.h"
#include "file.h"
#include "filedef.h"
#include "job.h"
#include "commands.h"
#include "variable.h"
#include <assert.h>
@@ -55,6 +56,10 @@ lookup_file (name)
/* This is also done in parse_file_seq, so this is redundant
for names read from makefiles. It is here for names passed
on the command line. */
#ifdef VMS
while (name[0] == '[' && name[1] == ']' && name[2] != '\0')
name += 2;
#endif
while (name[0] == '.' && name[1] == '/' && name[2] != '\0')
{
name += 2;
@@ -65,16 +70,28 @@ lookup_file (name)
if (*name == '\0')
/* It was all slashes after a dot. */
#ifdef VMS
name = "[]";
#else
#ifdef _AMIGA
name = "";
#else
name = "./";
#endif /* AMIGA */
#endif /* VMS */
hashval = 0;
for (n = name; *n != '\0'; ++n)
HASH (hashval, *n);
HASHI (hashval, *n);
hashval %= FILE_BUCKETS;
for (f = files[hashval]; f != 0; f = f->next)
if (streq (f->name, name))
return f;
{
if (strieq (f->hname, name))
{
return f;
}
}
return 0;
}
@@ -85,25 +102,46 @@ enter_file (name)
register struct file *f, *new;
register char *n;
register unsigned int hashval;
#ifdef VMS
char *lname, *ln;
#endif
if (*name == '\0')
abort ();
#ifdef VMS
lname = (char *)malloc (strlen (name) + 1);
for (n = name, ln = lname; *n != '\0'; ++n, ++ln)
{
if (isupper(*n))
*ln = tolower(*n);
else
*ln = *n;
}
*ln = 0;
name = lname;
#endif
hashval = 0;
for (n = name; *n != '\0'; ++n)
HASH (hashval, *n);
HASHI (hashval, *n);
hashval %= FILE_BUCKETS;
for (f = files[hashval]; f != 0; f = f->next)
if (streq (f->name, name))
if (strieq (f->hname, name))
break;
if (f != 0 && !f->double_colon)
return f;
{
#ifdef VMS
free(lname);
#endif
return f;
}
new = (struct file *) xmalloc (sizeof (struct file));
bzero ((char *) new, sizeof (struct file));
new->name = name;
new->name = new->hname = name;
new->update_status = -1;
if (f == 0)
@@ -124,16 +162,16 @@ enter_file (name)
return new;
}
/* Rename FILE to NAME. This is not as simple as resetting
the `name' member, since it must be put in a new hash bucket,
/* Rehash FILE to NAME. This is not as simple as resetting
the `hname' member, since it must be put in a new hash bucket,
and possibly merged with an existing file called NAME. */
void
rename_file (file, name)
rehash_file (file, name)
register struct file *file;
char *name;
{
char *oldname = file->name;
char *oldname = file->hname;
register unsigned int oldhash;
register char *n;
@@ -144,11 +182,28 @@ rename_file (file, name)
oldhash = 0;
for (n = oldname; *n != '\0'; ++n)
HASH (oldhash, *n);
HASHI (oldhash, *n);
file_hash_enter (file, name, oldhash, file->name);
}
/* Rename FILE to NAME. This is not as simple as resetting
the `name' member, since it must be put in a new hash bucket,
and possibly merged with an existing file called NAME. */
void
rename_file (file, name)
register struct file *file;
char *name;
{
rehash_file(file, name);
while (file)
{
file->name = file->hname;
file = file->prev;
}
}
void
file_hash_enter (file, name, oldhash, oldname)
register struct file *file;
@@ -164,15 +219,18 @@ file_hash_enter (file, name, oldhash, oldname)
newhash = 0;
for (n = name; *n != '\0'; ++n)
HASH (newhash, *n);
HASHI (newhash, *n);
newbucket = newhash % FILE_BUCKETS;
/* Look for an existing file under the new name. */
for (oldfile = files[newbucket]; oldfile != 0; oldfile = oldfile->next)
if (streq (oldfile->name, name))
if (strieq (oldfile->hname, name))
break;
/* If the old file is the same as the new file, something's wrong. */
assert (oldfile != file);
if (oldhash != 0 && (newbucket != oldbucket || oldfile != 0))
{
/* Remove FILE from its hash bucket. */
@@ -190,9 +248,9 @@ file_hash_enter (file, name, oldhash, oldname)
/* Give FILE its new name. */
file->name = name;
file->hname = name;
for (f = file->double_colon; f != 0; f = f->prev)
f->name = name;
f->hname = name;
if (oldfile == 0)
{
@@ -257,12 +315,17 @@ in favor of those for `%s'.",
merge_variable_set_lists (&oldfile->variables, file->variables);
if (oldfile->double_colon && !file->double_colon)
if (oldfile->double_colon && file->is_target && !file->double_colon)
fatal ("can't rename single-colon `%s' to double-colon `%s'",
oldname, name);
if (!oldfile->double_colon && file->double_colon)
fatal ("can't rename double-colon `%s' to single-colon `%s'",
oldname, name);
if (!oldfile->double_colon && file->double_colon)
{
if (oldfile->is_target)
fatal ("can't rename double-colon `%s' to single-colon `%s'",
oldname, name);
else
oldfile->double_colon = file->double_colon;
}
if (file->last_mtime > oldfile->last_mtime)
/* %%% Kludge so -W wins on a file that gets vpathized. */
@@ -276,6 +339,7 @@ in favor of those for `%s'.",
MERGE (is_target);
MERGE (cmd_target);
MERGE (phony);
MERGE (ignore_vpath);
#undef MERGE
file->renamed = oldfile;
@@ -294,7 +358,7 @@ remove_intermediates (sig)
register int i;
register struct file *f;
char doneany;
if (question_flag || touch_flag)
return;
if (sig && just_print_flag)
@@ -303,7 +367,8 @@ remove_intermediates (sig)
doneany = 0;
for (i = 0; i < FILE_BUCKETS; ++i)
for (f = files[i]; f != 0; f = f->next)
if (f->intermediate && (f->dontcare || !f->precious))
if (f->intermediate && (f->dontcare || !f->precious)
&& !f->secondary)
{
int status;
if (f->update_status == -1)
@@ -349,7 +414,8 @@ remove_intermediates (sig)
/* For each dependency of each file, make the `struct dep' point
at the appropriate `struct file' (which may have to be created).
Also mark the files depended on by .PRECIOUS and .PHONY. */
Also mark the files depended on by .PRECIOUS, .PHONY, .SILENT,
and various other special targets. */
void
snap_deps ()
@@ -372,7 +438,7 @@ snap_deps ()
free (d->name);
d->name = 0;
}
for (f = lookup_file (".PRECIOUS"); f != 0; f = f->prev)
for (d = f->deps; d != 0; d = d->next)
for (f2 = d->file; f2 != 0; f2 = f2->prev)
@@ -387,6 +453,41 @@ snap_deps ()
f2->last_mtime = (time_t) -1;
}
for (f = lookup_file (".INTERMEDIATE"); f != 0; f = f->prev)
{
/* .INTERMEDIATE with deps listed
marks those deps as intermediate files. */
for (d = f->deps; d != 0; d = d->next)
for (f2 = d->file; f2 != 0; f2 = f2->prev)
f2->intermediate = 1;
/* .INTERMEDIATE with no deps does nothing.
Marking all files as intermediates is useless
since the goal targets would be deleted after they are built. */
}
for (f = lookup_file (".SECONDARY"); f != 0; f = f->prev)
{
/* .SECONDARY with deps listed
marks those deps as intermediate files
in that they don't get rebuilt if not actually needed;
but unlike real intermediate files,
these are not deleted after make finishes. */
if (f->deps)
{
for (d = f->deps; d != 0; d = d->next)
for (f2 = d->file; f2 != 0; f2 = f2->prev)
f2->intermediate = f2->secondary = 1;
}
/* .SECONDARY with no deps listed marks *all* files that way. */
else
{
int i;
for (i = 0; i < FILE_BUCKETS; i++)
for (f2 = files[i]; f2; f2= f2->next)
f2->intermediate = f2->secondary = 1;
}
}
f = lookup_file (".EXPORT_ALL_VARIABLES");
if (f != 0 && f->is_target)
export_all_variables = 1;
@@ -445,11 +546,11 @@ print_file (f)
if (!f->is_target)
puts ("# Not a target:");
printf ("%s:%s", f->name, f->double_colon ? ":" : "");
for (d = f->deps; d != 0; d = d->next)
printf (" %s", dep_name (d));
putchar ('\n');
if (f->precious)
puts ("# Precious file (dependency of .PRECIOUS).");
if (f->phony)
@@ -564,3 +665,5 @@ print_file_data_base ()
#endif
}
}
/* EOF */

View File

@@ -1,5 +1,5 @@
/* Definition of target file data structures for GNU Make.
Copyright (C) 1988, 89, 90, 91, 92, 93, 94 Free Software Foundation, Inc.
Copyright (C) 1988,89,90,91,92,93,94,97 Free Software Foundation, Inc.
This file is part of GNU Make.
GNU Make is free software; you can redistribute it and/or modify
@@ -24,6 +24,8 @@ struct file
{
struct file *next;
char *name;
char *hname; /* Hashed filename */
char *vpath; /* VPATH/vpath pathname */
struct dep *deps;
struct commands *cmds; /* Commands to execute for this target. */
int command_flags; /* Flags OR'd in for cmds; see commands.h. */
@@ -72,8 +74,12 @@ struct file
unsigned int phony:1; /* Nonzero if this is a phony file
i.e., a dependency of .PHONY. */
unsigned int intermediate:1;/* Nonzero if this is an intermediate file. */
/* Nonzero, for an intermediate file,
means remove_intermediates should not delete it. */
unsigned int secondary:1;
unsigned int dontcare:1; /* Nonzero if no complaint is to be made if
this target cannot be remade. */
unsigned int ignore_vpath:1;/* Nonzero if we threw out VPATH name */
};
/* Number of intermediate files entered. */
@@ -85,15 +91,21 @@ extern struct file *default_goal_file, *suffix_file, *default_file;
extern struct file *lookup_file (), *enter_file ();
extern void remove_intermediates (), snap_deps ();
extern void rename_file (), file_hash_enter ();
extern void rename_file (), rehash_file (), file_hash_enter ();
extern void set_command_state ();
/* Return the mtime of file F (a struct file *), caching it.
The value is -1 if the file does not exist. */
#define file_mtime(f) file_mtime_1 ((f), 1)
/* Return the mtime of file F (a struct file *), caching it.
Don't search using vpath for the file--if it doesn't actually exist,
we don't find it.
The value is -1 if the file does not exist. */
#define file_mtime_no_search(f) file_mtime_1 ((f), 0)
extern time_t f_mtime ();
#define file_mtime_1(f, v) \
((f)->last_mtime != (time_t) 0 ? (f)->last_mtime : f_mtime ((f), v))
#define file_mtime(f) file_mtime_1 ((f), 1)
#define file_mtime_no_search(f) file_mtime_1 ((f), 0)
/* Modtime value to use for `infinitely new'. We used to get the current time
from the system and use that whenever we wanted `new'. But that causes
@@ -102,10 +114,12 @@ extern time_t f_mtime ();
targets, which need to be considered newer than anything that depends on
them, even if said dependents' modtimes are in the future.
NOTE: This assumes 32-bit `time_t's, but I cannot think of a portable way
to produce the largest representable integer of a given signed type. */
#define NEW_MTIME ((time_t) 0x7fffffff)
If time_t is unsigned, its maximum value is the same as "(time_t) -1",
so use one less than that, because -1 is used for non-existing files. */
#define NEW_MTIME \
(INTEGER_TYPE_SIGNED (time_t) \
? INTEGER_TYPE_MAXIMUM (time_t) \
: (INTEGER_TYPE_MAXIMUM (time_t) - 1))
#define check_renamed(file) \
while ((file)->renamed != 0) (file) = (file)->renamed /* No ; here. */

View File

@@ -1,5 +1,5 @@
/* Variable function expansion for GNU Make.
Copyright (C) 1988, 89, 91, 92, 93, 94, 95 Free Software Foundation, Inc.
Copyright (C) 1988,89,91,92,93,94,95,96,97 Free Software Foundation, Inc.
This file is part of GNU Make.
GNU Make is free software; you can redistribute it and/or modify
@@ -17,17 +17,22 @@ along with GNU Make; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "make.h"
#include "filedef.h"
#include "variable.h"
#include "dep.h"
#include "commands.h"
#include "job.h"
#include "commands.h"
#ifdef __MSDOS__
#include <process.h>
#include <fcntl.h>
#ifdef _AMIGA
#include "amiga.h"
#endif
#ifdef WINDOWS32
#include <windows.h>
#include <io.h>
#include "sub_proc.h"
#endif
static char *string_glob ();
static char *string_glob PARAMS ((char *line));
/* Store into VARIABLE_BUFFER at O the result of scanning TEXT and replacing
each occurrence of SUBST with REPLACE. TEXT is null-terminated. SLEN is
@@ -35,7 +40,7 @@ static char *string_glob ();
nonzero, substitutions are done only on matches which are complete
whitespace-delimited words. If SUFFIX_ONLY is nonzero, substitutions are
done only at the ends of whitespace-delimited words. */
char *
subst_expand (o, text, subst, replace, slen, rlen, by_word, suffix_only)
char *o;
@@ -113,9 +118,9 @@ patsubst_expand (o, text, pattern, replace, pattern_percent, replace_percent)
register char *pattern, *replace;
register char *pattern_percent, *replace_percent;
{
register int pattern_prepercent_len, pattern_postpercent_len;
register int replace_prepercent_len, replace_postpercent_len;
register char *t;
unsigned int pattern_prepercent_len, pattern_postpercent_len;
unsigned int replace_prepercent_len, replace_postpercent_len;
char *t;
unsigned int len;
int doneany = 0;
@@ -155,14 +160,14 @@ patsubst_expand (o, text, pattern, replace, pattern_percent, replace_percent)
if (len < pattern_prepercent_len + pattern_postpercent_len)
fail = 1;
/* Does the prefix match? */
/* Does the prefix match? */
if (!fail && pattern_prepercent_len > 0
&& (*t != *pattern
|| t[pattern_prepercent_len - 1] != pattern_percent[-1]
|| strncmp (t + 1, pattern + 1, pattern_prepercent_len - 1)))
fail = 1;
/* Does the suffix match? */
/* Does the suffix match? */
if (!fail && pattern_postpercent_len > 0
&& (t[len - 1] != pattern_percent[pattern_postpercent_len]
|| t[len - pattern_postpercent_len] != pattern_percent[1]
@@ -226,6 +231,7 @@ enum function
function_firstword,
function_word,
function_words,
function_wordlist,
function_findstring,
function_strip,
function_join,
@@ -262,6 +268,7 @@ static struct
{ "firstword", 9, function_firstword },
{ "word", 4, function_word },
{ "words", 5, function_words },
{ "wordlist", 8, function_wordlist },
{ "findstring", 10, function_findstring },
{ "strip", 5, function_strip },
{ "join", 4, function_join },
@@ -311,12 +318,12 @@ int shell_function_pid = 0, shell_function_completed;
The output is written into VARIABLE_BUFFER starting at O. */
/* Note this absorbs a semicolon and is safe to use in conditionals. */
#define BADARGS(func) \
if (reading_filename != 0) \
makefile_fatal (reading_filename, *reading_lineno_ptr, \
"insufficient arguments to function `%s'", \
func); \
else \
#define BADARGS(func) \
if (reading_filename != 0) \
makefile_fatal (reading_filename, *reading_lineno_ptr, \
"insufficient arguments to function `%s'", \
func); \
else \
fatal ("insufficient arguments to function `%s'", func)
static char *
@@ -327,7 +334,7 @@ expand_function (o, function, text, end)
char *end;
{
char *p, *p2, *p3;
unsigned int i, len;
unsigned int i, j, len;
int doneany = 0;
int count;
char endparen = *end, startparen = *end == ')' ? '(' : '{';
@@ -337,24 +344,43 @@ expand_function (o, function, text, end)
default:
abort ();
break;
#ifndef VMS /* not supported for vms yet */
case function_shell:
{
char **argv, **envp;
#ifdef WINDOWS32
SECURITY_ATTRIBUTES saAttr;
HANDLE hIn;
HANDLE hErr;
HANDLE hChildOutRd;
HANDLE hChildOutWr;
HANDLE hProcess;
#endif
#ifdef __MSDOS__
FILE *fpipe;
#endif
char **argv;
char *error_prefix;
#ifndef _AMIGA
char **envp;
int pipedes[2];
int pid;
#endif
/* Expand the command line. */
text = expand_argument (text, end);
#ifndef __MSDOS__
/* Construct the argument list. */
argv = construct_command_argv (text, (char *) NULL, (struct file *) 0);
argv = construct_command_argv (text,
(char **) NULL, (struct file *) 0);
if (argv == 0)
break;
#endif
#ifndef _AMIGA
/* Using a target environment for `shell' loses in cases like:
export var = $(shell echo foobie)
export var = $(shell echo foobie)
because target_environment hits a loop trying to expand $(var)
to put it in the environment. This is even more confusing when
var was not explicitly exported, but just appeared in the
@@ -365,6 +391,7 @@ expand_function (o, function, text, end)
/* Construct the environment. */
envp = target_environment ((struct file *) 0);
#endif
#endif /* Not Amiga. */
/* For error messages. */
if (reading_filename != 0)
@@ -376,29 +403,129 @@ expand_function (o, function, text, end)
else
error_prefix = "";
#ifndef __MSDOS__
#ifndef _AMIGA
# ifdef WINDOWS32
saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
saAttr.bInheritHandle = TRUE;
saAttr.lpSecurityDescriptor = NULL;
if (DuplicateHandle(GetCurrentProcess(),
GetStdHandle(STD_INPUT_HANDLE),
GetCurrentProcess(),
&hIn,
0,
TRUE,
DUPLICATE_SAME_ACCESS) == FALSE) {
fatal("create_child_process: DuplicateHandle(In) failed (e=%d)\n",
GetLastError());
}
if (DuplicateHandle(GetCurrentProcess(),
GetStdHandle(STD_ERROR_HANDLE),
GetCurrentProcess(),
&hErr,
0,
TRUE,
DUPLICATE_SAME_ACCESS) == FALSE) {
fatal("create_child_process: DuplicateHandle(Err) failed (e=%d)\n",
GetLastError());
}
if (!CreatePipe(&hChildOutRd, &hChildOutWr, &saAttr, 0))
fatal("CreatePipe() failed (e=%d)\n", GetLastError());
hProcess = process_init_fd(hIn, hChildOutWr, hErr);
if (!hProcess)
fatal("expand_function: process_init_fd() failed\n");
else
process_register(hProcess);
/* make sure that CreateProcess() has Path it needs */
sync_Path_environment();
if (!process_begin(hProcess, argv, envp, argv[0], NULL))
pid = (int) hProcess;
else
fatal("expand_function: unable to launch process (e=%d)\n",
process_last_err(hProcess));
/* set up to read data from child */
pipedes[0] = _open_osfhandle((long) hChildOutRd, O_RDONLY);
/* this will be closed almost right away */
pipedes[1] = _open_osfhandle((long) hChildOutWr, O_APPEND);
# else /* WINDOWS32 */
# ifdef __MSDOS__
{
/* MSDOS can't fork, but it has `popen'.
(Bwt, why isn't `popen' used in all the versions?) */
struct variable *sh = lookup_variable ("SHELL", 5);
int e;
extern int dos_command_running, dos_status;
/* Make sure not to bother processing an empty line. */
while (isblank (*text))
++text;
if (*text == '\0')
break;
if (sh)
{
char buf[PATH_MAX + 7];
/* This makes sure $SHELL value is used by $(shell), even
though the target environment is not passed to it. */
sprintf (buf, "SHELL=%s", sh->value);
putenv (buf);
}
e = errno;
errno = 0;
dos_command_running = 1;
dos_status = 0;
fpipe = popen (text, "rt");
dos_command_running = 0;
if (!fpipe || dos_status)
{
pipedes[0] = -1;
pid = -1;
if (dos_status)
errno = EINTR;
else if (errno == 0)
errno = ENOMEM;
shell_function_completed = -1;
}
else
{
pipedes[0] = fileno (fpipe);
pid = 42;
errno = e;
shell_function_completed = 1;
}
}
if (pipedes[0] < 0)
# else /* ! __MSDOS__ */
if (pipe (pipedes) < 0)
# endif /* __MSDOS__ */
{
perror_with_name (error_prefix, "pipe");
break;
}
# ifndef __MSDOS__
pid = vfork ();
if (pid < 0)
perror_with_name (error_prefix, "fork");
else if (pid == 0)
child_execute_job (0, pipedes[1], argv, envp);
else
# endif /* ! __MSDOS__ */
# endif /* WINDOWS32 */
{
/* We are the parent. */
char *buffer;
unsigned int maxlen;
int cc;
/* Free the storage only the child needed. */
free (argv[0]);
free ((char *) argv);
#if 0
for (i = 0; envp[i] != 0; ++i)
free (envp[i]);
@@ -407,17 +534,22 @@ expand_function (o, function, text, end)
/* Record the PID for reap_children. */
shell_function_pid = pid;
#ifndef __MSDOS__
shell_function_completed = 0;
/* Free the storage only the child needed. */
free (argv[0]);
free ((char *) argv);
/* Close the write side of the pipe. */
(void) close (pipedes[1]);
#endif
/* Set up and read from the pipe. */
maxlen = 200;
buffer = (char *) xmalloc (maxlen + 1);
/* Close the write side of the pipe. */
(void) close (pipedes[1]);
/* Read from the pipe until it gets EOF. */
i = 0;
do
@@ -440,7 +572,12 @@ expand_function (o, function, text, end)
#endif
/* Close the read side of the pipe. */
#ifdef __MSDOS__
if (fpipe)
(void) pclose (fpipe);
#else
(void) close (pipedes[0]);
#endif
/* Loop until child_handler sets shell_function_completed
to the status of our child shell. */
@@ -469,49 +606,81 @@ expand_function (o, function, text, end)
if (i > 0)
{
if (buffer[i - 1] == '\n')
buffer[--i] = '\0';
{
if (i > 1 && buffer[i - 2] == '\r')
--i;
buffer[--i] = '\0';
}
else
buffer[i] = '\0';
p = buffer;
while ((p = index (p, '\n')) != 0)
*p++ = ' ';
for (p2=p; *p != '\0'; ++p)
{
if (p[0] == '\r' && p[1] == '\n')
continue;
if (*p == '\n')
*p2++ = ' ';
else
*p2++ = *p;
}
*p2 = '\0';
o = variable_buffer_output (o, buffer, i);
}
}
free (buffer);
}
#else /* MSDOS. */
{
/* MS-DOS can't do fork, but it can do spawn. However, this
means that we don't have an opportunity to reopen stdout to
trap it. Thus, we save our own stdout onto a new descriptor
and dup a temp file's descriptor onto our stdout temporarily.
After we spawn the shell program, we dup our own stdout back
to the stdout descriptor. The buffer reading is the same as
above, except that we're now reading from a file. */
#else /* Amiga */
{
/* Amiga can't fork nor spawn, but I can start a program with
redirection of my choice. However, this means that we
don't have an opportunity to reopen stdout to trap it. Thus,
we save our own stdout onto a new descriptor and dup a temp
file's descriptor onto our stdout temporarily. After we
spawn the shell program, we dup our own stdout back to the
stdout descriptor. The buffer reading is the same as above,
except that we're now reading from a file. */
#include <dos/dos.h>
#include <proto/dos.h>
int save_stdout;
int child_stdout;
BPTR child_stdout;
char tmp_output[FILENAME_MAX];
FILE *child_stream;
unsigned int maxlen = 200;
int cc;
char *buffer;
strcpy (tmp_output, "shXXXXXX");
char * buffer, * ptr;
char ** aptr;
int len = 0;
strcpy (tmp_output, "t:MakeshXXXXXXXX");
mktemp (tmp_output);
child_stdout = open (tmp_output,
O_WRONLY|O_CREAT|O_TRUNC|O_TEXT, 0644);
save_stdout = dup (1);
dup2 (child_stdout, 1);
spawnvp (P_WAIT, argv[0], argv);
dup2 (save_stdout, 1);
close (child_stdout);
close (save_stdout);
child_stdout = open (tmp_output, O_RDONLY|O_TEXT, 0644);
child_stdout = Open (tmp_output, MODE_NEWFILE);
for (aptr=argv; *aptr; aptr++)
{
len += strlen (*aptr) + 1;
}
buffer = xmalloc (len + 1);
ptr = buffer;
for (aptr=argv; *aptr; aptr++)
{
strcpy (ptr, *aptr);
ptr += strlen (ptr) + 1;
*ptr ++ = ' ';
*ptr = 0;
}
ptr[-1] = '\n';
Execute (buffer, NULL, child_stdout);
free (buffer);
Close (child_stdout);
child_stdout = Open (tmp_output, MODE_OLDFILE);
buffer = xmalloc (maxlen);
i = 0;
do
@@ -521,15 +690,15 @@ expand_function (o, function, text, end)
maxlen += 512;
buffer = (char *) xrealloc (buffer, maxlen + 1);
}
cc = read (child_stdout, &buffer[i], maxlen - i);
cc = Read (child_stdout, &buffer[i], maxlen - i);
if (cc > 0)
i += cc;
} while (cc > 0);
close (child_stdout);
unlink (tmp_output);
Close (child_stdout);
DeleteFile (tmp_output);
if (i > 0)
{
if (buffer[i - 1] == '\n')
@@ -543,11 +712,12 @@ expand_function (o, function, text, end)
}
free (buffer);
}
#endif /* Not MSDOS. */
#endif /* Not Amiga. */
free (text);
break;
}
#endif /* !VMS */
case function_origin:
/* Expand the argument. */
@@ -590,7 +760,7 @@ expand_function (o, function, text, end)
free (text);
break;
case function_sort:
/* Expand the argument. */
text = expand_argument (text, end);
@@ -610,7 +780,7 @@ expand_function (o, function, text, end)
nwords *= 2;
words = (char **) xrealloc ((char *) words,
nwords * sizeof (char *));
}
}
words[wordi++] = savestring (p, len);
}
@@ -640,7 +810,7 @@ expand_function (o, function, text, end)
free (text);
break;
case function_foreach:
{
/* Get three comma-separated arguments but
@@ -733,7 +903,7 @@ expand_function (o, function, text, end)
if (p == end)
BADARGS (function == function_filter ? "filter" : "filter-out");
p2 = expand_argument (text, p);
text = expand_argument (p + 1, end);
/* Chop TEXT up into words and then run each pattern through. */
@@ -792,7 +962,7 @@ expand_function (o, function, text, end)
free (text);
}
break;
case function_patsubst:
/* Get three comma-separated arguments and expand each one. */
count = 0;
@@ -825,9 +995,9 @@ expand_function (o, function, text, end)
text = expand_argument (text, p2);
p3 = expand_argument (p2 + 1, p);
p2 = expand_argument (p + 1, end);
o = patsubst_expand (o, p2, text, p3, (char *) 0, (char *) 0);
free (text);
free (p3);
free (p2);
@@ -850,7 +1020,7 @@ expand_function (o, function, text, end)
text = expand_argument (text, p);
p = expand_argument (p + 1, end);
{
/* Write each word of the first argument directly followed
by the corresponding word of the second argument.
@@ -866,11 +1036,11 @@ expand_function (o, function, text, end)
tp = find_next_token (&p2, &tlen);
if (tp != 0)
o = variable_buffer_output (o, tp, tlen);
pp = find_next_token (&p3, &plen);
if (pp != 0)
o = variable_buffer_output (o, pp, plen);
if (tp != 0 || pp != 0)
{
o = variable_buffer_output (o, " ", 1);
@@ -882,18 +1052,25 @@ expand_function (o, function, text, end)
/* Kill the last blank. */
--o;
}
free (text);
free (p);
break;
case function_strip:
/* Expand the argument. */
text = expand_argument (text, end);
p2 = text;
while ((p = find_next_token (&p2, &i)) != 0)
while (*p2 != '\0')
{
while (isspace(*p2))
++p2;
p = p2;
for (i=0; *p2 != '\0' && !isspace(*p2); ++p2, ++i)
{}
if (!i)
break;
o = variable_buffer_output (o, p, i);
o = variable_buffer_output (o, " ", 1);
doneany = 1;
@@ -901,19 +1078,23 @@ expand_function (o, function, text, end)
if (doneany)
/* Kill the last space. */
--o;
free (text);
break;
case function_wildcard:
text = expand_argument (text, end);
#ifdef _AMIGA
o = wildcard_expansion (text, o);
#else
p = string_glob (text);
o = variable_buffer_output (o, p, strlen (p));
#endif
free (text);
break;
case function_subst:
/* Get three comma-separated arguments and expand each one. */
count = 0;
@@ -946,14 +1127,14 @@ expand_function (o, function, text, end)
text = expand_argument (text, p2);
p3 = expand_argument (p2 + 1, p);
p2 = expand_argument (p + 1, end);
o = subst_expand (o, p2, text, p3, strlen (text), strlen (p3), 0, 0);
free (text);
free (p3);
free (p2);
break;
case function_firstword:
/* Expand the argument. */
text = expand_argument (text, end);
@@ -963,10 +1144,10 @@ expand_function (o, function, text, end)
p = find_next_token (&p2, &i);
if (p != 0)
o = variable_buffer_output (o, p, i);
free (text);
break;
case function_word:
/* Get two comma-separated arguments and expand each one. */
count = 0;
@@ -1036,6 +1217,91 @@ index argument");
free (text);
break;
case function_wordlist:
/* Get two comma-separated arguments and expand each one. */
count = 0;
for (p = text; p < end; ++p)
{
if (*p == startparen)
++count;
else if (*p == endparen)
--count;
else if (*p == ',' && count <= 0)
break;
}
if (p == end)
BADARGS ("wordlist");
text = expand_argument (text, p);
/* Check the first argument. */
for (p2 = text; *p2 != '\0'; ++p2)
if (*p2 < '0' || *p2 > '9')
{
if (reading_filename != 0)
makefile_fatal (reading_filename, *reading_lineno_ptr,
"non-numeric first argument to `wordlist' function");
else
fatal ("non-numeric first argument to `wordlist' function");
}
i = (unsigned int)atoi(text);
free (text);
/* Check the next argument */
for (p2 = p + 1; isblank(*p2); ++p2)
{}
count = 0;
for (p = p2; p < end; ++p)
{
if (*p == startparen)
++count;
else if (*p == endparen)
--count;
else if (*p == ',' && count <= 0)
break;
}
if (p == end)
BADARGS ("wordlist");
text = expand_argument (p2, p);
for (p2 = text; *p2 != '\0'; ++p2)
if (*p2 < '0' || *p2 > '9')
{
if (reading_filename != 0)
makefile_fatal (reading_filename, *reading_lineno_ptr,
"non-numeric second argument to `wordlist' function");
else
fatal ("non-numeric second argument to `wordlist' function");
}
j = (unsigned int)atoi(text);
free (text);
if (j > i)
j -= i;
else
{
unsigned int k;
k = j;
j = i - j;
i = k;
}
++j;
/* Extract the requested words */
text = expand_argument (p + 1, end);
p2 = text;
while (((p = find_next_token (&p2, &len)) != 0) && --i)
{}
if (p)
{
while (--j && (find_next_token (&p2, &len) != 0))
{}
o = variable_buffer_output (o, p, p2 - p);
}
free (text);
break;
case function_findstring:
/* Get two comma-separated arguments and expand each one. */
count = 0;
@@ -1058,11 +1324,11 @@ index argument");
i = strlen (text);
if (sindex (p, 0, text, i) != 0)
o = variable_buffer_output (o, text, i);
free (p);
free (text);
break;
case function_addsuffix:
case function_addprefix:
/* Get two comma-separated arguments and expand each one. */
@@ -1082,7 +1348,7 @@ index argument");
i = strlen (text);
p2 = expand_argument (p + 1, end);
p3 = p2;
while ((p = find_next_token (&p3, &len)) != 0)
{
@@ -1097,11 +1363,11 @@ index argument");
if (doneany)
/* Kill last space. */
--o;
free (p2);
free (text);
break;
case function_dir:
case function_basename:
/* Expand the argument. */
@@ -1111,16 +1377,38 @@ index argument");
while ((p2 = find_next_token (&p3, &len)) != 0)
{
p = p2 + len;
while (p >= p2 && *p != (function == function_dir ? '/' : '.'))
#ifdef VMS
while (p >= p2 && *p != ']'
&& (function != function_basename || *p != '.'))
#else
# ifdef __MSDOS__
while (p >= p2 && *p != '/' && *p != '\\'
&& (function != function_basename || *p != '.'))
# else
while (p >= p2 && *p != '/'
&& (function != function_basename || *p != '.'))
# endif
#endif
--p;
if (p >= p2)
{
if (function == function_dir)
++p;
o = variable_buffer_output (o, p2, p - p2);
}
if (p >= p2 && (function == function_dir))
o = variable_buffer_output (o, p2, ++p - p2);
else if (p >= p2 && (*p == '.'))
o = variable_buffer_output (o, p2, p - p2);
#if defined(WINDOWS32) || defined(__MSDOS__)
/* Handle the "d:foobar" case */
else if (p2[0] && p2[1] == ':' && function == function_dir)
o = variable_buffer_output (o, p2, 2);
#endif
else if (function == function_dir)
o = variable_buffer_output (o, "./", 2);
#ifdef VMS
o = variable_buffer_output (o, "[]", 2);
#else
#ifndef _AMIGA
o = variable_buffer_output (o, "./", 2);
#else
/* o = o */; /* Just a nop... */
#endif /* AMIGA */
#endif /* !VMS */
else
/* The entire name is the basename. */
o = variable_buffer_output (o, p2, len);
@@ -1131,10 +1419,10 @@ index argument");
if (doneany)
/* Kill last space. */
--o;
free (text);
break;
case function_notdir:
case function_suffix:
/* Expand the argument. */
@@ -1144,14 +1432,35 @@ index argument");
while ((p2 = find_next_token (&p3, &len)) != 0)
{
p = p2 + len;
while (p >= p2 && *p != (function == function_notdir ? '/' : '.'))
#ifdef VMS
while (p >= p2 && *p != ']'
&& (function != function_suffix || *p != '.'))
#else
# ifdef __MSDOS__
while (p >= p2 && *p != '/' && *p != '\\'
&& (function != function_suffix || *p != '.'))
# else
while (p >= p2 && *p != '/'
&& (function != function_suffix || *p != '.'))
# endif
#endif
--p;
if (p >= p2)
{
if (function == function_notdir)
++p;
else if (*p != '.')
continue;
o = variable_buffer_output (o, p, len - (p - p2));
}
#if defined(WINDOWS32) || defined(__MSDOS__)
/* Handle the case of "d:foo/bar". */
else if (function == function_notdir && p2[0] && p2[1] == ':')
{
p = p2 + 2;
o = variable_buffer_output (o, p, len - (p - p2));
}
#endif
else if (function == function_notdir)
o = variable_buffer_output (o, p2, len);

File diff suppressed because it is too large Load Diff

1055
getopt.c Normal file

File diff suppressed because it is too large Load Diff

133
getopt.h Normal file
View File

@@ -0,0 +1,133 @@
/* Declarations for getopt.
Copyright (C) 1989,90,91,92,93,94,96,97 Free Software Foundation, Inc.
NOTE: The canonical source of this file is maintained with the GNU C Library.
Bugs can be reported to bug-glibc@gnu.org.
This program 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.
This program 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 this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
USA. */
#ifndef _GETOPT_H
#define _GETOPT_H 1
#ifdef __cplusplus
extern "C" {
#endif
/* For communication from `getopt' to the caller.
When `getopt' finds an option that takes an argument,
the argument value is returned here.
Also, when `ordering' is RETURN_IN_ORDER,
each non-option ARGV-element is returned here. */
extern char *optarg;
/* Index in ARGV of the next element to be scanned.
This is used for communication to and from the caller
and for communication between successive calls to `getopt'.
On entry to `getopt', zero means this is the first call; initialize.
When `getopt' returns -1, this is the index of the first of the
non-option elements that the caller should itself scan.
Otherwise, `optind' communicates from one call to the next
how much of ARGV has been scanned so far. */
extern int optind;
/* Callers store zero here to inhibit the error message `getopt' prints
for unrecognized options. */
extern int opterr;
/* Set to an option character which was unrecognized. */
extern int optopt;
/* Describe the long-named options requested by the application.
The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
of `struct option' terminated by an element containing a name which is
zero.
The field `has_arg' is:
no_argument (or 0) if the option does not take an argument,
required_argument (or 1) if the option requires an argument,
optional_argument (or 2) if the option takes an optional argument.
If the field `flag' is not NULL, it points to a variable that is set
to the value given in the field `val' when the option is found, but
left unchanged if the option is not found.
To have a long-named option do something other than set an `int' to
a compiled-in constant, such as set a value from `optarg', set the
option's `flag' field to zero and its `val' field to a nonzero
value (the equivalent single-letter option character, if there is
one). For long options that have a zero `flag' field, `getopt'
returns the contents of the `val' field. */
struct option
{
#if defined (__STDC__) && __STDC__
const char *name;
#else
char *name;
#endif
/* has_arg can't be an enum because some compilers complain about
type mismatches in all the code that assumes it is an int. */
int has_arg;
int *flag;
int val;
};
/* Names for the values of the `has_arg' field of `struct option'. */
#define no_argument 0
#define required_argument 1
#define optional_argument 2
#if defined (__STDC__) && __STDC__
#ifdef __GNU_LIBRARY__
/* Many other libraries have conflicting prototypes for getopt, with
differences in the consts, in stdlib.h. To avoid compilation
errors, only prototype getopt for the GNU C library. */
extern int getopt (int argc, char *const *argv, const char *shortopts);
#else /* not __GNU_LIBRARY__ */
extern int getopt ();
#endif /* __GNU_LIBRARY__ */
extern int getopt_long (int argc, char *const *argv, const char *shortopts,
const struct option *longopts, int *longind);
extern int getopt_long_only (int argc, char *const *argv,
const char *shortopts,
const struct option *longopts, int *longind);
/* Internal only. Users should not call this directly. */
extern int _getopt_internal (int argc, char *const *argv,
const char *shortopts,
const struct option *longopts, int *longind,
int long_only);
#else /* not __STDC__ */
extern int getopt ();
extern int getopt_long ();
extern int getopt_long_only ();
extern int _getopt_internal ();
#endif /* __STDC__ */
#ifdef __cplusplus
}
#endif
#endif /* getopt.h */

189
getopt1.c Normal file
View File

@@ -0,0 +1,189 @@
/* getopt_long and getopt_long_only entry points for GNU getopt.
Copyright (C) 1987,88,89,90,91,92,93,94,96,97 Free Software Foundation, Inc.
NOTE: The canonical source of this file is maintained with the GNU C Library.
Bugs can be reported to bug-glibc@prep.ai.mit.edu.
This program 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.
This program 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 this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
USA. */
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include "getopt.h"
#if !defined (__STDC__) || !__STDC__
/* This is a separate conditional since some stdc systems
reject `defined (const)'. */
#ifndef const
#define const
#endif
#endif
#include <stdio.h>
/* Comment out all this code if we are using the GNU C Library, and are not
actually compiling the library itself. This code is part of the GNU C
Library, but also included in many other GNU distributions. Compiling
and linking in this code is a waste when using the GNU C library
(especially if it is a shared library). Rather than having every GNU
program understand `configure --with-gnu-libc' and omit the object files,
it is simpler to just do this in the source for each such file. */
#define GETOPT_INTERFACE_VERSION 2
#if !defined (_LIBC) && defined (__GLIBC__) && __GLIBC__ >= 2
#include <gnu-versions.h>
#if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION
#define ELIDE_CODE
#endif
#endif
#ifndef ELIDE_CODE
/* This needs to come after some library #include
to get __GNU_LIBRARY__ defined. */
#ifdef __GNU_LIBRARY__
#include <stdlib.h>
#endif
#ifndef NULL
#define NULL 0
#endif
int
getopt_long (argc, argv, options, long_options, opt_index)
int argc;
char *const *argv;
const char *options;
const struct option *long_options;
int *opt_index;
{
return _getopt_internal (argc, argv, options, long_options, opt_index, 0);
}
/* Like getopt_long, but '-' as well as '--' can indicate a long option.
If an option that starts with '-' (not '--') doesn't match a long option,
but does match a short option, it is parsed as a short option
instead. */
int
getopt_long_only (argc, argv, options, long_options, opt_index)
int argc;
char *const *argv;
const char *options;
const struct option *long_options;
int *opt_index;
{
return _getopt_internal (argc, argv, options, long_options, opt_index, 1);
}
#endif /* Not ELIDE_CODE. */
#ifdef TEST
#include <stdio.h>
int
main (argc, argv)
int argc;
char **argv;
{
int c;
int digit_optind = 0;
while (1)
{
int this_option_optind = optind ? optind : 1;
int option_index = 0;
static struct option long_options[] =
{
{"add", 1, 0, 0},
{"append", 0, 0, 0},
{"delete", 1, 0, 0},
{"verbose", 0, 0, 0},
{"create", 0, 0, 0},
{"file", 1, 0, 0},
{0, 0, 0, 0}
};
c = getopt_long (argc, argv, "abc:d:0123456789",
long_options, &option_index);
if (c == -1)
break;
switch (c)
{
case 0:
printf ("option %s", long_options[option_index].name);
if (optarg)
printf (" with arg %s", optarg);
printf ("\n");
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
if (digit_optind != 0 && digit_optind != this_option_optind)
printf ("digits occur in two different argv-elements.\n");
digit_optind = this_option_optind;
printf ("option %c\n", c);
break;
case 'a':
printf ("option a\n");
break;
case 'b':
printf ("option b\n");
break;
case 'c':
printf ("option c with value `%s'\n", optarg);
break;
case 'd':
printf ("option d with value `%s'\n", optarg);
break;
case '?':
break;
default:
printf ("?? getopt returned character code 0%o ??\n", c);
}
}
if (optind < argc)
{
printf ("non-option ARGV-elements: ");
while (optind < argc)
printf ("%s ", argv[optind++]);
printf ("\n");
}
exit (0);
}
#endif /* TEST */

View File

@@ -1,481 +0,0 @@
GNU LIBRARY GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1991 Free Software Foundation, Inc.
675 Mass Ave, Cambridge, MA 02139, USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the library GPL. It is
numbered 2 because it goes with version 2 of the ordinary GPL.]
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.
This license, the Library General Public License, applies to some
specially designated Free Software Foundation software, and to any
other libraries whose authors decide to use it. You can use it for
your libraries, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if
you distribute copies of the library, or if you modify it.
For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you. You must make sure that they, too, receive or can get the source
code. If you link a program with the library, you must provide
complete object files to the recipients so that they can relink them
with the library, after making changes to the library and recompiling
it. And you must show them these terms so they know their rights.
Our method of protecting your rights has two steps: (1) copyright
the library, and (2) offer you this license which gives you legal
permission to copy, distribute and/or modify the library.
Also, for each distributor's protection, we want to make certain
that everyone understands that there is no warranty for this free
library. If the library is modified by someone else and passed on, we
want its recipients to know that what they have is not the original
version, so that any problems introduced by others will not reflect on
the original authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that companies distributing free
software will individually obtain patent licenses, thus in effect
transforming the program into proprietary software. To prevent this,
we have made it clear that any patent must be licensed for everyone's
free use or not licensed at all.
Most GNU software, including some libraries, is covered by the ordinary
GNU General Public License, which was designed for utility programs. This
license, the GNU Library General Public License, applies to certain
designated libraries. This license is quite different from the ordinary
one; be sure to read it in full, and don't assume that anything in it is
the same as in the ordinary license.
The reason we have a separate public license for some libraries is that
they blur the distinction we usually make between modifying or adding to a
program and simply using it. Linking a program with a library, without
changing the library, is in some sense simply using the library, and is
analogous to running a utility program or application program. However, in
a textual and legal sense, the linked executable is a combined work, a
derivative of the original library, and the ordinary General Public License
treats it as such.
Because of this blurred distinction, using the ordinary General
Public License for libraries did not effectively promote software
sharing, because most developers did not use the libraries. We
concluded that weaker conditions might promote sharing better.
However, unrestricted linking of non-free programs would deprive the
users of those programs of all benefit from the free status of the
libraries themselves. This Library General Public License is intended to
permit developers of non-free programs to use free libraries, while
preserving your freedom as a user of such programs to change the free
libraries that are incorporated in them. (We have not seen how to achieve
this as regards changes in header files, but we have achieved it as regards
changes in the actual functions of the Library.) The hope is that this
will lead to faster development of free libraries.
The precise terms and conditions for copying, distribution and
modification follow. Pay close attention to the difference between a
"work based on the library" and a "work that uses the library". The
former contains code derived from the library, while the latter only
works together with the library.
Note that it is possible for a library to be covered by the ordinary
General Public License rather than by this special one.
GNU LIBRARY GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library which
contains a notice placed by the copyright holder or other authorized
party saying it may be distributed under the terms of this Library
General Public License (also called "this License"). Each licensee is
addressed as "you".
A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work
which has been distributed under these terms. A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language. (Hereinafter, translation is
included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for
making modifications to it. For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control compilation
and installation of the library.
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it). Whether that is true depends on what the Library does
and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.
You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.
2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices
stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no
charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a
table of data to be supplied by an application program that uses
the facility, other than as an argument passed when the facility
is invoked, then you must make a good faith effort to ensure that,
in the event an application does not supply such function or
table, the facility still operates, and performs whatever part of
its purpose remains meaningful.
(For example, a function in a library to compute square roots has
a purpose that is entirely well-defined independent of the
application. Therefore, Subsection 2d requires that any
application-supplied function or table used by this function must
be optional: if the application does not supply it, the square
root function must still compute square roots.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.
In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library. To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License. (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.) Do not make any other change in
these notices.
Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.
If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library". Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library". The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library. The
threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work. (Executables containing this object code plus portions of the
Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also compile or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License. You must supply a copy of this License. If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License. Also, you must do one
of these things:
a) Accompany the work with the complete corresponding
machine-readable source code for the Library including whatever
changes were used in the work (which must be distributed under
Sections 1 and 2 above); and, if the work is an executable linked
with the Library, with the complete machine-readable "work that
uses the Library", as object code and/or source code, so that the
user can modify the Library and then relink to produce a modified
executable containing the modified Library. (It is understood
that the user who changes the contents of definitions files in the
Library will not necessarily be able to recompile the application
to use the modified definitions.)
b) Accompany the work with a written offer, valid for at
least three years, to give the same user the materials
specified in Subsection 6a, above, for a charge no more
than the cost of performing this distribution.
c) If distribution of the work is made by offering access to copy
from a designated place, offer equivalent access to copy the above
specified materials from the same place.
d) Verify that the user has already received a copy of these
materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it. However, as a special exception,
the source code distributed need not include anything that is normally
distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.
It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system. Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.
7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work
based on the Library, uncombined with any other library
facilities. This must be distributed under the terms of the
Sections above.
b) Give prominent notice with the combined library of the fact
that part of it is a work based on the Library, and explaining
where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License. Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License. However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Library or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all. For example, if a patent
license would not permit royalty-free redistribution of the Library by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any
particular circumstance, the balance of the section is intended to apply,
and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License may add
an explicit geographical distribution limitation excluding those countries,
so that distribution is permitted only in or among countries not thus
excluded. In such case, this License incorporates the limitation as if
written in the body of this License.
13. The Free Software Foundation may publish revised and/or new
versions of the Library General Public License from time to time.
Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library
specifies a version number of this License which applies to it and
"any later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation. If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission. For software which is
copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this. Our
decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.
END OF TERMS AND CONDITIONS
Appendix: How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest
possible use to the public, we recommend making it free software that
everyone can redistribute and change. You can do so by permitting
redistribution under these terms (or, alternatively, under the terms of the
ordinary General Public License).
To apply these terms, attach the following notices to the library. It is
safest to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.
<one line to give the library's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the library, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
<signature of Ty Coon>, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!

View File

@@ -1,115 +1,44 @@
Fri Mar 1 10:09:46 1996 Roland McGrath <roland@charlie-brown.gnu.ai.mit.edu>
Tue Aug 12 10:52:34 1997 Paul D. Smith <psmith@baynetworks.com>
* posix/glob.c: Use canonical code from autoconf manual for dirent
include.
[_D_NAMLEN]: Redefine NAMLEN using this.
(glob_in_dir): Use NAMLEN macro.
* configure.in: Require autoconf 2.12.
Fri Jan 19 13:28:59 1996 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
* glob: Updates from latest GNU libc glob code.
* posix/glob.c (glob): Use prototype in getlogin decl.
* glob.c,glob.h,fnmatch.h: Change all WIN32 references to WINDOWS32.
Thu Jan 18 00:32:43 1996 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
* glob.h: OSF4 defines macros in such a way that GLOB_ALTDIRFUNC
is not defined. Added a test to the #if which defines it if
_GNU_SOURCE is defined; that's set by both glob.c and GNU make.
* posix/glob.c (_GNU_SOURCE): Define if undefined, so glob.h
defines GNU extensions.
* posix/fnmatch.c: Likewise.
* glob.c: SunOS4 w/ cc needs #include <stdio.h>, since assert.h
requires stderr but doesn't include stdio.h :-/.
(next_brace_sub): De-protoize function definition.
(glob): Cast __alloca(); on SunOS4 it uses the default return type
of int.
(glob): Irix defines getlogin_r() to return a char*; move the
extern for that into the _LIBC area since it isn't used except in
LIBC anyway. Likewise, move extern getlogin() into the "else".
Fri Jan 12 13:40:01 1996 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
Sat Jul 20 21:55:31 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* posix/glob.c (glob): Add parens in glob call flags arg for
GLOB_BRACE case.
Win32 hacks from <Rob_Tulloh@tivoli.com>.
* posix/glob.c [WIN32]: Don't include <pwd.h>; don't use d_ino;
use void * for my_realloc; include <malloc.h> for alloca.
(glob) [WIN32]: Use "c:/users/default" for ~ if no HOME variable.
* posix/fnmatch.h [WIN32]: Use prototypes even if [!__STDC__].
* posix/glob.h: Likewise.
Thu Dec 14 02:28:22 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
Fri Jul 19 16:56:41 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* posix/glob.c (glob_in_dir): Cast result of opendir to __ptr_t,
and cast STREAM to DIR * before passing to readdir and closedir.
* posix/glob.h [!_AMIGA && !VMS]: Check this instead of just [!_AMIGA]
for `struct stat;' forward decl.
Mon Dec 11 20:07:54 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
Sat Jun 22 10:44:09 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* posix/glob.c [! STDC_HEADERS]: Declare getenv.
(glob): Avoid using function as value.
* posix/glob.c: Include <alloca.h> only [HAVE_ALLOCA_H], not [sparc].
Fri Dec 8 13:04:51 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
Fri Jun 21 00:27:51 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* posix/glob.c: Implement new options GLOB_ALTDIRFUNC, GLOB_BRACE,
GLOB_TILDE, GLOB_NOMAGIC.
(glob): Use stat instead of lstat to determine directoriness.
* posix/glob.h (GLOB_ALTDIRFUNC, GLOB_BRACE, GLOB_NOMAGIC, GLOB_TILDE):
New flag bits.
(__GLOB_FLAGS): Include them.
(glob_t): New members gl_closedir, gl_readdir, gl_opendir, gl_lstat,
gl_stat.
Mon Sep 11 14:00:14 1995 Roland McGrath <roland@whiz-bang.gnu.ai.mit.edu>
* posix/glob.c (glob): Comment fix.
Wed Aug 30 16:44:55 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
* posix/glob.c (glob): Use realloc to extend strings for GLOB_MARK
slash.
(glob_in_dir): Don't allocate extra byte here.
Mon Aug 7 14:04:36 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
* posix/glob.c (glob_in_dir): Allocate GLOB_MARK byte in case when
(NFOUND == 0 && (FLAGS & GLOB_NOCHECK)).
Sat Apr 29 15:46:57 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
* posix/glob.c (S_ISDIR): Define if undefined.
Tue Apr 25 17:17:19 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
* posix/glob.c (glob): If GLOB_MARK set, stat names to find
directories and append slashes to them in final pass before
sorting.
(glob_in_dir): If GLOB_MARK set, just allocate the extra char for the
slash; never append it here.
Wed Mar 8 13:38:13 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
* posix/glob/configure.bat: Fixes from DJ.
Wed Feb 22 00:44:41 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
* posix/glob/configure.in: Put AC_ISC_POSIX before AC_CONST.
Sun Feb 5 17:59:53 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
* malloc/malloc.c (__malloc_extra_blocks): New variable.
(malloc): When getting more core, get __malloc_extra_blocks extra;
put the new block at the end of the free list and let the next loop
iteration use the initial portion of it.
* malloc/free.c (_free_internal): Account for twice
__malloc_extra_blocks in deciding if we have so much extra memory
we should return it to the system.
* malloc/malloc.h (__malloc_extra_blocks): Declare it.
* posix/glob.c (prefix_array, glob_pattern_p): Remove gratuitous
const in parameter decl.
Fri Jan 27 17:53:49 1995 Jim Meyering (meyering@comco.com)
* posix/fnmatch.c: Declare errno if it's not defined.
That's simpler than testing #if !defined(__GNU_LIBRARY__)
&& !defined(STDC_HEADERS).
Thu Jan 26 00:02:01 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
* io/ftw.c: Avoid `ret' as variable name.
* posix/glob.c: Likewise.
Wed Jan 25 00:45:56 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
* posix/glob/configure.in: Put AC_AIX and AC_MINIX early, before
any compile tests.
Mon Jan 16 15:49:07 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
* posix/glob/Makefile.in: Remove config.h and config.log.
Sun Jan 15 06:56:47 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
* posix/glob/configure.in: Add AC_CONST check.
* posix/fnmatch.c (fnmatch): Fix \*[*?]+ case to increment name ptr
only for ?s, not for *s. Fix from Chet Ramey.

10
glob/Makefile.am Normal file
View File

@@ -0,0 +1,10 @@
# -*-Makefile-*-, or close enough
AUTOMAKE_OPTIONS = 1.2 foreign
noinst_LIBRARIES = libglob.a
libglob_a_SOURCES = glob.c glob.h fnmatch.c fnmatch.h
EXTRA_DIST = COPYING.LIB Makefile.ami SCOPTIONS SMakefile \
configure.bat

View File

@@ -10,7 +10,7 @@
# This library 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
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Library General Public License for more details.
# You should have received a copy of the GNU Library General Public
@@ -19,46 +19,49 @@
# Cambridge, MA 02139, USA.
# Ultrix 2.2 make doesn't expand the value of VPATH.
VPATH = @srcdir@
VPATH = /glob/
# This must repeat the value, because configure will remove `VPATH = .'.
srcdir = @srcdir@
srcdir = /glob/
CC = @CC@
CPPFLAGS = @CPPFLAGS@
CFLAGS = @CFLAGS@
CC = sc
RM = delete
CPPFLAGS =
CFLAGS =
# Information determined by configure.
DEFS = @DEFS@
DEFS = Define HAVE_HEADER_STDC Define HAVE_UNISTD_H Define HAVE_STRING_H \
Define HAVE_DIRENT_H
# How to invoke ar.
AR = @AR@
ARFLAGS = rv
AR = join
ARFLAGS = as
# How to invoke ranlib.
RANLIB = @RANLIB@
RANLIB = ;
.PHONY: all
all: libglob.a
all: glob.lib
libglob.a: glob.o fnmatch.o
glob.lib : glob.o fnmatch.o
$(AR) $(ARFLAGS) $@ glob.o fnmatch.o
$(RANLIB) $@
# For some reason, Unix make wants the dependencies on the source files.
# Otherwise it refuses to use an implicit rule!
# And, get this: it doesn't work to use $(srcdir)/foo.c!!
glob.o: $(srcdir)/glob.h $(srcdir)/fnmatch.h glob.c
fnmatch.o: $(srcdir)/fnmatch.h fnmatch.c
# And, get this: it doesn't work to use $(srcdir)foo.c!!
glob.o: $(srcdir)glob.h $(srcdir)fnmatch.h glob.c
fnmatch.o: $(srcdir)fnmatch.h fnmatch.c
OUTPUT_OPTION =
.c.o:
$(CC) -I. -I$(srcdir) -c \
$(CC) IDir "" \
$(DEFS) $(CPPFLAGS) $(CFLAGS) $< $(OUTPUT_OPTION)
.PHONY: clean realclean glob-clean glob-realclean distclean
clean glob-clean:
-rm -f libglob.a *.o core
-$(RM) glob.lib "#?.o" core
distclean glob-realclean: clean
-rm -f TAGS tags Makefile config.status config.h config.log
-$(RM) TAGS tags Makefile config.status config.h config.log
realcean: distclean
# For inside the C library.

13
glob/SCOPTIONS Normal file
View File

@@ -0,0 +1,13 @@
ERRORREXX
OPTIMIZE
NOVERSION
OPTIMIZERTIME
OPTIMIZERALIAS
DEFINE INCLUDEDIR="include:"
DEFINE LIBDIR="lib:"
DEFINE NO_ALLOCA
DEFINE NO_FLOAT
DEFINE NO_ARCHIVES
IGNORE=161
IGNORE=100
STARTUP=cres

69
glob/SMakefile Normal file
View File

@@ -0,0 +1,69 @@
# Makefile for standalone distribution of libglob.a (fnmatch, glob).
# Copyright (C) 1991, 92, 93, 94, 95 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Library General Public License
# as published by the Free Software Foundation; either version 2 of
# the License, or (at your option) any later version.
# This library 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
# Library General Public License for more details.
# You should have received a copy of the GNU Library General Public
# License along with this library; see the file COPYING.LIB. If
# not, write to the Free Software Foundation, Inc., 675 Mass Ave,
# Cambridge, MA 02139, USA.
# Ultrix 2.2 make doesn't expand the value of VPATH.
VPATH = /glob/
# This must repeat the value, because configure will remove `VPATH = .'.
srcdir = /glob/
CC = sc
CPPFLAGS =
CFLAGS =
MAKE = smake
RM = delete
# Information determined by configure.
DEFS = Define HAVE_HEADER_STDC Define HAVE_UNISTD_H Define HAVE_STRING_H \
Define HAVE_DIRENT_H
# How to invoke ar.
AR = join
ARFLAGS = as
# How to invoke ranlib.
RANLIB = ;
.PHONY: all
all: glob.lib
glob.lib : glob.o fnmatch.o
$(AR) $(ARFLAGS) $@ glob.o fnmatch.o
$(RANLIB) $@
# For some reason, Unix make wants the dependencies on the source files.
# Otherwise it refuses to use an implicit rule!
# And, get this: it doesn't work to use $(srcdir)foo.c!!
glob.o: $(srcdir)glob.h $(srcdir)fnmatch.h glob.c
fnmatch.o: $(srcdir)fnmatch.h fnmatch.c
.c.o:
$(CC) IDir "" \
$(DEFS) $(CPPFLAGS) $(CFLAGS) $< $(OUTPUT_OPTION)
.PHONY: clean realclean glob-clean glob-realclean distclean
clean glob-clean:
-$(RM) -f glob.lib *.o core
distclean glob-realclean: clean
-$(RM) -f TAGS tags Makefile config.status config.h config.log
realcean: distclean
# For inside the C library.
glob.tar glob.tar.Z:
$(MAKE) -C .. $@

1664
glob/configure vendored

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
@echo off
echo Configuring glob for GO32
echo Configuring glob for DJGPP
rem This batch file assumes a unix-type "sed" program
echo # Makefile generated by "configure.bat"> Makefile

View File

@@ -1,6 +1,9 @@
dnl Process this file with autoconf to produce a configure script.
AC_INIT(fnmatch.c) dnl A distinctive file to look for in srcdir.
AC_PREREQ(2.1) dnl Minimum Autoconf version required.
AC_PREREQ(2.12) dnl Minimum Autoconf version required.
AM_INIT_AUTOMAKE(glob, 0.0, nodefs)
AC_PROG_CC
AC_CHECK_PROG(AR, ar, ar, ar)
AC_PROG_RANLIB

View File

@@ -1,27 +1,28 @@
/* Copyright (C) 1991, 1992, 1993, 1996 Free Software Foundation, Inc.
/* Copyright (C) 1991, 1992, 1993, 1996, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
This library 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
Library General Public License for more details.
This library 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
You should have received a copy of the GNU Library General Public
License along with this library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#ifdef HAVE_CONFIG_H
#include <config.h>
#if HAVE_CONFIG_H
# include <config.h>
#endif
/* Enable GNU extensions in fnmatch.h. */
#ifndef _GNU_SOURCE
#define _GNU_SOURCE 1
# define _GNU_SOURCE 1
#endif
#include <errno.h>
@@ -37,12 +38,21 @@ Cambridge, MA 02139, USA. */
program understand `configure --with-gnu-libc' and omit the object files,
it is simpler to just do this in the source for each such file. */
#if defined (_LIBC) || !defined (__GNU_LIBRARY__)
#if defined _LIBC || !defined __GNU_LIBRARY__
#ifndef errno
# if defined STDC_HEADERS || !defined isascii
# define ISASCII(c) 1
# else
# define ISASCII(c) isascii(c)
# endif
# define ISUPPER(c) (ISASCII (c) && isupper (c))
# ifndef errno
extern int errno;
#endif
# endif
/* Match STRING against the filename pattern PATTERN, returning zero if
it matches, nonzero if not. */
@@ -55,8 +65,8 @@ fnmatch (pattern, string, flags)
register const char *p = pattern, *n = string;
register char c;
/* Note that this evalutes C many times. */
#define FOLD(c) ((flags & FNM_CASEFOLD) && isupper (c) ? tolower (c) : (c))
/* Note that this evaluates C many times. */
# define FOLD(c) ((flags & FNM_CASEFOLD) && ISUPPER (c) ? tolower (c) : (c))
while ((c = *p++) != '\0')
{
@@ -78,6 +88,9 @@ fnmatch (pattern, string, flags)
if (!(flags & FNM_NOESCAPE))
{
c = *p++;
if (c == '\0')
/* Trailing \ loses. */
return FNM_NOMATCH;
c = FOLD (c);
}
if (FOLD (*n) != c)
@@ -89,10 +102,24 @@ fnmatch (pattern, string, flags)
(n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/')))
return FNM_NOMATCH;
for (c = *p++; c == '?' || c == '*'; c = *p++, ++n)
if (((flags & FNM_FILE_NAME) && *n == '/') ||
(c == '?' && *n == '\0'))
return FNM_NOMATCH;
for (c = *p++; c == '?' || c == '*'; c = *p++)
{
if ((flags & FNM_FILE_NAME) && *n == '/')
/* A slash does not match a wildcard under FNM_FILE_NAME. */
return FNM_NOMATCH;
else if (c == '?')
{
/* A ? needs to match one character. */
if (*n == '\0')
/* There isn't another character; no match. */
return FNM_NOMATCH;
else
/* One character of the string is consumed in matching
this ? wildcard, so *??? won't match if there are
less than three characters. */
++n;
}
}
if (c == '\0')
return 0;
@@ -129,7 +156,11 @@ fnmatch (pattern, string, flags)
register char cstart = c, cend = c;
if (!(flags & FNM_NOESCAPE) && c == '\\')
cstart = cend = *p++;
{
if (*p == '\0')
return FNM_NOMATCH;
cstart = cend = *p++;
}
cstart = cend = FOLD (cstart);
@@ -176,8 +207,12 @@ fnmatch (pattern, string, flags)
c = *p++;
if (!(flags & FNM_NOESCAPE) && c == '\\')
/* XXX 1003.2d11 is unclear if this is right. */
++p;
{
if (*p == '\0')
return FNM_NOMATCH;
/* XXX 1003.2d11 is unclear if this is right. */
++p;
}
}
if (not)
return FNM_NOMATCH;
@@ -200,6 +235,8 @@ fnmatch (pattern, string, flags)
return 0;
return FNM_NOMATCH;
# undef FOLD
}
#endif /* _LIBC or not __GNU_LIBRARY__. */

View File

@@ -1,29 +1,30 @@
/* Copyright (C) 1991, 1992, 1993 Free Software Foundation, Inc.
/* Copyright (C) 1991, 1992, 1993, 1996, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
This library 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
Library General Public License for more details.
The GNU C Library 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#ifndef _FNMATCH_H
#define _FNMATCH_H 1
#ifdef __cplusplus
extern "C" {
#endif
#if defined (__cplusplus) || (defined (__STDC__) && __STDC__)
#if (defined (__cplusplus) || (defined (__STDC__) && __STDC__) \
|| defined (WINDOWS32))
#undef __P
#define __P(protos) protos
#else /* Not C++ or ANSI C. */

View File

@@ -1,19 +1,19 @@
/* Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc.
/* Copyright (C) 1991, 92, 93, 94, 95, 96, 97 Free Software Foundation, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
This library 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
Library General Public License for more details.
This library 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
You should have received a copy of the GNU Library General Public
License along with this library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/* AIX requires this to be the first thing in the file. */
#if defined (_AIX) && !defined (__GNUC__)
@@ -33,6 +33,12 @@ Cambridge, MA 02139, USA. */
#include <sys/types.h>
#include <sys/stat.h>
/* Outcomment the following line for production quality code. */
/* #define NDEBUG 1 */
#include <assert.h>
#include <stdio.h> /* Needed on stupid SunOS for assert. */
/* Comment out all this code if we are using the GNU C Library, and are not
actually compiling the library itself. This code is part of the GNU C
@@ -52,11 +58,11 @@ Cambridge, MA 02139, USA. */
#ifndef ELIDE_CODE
#ifdef STDC_HEADERS
#if defined(STDC_HEADERS) || defined(__GNU_LIBRARY__)
#include <stddef.h>
#endif
#ifdef HAVE_UNISTD_H
#if defined HAVE_UNISTD_H || defined _LIBC
#include <unistd.h>
#ifndef POSIX
#ifdef _POSIX_VERSION
@@ -65,11 +71,16 @@ Cambridge, MA 02139, USA. */
#endif
#endif
#if !defined (_AMIGA) && !defined (VMS) && !defined(WINDOWS32)
#include <pwd.h>
#endif
#if !defined(__GNU_LIBRARY__) && !defined(STDC_HEADERS)
extern int errno;
#endif
#ifndef __set_errno
#define __set_errno(val) errno = (val)
#endif
#ifndef NULL
#define NULL 0
@@ -91,6 +102,9 @@ extern int errno;
# ifdef HAVE_NDIR_H
# include <ndir.h>
# endif
# ifdef HAVE_VMSDIR_H
# include "vmsdir.h"
# endif /* HAVE_VMSDIR_H */
#endif
@@ -101,7 +115,7 @@ extern int errno;
#endif
#if defined (POSIX) && !defined (__GNU_LIBRARY__)
#if (defined (POSIX) || defined (WINDOWS32)) && !defined (__GNU_LIBRARY__)
/* Posix does not require that the d_ino field be present, and some
systems do not provide it. */
#define REAL_DIR_ENTRY(dp) 1
@@ -151,7 +165,7 @@ extern void bcopy ();
((void) ((better_be_zero) == 0 ? (bzero((s), (n)), 0) : (abort(), 0)))
#endif /* Not ANSI_STRING. */
#ifndef HAVE_STRCOLL
#if !defined HAVE_STRCOLL && !defined _LIBC
#define strcoll strcmp
#endif
@@ -160,7 +174,12 @@ extern void bcopy ();
#ifdef __GNUC__
__inline
#endif
#ifndef __SASC
#ifdef WINDOWS32
static void *
#else
static char *
#endif
my_realloc (p, n)
char *p;
unsigned int n;
@@ -172,7 +191,8 @@ my_realloc (p, n)
return (char *) realloc (p, n);
}
#define realloc my_realloc
#endif
#endif /* __SASC */
#endif /* __GNU_LIBRARY__ */
#if !defined(__alloca) && !defined(__GNU_LIBRARY__)
@@ -181,11 +201,15 @@ my_realloc (p, n)
#undef alloca
#define alloca(n) __builtin_alloca (n)
#else /* Not GCC. */
#if defined (sparc) || defined (HAVE_ALLOCA_H)
#ifdef HAVE_ALLOCA_H
#include <alloca.h>
#else /* Not sparc or HAVE_ALLOCA_H. */
#else /* Not HAVE_ALLOCA_H. */
#ifndef _AIX
#ifdef WINDOWS32
#include <malloc.h>
#else
extern char *alloca ();
#endif /* WINDOWS32 */
#endif /* Not _AIX. */
#endif /* sparc or HAVE_ALLOCA_H. */
#endif /* GCC. */
@@ -204,7 +228,7 @@ extern char *alloca ();
#endif
#endif
#ifndef STDC_HEADERS
#if !(defined (STDC_HEADERS) || defined (__GNU_LIBRARY__))
#undef size_t
#define size_t unsigned int
#endif
@@ -228,7 +252,6 @@ extern char *alloca ();
#undef GLOB_PERIOD
#include <glob.h>
static int glob_pattern_p __P ((const char *pattern, int quote));
static int glob_in_dir __P ((const char *pattern, const char *directory,
int flags,
int (*errfunc) __P ((const char *, int)),
@@ -236,12 +259,58 @@ static int glob_in_dir __P ((const char *pattern, const char *directory,
static int prefix_array __P ((const char *prefix, char **array, size_t n));
static int collated_compare __P ((const __ptr_t, const __ptr_t));
/* Find the end of the sub-pattern in a brace expression. We define
this as an inline function if the compiler permits. */
static
#if __GNUC__ - 0 >= 2
inline
#endif
const char *
next_brace_sub (begin)
const char *begin;
{
unsigned int depth = 0;
const char *cp = begin;
while (1)
{
if (depth == 0)
{
if (*cp != ',' && *cp != '}' && *cp != '\0')
{
if (*cp == '{')
++depth;
++cp;
continue;
}
}
else
{
while (*cp != '\0' && (*cp != '}' || depth > 0))
{
if (*cp == '}')
--depth;
++cp;
}
if (*cp == '\0')
/* An incorrectly terminated brace expression. */
return NULL;
continue;
}
break;
}
return cp;
}
/* Do glob searching for PATTERN, placing results in PGLOB.
The bits defined above may be set in FLAGS.
If a directory cannot be opened or read and ERRFUNC is not nil,
it is called with the pathname that caused the error, and the
`errno' value from the failing call; if it returns non-zero
`glob' returns GLOB_ABEND; if it returns zero, the error is ignored.
`glob' returns GLOB_ABORTED; if it returns zero, the error is ignored.
If memory cannot be allocated for PGLOB, GLOB_NOSPACE is returned.
Otherwise, `glob' returns zero. */
int
@@ -259,7 +328,7 @@ glob (pattern, flags, errfunc, pglob)
if (pattern == NULL || pglob == NULL || (flags & ~__GLOB_FLAGS) != 0)
{
errno = EINVAL;
__set_errno (EINVAL);
return -1;
}
@@ -268,48 +337,117 @@ glob (pattern, flags, errfunc, pglob)
const char *begin = strchr (pattern, '{');
if (begin != NULL)
{
const char *end = strchr (begin + 1, '}');
if (end != NULL && end != begin + 1)
/* Allocate working buffer large enough for our work. Note that
we have at least an opening and closing brace. */
int firstc;
char *alt_start;
const char *p;
const char *next;
const char *rest;
size_t rest_len;
#ifdef __GNUC__
char onealt[strlen (pattern) - 1];
#else
char *onealt = (char *) malloc (strlen (pattern) - 1);
if (onealt == NULL)
{
size_t restlen = strlen (end + 1) + 1;
const char *p, *comma;
char *buf;
size_t bufsz = 0;
int firstc;
if (!(flags & GLOB_APPEND))
{
pglob->gl_pathc = 0;
pglob->gl_pathv = NULL;
}
firstc = pglob->gl_pathc;
for (p = begin + 1;; p = comma + 1)
{
int result;
comma = strchr (p, ',');
if (comma == NULL)
comma = strchr (p, '\0');
if ((begin - pattern) + (comma - p) + 1 > bufsz)
{
if (bufsz * 2 < comma - p + 1)
bufsz *= 2;
else
bufsz = comma - p + 1;
buf = __alloca (bufsz);
}
memcpy (buf, pattern, begin - pattern);
memcpy (buf + (begin - pattern), p, comma - p);
memcpy (buf + (begin - pattern) + (comma - p), end, restlen);
result = glob (buf, ((flags & ~(GLOB_NOCHECK|GLOB_NOMAGIC)) |
GLOB_APPEND), errfunc, pglob);
if (result && result != GLOB_NOMATCH)
return result;
if (*comma == '\0')
break;
}
if (pglob->gl_pathc == firstc &&
!(flags & (GLOB_NOCHECK|GLOB_NOMAGIC)))
return GLOB_NOMATCH;
globfree (pglob);
return GLOB_NOSPACE;
}
#endif
/* We know the prefix for all sub-patterns. */
memcpy (onealt, pattern, begin - pattern);
alt_start = &onealt[begin - pattern];
/* Find the first sub-pattern and at the same time find the
rest after the closing brace. */
next = next_brace_sub (begin + 1);
if (next == NULL)
{
/* It is an illegal expression. */
#ifndef __GNUC__
free (onealt);
#endif
return glob (pattern, flags & ~GLOB_BRACE, errfunc, pglob);
}
/* Now find the end of the whole brace expression. */
rest = next;
while (*rest != '}')
{
rest = next_brace_sub (rest + 1);
if (rest == NULL)
{
/* It is an illegal expression. */
#ifndef __GNUC__
free (onealt);
#endif
return glob (pattern, flags & ~GLOB_BRACE, errfunc, pglob);
}
}
/* Please note that we now can be sure the brace expression
is well-formed. */
rest_len = strlen (++rest) + 1;
/* We have a brace expression. BEGIN points to the opening {,
NEXT points past the terminator of the first element, and END
points past the final }. We will accumulate result names from
recursive runs for each brace alternative in the buffer using
GLOB_APPEND. */
if (!(flags & GLOB_APPEND))
{
/* This call is to set a new vector, so clear out the
vector so we can append to it. */
pglob->gl_pathc = 0;
pglob->gl_pathv = NULL;
}
firstc = pglob->gl_pathc;
p = begin + 1;
while (1)
{
int result;
/* Construct the new glob expression. */
memcpy (alt_start, p, next - p);
memcpy (&alt_start[next - p], rest, rest_len);
result = glob (onealt,
((flags & ~(GLOB_NOCHECK|GLOB_NOMAGIC))
| GLOB_APPEND), errfunc, pglob);
/* If we got an error, return it. */
if (result && result != GLOB_NOMATCH)
{
#ifndef __GNUC__
free (onealt);
#endif
if (!(flags & GLOB_APPEND))
globfree (pglob);
return result;
}
if (*next == '}')
/* We saw the last entry. */
break;
p = next + 1;
next = next_brace_sub (p);
assert (next != NULL);
}
#ifndef __GNUC__
free (onealt);
#endif
if (pglob->gl_pathc != firstc)
/* We found some entries. */
return 0;
else if (!(flags & (GLOB_NOCHECK|GLOB_NOMAGIC)))
return GLOB_NOMATCH;
}
}
@@ -318,7 +456,11 @@ glob (pattern, flags, errfunc, pglob)
if (filename == NULL)
{
filename = pattern;
#ifdef _AMIGA
dirname = (char *) "";
#else
dirname = (char *) ".";
#endif
dirlen = 0;
}
else if (filename == pattern)
@@ -354,36 +496,130 @@ glob (pattern, flags, errfunc, pglob)
oldcount = pglob->gl_pathc;
#ifndef VMS
if ((flags & GLOB_TILDE) && dirname[0] == '~')
{
if (dirname[1] == '\0')
if (dirname[1] == '\0' || dirname[1] == '/')
{
/* Look up home directory. */
dirname = getenv ("HOME");
if (dirname == NULL || dirname[0] == '\0')
char *home_dir = getenv ("HOME");
#ifdef _AMIGA
if (home_dir == NULL || home_dir[0] == '\0')
home_dir = "SYS:";
#else
#ifdef WINDOWS32
if (home_dir == NULL || home_dir[0] == '\0')
home_dir = "c:/users/default"; /* poor default */
#else
if (home_dir == NULL || home_dir[0] == '\0')
{
int success;
#if defined HAVE_GETLOGIN_R || defined _LIBC
extern int getlogin_r __P ((char *, size_t));
size_t buflen = sysconf (_SC_LOGIN_NAME_MAX) + 1;
char *name;
if (buflen == 0)
/* `sysconf' does not support _SC_LOGIN_NAME_MAX. Try
a moderate value. */
buflen = 16;
name = (char *) __alloca (buflen);
success = getlogin_r (name, buflen) >= 0;
#else
extern char *getlogin __P ((void));
char *name = getlogin ();
if (name != NULL)
char *name;
success = (name = getlogin ()) != NULL;
#endif
if (success)
{
#if defined HAVE_GETPWNAM_R || defined _LIBC
size_t pwbuflen = sysconf (_SC_GETPW_R_SIZE_MAX);
char *pwtmpbuf;
struct passwd pwbuf, *p;
pwtmpbuf = (char *) __alloca (pwbuflen);
success = (__getpwnam_r (name, &pwbuf, pwtmpbuf,
pwbuflen, &p) >= 0);
#else
struct passwd *p = getpwnam (name);
if (p != NULL)
dirname = p->pw_dir;
success = p != NULL;
#endif
if (success)
home_dir = p->pw_dir;
}
}
if (dirname == NULL || dirname[0] == '\0')
dirname = (char *) "~"; /* No luck. */
if (home_dir == NULL || home_dir[0] == '\0')
home_dir = (char *) "~"; /* No luck. */
#endif /* WINDOWS32 */
#endif
/* Now construct the full directory. */
if (dirname[1] == '\0')
dirname = home_dir;
else
{
char *newp;
size_t home_len = strlen (home_dir);
newp = (char *) __alloca (home_len + dirlen);
memcpy (newp, home_dir, home_len);
memcpy (&newp[home_len], &dirname[1], dirlen);
dirname = newp;
}
}
#if !defined _AMIGA && !defined WINDOWS32
else
{
/* Look up specific user's home directory. */
struct passwd *p = getpwnam (dirname + 1);
if (p != NULL)
dirname = p->pw_dir;
}
}
char *end_name = strchr (dirname, '/');
char *user_name;
char *home_dir;
if (glob_pattern_p (dirname, !(flags & GLOB_NOESCAPE)))
if (end_name == NULL)
user_name = dirname + 1;
else
{
user_name = (char *) __alloca (end_name - dirname);
memcpy (user_name, dirname + 1, end_name - dirname);
user_name[end_name - dirname - 1] = '\0';
}
/* Look up specific user's home directory. */
{
#if defined HAVE_GETPWNAM_R || defined _LIBC
size_t buflen = sysconf (_SC_GETPW_R_SIZE_MAX);
char *pwtmpbuf = (char *) __alloca (buflen);
struct passwd pwbuf, *p;
if (__getpwnam_r (user_name, &pwbuf, pwtmpbuf, buflen, &p) >= 0)
home_dir = p->pw_dir;
else
home_dir = NULL;
#else
struct passwd *p = getpwnam (user_name);
if (p != NULL)
home_dir = p->pw_dir;
else
home_dir = NULL;
#endif
}
/* If we found a home directory use this. */
if (home_dir != NULL)
{
char *newp;
size_t home_len = strlen (home_dir);
size_t rest_len = end_name == NULL ? 0 : strlen (end_name);
newp = (char *) __alloca (home_len + rest_len + 1);
memcpy (newp, home_dir, home_len);
memcpy (&newp[home_len], end_name, rest_len);
newp[home_len + rest_len] = '\0';
dirname = newp;
}
}
#endif /* Not Amiga && not WINDOWS32. */
}
#endif /* Not VMS. */
if (__glob_pattern_p (dirname, !(flags & GLOB_NOESCAPE)))
{
/* The directory name contains metacharacters, so we
have to glob for the directory, and then glob for
@@ -414,7 +650,7 @@ glob (pattern, flags, errfunc, pglob)
{
globfree (&dirs);
globfree (&files);
return GLOB_ABEND;
return GLOB_ABORTED;
}
}
#endif /* SHELL. */
@@ -610,8 +846,8 @@ prefix_array (dirname, array, n)
/* Return nonzero if PATTERN contains any metacharacters.
Metacharacters can be quoted with backslashes if QUOTE is nonzero. */
static int
glob_pattern_p (pattern, quote)
int
__glob_pattern_p (pattern, quote)
const char *pattern;
int quote;
{
@@ -626,7 +862,7 @@ glob_pattern_p (pattern, quote)
return 1;
case '\\':
if (quote)
if (quote && p[1] != '\0')
++p;
break;
@@ -642,6 +878,9 @@ glob_pattern_p (pattern, quote)
return 0;
}
#ifdef _LIBC
weak_alias (__glob_pattern_p, glob_pattern_p)
#endif
/* Like `glob', but PATTERN is a final pathname component,
@@ -666,7 +905,7 @@ glob_in_dir (pattern, directory, flags, errfunc, pglob)
struct globlink *names = NULL;
size_t nfound = 0;
if (!glob_pattern_p (pattern, !(flags & GLOB_NOESCAPE)))
if (!__glob_pattern_p (pattern, !(flags & GLOB_NOESCAPE)))
{
stream = NULL;
flags |= GLOB_NOCHECK;
@@ -682,7 +921,7 @@ glob_in_dir (pattern, directory, flags, errfunc, pglob)
{
if ((errfunc != NULL && (*errfunc) (directory, errno)) ||
(flags & GLOB_ERR))
return GLOB_ABEND;
return GLOB_ABORTED;
}
else
while (1)
@@ -701,7 +940,11 @@ glob_in_dir (pattern, directory, flags, errfunc, pglob)
if (fnmatch (pattern, name,
(!(flags & GLOB_PERIOD) ? FNM_PERIOD : 0) |
((flags & GLOB_NOESCAPE) ? FNM_NOESCAPE : 0)) == 0)
((flags & GLOB_NOESCAPE) ? FNM_NOESCAPE : 0)
#ifdef _AMIGA
| FNM_CASEFOLD
#endif
) == 0)
{
struct globlink *new
= (struct globlink *) __alloca (sizeof (struct globlink));
@@ -720,7 +963,7 @@ glob_in_dir (pattern, directory, flags, errfunc, pglob)
}
if (nfound == 0 && (flags & GLOB_NOMAGIC) &&
! glob_pattern_p (pattern, !(flags & GLOB_NOESCAPE)))
! __glob_pattern_p (pattern, !(flags & GLOB_NOESCAPE)))
flags |= GLOB_NOCHECK;
if (nfound == 0 && (flags & GLOB_NOCHECK))
@@ -762,7 +1005,7 @@ glob_in_dir (pattern, directory, flags, errfunc, pglob)
(*pglob->gl_closedir) (stream);
else
closedir ((DIR *) stream);
errno = save;
__set_errno (save);
}
return nfound == 0 ? GLOB_NOMATCH : 0;
@@ -773,7 +1016,7 @@ glob_in_dir (pattern, directory, flags, errfunc, pglob)
(*pglob->gl_closedir) (stream);
else
closedir ((DIR *) stream);
errno = save;
__set_errno (save);
}
while (names != NULL)
{
@@ -785,4 +1028,3 @@ glob_in_dir (pattern, directory, flags, errfunc, pglob)
}
#endif /* Not ELIDE_CODE. */

View File

@@ -1,22 +1,21 @@
/* Copyright (C) 1991, 1992, 1995 Free Software Foundation, Inc.
/* Copyright (C) 1991, 1992, 1995, 1996, 1997 Free Software Foundation, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
This library 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
Library General Public License for more details.
The GNU C Library 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#ifndef _GLOB_H
#define _GLOB_H 1
#ifdef __cplusplus
@@ -25,16 +24,21 @@ extern "C"
#endif
#undef __ptr_t
#if defined (__cplusplus) || (defined (__STDC__) && __STDC__)
#undef __P
#define __P(protos) protos
#define __ptr_t void *
#if (defined __cplusplus || (defined __STDC__ && __STDC__) \
|| defined WINDOWS32)
# undef __P
# define __P(protos) protos
# define __ptr_t void *
# if !defined __GNUC__ || __GNUC__ < 2
# undef __const
# define __const const
# endif
#else /* Not C++ or ANSI C. */
#undef __P
#define __P(protos) ()
#undef const
#define const
#define __ptr_t char *
# undef __P
# define __P(protos) ()
# undef __const
# define __const
# define __ptr_t char *
#endif /* C++ or ANSI C. */
/* Bits set in the FLAGS argument to `glob'. */
@@ -46,26 +50,39 @@ extern "C"
#define GLOB_APPEND (1 << 5)/* Append to results of a previous call. */
#define GLOB_NOESCAPE (1 << 6)/* Backslashes don't quote metacharacters. */
#define GLOB_PERIOD (1 << 7)/* Leading `.' can be matched by metachars. */
#define __GLOB_FLAGS (GLOB_ERR|GLOB_MARK|GLOB_NOSORT|GLOB_DOOFFS| \
#if (!defined _POSIX_C_SOURCE || _POSIX_C_SOURCE < 2 || defined _BSD_SOURCE \
|| defined _GNU_SOURCE)
# define GLOB_MAGCHAR (1 << 8)/* Set in gl_flags if any metachars seen. */
# define GLOB_ALTDIRFUNC (1 << 9)/* Use gl_opendir et al functions. */
# define GLOB_BRACE (1 << 10)/* Expand "{a,b}" to "a" "b". */
# define GLOB_NOMAGIC (1 << 11)/* If no magic chars, return the pattern. */
# define GLOB_TILDE (1 <<12)/* Expand ~user and ~ to home directories. */
# define __GLOB_FLAGS (GLOB_ERR|GLOB_MARK|GLOB_NOSORT|GLOB_DOOFFS| \
GLOB_NOESCAPE|GLOB_NOCHECK|GLOB_APPEND| \
GLOB_PERIOD|GLOB_ALTDIRFUNC|GLOB_BRACE| \
GLOB_NOMAGIC|GLOB_TILDE)
#if !defined (_POSIX_C_SOURCE) || _POSIX_C_SOURCE < 2 || defined (_BSD_SOURCE)
#define GLOB_MAGCHAR (1 << 8)/* Set in gl_flags if any metachars seen. */
#define GLOB_ALTDIRFUNC (1 << 9)/* Use gl_opendir et al functions. */
#define GLOB_BRACE (1 << 10)/* Expand "{a,b}" to "a" "b". */
#define GLOB_NOMAGIC (1 << 11)/* If no magic chars, return the pattern. */
#define GLOB_TILDE (1 <<12)/* Expand ~user and ~ to home directories. */
#else
# define __GLOB_FLAGS (GLOB_ERR|GLOB_MARK|GLOB_NOSORT|GLOB_DOOFFS| \
GLOB_NOESCAPE|GLOB_NOCHECK|GLOB_APPEND| \
GLOB_PERIOD)
#endif
/* Error returns from `glob'. */
#define GLOB_NOSPACE 1 /* Ran out of memory. */
#define GLOB_ABEND 2 /* Read error. */
#define GLOB_ABORTED 2 /* Read error. */
#define GLOB_NOMATCH 3 /* No matches found. */
#ifdef _GNU_SOURCE
/* Previous versions of this file defined GLOB_ABEND instead of
GLOB_ABORTED. Provide a compatibility definition here. */
# define GLOB_ABEND GLOB_ABORTED
#endif
/* Structure describing a globbing run. */
#if !defined _AMIGA && !defined VMS /* Buggy compiler. */
struct stat;
#endif
typedef struct
{
int gl_pathc; /* Count of paths matched by the pattern. */
@@ -77,9 +94,9 @@ typedef struct
are used instead of the normal file access functions. */
void (*gl_closedir) __P ((void *));
struct dirent *(*gl_readdir) __P ((void *));
__ptr_t (*gl_opendir) __P ((const char *));
int (*gl_lstat) __P ((const char *, struct stat *));
int (*gl_stat) __P ((const char *, struct stat *));
__ptr_t (*gl_opendir) __P ((__const char *));
int (*gl_lstat) __P ((__const char *, struct stat *));
int (*gl_stat) __P ((__const char *, struct stat *));
} glob_t;
/* Do glob searching for PATTERN, placing results in PGLOB.
@@ -90,19 +107,22 @@ typedef struct
`glob' returns GLOB_ABEND; if it returns zero, the error is ignored.
If memory cannot be allocated for PGLOB, GLOB_NOSPACE is returned.
Otherwise, `glob' returns zero. */
extern int glob __P ((const char *__pattern, int __flags,
int (*__errfunc) __P ((const char *, int)),
extern int glob __P ((__const char *__pattern, int __flags,
int (*__errfunc) __P ((__const char *, int)),
glob_t *__pglob));
/* Free storage allocated in PGLOB by a previous `glob' call. */
extern void globfree __P ((glob_t *__pglob));
#if !defined (_POSIX_C_SOURCE) || _POSIX_C_SOURCE < 2 || defined (_GNU_SOURCE)
/* If they are not NULL, `glob' uses these functions to read directories. */
extern __ptr_t (*__glob_opendir_hook) __P ((const char *__directory));
extern const char *(*__glob_readdir_hook) __P ((__ptr_t __stream));
extern void (*__glob_closedir_hook) __P ((__ptr_t __stream));
#ifdef _GNU_SOURCE
/* Return nonzero if PATTERN contains any metacharacters.
Metacharacters can be quoted with backslashes if QUOTE is nonzero.
This function is not part of the interface specified by POSIX.2
but several programs want to use it. */
extern int __glob_pattern_p __P ((__const char *__pattern, int __quote));
extern int glob_pattern_p __P ((__const char *__pattern, int __quote));
#endif
#ifdef __cplusplus

View File

@@ -349,9 +349,9 @@ 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 this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
@end smallexample
Also add information on how to contact you by electronic and paper mail.

View File

@@ -1,5 +1,5 @@
/* Implicit rule searching for GNU Make.
Copyright (C) 1988, 89, 90, 91, 92, 93, 94 Free Software Foundation, Inc.
Copyright (C) 1988,89,90,91,92,93,94,97 Free Software Foundation, Inc.
This file is part of GNU Make.
GNU Make is free software; you can redistribute it and/or modify
@@ -19,9 +19,10 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "make.h"
#include "rule.h"
#include "dep.h"
#include "file.h"
#include "filedef.h"
static int pattern_search ();
static int pattern_search PARAMS ((struct file *file, int archive, unsigned int depth,
unsigned int recursions));
/* For a FILE which has no commands specified, try to figure out some
from the implicit pattern rules.
@@ -151,7 +152,7 @@ pattern_search (file, archive, depth, recursions)
register struct rule *rule;
register struct dep *dep;
char *p;
char *p, *vp;
#ifndef NO_ARCHIVES
if (archive || ar_name (filename))
@@ -162,7 +163,22 @@ pattern_search (file, archive, depth, recursions)
/* Set LASTSLASH to point at the last slash in FILENAME
but not counting any slash at the end. (foo/bar/ counts as
bar/ in directory foo/, not empty in directory foo/bar/.) */
#ifdef VMS
lastslash = rindex (filename, ']');
#else
lastslash = rindex (filename, '/');
#ifdef __MSDOS__
/* Handle backslashes (possibly mixed with forward slashes)
and the case of "d:file". */
{
char *bslash = rindex (filename, '\\');
if (lastslash == 0 || bslash > lastslash)
lastslash = bslash;
if (lastslash == 0 && filename[0] && filename[1] == ':')
lastslash = filename + 1;
}
#endif
#endif
if (lastslash != 0 && lastslash[1] == '\0')
lastslash = 0;
}
@@ -210,7 +226,11 @@ pattern_search (file, archive, depth, recursions)
/* Set CHECK_LASTSLASH if FILENAME contains a directory
prefix and the target pattern does not contain a slash. */
#ifdef VMS
check_lastslash = lastslash != 0 && index (target, ']') == 0;
#else
check_lastslash = lastslash != 0 && index (target, '/') == 0;
#endif
if (check_lastslash)
{
/* In that case, don't include the
@@ -379,10 +399,12 @@ pattern_search (file, archive, depth, recursions)
}
/* This code, given FILENAME = "lib/foo.o", dependency name
"lib/foo.c", and VPATH=src, searches for "src/lib/foo.c". */
if (vpath_search (&p, (time_t *) 0))
vp = p;
if (vpath_search (&vp, (time_t *) 0))
{
DEBUGP2 ("Found dependency as `%s'.%s\n", p, "");
found_files[deps_found++] = p;
DEBUGP2 ("Found dependency `%s' as VPATH `%s'\n", p, vp);
strcpy(vp, p);
found_files[deps_found++] = vp;
continue;
}
@@ -545,7 +567,7 @@ pattern_search (file, archive, depth, recursions)
dep->next = file->deps;
file->deps = dep;
}
if (!checked_lastslash[foundrule])
/* Always allocate new storage, since STEM might be
on the stack for an intermediate file. */

1049
job.c

File diff suppressed because it is too large Load Diff

34
job.h
View File

@@ -1,5 +1,5 @@
/* Definitions for managing subprocesses in GNU Make.
Copyright (C) 1992, 1993 Free Software Foundation, Inc.
Copyright (C) 1992, 1993, 1996 Free Software Foundation, Inc.
This file is part of GNU Make.
GNU Make is free software; you can redistribute it and/or modify
@@ -16,6 +16,9 @@ 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, 675 Mass Ave, Cambridge, MA 02139, USA. */
#ifndef SEEN_JOB_H
#define SEEN_JOB_H
/* Structure describing a running or dead child process. */
struct child
@@ -31,6 +34,10 @@ struct child
char *command_ptr; /* Ptr into command_lines[command_line]. */
pid_t pid; /* Child process's ID number. */
#ifdef VMS
int efn; /* Completion event flag number */
int cstatus; /* Completion status */
#endif
unsigned int remote:1; /* Nonzero if executing remotely. */
unsigned int noerror:1; /* Nonzero if commands contained a `-'. */
@@ -41,18 +48,27 @@ struct child
extern struct child *children;
extern void new_job ();
extern void reap_children ();
extern void start_waiting_jobs ();
extern void new_job PARAMS ((struct file *file));
extern void reap_children PARAMS ((int block, int err));
extern void start_waiting_jobs PARAMS ((void));
extern char **construct_command_argv ();
extern void child_execute_job ();
extern void exec_command ();
extern char **construct_command_argv PARAMS ((char *line, char **restp, struct file *file));
#ifdef VMS
extern int child_execute_job PARAMS ((char *argv, struct child *child));
#else
extern void child_execute_job PARAMS ((int stdin_fd, int stdout_fd, char **argv, char **envp));
#endif
#ifdef _AMIGA
extern void exec_command PARAMS ((char **argv));
#else
extern void exec_command PARAMS ((char **argv, char **envp));
#endif
extern unsigned int job_slots_used;
extern void block_sigs PARAMS ((void));
#ifdef POSIX
extern void unblock_sigs ();
extern void unblock_sigs PARAMS ((void));
#else
#ifdef HAVE_SIGSETMASK
extern int fatal_signal_mask;
@@ -61,3 +77,5 @@ extern int fatal_signal_mask;
#define unblock_sigs()
#endif
#endif
#endif /* SEEN_JOB_H */

682
main.c

File diff suppressed because it is too large Load Diff

58
maintMakefile Normal file
View File

@@ -0,0 +1,58 @@
# Maintainer-only makefile segment. This contains things that are relevant
# only if you have the full copy of the GNU make sources, not a dist copy.
#
# Find the glob source files... this might be dangerous, but we're maintainers!
#
globsrc := $(wildcard glob/*.c)
globhdr := $(wildcard glob/*.h)
TEMPLATES = README config.ami configh.dos config.h.W32 config.h-vms
# General rule for turning a .template into a regular file.
#
$(TEMPLATES) : % : %.template configure.in
rm -f $@
sed -e 's@%VERSION%@$(VERSION)@' \
-e 's@%PACKAGE%@$(PACKAGE)@' \
$< > $@
chmod a-w $@
# Construct Makefile.DOS
#
Makefile.DOS: Makefile.DOS.template Makefile.am configure.in
rm -f $@
sed -e 's@%VERSION%@$(VERSION)@' \
-e 's@%PROGRAMS%@$(bin_PROGRAMS)@' \
-e 's@%SOURCES%@$(filter-out remote-%,$(make_SOURCES)) remote-$$(REMOTE).c@' \
-e 's@%OBJECTS%@$(filter-out remote-%,$(make_OBJECTS)) remote-$$(REMOTE).o@' \
-e 's@%GLOB_SOURCES%@$(globsrc) $(globhdr)@' \
-e 's@%GLOB_OBJECTS%@$(globsrc:glob/%.c=%.o)@' \
$< > $@
chmod a-w $@
# Construct build.sh.in
#
build.sh.in: build.template Makefile.am
rm -f $@
sed -e 's@%objs%@$(filter-out remote-%, $(make_OBJECTS)\
$(patsubst %.c,%.o,$(globsrc)))@' \
$< > $@
chmod a-w+x $@
# We clean everything here. The GNU standards for makefile conventions say
# you shouldn't remove configure, etc., but this makefile is only available
# in a full development distribution, so they'll only be removed then.
#
MAINTAINERCLEANFILES = $(TEMPLATES) Makefile.DOS build.sh.in \
configure Makefile.in stamp-h.in
# Put the alpha distribution files up for anonymous FTP.
#
ALPHA := ~ftp/gnu
TARFILE := $(distdir).tar.gz
.PHONY: alpha
alpha: $(ALPHA) $(TARFILE)
@rm -f $(ALPHA)/$(TARFILE)
cp -p $(TARFILE) $(ALPHA)

View File

@@ -28,6 +28,8 @@ describes conventions for writing the Makefiles for GNU programs.
* Command Variables:: Variables for Specifying Commands
* Directory Variables:: Variables for Installation Directories
* Standard Targets:: Standard Targets for Users
* Install Command Categories:: Three categories of commands in the `install'
rule: normal, pre-install and post-install.
@end menu
@node Makefile Basics
@@ -63,11 +65,12 @@ you need to run programs that are a part of your package during the
make, please make sure that it uses @file{./} if the program is built as
part of the make or @file{$(srcdir)/} if the file is an unchanging part
of the source code. Without one of these prefixes, the current search
path is used.
path is used.
The distinction between @file{./} and @file{$(srcdir)/} is important
when using the @samp{--srcdir} option to @file{configure}. A rule of
the form:
The distinction between @file{./} (the @dfn{build directory}) and
@file{$(srcdir)/} (the @dfn{source directory}) is important because
users can build in a separate directory using the @samp{--srcdir} option
to @file{configure}. A rule of the form:
@smallexample
foo.1 : foo.man sedscript
@@ -75,9 +78,8 @@ foo.1 : foo.man sedscript
@end smallexample
@noindent
will fail when the current directory is not the source directory,
because @file{foo.man} and @file{sedscript} are not in the current
directory.
will fail when the build directory is not the source directory, because
@file{foo.man} and @file{sedscript} are in the the source directory.
When using GNU @code{make}, relying on @samp{VPATH} to find the source
file will work in the case where there is a single dependency file,
@@ -109,6 +111,18 @@ foo.1 : foo.man sedscript
sed -e $(srcdir)/sedscript $(srcdir)/foo.man > $@@
@end smallexample
GNU distributions usually contain some files which are not source
files---for example, Info files, and the output from Autoconf, Automake,
Bison or Flex. Since these files normally appear in the source
directory, they should always appear in the source directory, not in the
build directory. So Makefile rules to update them should put the
updated files in the source directory.
However, if a file does not appear in the distribution, then the
Makefile should not put it in the source directory, because building a
program in ordinary circumstances should not modify the source directory
in any way.
Try to make the build and installation targets, at least (and all their
subtargets) work correctly with a parallel @code{make}.
@@ -122,41 +136,57 @@ special features of @code{ksh} or @code{bash}.
The @code{configure} script and the Makefile rules for building and
installation should not use any utilities directly except these:
@c dd find
@c gunzip gzip md5sum
@c mkfifo mknod tee uname
@example
cat cmp cp echo egrep expr false grep
ln mkdir mv pwd rm rmdir sed test touch true
cat cmp cp diff echo egrep expr false grep install-info
ln ls mkdir mv pwd rm rmdir sed sleep sort tar test touch true
@end example
The compression program @code{gzip} can be used in the @code{dist} rule.
Stick to the generally supported options for these programs. For
example, don't use @samp{mkdir -p}, convenient as it may be, because
most systems don't support it.
It is a good idea to avoid creating symbolic links in makefiles, since a
few systems don't support them.
The Makefile rules for building and installation can also use compilers
and related programs, but should do so via @code{make} variables so that the
user can substitute alternatives. Here are some of the programs we
mean:
@example
ar bison cc flex install ld lex
ar bison cc flex install ld ldconfig lex
make makeinfo ranlib texi2dvi yacc
@end example
Use the following @code{make} variables:
Use the following @code{make} variables to run those programs:
@example
$(AR) $(BISON) $(CC) $(FLEX) $(INSTALL) $(LD) $(LEX)
$(AR) $(BISON) $(CC) $(FLEX) $(INSTALL) $(LD) $(LDCONFIG) $(LEX)
$(MAKE) $(MAKEINFO) $(RANLIB) $(TEXI2DVI) $(YACC)
@end example
When you use @code{ranlib}, you should make sure nothing bad happens if
the system does not have @code{ranlib}. Arrange to ignore an error
from that command, and print a message before the command to tell the
user that failure of the @code{ranlib} command does not mean a problem.
(The Autoconf @samp{AC_PROG_RANLIB} macro can help with this.)
When you use @code{ranlib} or @code{ldconfig}, you should make sure
nothing bad happens if the system does not have the program in question.
Arrange to ignore an error from that command, and print a message before
the command to tell the user that failure of this command does not mean
a problem. (The Autoconf @samp{AC_PROG_RANLIB} macro can help with
this.)
If you use symbolic links, you should implement a fallback for systems
that don't have symbolic links.
Additional utilities that can be used via Make variables are:
@example
chgrp chmod chown mknod
@end example
It is ok to use other utilities in Makefile portions (or scripts)
intended only for particular systems where you know those utilities
exist.
@@ -209,6 +239,9 @@ Put @code{CFLAGS} last in the compilation command, after other variables
containing compiler options, so the user can use @code{CFLAGS} to
override the others.
@code{CFLAGS} should be used in every invocation of the C compiler,
both those which do compilation and those which do linking.
Every Makefile should define the variable @code{INSTALL}, which is the
basic command for installing a file into the system.
@@ -325,14 +358,11 @@ files. This directory should normally be @file{/usr/local/etc}, but
write it as @file{$(prefix)/etc}.
(If you are using Autoconf, write it as @samp{@@sysconfdir@@}.)
@c rewritten to avoid overfull hbox --tower
Do not install executables
@c here
in this directory (they probably
belong in @file{$(libexecdir)} or @file{$(sbindir)}). Also do not
install files that are modified in the normal course of their use
(programs whose purpose is to change the configuration of the system
excluded). Those probably belong in @file{$(localstatedir)}.
Do not install executables here in this directory (they probably belong
in @file{$(libexecdir)} or @file{$(sbindir)}). Also do not install
files that are modified in the normal course of their use (programs
whose purpose is to change the configuration of the system excluded).
Those probably belong in @file{$(localstatedir)}.
@item sharedstatedir
The directory for installing architecture-independent data files which
@@ -352,7 +382,7 @@ should normally be @file{/usr/local/var}, but write it as
@item libdir
The directory for object files and libraries of object code. Do not
install executables here, they probably belong in @file{$(libexecdir)}
install executables here, they probably ought to go in @file{$(libexecdir)}
instead. The value of @code{libdir} should normally be
@file{/usr/local/lib}, but write it as @file{$(exec_prefix)/lib}.
(If you are using Autoconf, write it as @samp{@@libdir@@}.)
@@ -363,6 +393,20 @@ default, it should be @file{/usr/local/info}, but it should be written
as @file{$(prefix)/info}.
(If you are using Autoconf, write it as @samp{@@infodir@@}.)
@item lispdir
The directory for installing any Emacs Lisp files in this package. By
default, it should be @file{/usr/local/share/emacs/site-lisp}, but it
should be written as @file{$(prefix)/share/emacs/site-lisp}.
If you are using Autoconf, write the default as @samp{@@lispdir@@}.
In order to make @samp{@@lispdir@@} work, you need the following lines
in your @file{configure.in} file:
@example
lispdir='$@{datadir@}/emacs/site-lisp'
AC_SUBST(lispdir)
@end example
@item includedir
@c rewritten to avoid overfull hbox --roland
The directory for installing header files to be included by user
@@ -371,7 +415,7 @@ should normally be @file{/usr/local/include}, but write it as
@file{$(prefix)/include}.
(If you are using Autoconf, write it as @samp{@@includedir@@}.)
Most compilers other than GCC do not look for header files in
Most compilers other than GCC do not look for header files in directory
@file{/usr/local/include}. So installing the header files this way is
only useful with GCC. Sometimes this is not a problem because some
libraries are only really intended to work with GCC. But some libraries
@@ -405,7 +449,7 @@ Unix-style man pages are installed in one of the following:
@item mandir
The top-level directory for installing the man pages (if any) for this
package. It will normally be @file{/usr/local/man}, but you should
write it as @file{$(prefix)/man}.
write it as @file{$(prefix)/man}.
(If you are using Autoconf, write it as @samp{@@mandir@@}.)
@item man1dir
@@ -524,6 +568,7 @@ Here is a sample rule to install an Info file:
@comment Please do not reformat it without talking to roland@gnu.ai.mit.edu.
@smallexample
$(infodir)/foo.info: foo.info
$(POST_INSTALL)
# There may be a newer info file in . than in srcdir.
-if test -f foo.info; then d=.; \
else d=$(srcdir); fi; \
@@ -535,26 +580,35 @@ $(infodir)/foo.info: foo.info
# fail gracefully when there is an unknown command.
if $(SHELL) -c 'install-info --version' \
>/dev/null 2>&1; then \
install-info --dir-file=$(infodir)/dir $(infodir)/foo.info; \
install-info --dir-file=$(infodir)/dir \
$(infodir)/foo.info; \
else true; fi
@end smallexample
When writing the @code{install} target, you must classify all the
commands into three categories: normal ones, @dfn{pre-installation}
commands and @dfn{post-installation} commands. @xref{Install Command
Categories}.
@item uninstall
Delete all the installed files that the @samp{install} target would
create (but not the noninstalled files such as @samp{make all} would
create).
Delete all the installed files---the copies that the @samp{install}
target creates.
This rule should not modify the directories where compilation is done,
only the directories where files are installed.
The uninstallation commands are divided into three categories, just like
the installation commands. @xref{Install Command Categories}.
@item install-strip
Like @code{install}, but strip the executable files while installing
them. The definition of this target can be very simple:
them. In many cases, the definition of this target can be very simple:
@example
@smallexample
install-strip:
$(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' install
@end example
$(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' \
install
@end smallexample
Normally we do not recommend stripping an executable unless you are sure
the program has no bugs. However, it can be reasonable to install a
@@ -609,8 +663,8 @@ To help make users aware of this, the commands for the special
@code{maintainer-clean} target should start with these two:
@smallexample
@@echo "This command is intended for maintainers to use; it"
@@echo "deletes files that may require special tools to rebuild."
@@echo 'This command is intended for maintainers to use; it'
@@echo 'deletes files that may need special tools to rebuild.'
@end smallexample
@item TAGS
@@ -633,8 +687,14 @@ You must define the variable @code{MAKEINFO} in the Makefile. It should
run the @code{makeinfo} program, which is part of the Texinfo
distribution.
Normally a GNU distribution comes with Info files, and that means the
Info files are present in the source directory. Therefore, the Make
rule for an info file should update it in the source directory. When
users build the package, ordinarily Make will not update the Info files
because they will already be up to date.
@item dvi
Generate DVI files for all Texinfo documentation.
Generate DVI files for all Texinfo documentation.
For example:
@smallexample
@@ -649,7 +709,7 @@ You must define the variable @code{TEXI2DVI} in the Makefile. It should
run the program @code{texi2dvi}, which is part of the Texinfo
distribution.@footnote{@code{texi2dvi} uses @TeX{} to do the real work
of formatting. @TeX{} is not distributed with Texinfo.} Alternatively,
write just the dependencies, and allow GNU Make to provide the command.
write just the dependencies, and allow GNU @code{make} to provide the command.
@item dist
Create a distribution tar file for this program. The tar file should be
@@ -669,7 +729,7 @@ distribution file for GCC version 1.40 is called @file{gcc-1.40.tar.gz}.
The @code{dist} target should explicitly depend on all non-source files
that are in the distribution, to make sure they are up to date in the
distribution.
distribution.
@ifset CODESTD
@xref{Releases, , Making Releases}.
@end ifset
@@ -691,7 +751,7 @@ in which they are useful.
@item installcheck
Perform installation tests (if any). The user must build and install
the program before running the tests. You should not assume that
@file{$(bindir)} is in the search path.
@file{$(bindir)} is in the search path.
@item installdirs
It's useful to add a target named @samp{installdirs} to create the
@@ -715,3 +775,119 @@ installdirs: mkinstalldirs
This rule should not modify the directories where compilation is done.
It should do nothing but create installation directories.
@end table
@node Install Command Categories
@section Install Command Categories
@cindex pre-installation commands
@cindex post-installation commands
When writing the @code{install} target, you must classify all the
commands into three categories: normal ones, @dfn{pre-installation}
commands and @dfn{post-installation} commands.
Normal commands move files into their proper places, and set their
modes. They may not alter any files except the ones that come entirely
from the package they belong to.
Pre-installation and post-installation commands may alter other files;
in particular, they can edit global configuration files or data bases.
Pre-installation commands are typically executed before the normal
commands, and post-installation commands are typically run after the
normal commands.
The most common use for a post-installation command is to run
@code{install-info}. This cannot be done with a normal command, since
it alters a file (the Info directory) which does not come entirely and
solely from the package being installed. It is a post-installation
command because it needs to be done after the normal command which
installs the package's Info files.
Most programs don't need any pre-installation commands, but we have the
feature just in case it is needed.
To classify the commands in the @code{install} rule into these three
categories, insert @dfn{category lines} among them. A category line
specifies the category for the commands that follow.
A category line consists of a tab and a reference to a special Make
variable, plus an optional comment at the end. There are three
variables you can use, one for each category; the variable name
specifies the category. Category lines are no-ops in ordinary execution
because these three Make variables are normally undefined (and you
@emph{should not} define them in the makefile).
Here are the three possible category lines, each with a comment that
explains what it means:
@smallexample
$(PRE_INSTALL) # @r{Pre-install commands follow.}
$(POST_INSTALL) # @r{Post-install commands follow.}
$(NORMAL_INSTALL) # @r{Normal commands follow.}
@end smallexample
If you don't use a category line at the beginning of the @code{install}
rule, all the commands are classified as normal until the first category
line. If you don't use any category lines, all the commands are
classified as normal.
These are the category lines for @code{uninstall}:
@smallexample
$(PRE_UNINSTALL) # @r{Pre-uninstall commands follow.}
$(POST_UNINSTALL) # @r{Post-uninstall commands follow.}
$(NORMAL_UNINSTALL) # @r{Normal commands follow.}
@end smallexample
Typically, a pre-uninstall command would be used for deleting entries
from the Info directory.
If the @code{install} or @code{uninstall} target has any dependencies
which act as subroutines of installation, then you should start
@emph{each} dependency's commands with a category line, and start the
main target's commands with a category line also. This way, you can
ensure that each command is placed in the right category regardless of
which of the dependencies actually run.
Pre-installation and post-installation commands should not run any
programs except for these:
@example
[ basename bash cat chgrp chmod chown cmp cp dd diff echo
egrep expand expr false fgrep find getopt grep gunzip gzip
hostname install install-info kill ldconfig ln ls md5sum
mkdir mkfifo mknod mv printenv pwd rm rmdir sed sort tee
test touch true uname xargs yes
@end example
@cindex binary packages
The reason for distinguishing the commands in this way is for the sake
of making binary packages. Typically a binary package contains all the
executables and other files that need to be installed, and has its own
method of installing them---so it does not need to run the normal
installation commands. But installing the binary package does need to
execute the pre-installation and post-installation commands.
Programs to build binary packages work by extracting the
pre-installation and post-installation commands. Here is one way of
extracting the pre-installation commands:
@smallexample
make -n install -o all \
PRE_INSTALL=pre-install \
POST_INSTALL=post-install \
NORMAL_INSTALL=normal-install \
| gawk -f pre-install.awk
@end smallexample
@noindent
where the file @file{pre-install.awk} could contain this:
@smallexample
$0 ~ /^\t[ \t]*(normal_install|post_install)[ \t]*$/ @{on = 0@}
on @{print $0@}
$0 ~ /^\t[ \t]*pre_install[ \t]*$/ @{on = 1@}
@end smallexample
The resulting file of pre-installation commands is executed as a shell
script as part of installing the binary package.

14
make.1
View File

@@ -8,7 +8,7 @@ make \- GNU make utility to maintain groups of programs
makefile ] [ option ] ...
target ...
.SH WARNING
This man paage is an extract of the documentation of
This man page is an extract of the documentation of
.I GNU make .
It is updated only occasionally, because the GNU project does not use nroff.
For complete, current documentation, refer to the Info file
@@ -110,7 +110,7 @@ or if the target does not exist.
.B \-b
.TP 0.5i
.B \-m
These options are ignored for compatibility with other versions of
These options are ignored for compatibility with other versions of
.IR make .
.TP 0.5i
.BI "\-C " dir
@@ -157,7 +157,7 @@ If several
.B \-I
options are used to specify several directories, the directories are
searched in the order specified.
Unlike the arguments to other flags of
Unlike the arguments to other flags of
.IR make ,
directories given with
.B \-I
@@ -236,11 +236,11 @@ Silent operation; do not print the commands as they are executed.
Cancel the effect of the
.B \-k
option.
This is never necessary except in a recursive
This is never necessary except in a recursive
.I make
where
.B \-k
might be inherited from the top-level
might be inherited from the top-level
.I make
via MAKEFLAGS or if you set
.B \-k
@@ -254,7 +254,7 @@ future invocations of
.IR make .
.TP 0.5i
.B \-v
Print the version of the
Print the version of the
.I make
program plus a copyright, a list of authors and a notice that there
is no warranty.
@@ -285,7 +285,7 @@ it is almost the same as running a
.I touch
command on the given file before running
.IR make ,
except that the modification time is changed only in the imagination of
except that the modification time is changed only in the imagination of
.IR make .
.SH "SEE ALSO"
.PD 0

191
make.h
View File

@@ -1,5 +1,5 @@
/* Miscellaneous global declarations and portability cruft for GNU Make.
Copyright (C) 1988, 89, 90, 91, 92, 93, 94, 95 Free Software Foundation, Inc.
Copyright (C) 1988,89,90,91,92,93,94,95,96,97 Free Software Foundation, Inc.
This file is part of GNU Make.
GNU Make is free software; you can redistribute it and/or modify
@@ -28,6 +28,17 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#undef HAVE_CONFIG_H
#define HAVE_CONFIG_H
/* Use prototypes if available. */
#if defined (__cplusplus) || (defined (__STDC__) && __STDC__)
#undef PARAMS
#define PARAMS(protos) protos
#else /* Not C++ or ANSI C. */
#undef PARAMS
#define PARAMS(protos) ()
#endif /* C++ or ANSI C. */
#ifdef CRAY
/* This must happen before #include <signal.h> so
that the declaration therein is changed. */
@@ -61,15 +72,13 @@ extern int errno;
#include <unistd.h>
/* Ultrix's unistd.h always defines _POSIX_VERSION, but you only get
POSIX.1 behavior with `cc -YPOSIX', which predefines POSIX itself! */
#if defined (_POSIX_VERSION) && !defined (ultrix)
#if defined (_POSIX_VERSION) && !defined (ultrix) && !defined (VMS)
#define POSIX
#endif
#endif
/* Some systems define _POSIX_VERSION but are not really POSIX.1. */
#if (defined (butterfly) || defined (__arm) || \
(defined (__mips) && defined (_SYSTYPE_SVR3)) || \
(defined (sequent) && defined (i386)))
#if (defined (butterfly) || defined (__arm) || (defined (__mips) && defined (_SYSTYPE_SVR3)) || (defined (sequent) && defined (i386)))
#undef POSIX
#endif
@@ -77,15 +86,6 @@ extern int errno;
#define POSIX
#endif
#if !defined (HAVE_SYS_SIGLIST) && defined (HAVE__SYS_SIGLIST)
#define sys_siglist _sys_siglist
#define HAVE_SYS_SIGLIST /* Now we have it. */
/* It was declared in <signal.h>, with who knows what type.
Don't declare it again and risk conflicting. */
#define SYS_SIGLIST_DECLARED
#endif
#ifdef HAVE_SYS_SIGLIST
#ifndef SYS_SIGLIST_DECLARED
extern char *sys_siglist[];
@@ -132,11 +132,24 @@ extern char *sys_siglist[];
#define PATH_VAR(var) char var[PATH_MAX]
#else
#define NEED_GET_PATH_MAX
extern unsigned int get_path_max ();
extern unsigned int get_path_max PARAMS ((void));
#define GET_PATH_MAX (get_path_max ())
#define PATH_VAR(var) char *var = (char *) alloca (GET_PATH_MAX)
#endif
#ifndef CHAR_BIT
#define CHAR_BIT 8
#endif
/* Nonzero if the integer type T is signed. */
#define INTEGER_TYPE_SIGNED(t) ((t) -1 < 0)
/* The minimum and maximum values for the integer type T.
Use ~ (t) 0, not -1, for portability to 1's complement hosts. */
#define INTEGER_TYPE_MINIMUM(t) \
(! INTEGER_TYPE_SIGNED (t) ? (t) 0 : ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1))
#define INTEGER_TYPE_MAXIMUM(t) (~ (t) 0 - INTEGER_TYPE_MINIMUM (t))
#ifdef STAT_MACROS_BROKEN
#ifdef S_ISREG
#undef S_ISREG
@@ -153,8 +166,16 @@ extern unsigned int get_path_max ();
#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
#endif
#ifdef VMS
#include <stdio.h>
#include <types.h>
#include <unixlib.h>
#include <unixio.h>
#include <errno.h>
#include <perror.h>
#endif
#if (defined (STDC_HEADERS) || defined (__GNU_LIBRARY__))
#if (defined (STDC_HEADERS) || defined (__GNU_LIBRARY__) || defined(VMS))
#include <stdlib.h>
#include <string.h>
#define ANSI_STRING
@@ -170,10 +191,12 @@ extern unsigned int get_path_max ();
#include <memory.h>
#endif
extern char *malloc (), *realloc ();
extern void free ();
extern char *malloc PARAMS ((int));
extern char *realloc PARAMS ((char *, int));
extern void free PARAMS ((char *));
extern void abort (), exit ();
extern void abort PARAMS ((void));
extern void exit PARAMS ((int));
#endif /* Standard headers. */
@@ -192,8 +215,8 @@ extern void abort (), exit ();
#ifndef bzero
#define bzero(s, n) memset ((s), 0, (n))
#endif
#ifndef bcopy
#define bcopy(s, d, n) memcpy ((d), (s), (n))
#if defined(HAVE_MEMMOVE) && !defined(bcopy)
#define bcopy(s, d, n) memmove ((d), (s), (n))
#endif
#else /* Not ANSI_STRING. */
@@ -214,8 +237,8 @@ extern void bcopy ();
/* SCO Xenix has a buggy macro definition in <string.h>. */
#undef strerror
#ifndef ANSI_STRING
extern char *strerror ();
#if !defined(ANSI_STRING) && !defined(__DECC)
extern char *strerror PARAMS ((int errnum));
#endif
@@ -236,14 +259,30 @@ extern char *alloca ();
#define streq(a, b) \
((a) == (b) || \
(*(a) == *(b) && (*(a) == '\0' || !strcmp ((a) + 1, (b) + 1))))
#ifdef _AMIGA
#define strieq(a, b) \
((a) == (b) || \
(tolower(*(a)) == tolower(*(b)) && (*(a) == '\0' || !strcmpi ((a) + 1, (b) + 1))))
#else
#define strieq(a, b) \
((a) == (b) || \
(*(a) == *(b) && (*(a) == '\0' || !strcmp ((a) + 1, (b) + 1))))
#endif
#else
/* Buggy compiler can't handle this. */
#define streq(a, b) (strcmp ((a), (b)) == 0)
#define strieq(a, b) (strcmp ((a), (b)) == 0)
#endif
/* Add to VAR the hashing value of C, one character in a name. */
#define HASH(var, c) \
((var += (c)), (var = ((var) << 7) + ((var) >> 20)))
#ifdef _AMIGA /* Fold filenames on #amiga */
#define HASHI(var, c) \
((var += tolower((c))), (var = ((var) << 7) + ((var) >> 20)))
#else
#define HASHI(var, c) HASH(var,c)
#endif
#if defined(__GNUC__) || defined(ENUM_BITFIELDS)
#define ENUM_BITFIELD(bits) :bits
@@ -251,26 +290,53 @@ extern char *alloca ();
#define ENUM_BITFIELD(bits)
#endif
#ifdef __MSDOS__
#if defined(__MSDOS__) || defined(WINDOWS32)
#define PATH_SEPARATOR_CHAR ';'
#else
#if defined(VMS)
#define PATH_SEPARATOR_CHAR ','
#else
#define PATH_SEPARATOR_CHAR ':'
#endif
#endif
#ifdef WINDOWS32
#include <fcntl.h>
#include <malloc.h>
#define pipe(p) _pipe(p, 512, O_BINARY)
#define kill(pid,sig) w32_kill(pid,sig)
extern void sync_Path_environment(void);
extern int kill(int pid, int sig);
extern int safe_stat(char *file, struct stat *sb);
extern char *end_of_token_w32();
#endif
extern void die ();
extern void message (), fatal (), error ();
extern void message ();
extern void fatal ();
extern void error ();
extern void log_working_directory ();
extern void makefile_error (), makefile_fatal ();
extern void pfatal_with_name (), perror_with_name ();
extern char *savestring (), *concat ();
extern char *xmalloc (), *xrealloc ();
extern char *find_next_token (), *next_token (), *end_of_token ();
extern void collapse_continuations (), remove_comments ();
extern char *sindex (), *lindex ();
extern void makefile_error ();
extern void makefile_fatal ();
extern void pfatal_with_name ();
extern void perror_with_name ();
extern char *savestring ();
extern char *concat ();
extern char *xmalloc ();
extern char *xrealloc ();
extern char *find_next_token ();
extern char *next_token ();
extern char *end_of_token ();
extern void collapse_continuations ();
extern void remove_comments ();
extern char *sindex ();
extern char *lindex ();
extern int alpha_compare ();
extern void print_spaces ();
extern struct dep *copy_dep_chain ();
extern char *find_char_unquote (), *find_percent ();
extern char *find_char_unquote ();
extern char *find_percent ();
#ifndef NO_ARCHIVES
extern int ar_name ();
@@ -280,17 +346,24 @@ extern time_t ar_member_date ();
#endif
extern void dir_load ();
extern int dir_file_exists_p (), file_exists_p (), file_impossible_p ();
extern int dir_file_exists_p ();
extern int file_exists_p ();
extern int file_impossible_p ();
extern void file_impossible ();
extern char *dir_name ();
extern void define_default_variables ();
extern void set_default_suffixes (), install_default_suffix_rules ();
extern void install_default_implicit_rules (), count_implicit_rule_limits ();
extern void convert_to_pattern (), create_pattern_rule ();
extern void set_default_suffixes ();
extern void install_default_suffix_rules ();
extern void install_default_implicit_rules ();
extern void count_implicit_rule_limits ();
extern void convert_to_pattern ();
extern void create_pattern_rule ();
extern void build_vpath_lists (), construct_vpath_list ();
extern void build_vpath_lists ();
extern void construct_vpath_list ();
extern int vpath_search ();
extern int gpath_search ();
extern void construct_include_path ();
extern void uniquize_deps ();
@@ -298,25 +371,31 @@ extern void uniquize_deps ();
extern int update_goal_chain ();
extern void notice_finished_file ();
extern void user_access (), make_access (), child_access ();
extern void user_access ();
extern void make_access ();
extern void child_access ();
#ifdef HAVE_VFORK_H
#include <vfork.h>
#endif
/* We omit these declarations on non-POSIX systems which define _POSIX_VERSION,
because such systems often declare the in header files anyway. */
because such systems often declare them in header files anyway. */
#if !defined (__GNU_LIBRARY__) && !defined (POSIX) && !defined (_POSIX_VERSION)
#if !defined (__GNU_LIBRARY__) && !defined (POSIX) && !defined (_POSIX_VERSION) && !defined(WINDOWS32)
extern long int atol ();
#ifndef VMS
extern long int lseek ();
#endif
#endif /* Not GNU C library or POSIX. */
#ifdef HAVE_GETCWD
extern char *getcwd ();
#ifdef VMS
extern char *getwd PARAMS ((char *));
#endif
#else
extern char *getwd ();
#define getcwd(buf, len) getwd (buf)
@@ -332,9 +411,14 @@ extern int debug_flag, print_data_base_flag, question_flag, touch_flag;
extern int env_overrides, no_builtin_rules_flag, print_version_flag;
extern int print_directory_flag, warn_undefined_variables_flag;
extern int posix_pedantic;
extern int clock_skew_detected;
extern unsigned int job_slots;
#ifndef NO_FLOAT
extern double max_load_average;
#else
extern int max_load_average;
#endif
extern char *program;
extern char *starting_directory;
@@ -349,3 +433,26 @@ extern int handling_fatal_signal;
#define DEBUGPR(msg) \
do if (debug_flag) { print_spaces (depth); printf (msg, file->name); \
fflush (stdout); } while (0)
#ifdef VMS
# ifndef EXIT_FAILURE
# define EXIT_FAILURE 3
# endif
# ifndef EXIT_SUCCESS
# define EXIT_SUCCESS 1
# endif
# ifndef EXIT_TROUBLE
# define EXIT_TROUBLE 2
# endif
#else
# ifndef EXIT_FAILURE
# define EXIT_FAILURE 2
# endif
# ifndef EXIT_SUCCESS
# define EXIT_SUCCESS 0
# endif
# ifndef EXIT_TROUBLE
# define EXIT_TROUBLE 1
# endif
#endif

5
make.lnk Normal file
View File

@@ -0,0 +1,5 @@
FROM LIB:cres.o "commands.o"+"job.o"+"dir.o"+"file.o"+"misc.o"+"main.o"+"read.o"+"remake.o"+"rule.o"+"implicit.o"+"default.o"+"variable.o"+"expand.o"+"function.o"+"vpath.o"+"version.o"+"ar.o"+"arscan.o"+"signame.o"+"remote-stub.o"+"getopt.o"+"getopt1.o"+"alloca.o"+"amiga.o"
TO "make.new"
LIB glob/glob.lib LIB:sc.lib LIB:amiga.lib
QUIET

View File

@@ -8,12 +8,12 @@
@c FSF publishers: format makebook.texi instead of using this file directly.
@set RCSID $Id$
@set EDITION 0.50
@set VERSION 3.75 Beta
@set UPDATED 28 February 1996
@set UPDATE-MONTH February 1996
@set EDITION 0.51
@set VERSION 3.76 Beta
@set UPDATED 26 Aug 1997
@set UPDATE-MONTH Aug 1997
@comment The ISBN number might need to change on next publication.
@set ISBN 1-882114-78-7
@set ISBN 1-882114-78-7 @c CHANGE THIS BEFORE PRINTING AGAIN! --roland 9may96
@c finalout
@@ -25,6 +25,11 @@
@syncodeindex pg cp
@ifinfo
@dircategory The GNU make utility
@direntry
* GNU make: (make.info). The GNU make utility.
@end direntry
This file documents the GNU Make utility, which determines
automatically which pieces of a large program need to be recompiled,
and issues the commands to recompile them.
@@ -32,7 +37,7 @@ and issues the commands to recompile them.
This is Edition @value{EDITION}, last updated @value{UPDATED},
of @cite{The GNU Make Manual}, for @code{make}, Version @value{VERSION}.
Copyright (C) 1988, '89, '90, '91, '92, '93, '94, '95
Copyright (C) 1988, '89, '90, '91, '92, '93, '94, '95, '96, '97
Free Software Foundation, Inc.
Permission is granted to make and distribute verbatim copies of
@@ -68,7 +73,7 @@ by the Free Software Foundation.
@author Richard M. Stallman and Roland McGrath
@page
@vskip 0pt plus 1filll
Copyright @copyright{} 1988, '89, '90, '91, '92, '93, '94, '95 Free Software Foundation, Inc.
Copyright @copyright{} 1988, '89, '90, '91, '92, '93, '94, '95, '96, '97 Free Software Foundation, Inc.
@sp 2
Published by the Free Software Foundation @*
59 Temple Place -- Suite 330, @*
@@ -95,7 +100,7 @@ Cover art by Etienne Suvasa.
@page
@ifinfo
@node Top, Overview, (dir), (dir)
@node Top, Overview, , (dir)
@top Make
The GNU @code{make} utility automatically determines which pieces of a
@@ -196,6 +201,7 @@ Searching Directories for Dependencies
to every dependency.
* Selective Search:: Specifying a search path
for a specified class of names.
* Search Algorithm:: When and how search paths are applied.
* Commands/Search:: How to write shell commands that work together
with search paths.
* Implicit/Search:: How search paths affect implicit rules.
@@ -239,6 +245,8 @@ How to Use Variables
* Defining:: An alternate way to set a variable
to a verbatim string.
* Environment:: Variable values can come from the environment.
* Automatic:: Some special variables have predefined
meanings for use with implicit rules.
Advanced Features for Reference to Variables
@@ -256,7 +264,7 @@ Functions for Transforming Text
* Syntax of Functions:: How to write a function call.
* Text Functions:: General-purpose text manipulation functions.
* Filename Functions:: Functions for manipulating file names.
* File Name Functions:: Functions for manipulating file names.
* Foreach Function:: Repeat some text with controlled variation.
* Origin Function:: Find where a variable got its value.
* Shell Function:: Substitute the output of a shell command.
@@ -288,7 +296,7 @@ Using Implicit Rules
* Last Resort:: How to defining commands for rules
which cannot find any.
* Suffix Rules:: The old-fashioned style of implicit rule.
* Search Algorithm:: The precise algorithm for applying
* Implicit Rule Search:: The precise algorithm for applying
implicit rules.
Defining and Redefining Pattern Rules
@@ -307,6 +315,7 @@ Using @code{make} to Update Archive Files
* Archive Members:: Archive members as targets.
* Archive Update:: The implicit rule for archive member targets.
* Archive Pitfalls:: Dangers to watch out for when using archives.
* Archive Suffix Rules:: You can write a special kind of suffix rule
for updating archives.
@@ -1093,6 +1102,8 @@ makefile as has been traditionally done with other versions of
@cindex @code{-I}
@cindex @code{--include-dir}
@cindex included makefiles, default directries
@cindex default directries for included makefiles
@findex /usr/gnu/include
@findex /usr/local/include
@findex /usr/include
@@ -1103,7 +1114,10 @@ First, any directories you have specified with the @samp{-I} or
(@pxref{Options Summary, ,Summary of Options}).
Then the following directories (if they exist)
are searched, in this order:
@file{@var{prefix}/include} (normally @file{/usr/local/include})
@file{@var{prefix}/include} (normally @file{/usr/local/include}
@footnote{GNU Make compiled for MS-DOS and MS-Windows behaves as if
@var{prefix} has been defined to be the root of the DJGPP tree
hierarchy.})
@file{/usr/gnu/include},
@file{/usr/local/include}, @file{/usr/include}.
@@ -1126,6 +1140,8 @@ directive instead of @code{include}, like this:
This is acts like @code{include} in every way except that there is no
error (not even a warning) if any of the @var{filenames} do not exist.
For compatibility with some other @code{make} implementations,
@code{sinclude} is another name for @w{@code{-include}}.
@node MAKEFILES Variable, Remaking Makefiles, Include, Makefiles
@section The Variable @code{MAKEFILES}
@@ -1453,7 +1469,10 @@ significance. If alone, or followed by a slash, it represents your home
directory. For example @file{~/bin} expands to @file{/home/you/bin}.
If the @samp{~} is followed by a word, the string represents the home
directory of the user named by that word. For example @file{~john/bin}
expands to @file{/home/john/bin}.@refill
expands to @file{/home/john/bin}. On systems which don't have a home
directory for each user (such as MS-DOS or MS-Windows), this
functionality can be simulated by setting the environment variable
@var{HOME}.@refill
Wildcard expansion happens automatically in targets, in dependencies,
and in commands (where the shell does the expansion). In other
@@ -1567,6 +1586,24 @@ expansion, but you need more sophisticated techniques, including the
These are described in the following section.
@end iftex
@cindex wildcards and MS-DOS/MS-Windows backslashes
@cindex backslashes in pathnames and wildcard expansion
Microsoft operating systems (MS-DOS and MS-Windows) use backslashes to
separate directories in pathnames, like so:
@example
c:\foo\bar\baz.c
@end example
This is equivalent to the Unix-style @file{c:/foo/bar/baz.c} (the
@file{c:} part is the so-called drive letter). When @code{make} runs on
these systems, it supports backslashes as well as the Unix-style forward
slashes in pathnames. However, this support does @emph{not} include the
wildcard expansion, where backslash is a quote character. Therefore,
you @emph{must} use Unix-style slashes in these cases.
@node Wildcard Function, , Wildcard Pitfall, Wildcards
@subsection The Function @code{wildcard}
@findex wildcard
@@ -1597,7 +1634,7 @@ $(wildcard *.c)
@end example
We can change the list of C source files into a list of object files by
replacing the @samp{.o} suffix with @samp{.c} in the result, like this:
replacing the @samp{.c} suffix with @samp{.o} in the result, like this:
@example
$(patsubst %.c,%.o,$(wildcard *.c))
@@ -1643,6 +1680,7 @@ just the search paths.
to every dependency.
* Selective Search:: Specifying a search path
for a specified class of names.
* Search Algorithm:: When and how search paths are applied.
* Commands/Search:: How to write shell commands that work together
with search paths.
* Implicit/Search:: How search paths affect implicit rules.
@@ -1663,14 +1701,16 @@ rules.
Thus, if a file that is listed as a target or dependency does not exist
in the current directory, @code{make} searches the directories listed in
@code{VPATH} for a file with that name. If a file is found in one of
them, that file becomes the dependency. Rules may then specify the
names of source files in the dependencies as if they all existed in the
current directory. @xref{Commands/Search, ,Writing Shell Commands with
Directory Search}.
them, that file may become the dependency (see below). Rules may then
specify the names of files in the dependency list as if they all
existed in the current directory. @xref{Commands/Search, ,Writing Shell
Commands with Directory Search}.
In the @code{VPATH} variable, directory names are separated by colons or
blanks. The order in which directories are listed is the order followed
by @code{make} in its search.
by @code{make} in its search. (On MS-DOS and MS-Windows, semi-colons
are used as separators of directory names in @code{VPATH}, since the
colon can be used in the pathname itself, after the drive letter.)
For example,
@@ -1699,15 +1739,16 @@ foo.o : src/foo.c
assuming the file @file{foo.c} does not exist in the current directory but
is found in the directory @file{src}.
@node Selective Search, Commands/Search, General Search, Directory Search
@node Selective Search, Search Algorithm, General Search, Directory Search
@subsection The @code{vpath} Directive
@findex vpath
Similar to the @code{VPATH} variable but more selective is the @code{vpath}
directive (note lower case), which allows you to specify a search path for a particular class
of file names, those that match a particular pattern. Thus you can supply
certain search directories for one class of file names and other directories
(or none) for other file names.
Similar to the @code{VPATH} variable, but more selective, is the
@code{vpath} directive (note lower case), which allows you to specify a
search path for a particular class of file names: those that match a
particular pattern. Thus you can supply certain search directories for
one class of file names and other directories (or none) for other file
names.
There are three forms of the @code{vpath} directive:
@@ -1717,8 +1758,8 @@ Specify the search path @var{directories} for file names that match
@var{pattern}.
The search path, @var{directories}, is a list of directories to be
searched, separated by colons or blanks, just like the search path used
in the @code{VPATH} variable.
searched, separated by colons (semi-colons on MS-DOS and MS-Windows) or
blanks, just like the search path used in the @code{VPATH} variable.
@item vpath @var{pattern}
Clear out the search path associated with @var{pattern}.
@@ -1798,7 +1839,74 @@ vpath % blish
will look for a file ending in @samp{.c} in @file{foo}, then
@file{bar}, then @file{blish}.
@node Commands/Search, Implicit/Search, Selective Search, Directory Search
@node Search Algorithm, Commands/Search, Selective Search, Directory Search
@subsection How Directory Searches are Performed
@cindex algorithm for directory search
@cindex directory search algorithm
When a dependency is found through directory search, regardless of type
(general or selective), the pathname located may not be the one that
@code{make} actually provides you in the dependency list. Sometimes
the path discovered through directory search is thrown away.
The algorithm @code{make} uses to decide whether to keep or abandon a
path found via directory search is as follows:
@enumerate
@item
If a target file does not exist at the path specified in the makefile,
directory search is performed.
@item
If the directory search is successful, that path is kept and this file
is tentatively stored as the target.
@item
All dependencies of this target are examined using this same method.
@item
After processing the dependencies, the target may or may not need to be
rebuilt:
@enumerate a
@item
If the target does @emph{not} need to be rebuilt, the path to the file
found during directory search is used for any dependency lists which
contain this target. In short, if @code{make} doesn't need to rebuild
the target then you use the path found via directory search.
@item
If the target @emph{does} need to be rebuilt (is out-of-date), the
pathname found during directory search is @emph{thrown away}, and the
target is rebuilt using the file name specified in the makefile. In
short, if @code{make} must rebuild, then the target is rebuilt locally,
not in the directory found via directory search.
@end enumerate
@end enumerate
This algorithm may seem complex, but in practice it is quite often
exactly what you want.
@cindex traditional directory search
@cindex directory search, traditional
Other versions of @code{make} use a simpler algorithm: if the file does
not exist, and it is found via directory search, then that pathname is
always used whether or not the target needs to be built. Thus, if the
target is rebuilt it is created at the pathname discovered during
directory search.
@vindex GPATH
If, in fact, this is the behavior you want for some or all of your
directories, you can use the @code{GPATH} variable to indicate this to
@code{make}.
@code{GPATH} has the same syntax and format as @code{VPATH} (that is, a
space- or colon-delimited list of pathnames). If an out-of-date target
is found by directory search in a directory that also appears in
@code{GPATH}, then that pathname is not thrown away. The target is
rebuilt using the expanded path.
@node Commands/Search, Implicit/Search, Search Algorithm, Directory Search
@subsection Writing Shell Commands with Directory Search
@cindex shell command, and directory search
@cindex directory search (@code{VPATH}), and shell commands
@@ -1882,7 +1990,9 @@ handles it specially by searching for the file @file{lib@var{name}.a} in
the current directory, in directories specified by matching @code{vpath}
search paths and the @code{VPATH} search path, and then in the
directories @file{/lib}, @file{/usr/lib}, and @file{@var{prefix}/lib}
(normally @file{/usr/local/lib}).
(normally @file{/usr/local/lib}, but MS-DOS/MS-Windows versions of
@code{make} behave as if @var{prefix} is defined to be the root of the
DJGPP installation tree).
For example,
@@ -2110,7 +2220,7 @@ The commands specified for @code{.DEFAULT} are used for any target for
which no rules are found (either explicit rules or implicit rules).
@xref{Last Resort}. If @code{.DEFAULT} commands are specified, every
file mentioned as a dependency, but not as a target in a rule, will have
these commands executed on its behalf. @xref{Search Algorithm,
these commands executed on its behalf. @xref{Implicit Rule Search,
,Implicit Rule Search Algorithm}.
@findex .PRECIOUS
@@ -2131,6 +2241,27 @@ You can also list the target pattern of an implicit rule (such as
to preserve intermediate files created by rules whose target patterns
match that file's name.
@findex .INTERMEDIATE
@item .INTERMEDIATE
@cindex intermediate targets, explicit
The targets which @code{.INTERMEDIATE} depends on are treated as
intermediate files. @xref{Chained Rules, ,Chains of Implicit Rules}.
@code{.INTERMEDIATE} with no dependencies marks all file targets
mentioned in the makefile as intermediate.
@findex .SECONDARY
@item .SECONDARY
@cindex secondary targets
@cindex preserving with @code{.SECONDARY}
The targets which @code{.SECONDARY} depends on are treated as
intermediate files, except that they are never automatically deleted.
@xref{Chained Rules, ,Chains of Implicit Rules}.
@code{.SECONDARY} with no dependencies marks all file targets mentioned
in the makefile as secondary.
@findex .IGNORE
@item .IGNORE
@@ -2386,6 +2517,8 @@ from the corresponding @file{.c} file:
@group
objects = foo.o bar.o
all: $(objects)
$(objects): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@@
@end group
@@ -2580,7 +2713,8 @@ called @file{@var{name}.d} from a C source file called @file{@var{name}.c}:
@group
%.d: %.c
$(SHELL) -ec '$(CC) -M $(CPPFLAGS) $< \
| sed '\''s/\($*\)\.o[ :]*/\1 $@@/g'\'' > $@@'
| sed '\''s/\($*\)\.o[ :]*/\1.o $@@ : /g'\'' > $@@; \
[ -s $@@ ] || rm -f $@@'
@end group
@end smallexample
@@ -2734,13 +2868,15 @@ by making a new subshell for each line. (In practice, @code{make} may
take shortcuts that do not affect the results.)
@cindex @code{cd} (shell command)
@strong{Please note:} this implies that shell commands such as
@code{cd} that set variables local to each process will not affect the
following command lines. If you want to use @code{cd} to affect the
next command, put the two on a single line with a semicolon between
them. Then @code{make} will consider them a single command and pass
them, together, to a shell which will execute them in sequence. For
example:
@strong{Please note:} this implies that shell commands such as @code{cd}
that set variables local to each process will not affect the following
command lines. @footnote{On MS-DOS, the value of current working
directory is @strong{global}, so changing it @emph{will} affect the
following command lines on those systems.} If you want to use @code{cd}
to affect the next command, put the two on a single line with a
semicolon between them. Then @code{make} will consider them a single
command and pass them, together, to a shell which will execute them in
sequence. For example:
@example
foo : bar/lose
@@ -2771,13 +2907,75 @@ foo : bar/lose
The program used as the shell is taken from the variable @code{SHELL}.
By default, the program @file{/bin/sh} is used.
@vindex COMSPEC
On MS-DOS, if @code{SHELL} is not set, the value of the variable
@code{COMSPEC} (which is always set) is used instead.
@cindex @code{SHELL}, MS-DOS specifics
The processing of lines that set the variable @code{SHELL} in Makefiles
is different on MS-DOS. The stock shell, @file{command.com}, is
ridiculously limited in its functionality and many users of @code{make}
tend to install a replacement shell. Therefore, on MS-DOS, @code{make}
examines the value of @code{SHELL}, and changes its behavior based on
whether it points to a Unix-style or DOS-style shell. This allows
reasonable functionality even if @code{SHELL} points to
@file{command.com}.
If @code{SHELL} points to a Unix-style shell, @code{make} on MS-DOS
additionally checks whether that shell can indeed be found; if not, it
ignores the line that sets @code{SHELL}. In MS-DOS, GNU @code{make}
searches for the shell in the following places:
@enumerate
@item
In the precise place pointed to by the value of @code{SHELL}. For
example, if the makefile specifies @samp{SHELL = /bin/sh}, @code{make}
will look in the directory @file{/bin} on the current drive.
@item
In the current directory.
@item
In each of the directories in the @code{PATH} variable, in order.
@end enumerate
In every directory it examines, @code{make} will first look for the
specific file (@file{sh} in the example above). If this is not found,
it will also look in that directory for that file with one of the known
extensions which identify executable files. For example @file{.exe},
@file{.com}, @file{.bat}, @file{.btm}, @file{.sh}, and some others.
If any of these attempts is successful, the value of @code{SHELL} will
be set to the full pathname of the shell as found. However, if none of
these is found, the value of @code{SHELL} will not be changed, and thus
the line that sets it will be effectively ignored. This is so
@code{make} will only support features specific to a Unix-style shell if
such a shell is actually installed on the system where @code{make} runs.
Note that this extended search for the shell is limited to the cases
where @code{SHELL} is set from the Makefile; if it is set in the
environment or command line, you are expected to set it to the full
pathname of the shell, exactly as things are on Unix.
The effect of the above DOS-specific processing is that a Makefile that
says @samp{SHELL = /bin/sh} (as many Unix makefiles do), will work
on MS-DOS unaltered if you have e.g. @file{sh.exe} installed in some
directory along your @code{PATH}.
@cindex environment, @code{SHELL} in
Unlike most variables, the variable @code{SHELL} is never set from the
environment. This is because the @code{SHELL} environment variable is
used to specify your personal choice of shell program for interactive
use. It would be very bad for personal choices like this to affect
the functioning of makefiles. @xref{Environment, ,Variables from the
Environment}.
use. It would be very bad for personal choices like this to affect the
functioning of makefiles. @xref{Environment, ,Variables from the
Environment}. However, on MS-DOS and MS-Windows the value of
@code{SHELL} in the environment @strong{is} used, since on those systems
most users do not set this variable, and therefore it is most likely set
specifically to be used by @code{make}. On MS-DOS, if the setting of
@code{SHELL} is not suitable for @code{make}, you can set the variable
@code{MAKESHELL} to the shell that @code{make} should use; this will
override the value of @code{SHELL}.
@node Parallel, Errors, Execution, Commands
@section Parallel Execution
@@ -2794,6 +2992,9 @@ for it to finish before executing the next. However, the @samp{-j} or
@samp{--jobs} option tells @code{make} to execute many commands
simultaneously.@refill
On MS-DOS, the @samp{-j} option has no effect, since that system doesn't
support multi-processing.
If the @samp{-j} option is followed by an integer, this is the number of
commands to execute at once; this is called the number of @dfn{job slots}.
If there is nothing looking like an integer after the @samp{-j} option,
@@ -3010,7 +3211,7 @@ subdirectory. You can do it by writing this:
@example
subsystem:
cd subdir; $(MAKE)
cd subdir && $(MAKE)
@end example
@noindent
@@ -3046,13 +3247,13 @@ not the explicit command name @samp{make}, as shown here:
@example
@group
subsystem:
cd subdir; $(MAKE)
cd subdir && $(MAKE)
@end group
@end example
The value of this variable is the file name with which @code{make} was
invoked. If this file name was @file{/bin/make}, then the command executed
is @samp{cd subdir; /bin/make}. If you use a special version of
is @samp{cd subdir && /bin/make}. If you use a special version of
@code{make} to run the top-level makefile, the same special version will be
executed for recursive invocations.
@cindex @code{cd} (shell command)
@@ -3069,7 +3270,7 @@ Consider the command @samp{make -t} in the above example. (The
any commands; see @ref{Instead of Execution}.) Following the usual
definition of @samp{-t}, a @samp{make -t} command in the example would
create a file named @file{subsystem} and do nothing else. What you
really want it to do is run @samp{@w{cd subdir;} @w{make -t}}; but that would
really want it to do is run @samp{@w{cd subdir &&} @w{make -t}}; but that would
require executing the command, and @samp{-t} says not to execute
commands.@refill
@cindex @code{-t}, and recursion
@@ -3320,7 +3521,7 @@ value of @code{MAKEFLAGS}, like this:
@example
subsystem:
cd subdir; $(MAKE) MAKEFLAGS=
cd subdir && $(MAKE) MAKEFLAGS=
@end example
@vindex MAKEOVERRIDES
@@ -3359,7 +3560,7 @@ this:
@example
subsystem:
cd subdir; $(MAKE) $(MFLAGS)
cd subdir && $(MAKE) $(MFLAGS)
@end example
@noindent
@@ -4485,7 +4686,9 @@ Such problems would be especially likely with the variable @code{SHELL},
which is normally present in the environment to specify the user's choice
of interactive shell. It would be very undesirable for this choice to
affect @code{make}. So @code{make} ignores the environment value of
@code{SHELL}.@refill
@code{SHELL} (except on MS-DOS and MS-Windows, where @code{SHELL} is
usually not set. @xref{Execution, ,Special handling of SHELL on
MS-DOS}.)@refill
@node Conditionals, Functions, Using Variables, Top
@chapter Conditional Parts of Makefiles
@@ -4782,7 +4985,7 @@ call, just as a variable might be substituted.
@menu
* Syntax of Functions:: How to write a function call.
* Text Functions:: General-purpose text manipulation functions.
* Filename Functions:: Functions for manipulating file names.
* File Name Functions:: Functions for manipulating file names.
* Foreach Function:: Repeat some text with controlled variation.
* Origin Function:: Find where a variable got its value.
* Shell Function:: Substitute the output of a shell command.
@@ -4851,7 +5054,7 @@ bar:= $(subst $(space),$(comma),$(foo))
Here the @code{subst} function replaces each space with a comma, through
the value of @code{foo}, and substitutes the result.
@node Text Functions, Filename Functions, Syntax of Functions, Functions
@node Text Functions, File Name Functions, Syntax of Functions, Functions
@section Functions for String Substitution and Analysis
@cindex functions, for text
@@ -5115,7 +5318,7 @@ used so that the new value is assigned even if the previous value of
@code{CFLAGS} was specified with a command argument (@pxref{Override
Directive, , The @code{override} Directive}).
@node Filename Functions, Foreach Function, Text Functions, Functions
@node File Name Functions, Foreach Function, Text Functions, Functions
@section Functions for File Names
@cindex functions, for file names
@cindex file name functions
@@ -5182,11 +5385,11 @@ file names.
For example,
@example
$(suffix src/foo.c hacks)
$(suffix src/foo.c src-1.0/bar.c hacks)
@end example
@noindent
produces the result @samp{.c}.
produces the result @samp{.c .c}.
@item $(basename @var{names}@dots{})
@findex basename
@@ -5194,15 +5397,16 @@ produces the result @samp{.c}.
@cindex file name, basename of
Extracts all but the suffix of each file name in @var{names}. If the
file name contains a period, the basename is everything starting up to
(and not including) the last period. Otherwise, the basename is the
entire file name. For example,
(and not including) the last period. Periods in the directory part are
ignored. If there is no period, the basename is the entire file name.
For example,
@example
$(basename src/foo.c hacks)
$(basename src/foo.c src-1.0/bar hacks)
@end example
@noindent
produces the result @samp{src/foo hacks}.
produces the result @samp{src/foo src-1.0/bar hacks}.
@c plural convention with dots (be consistent)
@item $(addsuffix @var{suffix},@var{names}@dots{})
@@ -5261,8 +5465,8 @@ was given to those two functions.@refill
@item $(word @var{n},@var{text})
@findex word
@cindex words, selecting
@cindex selecting words
@cindex word, selecting a
@cindex selecting a word
Returns the @var{n}th word of @var{text}. The legitimate values of
@var{n} start from 1. If @var{n} is bigger than the number of words
in @var{text}, the value is empty. For example,
@@ -5274,6 +5478,25 @@ $(word 2, foo bar baz)
@noindent
returns @samp{bar}.
@item $(wordlist @var{s},@var{e},@var{text})
@findex wordlist
@cindex words, selecting lists of
@cindex selecting word lists
Returns the list of words in @var{text} starting with word @var{s} and
ending with word @var{e} (inclusive). The legitimate values of @var{s}
and @var{e} start from 1. If @var{s} is bigger than the number of words
in @var{text}, the value is empty. If @var{e} is bigger than the number
of words in @var{text}, words up to the end of @var{text} are returned.
If @var{s} is greater than @var{e}, @code{make} swaps them for you. For
example,
@example
$(wordlist 2, 3, foo bar baz)
@end example
@noindent
returns @samp{bar baz}.
@c Following item phrased to prevent overfull hbox. --RJC 17 Jul 92
@item $(words @var{text})
@findex words
@@ -5310,7 +5533,7 @@ that match the pattern.
@xref{Wildcards, ,Using Wildcard Characters in File Names}.
@end table
@node Foreach Function, Origin Function, Filename Functions, Functions
@node Foreach Function, Origin Function, File Name Functions, Functions
@section The @code{foreach} Function
@findex foreach
@cindex words, iterating over
@@ -5523,8 +5746,10 @@ The @code{shell} function performs the same function that backquotes
(@samp{`}) perform in most shells: it does @dfn{command expansion}. This
means that it takes an argument that is a shell command and returns the
output of the command. The only processing @code{make} does on the result,
before substituting it into the surrounding text, is to convert newlines to
spaces.@refill
before substituting it into the surrounding text, is to convert each
newline or carriage-return / newline pair to a single space. It also
removes the trailing (carriage-return and) newline, if it's the last
thing in the result.@refill
The commands run by calls to the @code{shell} function are run when the
function calls are expanded. In most cases, this is when the makefile is
@@ -5639,6 +5864,28 @@ parsed as a switch or variable definition, respectively). Even
targets not in the makefile may be specified, if @code{make} can find
implicit rules that say how to make them.
@cindex @code{MAKECMDGOALS}
@vindex MAKECMDGOALS
@code{Make} will set the special variable @code{MAKECMDGOALS} to the
list of goals you specified on the command line. If no goals were given
on the command line, this variable is empty. Note that this variable
should be used only in special circumstances.
An example of appropriate use is to avoid including @file{.d} files
during @code{clean} rules (@pxref{Automatic Dependencies}), so
@code{make} won't create them only to immediately remove them
again:@refill
@example
@group
sources = foo.c bar.c
ifneq ($(MAKECMDGOALS),clean)
include $(sources:.c=.d)
endif
@end group
@end example
One use of specifying a goal is if you want to compile only a part of
the program, or only one of several programs. Specify as a goal each
file that you wish to remake. For example, consider a directory containing
@@ -6072,6 +6319,7 @@ argument, @code{make} runs as many jobs simultaneously as possible. If
there is more than one @samp{-j} option, the last one is effective.
@xref{Parallel, ,Parallel Execution},
for more information on how commands are run.
Note that this option is ignored on MS-DOS.
@item -k
@cindex @code{-k}
@@ -6289,7 +6537,7 @@ retained for compatibility.
* Last Resort:: How to defining commands for rules
which cannot find any.
* Suffix Rules:: The old-fashioned style of implicit rule.
* Search Algorithm:: The precise algorithm for applying
* Implicit Rule Search:: The precise algorithm for applying
implicit rules.
@end menu
@@ -6347,7 +6595,7 @@ result of another implicit rule, we say that @dfn{chaining} is occurring.
In general, @code{make} searches for an implicit rule for each target, and
for each double-colon rule, that has no commands. A file that is mentioned
only as a dependency is considered a target whose rule specifies nothing,
so implicit rule search happens for it. @xref{Search Algorithm, ,Implicit Rule Search Algorithm}, for the
so implicit rule search happens for it. @xref{Implicit Rule Search, ,Implicit Rule Search Algorithm}, for the
details of how the search is done.
Note that explicit dependencies do not influence implicit rule search.
@@ -6897,17 +7145,44 @@ mentioned in the makefile, along with the implicit rule that says how to
create it.@refill
Intermediate files are remade using their rules just like all other
files. The difference is that the intermediate file is deleted when
@code{make} is finished. Therefore, the intermediate file which did not
exist before @code{make} also does not exist after @code{make}. The
deletion is reported to you by printing a @samp{rm -f} command that
shows what @code{make} is doing. (You can list the target pattern of an
implicit rule (such as @samp{%.o}) as a dependency of the special
target @code{.PRECIOUS} to preserve intermediate files made by implicit
rules whose target patterns match that file's name;
see @ref{Interrupts}.)@refill
files. But intermediate files are treated differently in two ways.
The first difference is what happens if the intermediate file does not
exist. If an ordinary file @var{b} does not exist, and @code{make}
considers a target that depends on @var{b}, it invariably creates
@var{b} and then updates the target from @var{b}. But if @var{b} is an
intermediate file, then @code{make} can leave well enough alone. It
won't bother updating @var{b}, or the ultimate target, unless some
dependency of @var{b} is newer than that target or there is some other
reason to update that target.
The second difference is that if @code{make} @emph{does} create @var{b}
in order to update something else, it deletes @var{b} later on after it
is no longer needed. Therefore, an intermediate file which did not
exist before @code{make} also does not exist after @code{make}.
@code{make} reports the deletion to you by printing a @samp{rm -f}
command showing which file it is deleting.
Ordinarily, a file cannot be intermediate if it is mentioned in the
makefile as a target or dependency. However, you can explicitly mark a
file as intermediate by listing it as a dependency of the special target
@code{.INTERMEDIATE}. This takes effect even if the file is mentioned
explicitly in some other way.
@cindex intermediate files, preserving
@cindex preserving intermediate files
@cindex secondary files
You can prevent automatic deletion of an intermediate file by marking it
as a @dfn{secondary} file. To do this, list it as a dependency of the
special target @code{.SECONDARY}. When a file is secondary, @code{make}
will not create the file merely because it does not already exist, but
@code{make} does not automatically delete the file. Marking a file as
secondary also marks it as intermediate.
You can list the target pattern of an implicit rule (such as @samp{%.o})
as a dependency of the special target @code{.PRECIOUS} to preserve
intermediate files made by implicit rules whose target patterns match
that file's name; see @ref{Interrupts}.@refill
@cindex preserving with @code{.PRECIOUS}
@cindex @code{.PRECIOUS} intermediate files
@@ -7203,7 +7478,7 @@ variants that get just the file's directory name or just the file name
within the directory. The variant variables' names are formed by
appending @samp{D} or @samp{F}, respectively. These variants are
semi-obsolete in GNU @code{make} since the functions @code{dir} and
@code{notdir} can be used to get a similar effect (@pxref{Filename
@code{notdir} can be used to get a similar effect (@pxref{File Name
Functions, , Functions for File Names}). Note, however, that the
@samp{F} variants all omit the trailing slash which always appears in
the output of the @code{dir} function. Here is a table of the variants:
@@ -7458,7 +7733,7 @@ Commands, ,Defining Empty Commands}).@refill
You can use a last-resort rule to override part of another makefile.
@xref{Overriding Makefiles, , Overriding Part of Another Makefile}.
@node Suffix Rules, Search Algorithm, Last Resort, Implicit Rules
@node Suffix Rules, Implicit Rule Search, Last Resort, Implicit Rules
@section Old-Fashioned Suffix Rules
@cindex old-fashioned suffix rules
@cindex suffix rule
@@ -7560,7 +7835,7 @@ before @code{make} reads any makefiles. You can change the list of suffixes
with a rule for the special target @code{.SUFFIXES}, but that does not alter
this variable.
@node Search Algorithm, , Suffix Rules, Implicit Rules
@node Implicit Rule Search, , Suffix Rules, Implicit Rules
@section Implicit Rule Search Algorithm
@cindex implicit rule, search algorithm
@cindex search algorithm, implicit rule
@@ -8026,7 +8301,8 @@ multiple members in a single archive file comes from SunOS 4 @code{make}.
The @code{-include} directive to include makefiles with no error for a
nonexistent file comes from SunOS 4 @code{make}. (But note that SunOS 4
@code{make} does not allow multiple makefiles to be specified in one
@code{-include} directive.)
@code{-include} directive.) The same feature appears with the name
@code{sinclude} in SGI @code{make} and perhaps others.
@end itemize
The remaining features are inventions new in GNU @code{make}:
@@ -8108,6 +8384,10 @@ characters. In other versions of @code{make}, they must begin with
Keep track of the current level of @code{make} recursion using the
variable @code{MAKELEVEL}. @xref{Recursion, ,Recursive Use of @code{make}}.
@item
Provide any goals given on the command line in the variable
@code{MAKECMDGOALS}. @xref{Goals, ,Arguments to Specify the Goals}.
@item
Specify static pattern rules. @xref{Static Pattern, ,Static Pattern Rules}.
@@ -8372,43 +8652,43 @@ Sort the words in @var{list} lexicographically, removing duplicates.@*
@item $(dir @var{names}@dots{})
Extract the directory part of each file name.@*
@xref{Filename Functions, ,Functions for File Names}.
@xref{File Name Functions, ,Functions for File Names}.
@item $(notdir @var{names}@dots{})
Extract the non-directory part of each file name.@*
@xref{Filename Functions, ,Functions for File Names}.
@xref{File Name Functions, ,Functions for File Names}.
@item $(suffix @var{names}@dots{})
Extract the suffix (the last @samp{.} and following characters) of each file name.@*
@xref{Filename Functions, ,Functions for File Names}.
@xref{File Name Functions, ,Functions for File Names}.
@item $(basename @var{names}@dots{})
Extract the base name (name without suffix) of each file name.@*
@xref{Filename Functions, ,Functions for File Names}.
@xref{File Name Functions, ,Functions for File Names}.
@item $(addsuffix @var{suffix},@var{names}@dots{})
Append @var{suffix} to each word in @var{names}.@*
@xref{Filename Functions, ,Functions for File Names}.
@xref{File Name Functions, ,Functions for File Names}.
@item $(addprefix @var{prefix},@var{names}@dots{})
Prepend @var{prefix} to each word in @var{names}.@*
@xref{Filename Functions, ,Functions for File Names}.
@xref{File Name Functions, ,Functions for File Names}.
@item $(join @var{list1},@var{list2})
Join two parallel lists of words.@*
@xref{Filename Functions, ,Functions for File Names}.
@xref{File Name Functions, ,Functions for File Names}.
@item $(word @var{n},@var{text})
Extract the @var{n}th word (one-origin) of @var{text}.@*
@xref{Filename Functions, ,Functions for File Names}.
@xref{File Name Functions, ,Functions for File Names}.
@item $(words @var{text})
Count the number of words in @var{text}.@*
@xref{Filename Functions, ,Functions for File Names}.
@xref{File Name Functions, ,Functions for File Names}.
@item $(firstword @var{names}@dots{})
Extract the first word of @var{names}.@*
@xref{Filename Functions, ,Functions for File Names}.
@xref{File Name Functions, ,Functions for File Names}.
@item $(wildcard @var{pattern}@dots{})
Find file names matching a shell file name pattern (@emph{not} a
@@ -8512,6 +8792,12 @@ The name of the system default command interpreter, usually @file{/bin/sh}.
You can set @code{SHELL} in the makefile to change the shell used to run
commands. @xref{Execution, ,Command Execution}.
@item MAKESHELL
On MS-DOS only, the name of the command interpreter that is to be used
by @code{make}. This value takes precedence over the value of
@code{SHELL}. @xref{Execution, ,MAKESHELL variable}.
@item MAKE
The name with which @code{make} was invoked.
@@ -8529,6 +8815,12 @@ The flags given to @code{make}. You can set this in the environment or
a makefile to set flags.@*
@xref{Options/Recursion, ,Communicating Options to a Sub-@code{make}}.
@item MAKECMDGOALS
The targets given to @code{make} on the command line. Setting this
variable has no effect on the operation of @code{make}.@*
@xref{Goals, ,Arguments to Specify the Goals}.
@item SUFFIXES
The default list of suffixes before @code{make} reads any makefiles.

34
makefile.com Normal file
View File

@@ -0,0 +1,34 @@
$!
$! Makefile.com - builds GNU Make for VMS
$!
$! P1 is non-empty if you want to link with the VAXCRTL library instead
$! of the shareable executable
$!
$ def/nolog sys sys$library:
$ filelist = "alloca ar arscan commands default dir expand file function implicit job main misc read remake remote-stub rule signame variable version vmsfunctions vmsify vpath [.glob]glob [.glob]fnmatch getopt getopt1"
$ copy config.h-vms config.h
$ n=0
$ loop:
$ cfile = f$elem(n," ",filelist)
$ if cfile .eqs. " " then goto linkit
$ write sys$output "Compiling ''cfile'..."
$ call compileit 'cfile' 'p1'
$ n = n + 1
$ goto loop
$ linkit:
$ if p1 .nes. "" then goto link_using_library
$ link/exe=make alloca,ar,arscan,commands,default,dir,expand,file,function,-
implicit,job,main,misc,read,remake,remote-stub,rule,-
signame,variable,version,vmsfunctions,vmsify,vpath,-
glob,fnmatch,getopt,getopt1
$ exit
$ link_using_library:
$ link/exe=make alloca,ar,arscan,commands,default,dir,expand,file,function,-
implicit,job,main,misc,read,remake,remote-stub,rule,-
signame,variable,version,vmsfunctions,vmsify,vpath,-
glob,fnmatch,getopt,getopt1,sys$library:vaxcrtl/lib
$!
$ compileit : subroutine
$ cc/include=([],[.glob])/define=("allocated_variable_expand_for_file=alloc_var_expand_for_file","unlink=remove","HAVE_CONFIG_H","VMS") 'p1'
$ exit
$ endsubroutine : compileit

121
makefile.vms Normal file
View File

@@ -0,0 +1,121 @@
# Copyright (C) 1988, 1989, 1996, 1997 Free Software Foundation, Inc.
# This file is part of GNU Make.
#
# VMS extensions from GNU Make 3.60 imported by
# Klaus Kämpf (kkaempf@progis.de) of proGIS Software, Aachen, Germany
#
# 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, 675 Mass Ave, Cambridge, MA 02139, USA.
CC = cc/warn
CP = copy
%.obj: %.c
$(CC) $(CFLAGS)/obj=$@ $<
#
# Makefile for GNU Make
#
CFLAGS = $(defines) /debug/noopt/include=([],[.glob])
#LDFLAGS = /deb
LDFLAGS =
defines = /define=("unlink=remove","HAVE_CONFIG_H","VMS","allocated_variable_expand_for_file=alloc_var_expand_for_file")
LOAD_AVG = /define="NO_LDAV"
# If you don't want archive support, comment these out.
ARCHIVES = ,ar.obj,arscan.obj
ARCHIVES_SRC = ar.c arscan.c
# If your system needs extra libraries loaded in, define them here.
# System V probably need -lPW for alloca.
# if on vax, uncomment the following line
#LOADLIBES = ,c.opt/opt
LOADLIBES =,sys$$library:vaxcrtl.olb/lib
# If your system doesn't have alloca, or the one provided is bad,
# get it from the Emacs distribution and define these.
ALLOCA = ,alloca.obj
ALLOCASRC = alloca.c
# If there are remote execution facilities defined,
# enable them with switches here (see remote-*.c).
REMOTE =
# Any extra object files your system needs.
extras = ,signame.obj,remote-stub.obj,vmsfunctions.obj,vmsify.obj
#,directory.obj
# as an alternative:
glob = ,[.glob]glob.obj,[.glob]fnmatch.obj
getopt = ,getopt.obj,getopt1.obj
# Directory to install `make' in.
bindir = []
# Directory to install the man page in.
mandir = []
# Number to put on the man page filename.
manext = 1
objs = commands.obj,job.obj,dir.obj,file.obj,misc.obj,\
main.obj,read.obj,remake.obj,rule.obj,implicit.obj,\
default.obj,variable.obj,expand.obj,function.obj,\
vpath.obj,version.obj$(ARCHIVES)$(ALLOCA)$(extras)$(getopt)$(glob)
srcs = commands.c job.c dir.c file.c misc.c \
main.c read.c remake.c rule.c implicit.c \
default.c variable.c expand.c function.c \
vpath.c version.c vmsfunctions.c vmsify.c $(ARCHIVES_SRC) $(ALLOCASRC) \
commands.h dep.h filedef.h job.h make.h rule.h variable.h
.PHONY: all doc
all: config.h make.exe
doc: make.info make.dvi
make.exe: $(objs)
$(LD)$(LDFLAGS)/exe=$@ $^$(LOADLIBES)
.PHONY: clean realclean
clean:
-$(RM) make.exe;,*.obj;*
# Automatically generated dependencies.
commands.obj: commands.c make.h dep.h commands.h filedef.h variable.h job.h
job.obj: job.c make.h commands.h job.h filedef.h variable.h
dir.obj: dir.c make.h
file.obj: file.c make.h commands.h dep.h filedef.h variable.h
misc.obj: misc.c make.h dep.h
main.obj: main.c make.h commands.h dep.h filedef.h variable.h job.h
read.obj: read.c make.h commands.h dep.h filedef.h variable.h
remake.obj: remake.c make.h commands.h job.h dep.h filedef.h
rule.obj: rule.c make.h commands.h dep.h filedef.h variable.h rule.h
implicit.obj: implicit.c make.h rule.h dep.h filedef.h
default.obj: default.c make.h rule.h dep.h filedef.h commands.h variable.h
variable.obj: variable.c make.h commands.h variable.h dep.h filedef.h
expand.obj: expand.c make.h commands.h filedef.h variable.h
function.obj: function.c make.h variable.h dep.h commands.h job.h
vpath.obj: vpath.c make.h filedef.h variable.h
version.obj: version.c
arscan.obj: arscan.c
ar.obj: ar.c make.h filedef.h
signame.obj: signame.c
remote-stub.obj: remote-stub.c
[.glob]glob.obj: [.glob]glob.c
[.glob]fnmatch.obj: [.glob]fnmatch.c
getopt.obj: getopt.c
getopt1.obj: getopt1.c
config.h: config.h-vms
$(CP) $< $@

37
misc.c
View File

@@ -1,5 +1,5 @@
/* Miscellaneous generic support functions for GNU Make.
Copyright (C) 1988, 89, 90, 91, 92, 93, 94, 1995 Free Software Foundation, Inc.
Copyright (C) 1988,89,90,91,92,93,94,95,97 Free Software Foundation, Inc.
This file is part of GNU Make.
GNU Make is free software; you can redistribute it and/or modify
@@ -271,7 +271,9 @@ strerror (errnum)
int errnum;
{
extern int errno, sys_nerr;
#ifndef __DECC
extern char *sys_errlist[];
#endif
static char buf[] = "Unknown error 12345678901234567890";
if (errno < sys_nerr)
@@ -395,6 +397,37 @@ end_of_token (s)
return s;
}
#ifdef WINDOWS32
/*
* Same as end_of_token, but take into account a stop character
*/
char *
end_of_token_w32 (s, stopchar)
char *s;
char stopchar;
{
register char *p = s;
register int backslash = 0;
while (*p != '\0' && *p != stopchar && (backslash || !isblank (*p)))
{
if (*p++ == '\\')
{
backslash = !backslash;
while (*p == '\\')
{
backslash = !backslash;
++p;
}
}
else
backslash = 0;
}
return p;
}
#endif
/* Return the address of the first nonwhitespace or null in the string S. */
char *
@@ -540,6 +573,7 @@ log_access (flavor)
static void
init_access ()
{
#ifndef VMS
user_uid = getuid ();
user_gid = getgid ();
@@ -553,6 +587,7 @@ init_access ()
log_access ("Initialized");
current_access = make;
#endif
}
#endif /* GETLOADAVG_PRIVILEGED */

315
read.c
View File

@@ -1,5 +1,5 @@
/* Reading and parsing of makefiles for GNU Make.
Copyright (C) 1988, 89, 90, 91, 92, 93, 94, 1995 Free Software Foundation, Inc.
Copyright (C) 1988,89,90,91,92,93,94,95,96,97 Free Software Foundation, Inc.
This file is part of GNU Make.
GNU Make is free software; you can redistribute it and/or modify
@@ -17,9 +17,10 @@ along with GNU Make; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "make.h"
#include "commands.h"
#include "dep.h"
#include "file.h"
#include "filedef.h"
#include "job.h"
#include "commands.h"
#include "variable.h"
/* This is POSIX.2, but most systems using -DPOSIX probably don't have it. */
@@ -29,15 +30,15 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "glob/glob.h"
#endif
#ifndef WINDOWS32
#ifndef _AMIGA
#ifndef VMS
#include <pwd.h>
struct passwd *getpwnam ();
static int read_makefile ();
static unsigned int readline (), do_define ();
static int conditional_line ();
static void record_files ();
#else
struct passwd *getpwnam PARAMS ((char *name));
#endif
#endif
#endif /* !WINDOWS32 */
/* A `struct linebuffer' is a structure which holds a line of text.
`readline' reads a line from a stream into a linebuffer
@@ -80,10 +81,19 @@ static struct conditionals *conditionals = &toplevel_conditionals;
static char *default_include_directories[] =
{
#if defined(WINDOWS32) && !defined(INCLUDEDIR)
/*
* This completly up to the user when they install MSVC or other packages.
* This is defined as a placeholder.
*/
#define INCLUDEDIR "."
#endif
INCLUDEDIR,
#ifndef _AMIGA
"/usr/gnu/include",
"/usr/local/include",
"/usr/include",
#endif
0
};
@@ -104,6 +114,17 @@ unsigned int *reading_lineno_ptr;
/* The chain of makefiles read by read_makefile. */
static struct dep *read_makefiles = 0;
static int read_makefile PARAMS ((char *filename, int flags));
static unsigned int readline PARAMS ((struct linebuffer *linebuffer, FILE *stream,
char *filename, unsigned int lineno));
static unsigned int do_define PARAMS ((char *name, unsigned int namelen, enum variable_origin origin,
unsigned int lineno, FILE *infile, char *filename));
static int conditional_line PARAMS ((char *line, char *filename, unsigned int lineno));
static void record_files PARAMS ((struct nameseq *filenames, char *pattern, char *pattern_percent,
struct dep *deps, unsigned int commands_started, char *commands,
unsigned int commands_idx, int two_colon, char *filename,
unsigned int lineno, int set_default));
/* Read in all the makefiles and return the chain of their names. */
@@ -138,6 +159,7 @@ read_all_makefiles (makefiles)
/* Set NAME to the start of next token and LENGTH to its length.
MAKEFILES is updated for finding remaining tokens. */
p = value;
while ((name = find_next_token (&p, &length)) != 0)
{
if (*p != '\0')
@@ -176,7 +198,16 @@ read_all_makefiles (makefiles)
if (num_makefiles == 0)
{
static char *default_makefiles[] =
#ifdef VMS
/* all lower case since readdir() (the vms version) 'lowercasifies' */
{ "makefile.vms", "gnumakefile", "makefile", 0 };
#else
#ifdef _AMIGA
{ "GNUmakefile", "Makefile", "SMakefile", 0 };
#else /* !Amiga && !VMS */
{ "GNUmakefile", "makefile", "Makefile", 0 };
#endif /* AMIGA */
#endif /* VMS */
register char **p = default_makefiles;
while (*p != 0 && !file_exists_p (*p))
++p;
@@ -240,6 +271,7 @@ read_makefile (filename, flags)
unsigned int commands_started;
register char *p;
char *p2;
int len;
int ignoring = 0, in_ignored_define = 0;
int no_targets = 0; /* Set when reading a rule without targets. */
char *passed_filename = filename;
@@ -252,6 +284,9 @@ read_makefile (filename, flags)
char *pattern = 0, *pattern_percent;
int makefile_errno;
#if defined (WINDOWS32) || defined (__MSDOS__)
int check_again;
#endif
#define record_waiting_files() \
do \
@@ -269,6 +304,8 @@ read_makefile (filename, flags)
#ifdef lint /* Suppress `used before set' messages. */
two_colon = 0;
#endif
pattern_percent = 0;
commands_started = lineno;
if (debug_flag)
{
@@ -302,7 +339,6 @@ read_makefile (filename, flags)
/* If the makefile wasn't found and it's either a makefile from
the `MAKEFILES' variable or an included makefile,
search the included makefile search path for this makefile. */
if (infile == 0 && (flags & RM_INCLUDED) && *filename != '/')
{
register unsigned int i;
@@ -418,8 +454,7 @@ read_makefile (filename, flags)
remove_comments (collapsed);
/* strncmp is first to avoid dereferencing out into space. */
#define word1eq(s, l) (!strncmp (s, p, l) \
&& (p[l] == '\0' || isblank (p[l])))
#define word1eq(s, l) (len == l && !strncmp (s, p, l))
p = collapsed;
while (isspace (*p))
++p;
@@ -427,6 +462,21 @@ read_makefile (filename, flags)
/* This line is completely empty. */
continue;
/* Find the end of the first token */
for (p2 = p+1; *p2 != '\0' && !isspace(*p2); ++p2)
{}
len = p2 - p;
/* Find the start of the second token. If it's a `:', jump past
preprocessor stuff since it can't be that--this allows targets named
`export', etc. */
while (isspace (*p2))
++p2;
if (*p2 == '\0')
p2 = NULL;
else if (p2[0] == ':' && p2[1] == '\0')
goto check_var;
/* We must first check for conditional and `define' directives before
ignoring anything, since they control what we will do with
following lines. */
@@ -544,15 +594,38 @@ read_makefile (filename, flags)
v->export = v_noexport;
}
}
else if (word1eq ("include", 7) || word1eq ("-include", 8))
else if (word1eq ("vpath", 5))
{
char *pattern;
unsigned int len;
p2 = variable_expand (p + 5);
p = find_next_token (&p2, &len);
if (p != 0)
{
pattern = savestring (p, len);
p = find_next_token (&p2, &len);
/* No searchpath means remove all previous
selective VPATH's with the same pattern. */
}
else
/* No pattern means remove all previous selective VPATH's. */
pattern = 0;
construct_vpath_list (pattern, p);
if (pattern != 0)
free (pattern);
}
else
check_var:
if (word1eq ("include", 7) || word1eq ("-include", 8)
|| word1eq ("sinclude", 8))
{
/* We have found an `include' line specifying a nested
makefile to be read at this point. */
struct conditionals *save, new_conditionals;
struct nameseq *files;
/* "-include" (vs "include") says no
error if the file does not exist. */
int noerror = p[0] == '-';
/* "-include" (vs "include") says no error if the file does not
exist. "sinclude" is an alias for this from SGI. */
int noerror = p[0] != 'i';
p = allocated_variable_expand (next_token (p + (noerror ? 9 : 8)));
if (*p == '\0')
@@ -586,7 +659,7 @@ read_makefile (filename, flags)
{
struct nameseq *next = files->next;
char *name = files->name;
free (files);
free ((char *)files);
files = next;
if (! read_makefile (name, (RM_INCLUDED | RM_NO_TILDE
@@ -607,26 +680,6 @@ read_makefile (filename, flags)
reading_filename = filename;
reading_lineno_ptr = &lineno;
}
else if (word1eq ("vpath", 5))
{
char *pattern;
unsigned int len;
p2 = variable_expand (p + 5);
p = find_next_token (&p2, &len);
if (p != 0)
{
pattern = savestring (p, len);
p = find_next_token (&p2, &len);
/* No searchpath means remove all previous
selective VPATH's with the same pattern. */
}
else
/* No pattern means remove all previous selective VPATH's. */
pattern = 0;
construct_vpath_list (pattern, p);
if (pattern != 0)
free (pattern);
}
#undef word1eq
else if (try_variable_definition (filename, lineno, p, o_file))
/* This line has been dealt with. */
@@ -729,10 +782,31 @@ read_makefile (filename, flags)
else
break;
}
#ifdef __MSDOS__
/* For MS-DOS, skip a "C:\...". */
if (p != 0 && p[1] == '\\' && isalpha (p[-1]))
#ifdef _AMIGA
/* Here, the situation is quite complicated. Let's have a look
at a couple of targets:
install: dev:make
dev:make: make
dev:make:: xyz
The rule is that it's only a target, if there are TWO :'s
OR a space around the :.
*/
if (p && !(isspace(p[1]) || !p[1] || isspace(p[-1])))
p = 0;
#endif
#if defined (WINDOWS32) || defined (__MSDOS__)
do {
check_again = 0;
/* For MSDOS and WINDOWS32, skip a "C:\..." or a "C:/..." */
if (p != 0 && (p[1] == '\\' || p[1] == '/') && isalpha (p[-1])) {
p = index(p + 1, ':');
check_again = 1;
}
} while (check_again);
#endif
if (p != 0)
{
@@ -833,13 +907,17 @@ do_define (name, namelen, origin, lineno, infile, filename)
initbuffer (&lb);
while (!feof (infile))
{
unsigned int len;
lineno += nlines;
nlines = readline (&lb, infile, filename, lineno);
collapse_continuations (lb.buffer);
p = next_token (lb.buffer);
if ((p[5] == '\0' || isblank (p[5])) && !strncmp (p, "endef", 5))
len = strlen (p);
if ((len == 5 || (len > 5 && isblank (p[5])))
&& !strncmp (p, "endef", 5))
{
p += 5;
remove_comments (p);
@@ -854,12 +932,11 @@ do_define (name, namelen, origin, lineno, infile, filename)
(void) define_variable (var, strlen (var), definition, origin, 1);
free (definition);
freebuffer (&lb);
return lineno;
return (lineno + nlines);
}
else
{
unsigned int len = strlen (lb.buffer);
len = strlen (lb.buffer);
/* Increase the buffer size if necessary. */
if (idx + len + 1 > length)
{
@@ -1030,7 +1107,16 @@ conditional_line (line, filename, lineno)
if (*line == '\0')
return -1;
*line++ = '\0';
if (termin == ',')
{
/* Strip blanks after the first string. */
char *p = line++;
while (isblank (p[-1]))
--p;
*p = '\0';
}
else
*line++ = '\0';
s2 = variable_expand (s1);
/* We must allocate a new copy of the expanded string because
@@ -1303,7 +1389,7 @@ record_files (filenames, pattern, pattern_percent, deps, commands_started,
{
struct dep *nextd = d->next;
free (d->name);
free (d);
free ((char *)d);
d = nextd;
}
f->deps = 0;
@@ -1392,7 +1478,11 @@ record_files (filenames, pattern, pattern_percent, deps, commands_started,
/* See if this is first target seen whose name does
not start with a `.', unless it contains a slash. */
if (default_goal_file == 0 && set_default
&& (*name != '.' || index (name, '/') != 0))
&& (*name != '.' || index (name, '/') != 0
#ifdef __MSDOS__
|| index (name, '\\') != 0
#endif
))
{
int reject = 0;
@@ -1448,7 +1538,7 @@ find_char_unquote (string, stopchars, blank)
char *stopchars;
int blank;
{
unsigned int string_len = strlen (string);
unsigned int string_len = 0;
register char *p = string;
while (1)
@@ -1466,6 +1556,9 @@ find_char_unquote (string, stopchars, blank)
while (&p[i] >= string && p[i] == '\\')
--i;
++i;
/* Only compute the length if really needed. */
if (string_len == 0)
string_len = strlen (string);
/* The number of backslashes is now -I.
Copy P over itself to swallow half of them. */
bcopy (&p[i / 2], &p[i], (string_len - (p - string)) - (i / 2) + 1);
@@ -1511,7 +1604,7 @@ find_percent (pattern)
struct nameseq *
parse_file_seq (stringp, stopchar, size, strip)
char **stringp;
char stopchar;
int stopchar;
unsigned int size;
int strip;
{
@@ -1520,9 +1613,16 @@ parse_file_seq (stringp, stopchar, size, strip)
register char *p = *stringp;
char *q;
char *name;
char stopchars[2];
char stopchars[3];
#ifdef VMS
stopchars[0] = ',';
stopchars[1] = stopchar;
stopchars[2] = '\0';
#else
stopchars[0] = stopchar;
stopchars[1] = '\0';
#endif
while (1)
{
@@ -1532,20 +1632,51 @@ parse_file_seq (stringp, stopchar, size, strip)
break;
if (*p == stopchar)
break;
/* Yes, find end of next name. */
q = p;
p = find_char_unquote (q, stopchars, 1);
#ifdef VMS
/* convert comma separated list to space separated */
if (p && *p == ',')
*p =' ';
#endif
#ifdef __MSDOS__
/* For MS-DOS, skip a "C:\...". */
if (stopchar == ':' && p != 0 && p[1] == '\\' && isalpha (p[-1]))
p = 0;
/* For MS-DOS, skip a "C:\..." or a "C:/..." until we find a
first colon which isn't followed by a slash or a backslash. */
if (stopchar == ':')
while (p != 0 && (p[1] == '\\' || p[1] == '/') && isalpha (p[-1]))
p = find_char_unquote (p + 1, stopchars, 1);
#endif
#ifdef _AMIGA
if (stopchar == ':' && p && *p == ':' &&
!(isspace(p[1]) || !p[1] || isspace(p[-1])))
{
p = find_char_unquote (p+1, stopchars, 1);
}
#endif
#ifdef WINDOWS32
/* For WINDOWS32, skip a "C:\..." or "C:/...". */
if (stopchar == ':' &&
p != 0 &&
(p[1] == '\\' || p[1] == '/') &&
isalpha (p[-1])) {
p = end_of_token_w32(++p, ':');
if (*p == '\0' && p[-1] == ':')
p--;
}
#endif
if (p == 0)
p = q + strlen (q);
if (strip)
#ifdef VMS
/* Skip leading `[]'s. */
while (p - q > 2 && q[0] == '[' && q[1] == ']')
#else
/* Skip leading `./'s. */
while (p - q > 2 && q[0] == '.' && q[1] == '/')
#endif
{
q += 2; /* Skip "./". */
while (q < p && *q == '/')
@@ -1556,10 +1687,44 @@ parse_file_seq (stringp, stopchar, size, strip)
/* Extract the filename just found, and skip it. */
if (q == p)
/* ".///" was stripped to "". */
/* ".///" was stripped to "". */
#ifdef VMS
continue;
#else
#ifdef _AMIGA
name = savestring ("", 0);
#else
name = savestring ("./", 2);
#endif
#endif
else
#ifdef VMS
/* VMS filenames can have a ':' in them but they have to be '\'ed but we need
* to remove this '\' before we can use the filename.
* Savestring called because q may be read-only string constant.
*/
{
char *qbase = savestring(q, strlen(q));
char *pbase = qbase + (p-q);
char *q1 = qbase;
char *q2 = q1;
char *p1 = pbase;
while (q1 != pbase)
{
if (*q1 == '\\' && *(q1+1) == ':')
{
q1++;
p1--;
}
*q2++ = *q1++;
}
name = savestring (qbase, p1 - qbase);
free (qbase);
}
#else
name = savestring (q, p - q);
#endif
/* Add it to the front of the chain. */
new1 = (struct nameseq *) xmalloc (size);
@@ -1787,8 +1952,11 @@ construct_include_path (arg_dirs)
char **arg_dirs;
{
register unsigned int i;
#ifdef VAXC /* just don't ask ... */
stat_t stbuf;
#else
struct stat stbuf;
#endif
/* Table to hold the dirs. */
register unsigned int defsize = (sizeof (default_include_directories)
@@ -1797,6 +1965,10 @@ construct_include_path (arg_dirs)
register char **dirs = (char **) xmalloc ((5 + defsize) * sizeof (char *));
register unsigned int idx = 0;
#ifdef __MSDOS__
defsize++;
#endif
/* First consider any dirs specified with -I switches.
Ignore dirs that don't exist. */
@@ -1828,6 +2000,22 @@ construct_include_path (arg_dirs)
/* Now add at the end the standard default dirs. */
#ifdef __MSDOS__
{
/* The environment variable $DJDIR holds the root of the
DJGPP directory tree; add ${DJDIR}/include. */
struct variable *djdir = lookup_variable ("DJDIR", 5);
if (djdir)
{
char *defdir = (char *) xmalloc (strlen (djdir->value) + 8 + 1);
strcat (strcpy (defdir, djdir->value), "/include");
dirs[idx++] = defdir;
}
}
#endif
for (i = 0; default_include_directories[i] != 0; ++i)
if (stat (default_include_directories[i], &stbuf) == 0
&& S_ISDIR (stbuf.st_mode))
@@ -1860,6 +2048,7 @@ char *
tilde_expand (name)
char *name;
{
#ifndef VMS
if (name[1] == '/' || name[1] == '\0')
{
extern char *getenv ();
@@ -1882,6 +2071,7 @@ tilde_expand (name)
free (home_dir);
home_dir = getenv ("HOME");
}
#if !defined(_AMIGA) && !defined(WINDOWS32)
if (home_dir == 0 || home_dir[0] == '\0')
{
extern char *getlogin ();
@@ -1894,6 +2084,7 @@ tilde_expand (name)
home_dir = p->pw_dir;
}
}
#endif /* !AMIGA && !WINDOWS32 */
if (home_dir != 0)
{
char *new = concat (home_dir, "", name + 1);
@@ -1902,6 +2093,7 @@ tilde_expand (name)
return new;
}
}
#if !defined(_AMIGA) && !defined(WINDOWS32)
else
{
struct passwd *pwent;
@@ -1919,7 +2111,8 @@ tilde_expand (name)
else if (userend != 0)
*userend = '/';
}
#endif /* !AMIGA && !WINDOWS32 */
#endif /* !VMS */
return 0;
}
@@ -1979,7 +2172,7 @@ multi_glob (chain, size)
}
else
memname = 0;
#endif
#endif /* !NO_ARCHIVES */
switch (glob (old->name, GLOB_NOCHECK|GLOB_ALTDIRFUNC, NULL, &gl))
{
@@ -2026,7 +2219,7 @@ multi_glob (chain, size)
free (memname);
}
else
#endif
#endif /* !NO_ARCHIVES */
{
struct nameseq *elt = (struct nameseq *) xmalloc (size);
elt->name = savestring (gl.gl_pathv[i],
@@ -2037,7 +2230,7 @@ multi_glob (chain, size)
}
globfree (&gl);
free (old->name);
free (old);
free ((char *)old);
break;
}

57
readme.vms Normal file
View File

@@ -0,0 +1,57 @@
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@progis.de> of
proGIS Software, Aachen, Germany.
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 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.

273
remake.c
View File

@@ -1,5 +1,5 @@
/* Basic dependency engine for GNU Make.
Copyright (C) 1988,89,90,91,92,93,94,95,96 Free Software Foundation, Inc.
Copyright (C) 1988,89,90,91,92,93,94,95,96,97 Free Software Foundation, Inc.
This file is part of GNU Make.
GNU Make is free software; you can redistribute it and/or modify
@@ -17,10 +17,10 @@ along with GNU Make; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "make.h"
#include "commands.h"
#include "filedef.h"
#include "job.h"
#include "commands.h"
#include "dep.h"
#include "file.h"
#include <assert.h>
#ifdef HAVE_FCNTL_H
@@ -29,17 +29,33 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include <sys/file.h>
#endif
extern int try_implicit_rule ();
#ifdef __MSDOS__
#include "variable.h"
#endif
#ifdef VMS
#include <starlet.h>
#endif
#ifdef WINDOWS32
#include <io.h>
#endif
extern int try_implicit_rule PARAMS ((struct file *file, unsigned int depth));
/* Incremented when a command is started (under -n, when one would be). */
unsigned int commands_started = 0;
static int update_file (), update_file_1 (), check_dep (), touch_file ();
static void remake_file ();
static time_t name_mtime ();
static int library_search ();
extern time_t f_mtime ();
static int update_file PARAMS ((struct file *file, unsigned int depth));
static int update_file_1 PARAMS ((struct file *file, unsigned int depth));
static int check_dep PARAMS ((struct file *file, unsigned int depth, time_t this_mtime, int *must_make_ptr));
static int touch_file PARAMS ((struct file *file));
static void remake_file PARAMS ((struct file *file));
static time_t name_mtime PARAMS ((char *name));
static int library_search PARAMS ((char **lib, time_t *mtime_ptr));
extern time_t f_mtime PARAMS ((struct file *file, int search));
/* Remake all the goals in the `struct dep' chain GOALS. Return -1 if nothing
was done, 0 if all goals were updated successfully, or 1 if a goal failed.
@@ -100,6 +116,7 @@ update_goal_chain (goals, makefiles)
/* Iterate over all double-colon entries for this file. */
struct file *file = g->file;
int stop, any_not_updated = 0;
for (file = g->file->double_colon ? g->file->double_colon : g->file;
file != NULL;
file = file->prev)
@@ -108,7 +125,6 @@ update_goal_chain (goals, makefiles)
int x;
time_t mtime = MTIME (file);
check_renamed (file);
if (makefiles)
{
if (file->cmd_target)
@@ -229,7 +245,6 @@ update_goal_chain (goals, makefiles)
just_print_flag = n;
job_slots = j;
}
return status;
}
@@ -551,13 +566,46 @@ update_file_1 (file, depth)
if (!must_make)
{
DEBUGPR ("No need to remake target `%s'.\n");
if (debug_flag)
{
print_spaces(depth);
printf("No need to remake target `%s'", file->name);
if (!streq(file->name, file->hname))
printf("; using VPATH name `%s'", file->hname);
printf(".\n");
fflush(stdout);
}
notice_finished_file (file);
/* Since we don't need to remake the file, convert it to use the
VPATH filename if we found one. hfile will be either the
local name if no VPATH or the VPATH name if one was found. */
while (file)
{
file->name = file->hname;
file = file->prev;
}
return 0;
}
DEBUGPR ("Must remake target `%s'.\n");
/* It needs to be remade. If it's VPATH and not reset via GPATH, toss the
VPATH */
if (!streq(file->name, file->hname))
{
if (debug_flag)
{
print_spaces (depth);
printf(" Ignoring VPATH name `%s'.\n", file->hname);
fflush(stdout);
}
file->ignore_vpath = 1;
}
/* Now, take appropriate actions to remake the file. */
remake_file (file);
@@ -706,49 +754,78 @@ check_dep (file, depth, this_mtime, must_make_ptr)
}
else
{
/* FILE is an intermediate file.
Update all non-intermediate files we depend on, if necessary,
and see whether any of them is more recent than the file
on whose behalf we are checking. */
register struct dep *lastd;
lastd = 0;
d = file->deps;
while (d != 0)
/* FILE is an intermediate file. */
time_t mtime;
if (!file->phony && file->cmds == 0 && !file->tried_implicit
&& file->secondary)
{
if (d->file->updating)
if (try_implicit_rule (file, depth))
DEBUGPR ("Found an implicit rule for `%s'.\n");
else
DEBUGPR ("No implicit rule found for `%s'.\n");
file->tried_implicit = 1;
}
if (file->cmds == 0 && !file->is_target && file->secondary
&& default_file != 0 && default_file->cmds != 0)
{
DEBUGPR ("Using default commands for `%s'.\n");
file->cmds = default_file->cmds;
}
/* If the intermediate file actually exists
and is newer, then we should remake from it. */
check_renamed (file);
mtime = file_mtime (file);
check_renamed (file);
if (mtime != (time_t) -1 && mtime > this_mtime)
*must_make_ptr = 1;
/* Otherwise, update all non-intermediate files we depend on,
if necessary, and see whether any of them is more
recent than the file on whose behalf we are checking. */
else
{
register struct dep *lastd;
lastd = 0;
d = file->deps;
while (d != 0)
{
error ("Circular %s <- %s dependency dropped.",
file->name, d->file->name);
if (lastd == 0)
if (d->file->updating)
{
file->deps = d->next;
free ((char *) d);
d = file->deps;
error ("Circular %s <- %s dependency dropped.",
file->name, d->file->name);
if (lastd == 0)
{
file->deps = d->next;
free ((char *) d);
d = file->deps;
}
else
{
lastd->next = d->next;
free ((char *) d);
d = lastd->next;
}
continue;
}
else
{
lastd->next = d->next;
free ((char *) d);
d = lastd->next;
}
continue;
d->file->parent = file;
dep_status |= check_dep (d->file, depth, this_mtime, must_make_ptr);
check_renamed (d->file);
if (dep_status != 0 && !keep_going_flag)
break;
if (d->file->command_state == cs_running
|| d->file->command_state == cs_deps_running)
/* Record that some of FILE's dependencies are still being made.
This tells the upper levels to wait on processing it until
the commands are finished. */
set_command_state (file, cs_deps_running);
lastd = d;
d = d->next;
}
d->file->parent = file;
dep_status |= check_dep (d->file, depth, this_mtime, must_make_ptr);
check_renamed (d->file);
if (dep_status != 0 && !keep_going_flag)
break;
if (d->file->command_state == cs_running
|| d->file->command_state == cs_deps_running)
/* Record that some of FILE's dependencies are still being made.
This tells the upper levels to wait on processing it until
the commands are finished. */
set_command_state (file, cs_deps_running);
lastd = d;
d = d->next;
}
}
@@ -959,7 +1036,7 @@ f_mtime (file, search)
{
mtime = name_mtime (file->name);
if (mtime == (time_t) -1 && search)
if (mtime == (time_t) -1 && search && !file->ignore_vpath)
{
/* If name_mtime failed, search VPATH. */
char *name = file->name;
@@ -972,9 +1049,20 @@ f_mtime (file, search)
/* vpath_search and library_search store zero in MTIME
if they didn't need to do a stat call for their work. */
file->last_mtime = mtime;
rename_file (file, name);
/* If we found it in VPATH, see if it's in GPATH too; if so,
change the name right now; if not, defer until after the
dependencies are updated. */
if (gpath_search (name, strlen(name) - strlen(file->name) - 1))
{
rename_file (file, name);
check_renamed (file);
return file_mtime (file);
}
rehash_file (file, name);
check_renamed (file);
return file_mtime (file);
mtime = name_mtime (name);
}
}
}
@@ -982,21 +1070,39 @@ f_mtime (file, search)
{
/* Files can have bogus timestamps that nothing newly made will be
"newer" than. Updating their dependents could just result in loops.
So notify the user of the anomaly by treating future files as
unrecoverably absent. */
So notify the user of the anomaly with a warning.
static time_t now;
if (mtime > now && ! file->updated)
We only need to do this once, for now. */
static time_t now = 0;
if (!clock_skew_detected
&& mtime != (time_t)-1 && mtime > now
&& !file->updated)
{
/* This file's time appears to be in the future.
Update our concept of the present, and compare again. */
extern time_t time ();
if (mtime > time (&now))
{
error ("*** File `%s' has modification time in the future",
file->name);
file->update_status = 2;
}
time (&now);
#ifdef WINDOWS32
/*
* FAT filesystems round time to nearest even second(!). Just
* allow for any file (NTFS or FAT) to perhaps suffer from this
* braindamage.
*
* Apparently, this doesn't happen with the MS-DOS/DJGPP port,
* although MS-DOS and MS-Windows 3.X/9X also use FAT filesystems.
*/
if (mtime > now && (((mtime % 2) == 0) && ((mtime-1) > now)))
#else
if (mtime > now)
#endif
{
error("*** Warning: File `%s' has modification time in the future",
file->name);
clock_skew_detected = 1;
}
}
}
@@ -1039,8 +1145,17 @@ library_search (lib, mtime_ptr)
{
static char *dirs[] =
{
#ifndef _AMIGA
"/lib",
"/usr/lib",
#endif
#if defined(WINDOWS32) && !defined(LIBDIR)
/*
* This is completely up to the user at product install time. Just define
* a placeholder.
*/
#define LIBDIR "."
#endif
LIBDIR, /* Defined by configuration. */
0
};
@@ -1054,7 +1169,11 @@ library_search (lib, mtime_ptr)
/* Look first for `libNAME.a' in the current directory. */
#ifndef _AMIGA
sprintf (buf, "lib%s.a", libname);
#else
sprintf (buf, "%s.lib", libname);
#endif
mtime = name_mtime (buf);
if (mtime != (time_t) -1)
{
@@ -1076,9 +1195,37 @@ library_search (lib, mtime_ptr)
/* Now try the standard set of directories. */
#ifdef __MSDOS__
{
/* The default library directory is at ${DJDIR}/lib. */
struct variable *djdir = lookup_variable ("DJDIR", 5);
if (djdir)
{
size_t djdir_len = strlen (djdir->value);
if (djdir_len > sizeof(LIBDIR) + 8 + strlen(libname) + 4 + 2)
buf = (char *) xrealloc (djdir_len + 1);
sprintf (buf, "%s/lib/lib%s.a", djdir->value, libname);
mtime = name_mtime (buf);
if (mtime != (time_t) -1)
{
*lib = buf;
if (mtime_ptr != 0)
*mtime_ptr = mtime;
return 1;
}
}
}
#endif
for (dp = dirs; *dp != 0; ++dp)
{
#ifndef _AMIGA
sprintf (buf, "%s/lib%s.a", *dp, libname);
#else
sprintf (buf, "%s/%s.lib", *dp, libname);
#endif
mtime = name_mtime (buf);
if (mtime != (time_t) -1)
{

View File

@@ -1,5 +1,5 @@
/* Template for the remote job exportation interface to GNU Make.
Copyright (C) 1988, 1989, 1992, 1993 Free Software Foundation, Inc.
Copyright (C) 1988, 1989, 1992, 1993, 1996 Free Software Foundation, Inc.
This file is part of GNU Make.
GNU Make is free software; you can redistribute it and/or modify
@@ -17,12 +17,27 @@ along with GNU Make; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "make.h"
#include "filedef.h"
#include "job.h"
#include "commands.h"
char *remote_description = 0;
/* Call once at startup even if no commands are run. */
void
remote_setup ()
{
}
/* Called before exit. */
void
remote_cleanup ()
{
}
/* Return nonzero if the next job should be done remotely. */
int

28
rule.c
View File

@@ -17,13 +17,14 @@ along with GNU Make; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "make.h"
#include "commands.h"
#include "dep.h"
#include "file.h"
#include "filedef.h"
#include "job.h"
#include "commands.h"
#include "variable.h"
#include "rule.h"
static void freerule ();
static void freerule PARAMS ((struct rule *rule, struct rule *lastrule));
/* Chain of all pattern rules. */
@@ -96,9 +97,13 @@ count_implicit_rule_limits ()
for (dep = rule->deps; dep != 0; dep = dep->next)
{
unsigned int len = strlen (dep->name);
char *p = rindex (dep->name, '/');
char *p2 = p != 0 ? index (dep->name, '%') : 0;
#ifdef VMS
char *p = rindex (dep->name, ']');
#else
char *p = rindex (dep->name, '/');
#endif
char *p2 = p != 0 ? index (dep->name, '%') : 0;
ndeps++;
if (len > max_pattern_dep_length)
@@ -125,7 +130,11 @@ count_implicit_rule_limits ()
nonexistent subdirectory. */
dep->changed = !dir_file_exists_p (name, "");
#ifdef VMS
if (dep->changed && *name == ']')
#else
if (dep->changed && *name == '/')
#endif
{
/* The name is absolute and the directory does not exist.
This rule can never possibly match, since this dependency
@@ -173,7 +182,11 @@ convert_suffix_rule (target, source, cmds)
/* Special case: TARGET being nil means we are defining a
`.X.a' suffix rule; the target pattern is always `(%.o)'. */
{
#ifdef VMS
targname = savestring ("(%.obj)", 7);
#else
targname = savestring ("(%.o)", 5);
#endif
targpercent = targname + 1;
}
else
@@ -561,6 +574,11 @@ print_rule_data_base ()
printf ("\n# %u implicit rules, %u", rules, terminal);
#ifndef NO_FLOAT
printf (" (%.1f%%)", (double) terminal / (double) rules * 100.0);
#else
{
int f = (terminal * 1000 + 5) / rules;
printf (" (%d.%d%%)", f/10, f%10);
}
#endif
puts (" terminal.");
}

4
rule.h
View File

@@ -49,5 +49,5 @@ extern struct file *suffix_file;
extern unsigned int maxsuffix;
extern void install_pattern_rule ();
int new_pattern_rule ();
extern void install_pattern_rule PARAMS ((struct pspec *p, int terminal));
extern int new_pattern_rule PARAMS ((struct rule *rule, int override));

View File

@@ -1,19 +1,21 @@
/* Convert between signal names and numbers.
Copyright (C) 1990, 1992, 1993, 1995 Free Software Foundation, Inc.
Copyright (C) 1990, 1992, 1993, 1995, 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
This program 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.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
This program 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.
The GNU C Library 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
Library General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#ifdef HAVE_CONFIG_H
#include <config.h>
@@ -23,6 +25,10 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include <sys/types.h> /* Some systems need this for <signal.h>. */
#include <signal.h>
#ifdef HAVE_STRING_H
#include <string.h>
#endif
/* Some systems declare `sys_siglist in <unistd.h>; if
configure defined SYS_SIGLIST_DECLARED, it may expect
to find the declaration there. */
@@ -227,6 +233,9 @@ signame_init ()
#if defined (SIGINFO)
init_sig (SIGINFO, "INFO", "Information request");
#endif
#if defined (SIGNOFP)
init_sig (SIGNOFP, "NOFP", "Floating point co-processor not available");
#endif
}
/* Return the abbreviation for signal NUMBER. */
@@ -239,7 +248,7 @@ sig_abbrev (number)
if (sig_table_nelts == 0)
signame_init ();
for (i = 0; i < sig_table_nelts; i++)
if (sig_table[i].number == number)
return (char *)sig_table[i].abbrev;
@@ -293,10 +302,10 @@ strsignal (signal)
int signal;
{
static char buf[] = "Signal 12345678901234567890";
if (signal > 0 || signal < NSIG)
return (char *) sys_siglist[signal];
sprintf (buf, "Signal %d", signal);
return buf;
}

View File

@@ -1,19 +1,21 @@
/* Convert between signal names and numbers.
Copyright (C) 1990, 1992, 1993, 1995 Free Software Foundation, Inc.
Copyright (C) 1990, 1992, 1993, 1995, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
This program 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.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
This program 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.
The GNU C Library 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
Library General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#if defined (__STDC__) && __STDC__

3
subproc.bat Normal file
View File

@@ -0,0 +1,3 @@
cd w32\subproc
nmake /f %1
cd ..\..

4935
texinfo.tex Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
/* Internals of variables for GNU Make.
Copyright (C) 1988, 89, 90, 91, 92, 93, 94 Free Software Foundation, Inc.
Copyright (C) 1988,89,90,91,92,93,94,96,97 Free Software Foundation, Inc.
This file is part of GNU Make.
GNU Make is free software; you can redistribute it and/or modify
@@ -17,10 +17,14 @@ along with GNU Make; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "make.h"
#include "dep.h"
#include "filedef.h"
#include "job.h"
#include "commands.h"
#include "variable.h"
#include "dep.h"
#include "file.h"
#ifdef WINDOWS32
#include "pathstuff.h"
#endif
/* Hash table of all global variable definitions. */
@@ -39,6 +43,11 @@ static struct variable_set global_variable_set
static struct variable_set_list global_setlist
= { 0, &global_variable_set };
struct variable_set_list *current_variable_set_list = &global_setlist;
static struct variable *define_variable_in_set PARAMS ((char *name, unsigned int length,
char *value, enum variable_origin origin,
int recursive, struct variable_set *set));
/* Implement variables. */
@@ -324,8 +333,6 @@ merge_variable_set_lists (setlist0, setlist1)
merge_variable_sets (list0->set, next->set);
free ((char *) next);
last0 = list0;
list0 = list0->next;
}
@@ -345,7 +352,11 @@ merge_variable_set_lists (setlist0, setlist1)
void
define_automatic_variables ()
{
#ifdef WINDOWS32
extern char* default_shell;
#else
extern char default_shell[];
#endif
register struct variable *v;
char buf[200];
@@ -360,12 +371,39 @@ define_automatic_variables ()
? "" : remote_description);
(void) define_variable ("MAKE_VERSION", 12, buf, o_default, 0);
#ifdef __MSDOS__
/* Allow to specify a special shell just for Make,
and use $COMSPEC as the default $SHELL when appropriate. */
{
static char shell_str[] = "SHELL";
const int shlen = sizeof (shell_str) - 1;
struct variable *mshp = lookup_variable ("MAKESHELL", 9);
struct variable *comp = lookup_variable ("COMSPEC", 7);
/* Make $MAKESHELL override $SHELL even if -e is in effect. */
if (mshp)
(void) define_variable (shell_str, shlen,
mshp->value, o_env_override, 0);
else if (comp)
{
/* $COMSPEC shouldn't override $SHELL. */
struct variable *shp = lookup_variable (shell_str, shlen);
if (!shp)
(void) define_variable (shell_str, shlen, comp->value, o_env, 0);
}
}
#endif
/* This won't override any definition, but it
will provide one if there isn't one there. */
v = define_variable ("SHELL", 5, default_shell, o_default, 0);
v->export = v_export; /* Always export SHELL. */
/* On MSDOS we do use SHELL from environment, since
it isn't a standard environment variable on MSDOS,
so whoever sets it, does that on purpose. */
#ifndef __MSDOS__
/* Don't let SHELL come from the environment. */
if (*v->value == '\0' || v->origin == o_env || v->origin == o_env_override)
{
@@ -373,6 +411,7 @@ define_automatic_variables ()
v->origin = o_file;
v->value = savestring (default_shell, strlen (default_shell));
}
#endif
/* Make sure MAKEFILES gets exported if it is set. */
v = define_variable ("MAKEFILES", 9, "", o_default, 0);
@@ -533,11 +572,25 @@ target_environment (file)
&& v->origin != o_env && v->origin != o_env_override)
{
char *value = recursively_expand (v);
#ifdef WINDOWS32
if (strcmp(v->name, "Path") == 0 ||
strcmp(v->name, "PATH") == 0)
convert_Path_to_windows32(value, ';');
#endif
result[nvariables++] = concat (v->name, "=", value);
free (value);
}
else
#ifdef WINDOWS32
{
if (strcmp(v->name, "Path") == 0 ||
strcmp(v->name, "PATH") == 0)
convert_Path_to_windows32(v->value, ';');
result[nvariables++] = concat (v->name, "=", v->value);
}
#else
result[nvariables++] = concat (v->name, "=", v->value);
#endif
}
}
result[nvariables] = (char *) xmalloc (100);
@@ -605,6 +658,34 @@ try_variable_definition (filename, lineno, line, origin)
flavor = append;
break;
}
else if (c == '$')
{
/* This might begin a variable expansion reference. Make sure we
don't misrecognize chars inside the reference as =, := or +=. */
char closeparen;
int count;
c = *p++;
if (c == '(')
closeparen = ')';
else if (c == '{')
closeparen = '}';
else
continue; /* Nope. */
/* P now points past the opening paren or brace.
Count parens or braces until it is matched. */
count = 0;
for (; *p != '\0'; ++p)
{
if (*p == c)
++count;
else if (*p == closeparen && --count < 0)
{
++p;
break;
}
}
}
}
beg = next_token (line);
@@ -679,6 +760,88 @@ try_variable_definition (filename, lineno, line, origin)
}
}
#ifdef __MSDOS__
/* Many Unix Makefiles include a line saying "SHELL=/bin/sh", but
non-Unix systems don't conform to this default configuration (in
fact, most of them don't even have `/bin'). On the other hand,
$SHELL in the environment, if set, points to the real pathname of
the shell.
Therefore, we generally won't let lines like "SHELL=/bin/sh" from
the Makefile override $SHELL from the environment. But first, we
look for the basename of the shell in the directory where SHELL=
points, and along the $PATH; if it is found in any of these places,
we define $SHELL to be the actual pathname of the shell. Thus, if
you have bash.exe installed as d:/unix/bash.exe, and d:/unix is on
your $PATH, then SHELL=/usr/local/bin/bash will have the effect of
defining SHELL to be "d:/unix/bash.exe". */
if (origin == o_file
&& strcmp (expanded_name, "SHELL") == 0)
{
char shellpath[PATH_MAX];
extern char * __dosexec_find_on_path (const char *, char *[], char *);
/* See if we can find "/bin/sh.exe", "/bin/sh.com", etc. */
if (__dosexec_find_on_path (value, (char **)0, shellpath))
{
char *p;
for (p = shellpath; *p; p++)
{
if (*p == '\\')
*p = '/';
}
v = define_variable (expanded_name, strlen (expanded_name),
shellpath, origin, flavor == recursive);
}
else
{
char *shellbase, *bslash;
struct variable *pathv = lookup_variable ("PATH", 4);
char *path_string;
char *fake_env[2];
size_t pathlen = 0;
shellbase = rindex (value, '/');
bslash = rindex (value, '\\');
if (!shellbase || bslash > shellbase)
shellbase = bslash;
if (!shellbase && value[1] == ':')
shellbase = value + 1;
if (shellbase)
shellbase++;
else
shellbase = value;
/* Search for the basename of the shell (with standard
executable extensions) along the $PATH. */
if (pathv)
pathlen = strlen (pathv->value);
path_string = (char *)xmalloc (5 + pathlen + 2 + 1);
/* On MSDOS, current directory is considered as part of $PATH. */
sprintf (path_string, "PATH=.;%s", pathv ? pathv->value : "");
fake_env[0] = path_string;
fake_env[1] = (char *)0;
if (__dosexec_find_on_path (shellbase, fake_env, shellpath))
{
char *p;
for (p = shellpath; *p; p++)
{
if (*p == '\\')
*p = '/';
}
v = define_variable (expanded_name, strlen (expanded_name),
shellpath, origin, flavor == recursive);
}
else
v = lookup_variable (expanded_name, strlen (expanded_name));
free (path_string);
}
}
else
#endif /* __MSDOS__ */
v = define_variable (expanded_name, strlen (expanded_name),
value, origin, flavor == recursive);
@@ -795,6 +958,14 @@ print_variable_set (set, prefix)
max %u in one bucket.\n",
(double) nvariables / (double) set->buckets,
per_bucket);
#else
{
int f = (nvariables * 1000 + 5) / set->buckets;
printf ("# average of %d.%d variables per bucket, \
max %u in one bucket.\n",
f/10, f%10,
per_bucket);
}
#endif
}
}
@@ -820,3 +991,30 @@ print_file_variables (file)
if (file->variables != 0)
print_variable_set (file->variables->set, "# ");
}
#ifdef WINDOWS32
void
sync_Path_environment(void)
{
char* path = allocated_variable_expand("$(Path)");
static char* environ_path = NULL;
if (!path)
return;
/*
* If done this before, don't leak memory unnecessarily.
* Free the previous entry before allocating new one.
*/
if (environ_path)
free(environ_path);
/*
* Create something WINDOWS32 world can grok
*/
convert_Path_to_windows32(path, ';');
environ_path = concat("Path", "=", path);
putenv(environ_path);
free(path);
}
#endif

View File

@@ -70,31 +70,40 @@ struct variable_set_list
extern struct variable_set_list *current_variable_set_list;
extern void push_new_variable_scope (), pop_variable_scope ();
extern int handle_function ();
extern char *variable_buffer_output ();
extern char *variable_expand (), *variable_expand_for_file ();
extern char *allocated_variable_expand_for_file ();
/* expand.c */
extern char *variable_buffer_output PARAMS ((char *ptr, char *string, unsigned int length));
extern char *variable_expand PARAMS ((char *line));
extern char *variable_expand_for_file PARAMS ((char *line, struct file *file));
extern char *allocated_variable_expand_for_file PARAMS ((char *line, struct file *file));
#define allocated_variable_expand(line) \
allocated_variable_expand_for_file (line, (struct file *) 0)
extern char *expand_argument ();
extern char *expand_argument PARAMS ((char *str, char *end));
extern void define_automatic_variables ();
extern void initialize_file_variables ();
extern void print_file_variables ();
/* function.c */
extern int handle_function PARAMS ((char **op, char **stringp));
extern int pattern_matches PARAMS ((char *pattern, char *percent, char *word));
extern char *subst_expand PARAMS ((char *o, char *text, char *subst, char *replace,
unsigned int slen, unsigned int rlen, int by_word, int suffix_only));
extern char *patsubst_expand PARAMS ((char *o, char *text, char *pattern, char *replace,
char *pattern_percent, char *replace_percent));
extern void merge_variable_set_lists ();
/* expand.c */
extern char *recursively_expand PARAMS ((struct variable *v));
extern struct variable *try_variable_definition ();
/* variable.c */
extern void push_new_variable_scope PARAMS ((void));
extern void pop_variable_scope PARAMS ((void));
extern void define_automatic_variables PARAMS ((void));
extern void initialize_file_variables PARAMS ((struct file *file));
extern void print_file_variables PARAMS ((struct file *file));
extern void merge_variable_set_lists PARAMS ((struct variable_set_list **setlist0, struct variable_set_list *setlist1));
extern struct variable *try_variable_definition PARAMS ((char *filename, unsigned int lineno, char *line, enum variable_origin origin));
extern struct variable *lookup_variable (), *define_variable ();
extern struct variable *define_variable_for_file ();
extern struct variable *lookup_variable PARAMS ((char *name, unsigned int length));
extern struct variable *define_variable PARAMS ((char *name, unsigned int length, char *value,
enum variable_origin origin, int recursive));
extern struct variable *define_variable_for_file PARAMS ((char *name, unsigned int length,
char *value, enum variable_origin origin, int recursive, struct file *file));
extern char **target_environment PARAMS ((struct file *file));
extern int pattern_matches ();
extern char *subst_expand (), *patsubst_expand (), *recursively_expand ();
extern char **target_environment ();
extern int export_all_variables;

View File

@@ -1,4 +1,9 @@
char *version_string = "3.74.3";
/* We use <config.h> instead of "config.h" so that a compilation
using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h
(which it would do because make.h was found in $srcdir). */
#include <config.h>
char *version_string = VERSION;
/*
Local variables:

42
vmsdir.h Normal file
View File

@@ -0,0 +1,42 @@
/* dirent.h for vms */
#include <rms.h>
#define MAXNAMLEN 255
#ifndef __DECC
typedef unsigned long u_long;
typedef unsigned short u_short;
#endif
struct direct {
off_t d_off;
u_long d_fileno;
u_short d_reclen;
u_short d_namlen;
char d_name[MAXNAMLEN + 1];
};
#undef DIRSIZ
#define DIRSIZ(dp) \
(((sizeof (struct direct) - (MAXNAMLEN+1) + ((dp)->d_namlen+1)) + 3) & ~3)
#define d_ino d_fileno /* compatability */
/*
* Definitions for library routines operating on directories.
*/
typedef struct FAB DIR;
#ifndef NULL
#define NULL 0
#endif
extern DIR *opendir PARAMS (());
extern struct direct *readdir PARAMS ((DIR *dfd));
#define rewinddir(dirp) seekdir((dirp), (long)0)
extern int closedir PARAMS ((DIR *dfd));
extern char *vmsify PARAMS ((char *name, int type));
/* EOF */

235
vmsfunctions.c Normal file
View File

@@ -0,0 +1,235 @@
#define KDEBUG 0
/* vmsfunctions.c */
#include <stdio.h>
#include "make.h"
#ifdef __DECC
#include <starlet.h>
#endif
#include <descrip.h>
#include <rms.h>
#include <iodef.h>
#include <atrdef.h>
#include <fibdef.h>
#include "vmsdir.h"
DIR *opendir(char *dspec)
{
static struct FAB *dfab;
struct NAM *dnam;
char *searchspec;
if ((dfab = (struct FAB *)xmalloc(sizeof (struct FAB))) == NULL) {
printf("Error mallocing for FAB\n");
return(NULL);
}
if ((dnam = (struct NAM *)xmalloc(sizeof (struct NAM))) == NULL) {
printf("Error mallocing for NAM\n");
free(dfab);
return(NULL);
}
if ((searchspec = (char *)xmalloc(MAXNAMLEN+1)) == NULL) {
printf("Error mallocing for searchspec\n");
free(dfab);
free(dnam);
return(NULL);
}
sprintf(searchspec,"%s*.*;",dspec);
*dfab = cc$rms_fab;
dfab->fab$l_fna = searchspec;
dfab->fab$b_fns = strlen(searchspec);
dfab->fab$l_nam = dnam;
*dnam = cc$rms_nam;
dnam->nam$l_esa = searchspec;
dnam->nam$b_ess = MAXNAMLEN;
if (!(sys$parse(dfab) & 1)) {
free(dfab);
free(dnam);
free(searchspec);
return(NULL);
}
return(dfab);
}
#include <ctype.h>
#define uppercasify(str) { char *tmp; for(tmp = (str); *tmp != '\0'; tmp++) if(islower(*tmp)) *tmp = toupper(*tmp); }
struct direct *readdir(DIR *dfd)
{
static struct direct *dentry;
static char resultspec[MAXNAMLEN+1];
int i;
if ((dentry = (struct direct *)xmalloc(sizeof (struct direct))) == NULL) {
printf("Error mallocing for direct\n");
return(NULL);
}
dfd->fab$l_nam->nam$l_rsa = resultspec;
dfd->fab$l_nam->nam$b_rss = MAXNAMLEN;
if (debug_flag)
printf(".");
if (!((i = sys$search(dfd)) & 1)) {
if (debug_flag)
printf("sys$search failed with %d\n", i);
free(dentry);
return(NULL);
}
dentry->d_off = 0;
if (dfd->fab$l_nam->nam$w_fid == 0)
dentry->d_fileno = 1;
else dentry->d_fileno = dfd->fab$l_nam->nam$w_fid[0]
+dfd->fab$l_nam->nam$w_fid[1]<<16;
dentry->d_reclen = sizeof (struct direct);
/*
if (!strcmp(dfd->fab$l_nam->nam$l_type,".DIR"))
dentry->d_namlen = dfd->fab$l_nam->nam$b_name;
else
*/
dentry->d_namlen = dfd->fab$l_nam->nam$b_name+dfd->fab$l_nam->nam$b_type;
strncpy(dentry->d_name,dfd->fab$l_nam->nam$l_name,dentry->d_namlen);
dentry->d_name[dentry->d_namlen] = '\0';
uppercasify(dentry->d_name);
/* uvUnFixRCSSeparator(dentry->d_name);*/
return(dentry);
}
closedir(DIR *dfd)
{
if (dfd != NULL) {
if (dfd->fab$l_nam != NULL)
free(dfd->fab$l_nam->nam$l_esa);
free(dfd->fab$l_nam);
free(dfd);
}
}
char *getwd(char *cwd)
{
static char buf[512];
if (cwd)
return(getcwd(cwd,512));
else
return(getcwd(buf,512));
}
int
vms_stat (name, buf)
char *name;
struct stat *buf;
{
int status;
int i;
static struct FAB Fab;
static struct NAM Nam;
static struct fibdef Fib; /* short fib */
static struct dsc$descriptor FibDesc =
{sizeof(Fib), DSC$K_DTYPE_Z, DSC$K_CLASS_S, (char *)&Fib};
static struct dsc$descriptor_s DevDesc =
{0, DSC$K_DTYPE_T, DSC$K_CLASS_S, &Nam.nam$t_dvi[1]};
static char EName[NAM$C_MAXRSS];
static char RName[NAM$C_MAXRSS];
static struct dsc$descriptor_s FileName =
{0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 0};
static struct dsc$descriptor_s string =
{0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 0};
static unsigned long Rdate[2];
static unsigned long Cdate[2];
static struct atrdef Atr[] = {
{sizeof(Rdate),ATR$C_REVDATE,&Rdate[0]}, /* Revision date */
{sizeof(Cdate),ATR$C_CREDATE,&Cdate[0]}, /* Creation date */
{0,0,0}
};
static short int DevChan;
static short int iosb[4];
name = vmsify (name, 0);
/* initialize RMS structures, we need a NAM to retrieve the FID */
Fab = cc$rms_fab;
Fab.fab$l_fna = name ; /* name of file */
Fab.fab$b_fns = strlen(name);
Fab.fab$l_nam = &Nam; /* FAB has an associated NAM */
Nam = cc$rms_nam;
Nam.nam$l_esa = EName; /* expanded filename */
Nam.nam$b_ess = sizeof(EName);
Nam.nam$l_rsa = RName; /* resultant filename */
Nam.nam$b_rss = sizeof(RName);
/* do $PARSE and $SEARCH here */
status = sys$parse(&Fab);
if (!(status & 1))
return -1;
DevDesc.dsc$w_length = Nam.nam$t_dvi[0];
status = sys$assign(&DevDesc,&DevChan,0,0);
if (!(status & 1))
return -1;
FileName.dsc$a_pointer = Nam.nam$l_name;
FileName.dsc$w_length = Nam.nam$b_name+Nam.nam$b_type+Nam.nam$b_ver;
/* Initialize the FIB */
for (i=0;i<3;i++)
{
#if __DECC
Fib.fib$w_fid[i]=Nam.nam$w_fid[i];
Fib.fib$w_did[i]=Nam.nam$w_did[i];
#else
Fib.fib$r_fid_overlay.fib$w_fid[i]=Nam.nam$w_fid[i];
Fib.fib$r_did_overlay.fib$w_did[i]=Nam.nam$w_did[i];
#endif
}
status = sys$qiow(0,DevChan,IO$_ACCESS,&iosb,0,0,
&FibDesc,&FileName,0,0,&Atr,0);
sys$dassgn (DevChan);
if (!(status & 1))
return -1;
status = iosb[0];
if (!(status & 1))
return -1;
status = stat (name, buf);
if (status)
return -1;
buf->st_mtime = ((Rdate[0]>>24) & 0xff) + ((Rdate[1]<<8) & 0xffffff00);
buf->st_ctime = ((Cdate[0]>>24) & 0xff) + ((Cdate[1]<<8) & 0xffffff00);
return 0;
}
char *
cvt_time(tval)
unsigned long tval;
{
static long int date[2];
static char str[27];
static struct dsc$descriptor date_str =
{26, DSC$K_DTYPE_T, DSC$K_CLASS_S, str};
date[0] = (tval & 0xff) << 24;
date[1] = ((tval>>8) & 0xffffff);
if ((date[0]==0) && (date[1]==0))
return("never");
sys$asctim(0,&date_str,date,0);
str[26]='\0';
return(str);
}
/* EOF */

927
vmsify.c Normal file
View File

@@ -0,0 +1,927 @@
/*
vmsify.c
Module for vms <-> unix file name conversion
Written by Klaus Kämpf (kkaempf@progis.de)
of proGIS Software, Aachen, Germany
*/
#include <string.h>
#include <ctype.h>
#if VMS
#include <unixlib.h>
#include <stdlib.h>
#include <jpidef.h>
#include <descrip.h>
#include <uaidef.h>
#include <ssdef.h>
#include <starlet.h>
#include <lib$routines.h>
/* Initialize a string descriptor (struct dsc$descriptor_s) for an
arbitrary string. ADDR is a pointer to the first character
of the string, and LEN is the length of the string. */
#define INIT_DSC_S(dsc, addr, len) do { \
(dsc).dsc$b_dtype = DSC$K_DTYPE_T; \
(dsc).dsc$b_class = DSC$K_CLASS_S; \
(dsc).dsc$w_length = (len); \
(dsc).dsc$a_pointer = (addr); \
} while (0)
/* Initialize a string descriptor (struct dsc$descriptor_s) for a
NUL-terminated string. S is a pointer to the string; the length
is determined by calling strlen(). */
#define INIT_DSC_CSTRING(dsc, s) INIT_DSC_S(dsc, s, strlen(s))
#endif
/*
copy 'from' to 'to' up to but not including 'upto'
return 0 if eos on from
return 1 if upto found
return 'to' at last char + 1
return 'from' at match + 1 or eos if no match
if as_dir == 1, change all '.' to '_'
else change all '.' but the last to '_'
*/
static int
copyto (char **to, char **from, char upto, int as_dir)
{
char *s;
s = strrchr (*from, '.');
while (**from)
{
if (**from == upto)
{
do
{
(*from)++;
}
while (**from == upto);
return 1;
}
if (**from == '.')
{
if ((as_dir == 1)
|| (*from != s))
**to = '_';
else
**to = '.';
}
else
{
if (islower (**from))
**to = toupper (**from);
else
**to = **from;
}
(*to)++;
(*from)++;
}
return 0;
}
/*
get translation of logical name
*/
static char *
trnlog (char *name)
{
int stat;
static char reslt[1024];
$DESCRIPTOR (reslt_dsc, reslt);
short resltlen;
struct dsc$descriptor_s name_dsc;
char *s;
INIT_DSC_CSTRING (name_dsc, name);
stat = lib$sys_trnlog (&name_dsc, &resltlen, &reslt_dsc);
if ((stat&1) == 0)
{
return "";
}
if (stat == SS$_NOTRAN)
{
return "";
}
reslt[resltlen] = '\0';
s = (char *)malloc (resltlen+1);
if (s == 0)
return "";
strcpy (s, reslt);
return s;
}
enum namestate { N_START, N_DEVICE, N_OPEN, N_DOT, N_CLOSED, N_DONE };
/*
convert unix style name to vms style
type = 0 -> name is a full name (directory and filename part)
type = 1 -> name is a directory
type = 2 -> name is a filename without directory
The following conversions are applied
(0) (1) (2)
input full name dir name file name
1 ./ <cwd> [] <current directory>.dir
2 ../ <home of cwd> <home of cwd> <home of cwd>.dir
3 // <dev of cwd>: <dev of cwd>:[000000] <dev of cwd>:000000.dir
4 //a a: a: a:
5 //a/ a: a: a:000000.dir
9 / [000000] [000000] 000000.dir
10 /a [000000]a [a] [000000]a
11 /a/ [a] [a] [000000]a.dir
12 /a/b [a]b [a.b] [a]b
13 /a/b/ [a.b] [a.b] [a]b.dir
14 /a/b/c [a.b]c [a.b.c] [a.b]c
15 /a/b/c/ [a.b.c] [a.b.c] [a.b]c.dir
16 a a [.a] a
17 a/ [.a] [.a] a.dir
18 a/b [.a]b [.a.b] [.a]b
19 a/b/ [.a.b] [.a.b] [.a]b.dir
20 a/b/c [.a.b]c [.a.b.c] [.a.b]c
21 a/b/c/ [.a.b.c] [.a.b.c] [.a.b]c.dir
22 a.b.c a_b.c [.a_b_c] a_b_c.dir
23 [x][y]z [x.y]z [x.y]z [x.y]z
24 [x][.y]z [x.y]z [x.y]z [x.y]z
25 filenames with '$' are left unchanged if they contain no '/'
25 filenames with ':' are left unchanged
26 filenames with a single pair of '[' ']' are left unchanged
the input string is not written to
*/
char *
vmsify (name, type)
char *name;
int type;
{
/* max 255 device
max 39 directory
max 39 filename
max 39 filetype
max 5 version
*/
#define MAXPATHLEN 512
enum namestate nstate;
static char vmsname[MAXPATHLEN+1];
char *fptr;
char *vptr;
char *s,*s1;
int as_dir;
int count;
if (name == 0)
return 0;
fptr = name;
vptr = vmsname;
nstate = N_START;
/* case 25a */
s = strpbrk (name, "$:");
if (s != 0)
{
if (*s == '$')
{
if (strchr (name, '/') == 0)
{
return name;
}
}
else
{
return name;
}
}
/* case 26 */
s = strchr (name, '[');
if (s != 0)
{
s1 = strchr (s+1, '[');
if (s1 == 0)
{
return name; /* single [, keep unchanged */
}
s1--;
if (*s1 != ']')
{
return name; /* not ][, keep unchanged */
}
/* we have ][ */
s = name;
/* s -> starting char
s1 -> ending ']' */
do
{
strncpy (vptr, s, s1-s); /* copy up to but not including ']' */
vptr += s1-s;
if (*s1 == 0)
break;
s = s1 + 1; /* s -> char behind ']' */
if (*s != '[') /* was '][' ? */
break; /* no, last ] found, exit */
s++;
if (*s != '.')
*vptr++ = '.';
s1 = strchr (s, ']');
if (s1 == 0) /* no closing ] */
s1 = s + strlen (s);
}
while (1);
*vptr++ = ']';
fptr = s;
}
else /* no [ in name */
{
int state;
int rooted = 1; /* flag if logical is rooted, else insert [000000] */
state = 0;
do
{
switch (state)
{
case 0: /* start of loop */
if (*fptr == '/')
{
fptr++;
state = 1;
}
else if (*fptr == '.')
{
fptr++;
state = 10;
}
else
state = 2;
break;
case 1: /* '/' at start */
if (*fptr == '/')
{
fptr++;
state = 3;
}
else
state = 4;
break;
case 2: /* no '/' at start */
s = strchr (fptr, '/');
if (s == 0) /* no '/' (16) */
{
if (type == 1)
{
strcpy (vptr, "[.");
vptr += 2;
}
copyto (&vptr, &fptr, 0, (type==1));
if (type == 1)
*vptr++ = ']';
state = -1;
}
else /* found '/' (17..21) */
{
if ((type == 2)
&& (*(s+1) == 0)) /* 17(2) */
{
copyto (&vptr, &fptr, '/', 1);
state = 7;
}
else
{
strcpy (vptr, "[.");
vptr += 2;
copyto (&vptr, &fptr, '/', 1);
nstate = N_OPEN;
state = 9;
}
}
break;
case 3: /* '//' at start */
while (*fptr == '/') /* collapse all '/' */
fptr++;
if (*fptr == 0) /* just // */
{
char cwdbuf[MAXPATHLEN+1];
s1 = getcwd(cwdbuf, MAXPATHLEN);
if (s1 == 0)
{
return ""; /* FIXME, err getcwd */
}
s = strchr (s1, ':');
if (s == 0)
{
return ""; /* FIXME, err no device */
}
strncpy (vptr, s1, s-s1+1);
vptr += s-s1+1;
state = -1;
break;
}
s = vptr;
if (copyto (&vptr, &fptr, '/', 1) == 0) /* copy device part */
{
*vptr++ = ':';
state = -1;
break;
}
*vptr = ':';
nstate = N_DEVICE;
if (*fptr == 0) /* just '//a/' */
{
strcpy (vptr+1, "[000000]");
vptr += 9;
state = -1;
break;
}
*vptr = 0;
/* check logical for [000000] insertion */
s1 = trnlog (s);
if (*s1 != 0)
{ /* found translation */
char *s2;
for (;;) /* loop over all nested logicals */
{
s2 = s1 + strlen (s1) - 1;
if (*s2 == ':') /* translation ends in ':' */
{
s2 = trnlog (s1);
free (s1);
if (*s2 == 0)
{
rooted = 0;
break;
}
s1 = s2;
continue; /* next iteration */
}
if (*s2 == ']') /* translation ends in ']' */
{
if (*(s2-1) == '.') /* ends in '.]' */
{
if (strncmp (fptr, "000000", 6) != 0)
rooted = 0;
}
else
{
strcpy (vmsname, s1);
s = strchr (vmsname, ']');
*s = '.';
nstate = N_DOT;
vptr = s;
}
}
break;
}
free (s1);
}
else
rooted = 0;
if (*vptr == 0)
{
nstate = N_DEVICE;
*vptr++ = ':';
}
else
vptr++;
if (rooted == 0)
{
strcpy (vptr, "[000000.");
vptr += 8;
s1 = vptr-1;
nstate = N_DOT;
}
else
s1 = 0;
/* s1-> '.' after 000000 or NULL */
s = strchr (fptr, '/');
if (s == 0)
{ /* no next '/' */
if (*(vptr-1) == '.')
*(vptr-1) = ']';
else if (rooted == 0)
*vptr++ = ']';
copyto (&vptr, &fptr, 0, (type == 1));
state = -1;
break;
}
else
{
while (*(s+1) == '/') /* skip multiple '/' */
s++;
}
if ((rooted != 0)
&& (*(vptr-1) != '.'))
{
*vptr++ = '[';
nstate = N_DOT;
}
else
if ((nstate == N_DOT)
&& (s1 != 0)
&& (*(s+1) == 0))
{
if (type == 2)
{
*s1 = ']';
nstate = N_CLOSED;
}
}
state = 9;
break;
case 4: /* single '/' at start (9..15) */
if (*fptr == 0)
state = 5;
else
state = 6;
break;
case 5: /* just '/' at start (9) */
if (type != 2)
{
*vptr++ = '[';
nstate = N_OPEN;
}
strcpy (vptr, "000000");
vptr += 6;
if (type == 2)
state = 7;
else
state = 8;
break;
case 6: /* chars following '/' at start 10..15 */
*vptr++ = '[';
nstate = N_OPEN;
s = strchr (fptr, '/');
if (s == 0) /* 10 */
{
if (type != 1)
{
strcpy (vptr, "000000]");
vptr += 7;
}
copyto (&vptr, &fptr, 0, (type == 1));
if (type == 1)
{
*vptr++ = ']';
}
state = -1;
}
else /* 11..15 */
{
if ( (type == 2)
&& (*(s+1) == 0)) /* 11(2) */
{
strcpy (vptr, "000000]");
nstate = N_CLOSED;
vptr += 7;
}
copyto (&vptr, &fptr, '/', (*(vptr-1) != ']'));
state = 9;
}
break;
case 7: /* add '.dir' and exit */
if ((nstate == N_OPEN)
|| (nstate == N_DOT))
{
s = vptr-1;
while (s > vmsname)
{
if (*s == ']')
{
break;
}
if (*s == '.')
{
*s = ']';
break;
}
s--;
}
}
strcpy (vptr, ".dir");
vptr += 4;
state = -1;
break;
case 8: /* add ']' and exit */
*vptr++ = ']';
state = -1;
break;
case 9: /* 17..21, fptr -> 1st '/' + 1 */
if (*fptr == 0)
{
if (type == 2)
{
state = 7;
}
else
state = 8;
break;
}
s = strchr (fptr, '/');
if (s == 0)
{
if (type != 1)
{
if (nstate == N_OPEN)
{
*vptr++ = ']';
nstate = N_CLOSED;
}
as_dir = 0;
}
else
{
if (nstate == N_OPEN)
{
*vptr++ = '.';
nstate = N_DOT;
}
as_dir = 1;
}
}
else
{
while (*(s+1) == '/')
s++;
if ( (type == 2)
&& (*(s+1) == 0)) /* 19(2), 21(2)*/
{
if (nstate != N_CLOSED)
{
*vptr++ = ']';
nstate = N_CLOSED;
}
as_dir = 1;
}
else
{
if (nstate == N_OPEN)
{
*vptr++ = '.';
nstate = N_DOT;
}
as_dir = 1;
}
}
if ( (*fptr == '.') /* check for '..' or '../' */
&& (*(fptr+1) == '.')
&& ((*(fptr+2) == '/')
|| (*(fptr+2) == 0)) )
{
fptr += 2;
if (*fptr == '/')
{
do
{
fptr++;
}
while (*fptr == '/');
}
else if (*fptr == 0)
type = 1;
vptr--; /* vptr -> '.' or ']' */
s1 = vptr;
for (;;)
{
s1--;
if (*s1 == '.') /* one back */
{
vptr = s1;
nstate = N_OPEN;
break;
}
if (*s1 == '[') /* top level reached */
{
if (*fptr == 0)
{
strcpy (s1, "[000000]");
vptr = s1 + 8;
nstate = N_CLOSED;
s = 0;
break;
}
else
{
vptr = s1+1;
nstate = N_OPEN;
break;
}
}
}
}
else
{
copyto (&vptr, &fptr, '/', as_dir);
if (nstate == N_DOT)
nstate = N_OPEN;
}
if (s == 0)
{ /* 18,20 */
if (type == 1)
*vptr++ = ']';
state = -1;
}
else
{
if (*(s+1) == 0)
{
if (type == 2) /* 19,21 */
{
state = 7;
}
else
{
*vptr++ = ']';
state = -1;
}
}
}
break;
case 10: /* 1,2 first is '.' */
if (*fptr == '.')
{
fptr++;
state = 11;
}
else
state = 12;
break;
case 11: /* 2, '..' at start */
count = 1;
if (*fptr != 0)
{
if (*fptr != '/') /* got ..xxx */
{
return name;
}
do /* got ../ */
{
fptr++;
while (*fptr == '/') fptr++;
if (*fptr != '.')
break;
if (*(fptr+1) != '.')
break;
fptr += 2;
if ((*fptr == 0)
|| (*fptr == '/'))
count++;
}
while (*fptr == '/');
}
{ /* got '..' or '../' */
char cwdbuf[MAXPATHLEN+1];
s1 = getcwd(cwdbuf, MAXPATHLEN);
if (s1 == 0)
{
return ""; /* FIXME, err getcwd */
}
strcpy (vptr, s1);
s = strchr (vptr, ']');
if (s != 0)
{
nstate = N_OPEN;
while (s > vptr)
{
s--;
if (*s == '[')
{
s++;
strcpy (s, "000000]");
state = -1;
break;
}
else if (*s == '.')
{
if (--count == 0)
{
if (*fptr == 0) /* had '..' or '../' */
{
*s++ = ']';
state = -1;
}
else /* had '../xxx' */
{
state = 9;
}
*s = 0;
break;
}
}
}
}
vptr += strlen (vptr);
}
break;
case 12: /* 1, '.' at start */
if (*fptr != 0)
{
if (*fptr != '/')
{
return name;
}
fptr++;
}
{
char cwdbuf[MAXPATHLEN+1];
s1 = getcwd(cwdbuf, MAXPATHLEN);
if (s1 == 0)
{
return ""; /*FIXME, err getcwd */
}
strcpy (vptr, s1);
if (*fptr == 0)
{
state = -1;
break;
}
else
{
s = strchr (vptr, ']');
if (s == 0)
{
state = -1;
break;
}
*s = 0;
nstate = N_OPEN;
vptr += strlen (vptr);
state = 9;
}
}
break;
}
}
while (state > 0);
}
/* directory conversion done
fptr -> filename part of input string
vptr -> free space in vmsname
*/
*vptr++ = 0;
return vmsname;
}
/*
convert from vms-style to unix-style
dev:[dir1.dir2] //dev/dir1/dir2/
*/
char *
unixify (char *name)
{
static char piece[512];
char *s, *p;
if (strchr (name, '/') != 0) /* already in unix style */
return name;
p = piece;
*p = 0;
/* device part */
s = strchr (name, ':');
if (s != 0)
{
*s = 0;
*p++ = '/';
*p++ = '/';
strcpy (p, name);
p += strlen (p);
*s = ':';
}
/* directory part */
*p++ = '/';
s = strchr (name, '[');
if (s != 0)
{
s++;
switch (*s)
{
case ']': /* [] */
strcat (p, "./");
break;
case '-': /* [- */
strcat (p, "../");
break;
case '.':
strcat (p, "./"); /* [. */
break;
default:
s--;
break;
}
s++;
while (*s)
{
if (*s == '.')
*p++ = '/';
else
*p++ = *s;
s++;
if (*s == ']')
{
s++;
break;
}
}
if (*s != 0) /* more after ']' ?? */
{
if (*(p-1) != '/')
*p++ = '/';
strcpy (p, s); /* copy it anyway */
}
}
else /* no '[' anywhere */
{
*p++ = 0;
}
/* force end with '/' */
if (*(p-1) != '/')
*p++ = '/';
*p = 0;
return piece;
}
/* EOF */

136
vpath.c
View File

@@ -1,5 +1,5 @@
/* Implementation of pattern-matching file search paths for GNU Make.
Copyright (C) 1988, 89, 91, 92, 93, 94, 95 Free Software Foundation, Inc.
Copyright (C) 1988,89,91,92,93,94,95,96,97 Free Software Foundation, Inc.
This file is part of GNU Make.
GNU Make is free software; you can redistribute it and/or modify
@@ -17,8 +17,11 @@ along with GNU Make; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "make.h"
#include "file.h"
#include "filedef.h"
#include "variable.h"
#ifdef WINDOWS32
#include "pathstuff.h"
#endif
/* Structure used to represent a selective VPATH searchpath. */
@@ -40,8 +43,12 @@ static struct vpath *vpaths;
/* Structure for the general VPATH given in the variable. */
static struct vpath *general_vpath;
/* Structure for GPATH given in the variable. */
static struct vpath *gpaths;
static int selective_vpath_search ();
static int selective_vpath_search PARAMS ((struct vpath *path, char **file, time_t *mtime_ptr));
/* Reverse the chain of selective VPATH lists so they
will be searched in the order given in the makefiles
@@ -95,6 +102,38 @@ build_vpath_lists ()
general_vpath = vpaths;
vpaths = save_vpaths;
}
/* If there is a GPATH variable with a nonnull value, construct the
GPATH list from it. We use variable_expand rather than just
calling lookup_variable so that it will be recursively expanded. */
{
/* Turn off --warn-undefined-variables while we expand SHELL and IFS. */
int save = warn_undefined_variables_flag;
warn_undefined_variables_flag = 0;
p = variable_expand ("$(strip $(GPATH))");
warn_undefined_variables_flag = save;
}
if (*p != '\0')
{
/* Save the list of vpaths. */
struct vpath *save_vpaths = vpaths;
/* Empty `vpaths' so the new one will have no next, and `vpaths'
will still be nil if P contains no existing directories. */
vpaths = 0;
/* Parse P. */
construct_vpath_list ("%", p);
/* Store the created path as the GPATH,
and restore the old list of vpaths. */
gpaths = vpaths;
vpaths = save_vpaths;
}
}
/* Construct the VPATH listing for the pattern and searchpath given.
@@ -106,14 +145,15 @@ build_vpath_lists ()
variable.
If SEARCHPATH is nil, remove all previous listings with the same
pattern. If PATTERN is nil, remove all VPATH listings.
Existing and readable directories that are not "." given in the
searchpath separated by colons are loaded into the directory hash
table if they are not there already and put in the VPATH searchpath
for the given pattern with trailing slashes stripped off if present
(and if the directory is not the root, "/").
The length of the longest entry in the list is put in the structure as well.
The new entry will be at the head of the VPATHS chain. */
pattern. If PATTERN is nil, remove all VPATH listings. Existing
and readable directories that are not "." given in the searchpath
separated by the path element separator (defined in make.h) are
loaded into the directory hash table if they are not there already
and put in the VPATH searchpath for the given pattern with trailing
slashes stripped off if present (and if the directory is not the
root, "/"). The length of the longest entry in the list is put in
the structure as well. The new entry will be at the head of the
VPATHS chain. */
void
construct_vpath_list (pattern, dirpath)
@@ -170,10 +210,14 @@ construct_vpath_list (pattern, dirpath)
return;
}
/* Figure out the maximum number of VPATH entries and
put it in MAXELEM. We start with 2, one before the
first colon and one nil, the list terminator and
increment our estimated number for each colon or blank we find. */
#ifdef WINDOWS32
convert_vpath_to_windows32(dirpath, ';');
#endif
/* Figure out the maximum number of VPATH entries and put it in
MAXELEM. We start with 2, one before the first separator and one
nil (the list terminator) and increment our estimated number for
each separator or blank we find. */
maxelem = 2;
p = dirpath;
while (*p != '\0')
@@ -183,7 +227,7 @@ construct_vpath_list (pattern, dirpath)
vpath = (char **) xmalloc (maxelem * sizeof (char *));
maxvpath = 0;
/* Skip over any initial colons and blanks. */
/* Skip over any initial separators and blanks. */
p = dirpath;
while (*p == PATH_SEPARATOR_CHAR || isblank (*p))
++p;
@@ -202,6 +246,10 @@ construct_vpath_list (pattern, dirpath)
len = p - v;
/* Make sure there's no trailing slash,
but still allow "/" as a directory. */
#ifdef __MSDOS__
/* We need also to leave alone a trailing slash in "d:/". */
if (len > 3 || (len > 1 && v[1] != ':'))
#endif
if (len > 1 && p[-1] == '/')
--len;
@@ -224,7 +272,7 @@ construct_vpath_list (pattern, dirpath)
free (v);
}
/* Skip over colons and blanks between entries. */
/* Skip over separators and blanks between entries. */
while (*p == PATH_SEPARATOR_CHAR || isblank (*p))
++p;
}
@@ -263,6 +311,24 @@ construct_vpath_list (pattern, dirpath)
}
}
/* Search the GPATH list for a pathname string that matches the one passed
in. If it is found, return 1. Otherwise we return 0. */
int
gpath_search (file, len)
char *file;
int len;
{
register char **gp;
if (gpaths && (len <= gpaths->maxlen))
for (gp = gpaths->searchpath; *gp != NULL; ++gp)
if (!strncmp(*gp, file, len) && (*gp)[len] == '\0')
return 1;
return 0;
}
/* Search the VPATH list whose pattern matches *FILE for a directory
where the name pointed to by FILE exists. If it is found, we set *FILE to
the newly malloc'd name of the existing file, *MTIME_PTR (if MTIME_PTR is
@@ -279,7 +345,12 @@ vpath_search (file, mtime_ptr)
/* If there are no VPATH entries or FILENAME starts at the root,
there is nothing we can do. */
if (**file == '/' || (vpaths == 0 && general_vpath == 0))
if (**file == '/'
#if defined (WINDOWS32) || defined (__MSDOS__)
|| **file == '\\'
|| (*file)[1] == ':'
#endif
|| (vpaths == 0 && general_vpath == 0))
return 0;
for (v = vpaths; v != 0; v = v->next)
@@ -331,6 +402,14 @@ selective_vpath_search (path, file, mtime_ptr)
pointer to the name-within-directory and FLEN is its length. */
n = rindex (*file, '/');
#if defined (WINDOWS32) || defined (__MSDOS__)
/* We need the rightmost slash or backslash. */
{
char *bslash = rindex(*file, '\\');
if (!n || bslash > n)
n = bslash;
}
#endif
name_dplen = n != 0 ? n - *file : 0;
filename = name_dplen > 0 ? n + 1 : *file;
if (name_dplen > 0)
@@ -340,7 +419,7 @@ selective_vpath_search (path, file, mtime_ptr)
a slash, the directory prefix that came with *FILE,
another slash (although this one may not always be
necessary), the filename, and a null terminator. */
name = (char *) alloca (maxvpath + 1 + name_dplen + 1 + flen + 1);
name = (char *) xmalloc (maxvpath + 1 + name_dplen + 1 + flen + 1);
/* Try each VPATH entry. */
for (i = 0; vpath[i] != 0; ++i)
@@ -357,18 +436,27 @@ selective_vpath_search (path, file, mtime_ptr)
/* Add the directory prefix already in *FILE. */
if (name_dplen > 0)
{
#ifndef VMS
*n++ = '/';
#endif
bcopy (*file, n, name_dplen);
n += name_dplen;
}
#if defined (WINDOWS32) || defined (__MSDOS__)
/* Cause the next if to treat backslash and slash alike. */
if (n != name && n[-1] == '\\' )
n[-1] = '/';
#endif
/* Now add the name-within-directory at the end of NAME. */
#ifndef VMS
if (n != name && n[-1] != '/')
{
*n = '/';
bcopy (filename, n + 1, flen + 1);
}
else
#endif
bcopy (filename, n, flen + 1);
/* Check if the file is mentioned in a makefile. If *FILE is not
@@ -381,7 +469,7 @@ selective_vpath_search (path, file, mtime_ptr)
inadequately commented change in July 1990; I am not sure off
hand what problem it fixes.
In December 1993 I loosened of this restriction to allow a file
In December 1993 I loosened this restriction to allow a file
to be chosen if it is mentioned as a target in a makefile. This
seem logical. */
{
@@ -395,6 +483,9 @@ selective_vpath_search (path, file, mtime_ptr)
/* That file wasn't mentioned in the makefile.
See if it actually exists. */
#ifdef VMS
exists_in_cache = exists = dir_file_exists_p (vpath[i], filename);
#else
/* Clobber a null into the name at the last slash.
Now NAME is the name of the directory to look in. */
*n = '\0';
@@ -403,6 +494,7 @@ selective_vpath_search (path, file, mtime_ptr)
construct_vpath_list or the code just above put it there.
Does the file we seek exist in it? */
exists_in_cache = exists = dir_file_exists_p (name, filename);
#endif
}
if (exists)
@@ -415,8 +507,10 @@ selective_vpath_search (path, file, mtime_ptr)
struct stat st;
#ifndef VMS
/* Put the slash back in NAME. */
*n = '/';
#endif
if (!exists_in_cache /* Makefile-mentioned file need not exist. */
|| stat (name, &st) == 0) /* Does it really exist? */
@@ -432,6 +526,7 @@ selective_vpath_search (path, file, mtime_ptr)
we record a zero modtime to indicate this. */
*mtime_ptr = exists_in_cache ? st.st_mtime : (time_t) 0;
free (name);
return 1;
}
else
@@ -439,6 +534,7 @@ selective_vpath_search (path, file, mtime_ptr)
}
}
free (name);
return 0;
}

188
w32/compat/dirent.c Normal file
View File

@@ -0,0 +1,188 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include "dirent.h"
DIR*
opendir(const char* pDirName)
{
struct stat sb;
DIR* pDir;
char* pEndDirName;
int nBufferLen;
/* sanity checks */
if (!pDirName) {
errno = EINVAL;
return NULL;
}
if (stat(pDirName, &sb) != 0) {
errno = ENOENT;
return NULL;
}
if ((sb.st_mode & S_IFMT) != S_IFDIR) {
errno = ENOTDIR;
return NULL;
}
/* allocate a DIR structure to return */
pDir = (DIR *) malloc(sizeof (DIR));
if (!pDir)
return NULL;
/* input directory name length */
nBufferLen = strlen(pDirName);
/* copy input directory name to DIR buffer */
strcpy(pDir->dir_pDirectoryName, pDirName);
/* point to end of the copied directory name */
pEndDirName = &pDir->dir_pDirectoryName[nBufferLen - 1];
/* if directory name did not end in '/' or '\', add '/' */
if ((*pEndDirName != '/') && (*pEndDirName != '\\')) {
pEndDirName++;
*pEndDirName = '/';
}
/* now append the wildcard character to the buffer */
pEndDirName++;
*pEndDirName = '*';
pEndDirName++;
*pEndDirName = '\0';
/* other values defaulted */
pDir->dir_nNumFiles = 0;
pDir->dir_hDirHandle = INVALID_HANDLE_VALUE;
pDir->dir_ulCookie = __DIRENT_COOKIE;
return pDir;
}
void
closedir(DIR *pDir)
{
/* got a valid pointer? */
if (!pDir) {
errno = EINVAL;
return;
}
/* sanity check that this is a DIR pointer */
if (pDir->dir_ulCookie != __DIRENT_COOKIE) {
errno = EINVAL;
return;
}
/* close the WINDOWS32 directory handle */
if (pDir->dir_hDirHandle != INVALID_HANDLE_VALUE)
FindClose(pDir->dir_hDirHandle);
free(pDir);
return;
}
struct dirent *
readdir(DIR* pDir)
{
WIN32_FIND_DATA wfdFindData;
if (!pDir) {
errno = EINVAL;
return NULL;
}
/* sanity check that this is a DIR pointer */
if (pDir->dir_ulCookie != __DIRENT_COOKIE) {
errno = EINVAL;
return NULL;
}
if (pDir->dir_nNumFiles == 0) {
pDir->dir_hDirHandle = FindFirstFile(pDir->dir_pDirectoryName, &wfdFindData);
if (pDir->dir_hDirHandle == INVALID_HANDLE_VALUE)
return NULL;
} else if (!FindNextFile(pDir->dir_hDirHandle, &wfdFindData))
return NULL;
/* bump count for next call to readdir() or telldir() */
pDir->dir_nNumFiles++;
/* fill in struct dirent values */
pDir->dir_sdReturn.d_ino = -1;
strcpy(pDir->dir_sdReturn.d_name, wfdFindData.cFileName);
return &pDir->dir_sdReturn;
}
void
rewinddir(DIR* pDir)
{
if (!pDir) {
errno = EINVAL;
return;
}
/* sanity check that this is a DIR pointer */
if (pDir->dir_ulCookie != __DIRENT_COOKIE) {
errno = EINVAL;
return;
}
/* close the WINDOWS32 directory handle */
if (pDir->dir_hDirHandle != INVALID_HANDLE_VALUE)
if (!FindClose(pDir->dir_hDirHandle))
errno = EBADF;
/* reset members which control readdir() */
pDir->dir_hDirHandle = INVALID_HANDLE_VALUE;
pDir->dir_nNumFiles = 0;
return;
}
int
telldir(DIR* pDir)
{
if (!pDir) {
errno = EINVAL;
return -1;
}
/* sanity check that this is a DIR pointer */
if (pDir->dir_ulCookie != __DIRENT_COOKIE) {
errno = EINVAL;
return -1;
}
/* return number of times readdir() called */
return pDir->dir_nNumFiles;
}
void
seekdir(DIR* pDir, long nPosition)
{
if (!pDir)
return;
/* sanity check that this is a DIR pointer */
if (pDir->dir_ulCookie != __DIRENT_COOKIE)
return;
/* go back to beginning of directory */
rewinddir(pDir);
/* loop until we have found position we care about */
for (--nPosition; nPosition && readdir(pDir); nPosition--);
/* flag invalid nPosition value */
if (nPosition)
errno = EINVAL;
return;
}

37
w32/include/dirent.h Normal file
View File

@@ -0,0 +1,37 @@
#ifndef _DIRENT_H
#define _DIRENT_H
#include <stdlib.h>
#include <windows.h>
#include <limits.h>
#include <sys/types.h>
#ifndef NAME_MAX
#define NAME_MAX 255
#endif
#define __DIRENT_COOKIE 0xfefeabab
struct dirent
{
ino_t d_ino; /* unused - no equivalent on WINDOWS32 */
char d_name[NAME_MAX+1];
};
typedef struct dir_struct {
ULONG dir_ulCookie;
HANDLE dir_hDirHandle;
DWORD dir_nNumFiles;
char dir_pDirectoryName[NAME_MAX+1];
struct dirent dir_sdReturn;
} DIR;
DIR *opendir(const char *);
struct dirent *readdir(DIR *);
void rewinddir(DIR *);
void closedir(DIR *);
int telldir(DIR *);
void seekdir(DIR *, long);
#endif

9
w32/include/pathstuff.h Normal file
View File

@@ -0,0 +1,9 @@
#ifndef _PATHSTUFF_H
#define _PATHSTUFF_H
extern char * convert_Path_to_windows32(char *Path, char to_delim);
extern char * convert_vpath_to_windows32(char *Path, char to_delim);
extern char * w32ify(char *file, int resolve);
extern char * getcwd_fs(char *buf, int len);
#endif

47
w32/include/sub_proc.h Normal file
View File

@@ -0,0 +1,47 @@
#ifndef SUB_PROC_H
#define SUB_PROC_H
/*
* Component Name:
*
* $Date$
*
* $Source$
*
* $Revision$
*/
/* $Id$ */
#ifdef WINDOWS32
#define EXTERN_DECL(entry, args) extern entry args
#define VOID_DECL void
EXTERN_DECL(HANDLE process_init, (VOID_DECL));
EXTERN_DECL(HANDLE process_init_fd, (HANDLE stdinh, HANDLE stdouth,
HANDLE stderrh));
EXTERN_DECL(long process_begin, (HANDLE proc, char **argv, char **envp,
char *exec_path, char *as_user));
EXTERN_DECL(long process_pipe_io, (HANDLE proc, char *stdin_data,
int stdin_data_len));
EXTERN_DECL(long process_file_io, (HANDLE proc));
EXTERN_DECL(void process_cleanup, (HANDLE proc));
EXTERN_DECL(HANDLE process_wait_for_any, (VOID_DECL));
EXTERN_DECL(void process_register, (HANDLE proc));
EXTERN_DECL(HANDLE process_easy, (char** argv, char** env));
EXTERN_DECL(BOOL process_kill, (HANDLE proc, int signal));
/* support routines */
EXTERN_DECL(long process_errno, (HANDLE proc));
EXTERN_DECL(long process_last_err, (HANDLE proc));
EXTERN_DECL(long process_exit_code, (HANDLE proc));
EXTERN_DECL(long process_signal, (HANDLE proc));
EXTERN_DECL(char * process_outbuf, (HANDLE proc));
EXTERN_DECL(char * process_errbuf, (HANDLE proc));
EXTERN_DECL(int process_outcnt, (HANDLE proc));
EXTERN_DECL(int process_errcnt, (HANDLE proc));
EXTERN_DECL(void process_pipes, (HANDLE proc, int pipes[3]));
#endif
#endif

10
w32/include/w32err.h Normal file
View File

@@ -0,0 +1,10 @@
#ifndef _W32ERR_H_
#define _W32ERR_H_
#ifndef EXTERN_DECL
#define EXTERN_DECL(entry, args) entry args
#endif
EXTERN_DECL(char * map_windows32_error_to_string, (DWORD error));
#endif /* !_W32ERR_H */

238
w32/pathstuff.c Normal file
View File

@@ -0,0 +1,238 @@
#include <string.h>
#include <stdlib.h>
#include "make.h"
#include "pathstuff.h"
/*
* Convert delimiter separated vpath to Canonical format.
*/
char *
convert_vpath_to_windows32(char *Path, char to_delim)
{
char *etok; /* token separator for old Path */
/*
* Convert all spaces to delimiters. Note that pathnames which
* contain blanks get trounced here. Use 8.3 format as a workaround.
*/
for (etok = Path; etok && *etok; etok++)
if (isblank(*etok))
*etok = to_delim;
return (convert_Path_to_windows32(Path, to_delim));
}
/*
* Convert delimiter separated path to Canonical format.
*/
char *
convert_Path_to_windows32(char *Path, char to_delim)
{
char *etok; /* token separator for old Path */
char *p; /* points to element of old Path */
/* is this a multi-element Path ? */
for (p = Path, etok = strpbrk(p, ":;");
etok;
etok = strpbrk(p, ":;"))
if ((etok - p) == 1) {
if (*(etok - 1) == ';' ||
*(etok - 1) == ':') {
etok[-1] = to_delim;
etok[0] = to_delim;
p = ++etok;
continue; /* ignore empty bucket */
} else if (!isalpha(*p)) {
/* found one to count, handle things like '.' */
*etok = to_delim;
p = ++etok;
} else if ((*etok == ':') && (etok = strpbrk(etok+1, ":;"))) {
/* found one to count, handle drive letter */
*etok = to_delim;
p = ++etok;
} else
/* all finished, force abort */
p += strlen(p);
} else {
/* found another one, no drive letter */
*etok = to_delim;
p = ++etok;
}
return Path;
}
/*
* Convert to forward slashes. Resolve to full pathname optionally
*/
char *
w32ify(char *filename, int resolve)
{
static char w32_path[FILENAME_MAX];
char *p;
if (resolve)
_fullpath(w32_path, filename, sizeof (w32_path));
else
strncpy(w32_path, filename, sizeof (w32_path));
for (p = w32_path; p && *p; p++)
if (*p == '\\')
*p = '/';
return w32_path;
}
char *
getcwd_fs(char* buf, int len)
{
char *p;
if (p = getcwd(buf, len)) {
char *q = w32ify(buf, 0);
strncpy(buf, q, len);
}
return p;
}
#ifdef unused
/*
* Convert delimiter separated pathnames (e.g. PATH) or single file pathname
* (e.g. c:/foo, c:\bar) to NutC format. If we are handed a string that
* _NutPathToNutc() fails to convert, just return the path we were handed
* and assume the caller will know what to do with it (It was probably
* a mistake to try and convert it anyway due to some of the bizarre things
* that might look like pathnames in makefiles).
*/
char *
convert_path_to_nutc(char *path)
{
int count; /* count of path elements */
char *nutc_path; /* new NutC path */
int nutc_path_len; /* length of buffer to allocate for new path */
char *pathp; /* pointer to nutc_path used to build it */
char *etok; /* token separator for old path */
char *p; /* points to element of old path */
char sep; /* what flavor of separator used in old path */
char *rval;
/* is this a multi-element path ? */
for (p = path, etok = strpbrk(p, ":;"), count = 0;
etok;
etok = strpbrk(p, ":;"))
if ((etok - p) == 1) {
if (*(etok - 1) == ';' ||
*(etok - 1) == ':') {
p = ++etok;
continue; /* ignore empty bucket */
} else if (etok = strpbrk(etok+1, ":;"))
/* found one to count, handle drive letter */
p = ++etok, count++;
else
/* all finished, force abort */
p += strlen(p);
} else
/* found another one, no drive letter */
p = ++etok, count++;
if (count) {
count++; /* x1;x2;x3 <- need to count x3 */
/*
* Hazard a guess on how big the buffer needs to be.
* We have to convert things like c:/foo to /c=/foo.
*/
nutc_path_len = strlen(path) + (count*2) + 1;
nutc_path = xmalloc(nutc_path_len);
pathp = nutc_path;
*pathp = '\0';
/*
* Loop through PATH and convert one elemnt of the path at at
* a time. Single file pathnames will fail this and fall
* to the logic below loop.
*/
for (p = path, etok = strpbrk(p, ":;");
etok;
etok = strpbrk(p, ":;")) {
/* don't trip up on device specifiers or empty path slots */
if ((etok - p) == 1)
if (*(etok - 1) == ';' ||
*(etok - 1) == ':') {
p = ++etok;
continue;
} else if ((etok = strpbrk(etok+1, ":;")) == NULL)
break; /* thing found was a WINDOWS32 pathname */
/* save separator */
sep = *etok;
/* terminate the current path element -- temporarily */
*etok = '\0';
#ifdef __NUTC__
/* convert to NutC format */
if (_NutPathToNutc(p, pathp, 0) == FALSE) {
free(nutc_path);
rval = savestring(path, strlen(path));
return rval;
}
#else
*pathp++ = '/';
*pathp++ = p[0];
*pathp++ = '=';
*pathp++ = '/';
strcpy(pathp, &p[2]);
#endif
pathp += strlen(pathp);
*pathp++ = ':'; /* use Unix style path separtor for new path */
*pathp = '\0'; /* make sure we are null terminaed */
/* restore path separator */
*etok = sep;
/* point p to first char of next path element */
p = ++etok;
}
} else {
nutc_path_len = strlen(path) + 3;
nutc_path = xmalloc(nutc_path_len);
pathp = nutc_path;
*pathp = '\0';
p = path;
}
/*
* OK, here we handle the last element in PATH (e.g. c of a;b;c)
* or the path was a single filename and will be converted
* here. Note, testing p here assures that we don't trip up
* on paths like a;b; which have trailing delimiter followed by
* nothing.
*/
if (*p != '\0') {
#ifdef __NUTC__
if (_NutPathToNutc(p, pathp, 0) == FALSE) {
free(nutc_path);
rval = savestring(path, strlen(path));
return rval;
}
#else
*pathp++ = '/';
*pathp++ = p[0];
*pathp++ = '=';
*pathp++ = '/';
strcpy(pathp, &p[2]);
#endif
} else
*(pathp-1) = '\0'; /* we're already done, don't leave trailing : */
rval = savestring(nutc_path, strlen(nutc_path));
free(nutc_path);
return rval;
}
#endif

Some files were not shown because too many files have changed in this diff Show More