Compare commits

..

57 Commits

Author SHA1 Message Date
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
56 changed files with 5288 additions and 416 deletions

182
ChangeLog
View File

@@ -1,10 +1,188 @@
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,6 +1,6 @@
# GNU Make-specific makefile for GNU Make.
# Copyright (C) 1990, 91, 92, 93, 94, 95 Free Software Foundation, Inc.
# Copyright (C) 1990, 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
@@ -151,8 +151,9 @@ $(prog): $(objs) $(globdep) #$(addprefix $(ARCH)/,gmalloc.o mcheck.o)
$(CC) $(LDFLAGS) $^ $(globlib) $(LOADLIBES) -o $@.new
mv -f $@.new $@
libc-srcdir = /home/gd/gnu/libc
libc-srcdir = ../libc
globfiles = $(addprefix glob/,COPYING.LIB configure.in configure Makefile.in \
Makefile.ami SCOPTIONS SMakefile \
configure.bat glob.c fnmatch.c glob.h fnmatch.h)
$(globfiles): stamp-glob ;
stamp-glob: $(libc-srcdir)/posix/glob.tar
@@ -186,7 +187,7 @@ Makefile.in: compatMakefile $(nolib-deps:remote-%.dep=remote-stub.dep)
.SUFFIXES: .dep
# Maintain the automatically-generated dependencies.
ifndef no_deps
include $(depfiles)
-include $(depfiles)
endif
$(archpfx)%.dep: %.c
$(mkdep) $< | sed 's,$*\.o,$(@:.dep=.o) $@,' > $@
@@ -222,9 +223,14 @@ dist: cvs-mark default info dvi tests tarfiles
.PHONY: tarfiles
tarfiles: $(tarfiles)
vmsfiles = config.h-vms makefile.com makefile.vms readme.vms \
vmsdir.h vmsfunctions.c vmsify.c
amigafiles = README.Amiga config.ami Makefile.ami SCOPTIONS SMakefile \
amiga.c amiga.h make.lnk
distfiles=README INSTALL COPYING ChangeLog NEWS \
configure Makefile.in configure.in build.sh.in mkinstalldirs \
configh.dos configure.bat \
$(amigafiles) $(vmsfiles) \
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 \

309
Makefile.ami Normal file
View File

@@ -0,0 +1,309 @@
# 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
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 = 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 \
$(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:
.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)
$(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) IDir "" IDir glob \
$(CPPFLAGS) $(CFLAGS) $< $(OUTPUT_OPTION)
# For some losing Unix makes.
SHELL = /bin/sh
#@SET_MAKE@
glob/libglob.a: FORCE config.h
cd glob; $(MAKE) libglob.a
FORCE:
tagsrcs = $(srcs) $(srcdir)remote-*.c
.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) $@.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) make loadavg "#?.o" core make.dvi
distclean: clean glob-realclean
-$(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) make.info*
mostlyclean: clean
.PHONY: glob-clean glob-realclean
glob-clean glob-realclean:
cd glob @@\
$(MAKE) $@
# 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.
# 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

View File

@@ -120,8 +120,9 @@ srcs = $(srcdir)/commands.c $(srcdir)/job.c $(srcdir)/dir.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)/signame.c $(srcdir)/signame.h \
$(srcdir)/getopt.c $(srcdir)/getopt1.c $(srcdir)/getopt.h \
$(srcdir)/commands.h $(srcdir)/dep.h $(srcdir)/filedef.h \
$(srcdir)/job.h $(srcdir)/make.h $(srcdir)/rule.h \
$(srcdir)/variable.h $(ALLOCA_SRC) $(srcdir)/config.h.in
@@ -270,27 +271,33 @@ $(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
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
getloadavg.o: getloadavg.c

8
NEWS
View File

@@ -1,4 +1,4 @@
GNU make NEWS -- history of user-visible changes. 28 February 1996
GNU make NEWS -- history of user-visible changes. 9 May 1996
Copyright (C) 1992, 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
See the end for copying conditions.
@@ -15,6 +15,12 @@ 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>.
Version 3.73

2
README
View File

@@ -1,4 +1,4 @@
This directory contains the 3.74.3 test release of GNU Make.
This directory contains the 3.74.4 test release of GNU Make.
All bugs reported for previous test releases have been fixed.
Some bugs surely remain.

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 3.74. 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

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

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

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));

126
ar.c
View File

@@ -20,14 +20,14 @@ 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_member_touch PARAMS ((char *arname, char *memname));
extern int ar_name_equal PARAMS ((char *name, char *mem, int truncated));
/* Return nonzero if NAME is an archive-member reference, zero if not.
@@ -67,8 +67,113 @@ ar_parse_name (name, arname_p, memname_p)
if (memname_p != 0)
*memname_p = savestring (p + 1, end - (p + 1));
}
#ifdef VMS
#include <lbrdef.h>
#include <mhddef.h>
#include <credef.h>
#include <descrip.h>
#include <ctype.h>
#if __DECC
#include <lbr$routines.h>
#endif
#define uppercasify(str) {char *str1; for (str1 = str; *str1; str1++) *str1 = _toupper(*str1);}
#define LBR$_KEYNOTFND 2527330 /* This isn't in any .h file anywhere so I got it from a MACRO library */
time_t
ar_member_date (name)
char *name;
{
static char *arname;
static char *memname;
char *p,*q;
long int val;
static struct {
struct mhddef mhd;
struct credef cre;
char garbage[256];
} buf;
int func=LBR$C_READ,
type=LBR$C_TYP_OBJ,
rfa[2],
lidx,
status;
$DESCRIPTOR(bufdesc,(char *)&buf);
$DESCRIPTOR(libdesc,arname);
$DESCRIPTOR(moddesc,memname);
/* This "file" is an archive member. */
p = index (name, '(');
arname = savestring (name, p - name);
val = strlen (p) - 2;
/*
if (val > 15)
val = 15;
*/
memname = savestring (p + 1, val);
#ifdef OLDWAY
p = rindex (memname, ')');
if (p != 0) {
q = rindex(p,'.');
if (q)
*q = '\0'; /* to get rid of extension */
}
#endif
q = rindex(memname,'.');
if (q)
*q = '\0'; /* to get rid of extension */
uppercasify(memname);
/* Make sure we know the modtime of the archive itself because
we are likely to be called just before commands to remake a
member are run, and they will change the archive itself. */
(void) f_mtime (enter_file (arname));
libdesc.dsc$a_pointer = arname;
libdesc.dsc$w_length = strlen(arname);
moddesc.dsc$a_pointer = memname;
moddesc.dsc$w_length = strlen(memname);
if (!((status = lbr$ini_control(&lidx,&func,&type,0)) & 1)) {
printf("Error in lbr$ini_control, %d\n",status);
return(-1);
}
if (!((status = lbr$open(&lidx,&libdesc,0,0,0,0,0)) & 1)) {
printf("Error opening library %s to lookup member %s, %d\n",arname, memname ,status);
return(-1);
}
if (!((status = lbr$lookup_key(&lidx,&moddesc,rfa)) & 1)) {
if (status != LBR$_KEYNOTFND)
printf("Error looking up module %s in library %s, %d\n",memname, arname ,status);
lbr$close(&lidx);
return(-1);
}
if (!((status = lbr$set_module(&lidx,rfa,&bufdesc,&bufdesc,0)) & 1)) {
printf("Error getting module info, %d\n",status);
lbr$close(&lidx);
return(-1);
}
lbr$close(&lidx);
val = SHELL$FIX_TIME(&buf.mhd.mhd$l_datim);
free (arname);
free (memname);
return (val <= 0 ? (time_t) -1 : (time_t) val);
}
#else
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. */
@@ -127,9 +232,19 @@ ar_member_date_1 (desc, mem, truncated,
{
return ar_name_equal (name, mem, truncated) ? date : 0;
}
#endif /* !VMS */
/* 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 +297,7 @@ ar_touch (name)
return val;
}
#endif /* !VMS */
/* State of an `ar_glob' run, passed to `ar_glob_match'. */

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 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,9 +369,16 @@ RETSIGTYPE
fatal_error_signal (sig)
int sig;
{
#ifdef __MSDOS__
#if defined(__MSDOS__) || defined(_AMIGA)
remove_intermediates (1);
#ifdef _AMIGA
if (sig == SIGINT)
fputs ("*** Break.\n", stderr);
exit (10);
#else
exit (1);
#endif
#else /* Not MSDOS. */
handling_fatal_signal = 1;
@@ -383,7 +400,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,10 +434,12 @@ 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. */

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

@@ -120,8 +120,9 @@ srcs = $(srcdir)/commands.c $(srcdir)/job.c $(srcdir)/dir.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)/signame.c $(srcdir)/signame.h \
$(srcdir)/getopt.c $(srcdir)/getopt1.c $(srcdir)/getopt.h \
$(srcdir)/commands.h $(srcdir)/dep.h $(srcdir)/filedef.h \
$(srcdir)/job.h $(srcdir)/make.h $(srcdir)/rule.h \
$(srcdir)/variable.h $(ALLOCA_SRC) $(srcdir)/config.h.in

271
config.ami.template Normal file
View File

@@ -0,0 +1,271 @@
/* 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 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
/* 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

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

@@ -0,0 +1,292 @@
/* config.h-vms. Generated by hand by Klaus Kämpf <kkaempf@didymus.rmi.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 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. */
#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 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. */
#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 */
/* 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. */

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

254
dir.c
View File

@@ -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. */
@@ -92,7 +95,92 @@ dosify (filename)
*df = 0;
return dos_filename;
}
#endif
#endif /* __MSDOS__ */
#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);
}
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 +192,12 @@ 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 VMS
ino_t ino[3];
#else
ino_t ino;
#endif
struct dirfile **files; /* Files in this directory. */
DIR *dirstream; /* Stream reading this directory. */
};
@@ -149,7 +241,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 +253,19 @@ find_directory (name)
register unsigned int hash = 0;
register char *p;
register struct directory *dir;
#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 +282,41 @@ 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 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
hash %= DIRECTORY_BUCKETS;
for (dc = directories_contents[hash]; dc != 0; dc = dc->next)
if (dc->dev == st.st_dev && dc->ino == st.st_ino)
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
break;
if (dc == 0)
@@ -209,15 +328,23 @@ find_directory (name)
/* Enter it in the contents hash table. */
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
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. */
@@ -257,19 +384,30 @@ dir_contents_file_exists_p (dir, filename)
register struct dirent *d;
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 +416,22 @@ 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)
{
/* The directory has been all read in. */
return 0;
return 0;
}
while ((d = readdir (dir->dirstream)) != 0)
{
@@ -301,7 +445,7 @@ 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;
df = (struct dirfile *) xmalloc (sizeof (struct dirfile));
@@ -309,11 +453,12 @@ dir_contents_file_exists_p (dir, filename)
dir->files[newhash] = df;
df->name = savestring (d->d_name, len);
df->impossible = 0;
/* 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 +469,6 @@ dir_contents_file_exists_p (dir, filename)
closedir (dir->dirstream);
dir->dirstream = 0;
}
return 0;
}
@@ -355,9 +499,22 @@ 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 (dirend == 0)
return dir_file_exists_p (".", name);
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);
@@ -379,9 +536,20 @@ 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 (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);
@@ -392,7 +560,7 @@ file_impossible (filename)
}
for (hash = 0; *p != '\0'; ++p)
HASH (hash, *p);
HASHI (hash, *p);
hash %= DIRFILE_BUCKETS;
if (dir->contents == 0)
@@ -401,7 +569,13 @@ 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 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
dir->contents->files = 0;
dir->contents->dirstream = 0;
}
@@ -436,9 +610,19 @@ file_impossible_p (filename)
register struct directory_contents *dir;
register struct dirfile *next;
#ifdef VMS
dirend = rindex (filename, ']');
if (dirend == 0)
dir = find_directory ("[]")->contents;
#else
dirend = rindex (filename, '/');
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);
@@ -455,13 +639,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 +685,15 @@ print_dir_data_base ()
if (dir->contents == 0)
printf ("# %s: could not be stat'd.\n", dir->name);
else if (dir->contents->files == 0)
#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 %d, inode %d): could not be opened.\n",
dir->name, dir->contents->dev, dir->contents->ino);
#endif
else
{
register unsigned int f = 0, im = 0;
@@ -508,8 +705,15 @@ print_dir_data_base ()
++im;
else
++f;
#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
if (f == 0)
fputs ("No", stdout);
else
@@ -557,15 +761,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.

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.

112
file.c
View File

@@ -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->name, name))
{
return f;
}
}
return 0;
}
@@ -85,21 +102,42 @@ 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->name, 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));
@@ -144,7 +182,7 @@ 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);
}
@@ -164,13 +202,13 @@ 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->name, name))
break;
if (oldhash != 0 && (newbucket != oldbucket || oldfile != 0))
@@ -303,7 +341,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 +388,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 ()
@@ -387,6 +427,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;
@@ -440,7 +515,9 @@ print_file (f)
struct file *f;
{
register struct dep *d;
#ifdef VMS
extern char *cvt_time PARAMS ((unsigned long));
#endif
putchar ('\n');
if (!f->is_target)
puts ("# Not a target:");
@@ -476,8 +553,13 @@ print_file (f)
else if (f->last_mtime == (time_t) -1)
puts ("# File does not exist.");
else
#ifdef VMS
printf ("# Last modified %.24s (%0lx)\n",
cvt_time(f->last_mtime), (unsigned long) f->last_mtime);
#else
printf ("# Last modified %.24s (%ld)\n",
ctime (&f->last_mtime), (long int) f->last_mtime);
#endif
printf ("# File has%s been updated.\n",
f->updated ? "" : " not");
switch (f->command_state)
@@ -564,3 +646,5 @@ print_file_data_base ()
#endif
}
}
/* EOF */

View File

@@ -72,6 +72,9 @@ 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. */
};
@@ -89,11 +92,17 @@ extern void rename_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

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 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,21 @@ 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>
#endif
#ifdef _AMIGA
#include "amiga.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 +39,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 +117,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;
@@ -337,24 +341,30 @@ expand_function (o, function, text, end)
default:
abort ();
break;
#ifndef VMS /* not supported for vms yet */
case function_shell:
{
char **argv, **envp;
char **argv;
char *error_prefix;
#ifndef _AMIGA
char **envp;
int pipedes[2];
int pid;
#endif
/* Expand the command line. */
text = expand_argument (text, end);
/* 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;
#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 +375,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,7 +387,7 @@ expand_function (o, function, text, end)
else
error_prefix = "";
#ifndef __MSDOS__
#if !defined(__MSDOS__) && !defined(_AMIGA)
if (pipe (pipedes) < 0)
{
perror_with_name (error_prefix, "pipe");
@@ -481,7 +492,8 @@ expand_function (o, function, text, end)
free (buffer);
}
#else /* MSDOS. */
#else /* MSDOS or Amiga */
#ifndef _AMIGA
{
/* 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
@@ -498,7 +510,7 @@ expand_function (o, function, text, end)
unsigned int maxlen = 200;
int cc;
char *buffer;
strcpy (tmp_output, "shXXXXXX");
mktemp (tmp_output);
child_stdout = open (tmp_output,
@@ -509,9 +521,9 @@ expand_function (o, function, text, end)
dup2 (save_stdout, 1);
close (child_stdout);
close (save_stdout);
child_stdout = open (tmp_output, O_RDONLY|O_TEXT, 0644);
buffer = xmalloc (maxlen);
i = 0;
do
@@ -521,15 +533,15 @@ expand_function (o, function, text, end)
maxlen += 512;
buffer = (char *) xrealloc (buffer, maxlen + 1);
}
cc = read (child_stdout, &buffer[i], maxlen - i);
if (cc > 0)
i += cc;
} while (cc > 0);
close (child_stdout);
unlink (tmp_output);
if (i > 0)
{
if (buffer[i - 1] == '\n')
@@ -543,11 +555,88 @@ expand_function (o, function, text, end)
}
free (buffer);
}
#endif /* Not MSDOS. */
#else /* Amiga */
{
/* Amiga can't fork nor spawn, but I can start a program with
redirection of my choice. The rest is the same as above. */
#include <dos/dos.h>
#include <proto/dos.h>
BPTR child_stdout;
char tmp_output[FILENAME_MAX];
unsigned int maxlen = 200;
int cc;
char * buffer, * ptr;
char ** aptr;
int len = 0;
strcpy (tmp_output, "t:MakeshXXXXXXXX");
mktemp (tmp_output);
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
{
if (i == maxlen)
{
maxlen += 512;
buffer = (char *) xrealloc (buffer, maxlen + 1);
}
cc = Read (child_stdout, &buffer[i], maxlen - i);
if (cc > 0)
i += cc;
} while (cc > 0);
Close (child_stdout);
DeleteFile (tmp_output);
if (i > 0)
{
if (buffer[i - 1] == '\n')
buffer[--i] = '\0';
else
buffer[i] = '\0';
p = buffer;
while ((p = index (p, '\n')) != 0)
*p++ = ' ';
o = variable_buffer_output (o, buffer, i);
}
free (buffer);
}
#endif /* Not Amiga. */
#endif /* MSDOS or Amiga. */
free (text);
break;
}
#endif /* !VMS */
case function_origin:
/* Expand the argument. */
@@ -590,7 +679,7 @@ expand_function (o, function, text, end)
free (text);
break;
case function_sort:
/* Expand the argument. */
text = expand_argument (text, end);
@@ -610,7 +699,7 @@ expand_function (o, function, text, end)
nwords *= 2;
words = (char **) xrealloc ((char *) words,
nwords * sizeof (char *));
}
}
words[wordi++] = savestring (p, len);
}
@@ -640,7 +729,7 @@ expand_function (o, function, text, end)
free (text);
break;
case function_foreach:
{
/* Get three comma-separated arguments but
@@ -733,7 +822,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 +881,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 +914,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 +939,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 +955,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,11 +971,11 @@ 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);
@@ -901,19 +990,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 +1039,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 +1056,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;
@@ -1058,11 +1151,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 +1175,7 @@ index argument");
i = strlen (text);
p2 = expand_argument (p + 1, end);
p3 = p2;
while ((p = find_next_token (&p3, &len)) != 0)
{
@@ -1097,11 +1190,11 @@ index argument");
if (doneany)
/* Kill last space. */
--o;
free (p2);
free (text);
break;
case function_dir:
case function_basename:
/* Expand the argument. */
@@ -1111,7 +1204,11 @@ index argument");
while ((p2 = find_next_token (&p3, &len)) != 0)
{
p = p2 + len;
#ifdef VMS
while (p >= p2 && *p != (function == function_dir ? ']' : '.'))
#else
while (p >= p2 && *p != (function == function_dir ? '/' : '.'))
#endif
--p;
if (p >= p2)
{
@@ -1120,7 +1217,15 @@ index argument");
o = variable_buffer_output (o, p2, p - p2);
}
else if (function == function_dir)
#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 +1236,10 @@ index argument");
if (doneany)
/* Kill last space. */
--o;
free (text);
break;
case function_notdir:
case function_suffix:
/* Expand the argument. */
@@ -1144,7 +1249,11 @@ index argument");
while ((p2 = find_next_token (&p3, &len)) != 0)
{
p = p2 + len;
#ifdef VMS
while (p >= p2 && *p != (function == function_notdir ? ']' : '.'))
#else
while (p >= p2 && *p != (function == function_notdir ? '/' : '.'))
#endif
--p;
if (p >= p2)
{

View File

@@ -1,3 +1,29 @@
Mon May 13 12:03:03 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* posix/glob.c [_AMIGA]: Don't include <pwd.h>.
(glob): Remove bogus & in call to globfree.
[_AMIGA]: Use AmigaDOS file name conventions.
Thu May 9 09:17:46 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* posix/glob/SMakefile, posix/glob/SCOPTIONS, posix/glob/Makefile.ami:
New files, AmigaDOS support from Aaron Digulla.
* posix/Makefile (glob.tar): Add AmigaDOS support files.
Tue Apr 2 21:27:01 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* posix/glob.c (glob_pattern_p): Avoid scanning past eos if
the pattern ends with a backslash and quoting is enabled.
* posix/fnmatch.c (fnmatch): Likewise; return FNM_NOMATCH for such
patterns.
Thu Mar 14 06:01:07 1996 Roland McGrath <roland@charlie-brown.gnu.ai.mit.edu>
* posix/glob.c (glob): In GLOB_BRACE brace expansion, fix buffer size
calculation to include trailing invariant portion. Don't use alloca;
instead use a dynamic auto array for GCC, malloc for non-GCC.
Handle nested braces properly.
Fri Mar 1 10:09:46 1996 Roland McGrath <roland@charlie-brown.gnu.ai.mit.edu>
* posix/glob.c: Use canonical code from autoconf manual for dirent

69
glob/Makefile.ami 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
RM = delete
CPPFLAGS =
CFLAGS =
# 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
OUTPUT_OPTION =
.c.o:
$(CC) IDir "" \
$(DEFS) $(CPPFLAGS) $(CFLAGS) $< $(OUTPUT_OPTION)
.PHONY: clean realclean glob-clean glob-realclean distclean
clean glob-clean:
-$(RM) glob.lib "#?.o" core
distclean glob-realclean: clean
-$(RM) TAGS tags Makefile config.status config.h config.log
realcean: distclean
# For inside the C library.
glob.tar glob.tar.Z:
$(MAKE) -C .. $@

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 .. $@

View File

@@ -78,6 +78,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)
@@ -129,7 +132,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 +183,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;

View File

@@ -65,7 +65,9 @@ Cambridge, MA 02139, USA. */
#endif
#endif
#ifndef _AMIGA
#include <pwd.h>
#endif
#if !defined(__GNU_LIBRARY__) && !defined(STDC_HEADERS)
extern int errno;
@@ -160,6 +162,7 @@ extern void bcopy ();
#ifdef __GNUC__
__inline
#endif
#ifndef __SASC
static char *
my_realloc (p, n)
char *p;
@@ -172,7 +175,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__)
@@ -268,48 +272,121 @@ 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)
int firstc;
size_t restlen;
const char *p, *end, *next;
unsigned int depth = 0;
/* Find the end of the brace expression, by counting braces.
While we're at it, notice the first comma at top brace level. */
end = begin + 1;
next = NULL;
while (1)
{
size_t restlen = strlen (end + 1) + 1;
const char *p, *comma;
char *buf;
size_t bufsz = 0;
int firstc;
if (!(flags & GLOB_APPEND))
switch (*end++)
{
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')
case ',':
if (depth == 0 && next == NULL)
next = end;
continue;
case '{':
++depth;
continue;
case '}':
if (depth-- == 0)
break;
continue;
case '\0':
return glob (pattern, flags &~ GLOB_BRACE, errfunc, pglob);
}
if (pglob->gl_pathc == firstc &&
!(flags & (GLOB_NOCHECK|GLOB_NOMAGIC)))
return GLOB_NOMATCH;
break;
}
restlen = strlen (end) + 1;
if (next == NULL)
next = end;
/* 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;
/* In this loop P points to the beginning of the current element
and NEXT points past its terminator. */
p = begin + 1;
while (1)
{
/* Construct a whole name that is one of the brace
alternatives in a temporary buffer. */
int result;
size_t bufsz = (begin - pattern) + (next - 1 - p) + restlen;
#ifdef __GNUC__
char onealt[bufsz];
#else
char *onealt = malloc (bufsz);
if (onealt == NULL)
{
if (!(flags & GLOB_APPEND))
globfree (pglob);
return GLOB_NOSPACE;
}
#endif
memcpy (onealt, pattern, begin - pattern);
memcpy (&onealt[begin - pattern], p, next - 1 - p);
memcpy (&onealt[(begin - pattern) + (next - 1 - p)],
end, restlen);
result = glob (onealt,
((flags & ~(GLOB_NOCHECK|GLOB_NOMAGIC)) |
GLOB_APPEND), errfunc, pglob);
#ifndef __GNUC__
free (onealt);
#endif
/* If we got an error, return it. */
if (result && result != GLOB_NOMATCH)
{
if (!(flags & GLOB_APPEND))
globfree (pglob);
return result;
}
/* Advance past this alternative and process the next. */
p = next;
depth = 0;
scan:
switch (*p++)
{
case ',':
if (depth == 0)
{
/* Found the next alternative. Loop to glob it. */
next = p;
continue;
}
goto scan;
case '{':
++depth;
goto scan;
case '}':
if (depth-- == 0)
/* End of the brace expression. Break out of the loop. */
break;
goto scan;
}
}
if (pglob->gl_pathc == firstc &&
!(flags & (GLOB_NOCHECK|GLOB_NOMAGIC)))
return GLOB_NOMATCH;
}
}
@@ -318,7 +395,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)
@@ -360,6 +441,10 @@ glob (pattern, flags, errfunc, pglob)
{
/* Look up home directory. */
dirname = getenv ("HOME");
#ifdef _AMIGA
if (dirname == NULL || dirname[0] == '\0')
dirname = "SYS:";
#else
if (dirname == NULL || dirname[0] == '\0')
{
extern char *getlogin __P ((void));
@@ -373,13 +458,19 @@ glob (pattern, flags, errfunc, pglob)
}
if (dirname == NULL || dirname[0] == '\0')
dirname = (char *) "~"; /* No luck. */
#endif
}
else
{
#ifdef _AMIGA
if (dirname == NULL || dirname[0] == '\0')
dirname = "SYS:";
#else
/* Look up specific user's home directory. */
struct passwd *p = getpwnam (dirname + 1);
if (p != NULL)
dirname = p->pw_dir;
#endif
}
}
@@ -626,7 +717,7 @@ glob_pattern_p (pattern, quote)
return 1;
case '\\':
if (quote)
if (quote && p[1] != '\0')
++p;
break;
@@ -701,7 +792,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));

View File

@@ -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.
@@ -162,7 +163,11 @@ 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, '/');
#endif
if (lastslash != 0 && lastslash[1] == '\0')
lastslash = 0;
}
@@ -210,7 +215,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

471
job.c
View File

@@ -18,14 +18,19 @@ 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 "job.h"
#include "file.h"
#include "filedef.h"
#include "commands.h"
#include "variable.h"
#include <assert.h>
/* Default shell to use. */
#ifndef _AMIGA
char default_shell[] = "/bin/sh";
#else
char default_shell[] = "";
extern int MyExecute (char **);
#endif
#ifdef __MSDOS__
#include <process.h>
@@ -35,6 +40,20 @@ static char *dos_bname;
static char *dos_bename;
static int dos_batch_file;
#endif /* MSDOS. */
#ifdef _AMIGA
#include <proto/dos.h>
static int amiga_pid = 123;
static int amiga_status;
static char amiga_bname[32];
static int amiga_batch_file;
#endif /* Amiga. */
#ifdef VMS
#include <time.h>
#include <processes.h>
#include <starlet.h>
#include <lib$routines.h>
#endif
#ifdef HAVE_FCNTL_H
#include <fcntl.h>
@@ -102,22 +121,40 @@ extern int wait ();
#endif /* Don't have `union wait'. */
#ifdef VMS
static int vms_jobsefnmask=0;
#endif /* !VMS */
#ifndef HAVE_UNISTD_H
extern int dup2 ();
extern int execve ();
extern void _exit ();
extern int geteuid (), getegid ();
extern int setgid (), getgid ();
#ifndef VMS
extern int geteuid ();
extern int getegid ();
extern int setgid ();
extern int getgid ();
#endif
#endif
extern int getloadavg ();
extern int start_remote_job_p ();
extern int start_remote_job (), remote_status ();
extern char *allocated_variable_expand_for_file PARAMS ((char *line, struct file *file));
RETSIGTYPE child_handler ();
static void free_child (), start_job_command ();
static int load_too_high (), job_next_command ();
extern int getloadavg PARAMS ((double loadavg[], int nelem));
extern int start_remote_job PARAMS ((char **argv, char **envp, int stdin_fd,
int *is_remote, int *id_ptr, int *used_stdin));
extern int start_remote_job_p PARAMS ((void));
extern int remote_status PARAMS ((int *exit_code_ptr, int *signal_ptr,
int *coredump_ptr, int block));
RETSIGTYPE child_handler PARAMS ((int));
static void free_child PARAMS ((struct child *));
static void start_job_command PARAMS ((struct child *child));
static int load_too_high PARAMS ((void));
static int job_next_command PARAMS ((struct child *));
static int start_waiting_job PARAMS ((struct child *));
#ifdef VMS
static void vmsWaitForChildren PARAMS ((int *));
#endif
/* Chain of all live (or recently deceased) children. */
@@ -148,6 +185,10 @@ child_error (target_name, exit_code, exit_sig, coredump, ignored)
if (ignored && silent_flag)
return;
#ifdef VMS
if (!(exit_code & 1))
error("*** [%s] Error 0x%x%s", target_name, exit_code, ((ignored)? " (ignored)" : ""));
#else
if (exit_sig == 0)
error (ignored ? "[%s] Error %d (ignored)" :
"*** [%s] Error %d",
@@ -156,10 +197,31 @@ child_error (target_name, exit_code, exit_sig, coredump, ignored)
error ("*** [%s] %s%s",
target_name, strsignal (exit_sig),
coredump ? " (core dumped)" : "");
#endif /* VMS */
}
static unsigned int dead_children = 0;
#ifdef VMS
/* Wait for nchildren children to terminate */
static void
vmsWaitForChildren(int *status)
{
while (1)
{
if (!vms_jobsefnmask)
{
*status = 0;
return;
}
*status = sys$wflor (32, vms_jobsefnmask);
}
return;
}
#endif
/* Notice that a child died.
reap_children should be called when convenient. */
RETSIGTYPE
@@ -215,7 +277,7 @@ reap_children (block, err)
and we might print the "Waiting for unfinished jobs" message above
when not necessary. */
if (dead_children != 0)
if (dead_children > 0)
--dead_children;
any_remote = 0;
@@ -228,6 +290,9 @@ reap_children (block, err)
printf ("Live child 0x%08lx PID %d%s\n",
(unsigned long int) c,
c->pid, c->remote ? " (remote)" : "");
#ifdef VMS
break;
#endif
}
/* First, check for remote children. */
@@ -235,6 +300,7 @@ reap_children (block, err)
pid = remote_status (&exit_code, &exit_sig, &coredump, 0);
else
pid = 0;
if (pid < 0)
{
remote_status_lose:
@@ -246,24 +312,29 @@ reap_children (block, err)
}
else if (pid == 0)
{
#ifndef __MSDOS__
#if !defined(__MSDOS__) && !defined(_AMIGA)
/* No remote children. Check for local children. */
if (any_local)
{
#ifdef WAIT_NOHANG
#ifdef VMS
vmsWaitForChildren (&status);
pid = c->pid;
#else
#ifdef WAIT_NOHANG
if (!block)
pid = WAIT_NOHANG (&status);
else
#endif
pid = wait (&status);
#endif /* !VMS */
}
else
pid = 0;
if (pid < 0)
{
#ifdef EINTR
#ifdef EINTR
if (errno == EINTR)
continue;
#endif
@@ -296,12 +367,21 @@ reap_children (block, err)
coredump = WCOREDUMP (status);
}
#else /* MSDOS. */
#ifdef __MSDOS__
/* Life is very different on MSDOS. */
pid = dos_pid - 1;
status = dos_status;
exit_code = dos_status;
exit_sig = 0;
coredump = 0;
#else
/* Same on Amiga */
pid = amiga_pid - 1;
status = amiga_status;
exit_code = amiga_status;
exit_sig = 0;
coredump = 0;
#endif
#endif /* Not MSDOS. */
}
else
@@ -442,7 +522,8 @@ reap_children (block, err)
free_child (c);
/* There is now another slot open. */
--job_slots_used;
if (job_slots_used > 0)
--job_slots_used;
/* If the job failed, and the -k flag was not given, die,
unless we are already in the process of dying. */
@@ -453,6 +534,7 @@ reap_children (block, err)
/* Only block for one child. */
block = 0;
}
return;
}
/* Free the storage allocated for CHILD. */
@@ -511,10 +593,16 @@ static void
start_job_command (child)
register struct child *child;
{
#ifndef _AMIGA
static int bad_stdin = -1;
#endif
register char *p;
int flags;
#ifdef VMS
char *argv;
#else
char **argv;
#endif
/* Combine the flags parsed for the line itself with
the flags specified globally for this target. */
@@ -523,6 +611,7 @@ start_job_command (child)
p = child->command_ptr;
child->noerror = flags & COMMANDS_NOERROR;
while (*p != '\0')
{
if (*p == '@')
@@ -553,8 +642,12 @@ start_job_command (child)
/* Figure out an argument list from this command line. */
{
char *end;
char *end = 0;
#ifdef VMS
argv = p;
#else
argv = construct_command_argv (p, &end, child->file);
#endif
if (end == NULL)
child->command_ptr = NULL;
else
@@ -568,8 +661,10 @@ start_job_command (child)
{
/* Go on to the next command. It might be the recursive one.
We construct ARGV only to find the end of the command line. */
#ifndef VMS
free (argv[0]);
free ((char *) argv);
#endif
argv = 0;
}
@@ -608,8 +703,10 @@ start_job_command (child)
if (just_print_flag && !(flags & COMMANDS_RECURSE))
{
#ifndef VMS
free (argv[0]);
free ((char *) argv);
#endif
goto next_command;
}
@@ -618,6 +715,9 @@ start_job_command (child)
fflush (stdout);
fflush (stderr);
#ifndef _AMIGA
#ifndef VMS
/* Set up a bad standard input that reads from a broken pipe. */
if (bad_stdin == -1)
@@ -644,6 +744,8 @@ start_job_command (child)
}
}
#endif /* !AMIGA */
/* Decide whether to give this child the `good' standard input
(one that points to the terminal or whatever), or the `bad' one
that points to the read side of a broken pipe. */
@@ -652,14 +754,19 @@ start_job_command (child)
if (child->good_stdin)
good_stdin_used = 1;
#endif /* Not VMS */
child->deleted = 0;
#ifndef _AMIGA
/* Set up the environment for the child. */
if (child->environment == 0)
child->environment = target_environment (child->file);
#endif
#ifndef __MSDOS__
#if !defined(__MSDOS__) && !defined(_AMIGA)
#ifndef VMS
/* start_waiting_job has set CHILD->remote if we can start a remote job. */
if (child->remote)
{
@@ -680,6 +787,7 @@ start_job_command (child)
}
}
else
#endif /* !VMS */
{
/* Fork the child process. */
@@ -694,6 +802,17 @@ start_job_command (child)
#endif
child->remote = 0;
#ifdef VMS
if (!child_execute_job (argv, child)) {
/* Fork failed! */
perror_with_name ("vfork", "");
goto error;
}
#else
parent_environ = environ;
child->pid = vfork ();
environ = parent_environ; /* Restore value child may have clobbered. */
@@ -711,9 +830,11 @@ start_job_command (child)
perror_with_name ("vfork", "");
goto error;
}
#endif /* !VMS */
}
#else /* MSDOS. */
#else /* MSDOS or Amiga. */
#ifdef __MSDOS__
dos_status = spawnvpe (P_WAIT, argv[0], argv, child->environment);
++dead_children;
child->pid = dos_pid++;
@@ -727,6 +848,17 @@ start_job_command (child)
dos_status = 0;
remove (dos_bename);
}
#else
amiga_status = MyExecute (argv);
++dead_children;
child->pid = amiga_pid++;
if (amiga_batch_file)
{
amiga_batch_file = 0;
DeleteFile (amiga_bname); /* Ignore errors. */
}
#endif /* Not Amiga */
#endif /* Not MSDOS. */
/* We are the parent side. Set the state to
@@ -735,15 +867,17 @@ start_job_command (child)
set_command_state (child->file, cs_running);
/* Free the storage used by the child's argument list. */
#ifndef VMS
free (argv[0]);
free ((char *) argv);
#endif
return;
error:
child->file->update_status = 2;
notice_finished_file (child->file);
return;
}
/* Try to start a child running.
@@ -949,13 +1083,15 @@ new_job (file)
/* The job is now primed. Start it running.
(This will notice if there are in fact no commands.) */
start_waiting_job (c);
(void)start_waiting_job (c);
if (job_slots == 1)
/* Since there is only one job slot, make things run linearly.
Wait for the child to die, setting the state to `cs_finished'. */
while (file->command_state == cs_running)
reap_children (1, 0);
return;
}
/* Move CHILD's pointers to the next command for it to execute.
@@ -984,10 +1120,9 @@ job_next_command (child)
static int
load_too_high ()
{
#ifdef __MSDOS__
#if defined(__MSDOS__) || defined(VMS) || defined(_AMIGA)
return 1;
#else
extern int getloadavg ();
double load;
if (max_load_average < 0)
@@ -1036,10 +1171,227 @@ start_waiting_jobs ()
/* Try to start that job. We break out of the loop as soon
as start_waiting_job puts one back on the waiting list. */
} while (start_waiting_job (job) && waiting_jobs != 0);
}
while (start_waiting_job (job) && waiting_jobs != 0);
return;
}
/* Replace the current process with one executing the command in ARGV.
#ifdef VMS
#include <descrip.h>
#include <clidef.h>
/* This is called as an AST when a child process dies (it won't get
interrupted by anything except a higher level AST).
*/
int vmsHandleChildTerm(struct child *child)
{
int status;
register struct child *lastc, *c;
int child_failed;
vms_jobsefnmask &= ~(1 << (child->efn - 32));
lib$free_ef(&child->efn);
(void) sigblock (fatal_signal_mask);
child_failed = !(child->cstatus & 1 || ((child->cstatus & 7) == 0));
/* Search for a child matching the deceased one. */
lastc = 0;
#if defined(RECURSIVEJOBS) /* I've had problems with recursive stuff and process handling */
for (c = children; c != 0 && c != child; lastc = c, c = c->next);
#else
c = child;
#endif
if (child_failed && !c->noerror && !ignore_errors_flag)
{
/* The commands failed. Write an error message,
delete non-precious targets, and abort. */
child_error (c->file->name, c->cstatus, 0, 0, 0);
c->file->update_status = 1;
delete_child_targets (c);
}
else
{
if (child_failed)
{
/* The commands failed, but we don't care. */
child_error (c->file->name, c->cstatus, 0, 0, 1);
child_failed = 0;
}
#if defined(RECURSIVEJOBS) /* I've had problems with recursive stuff and process handling */
/* If there are more commands to run, try to start them. */
start_job (c);
switch (c->file->command_state)
{
case cs_running:
/* Successfully started. */
break;
case cs_finished:
if (c->file->update_status != 0) {
/* We failed to start the commands. */
delete_child_targets (c);
}
break;
default:
error ("internal error: `%s' command_state \
%d in child_handler", c->file->name);
abort ();
break;
}
#endif /* RECURSIVEJOBS */
}
/* Set the state flag to say the commands have finished. */
c->file->command_state = cs_finished;
notice_finished_file (c->file);
#if defined(RECURSIVEJOBS) /* I've had problems with recursive stuff and process handling */
/* Remove the child from the chain and free it. */
if (lastc == 0)
children = c->next;
else
lastc->next = c->next;
free_child (c);
#endif /* RECURSIVEJOBS */
/* There is now another slot open. */
if (job_slots_used > 0)
--job_slots_used;
/* If the job failed, and the -k flag was not given, die. */
if (child_failed && !keep_going_flag)
die (EXIT_FAILURE);
(void) sigsetmask (sigblock (0) & ~(fatal_signal_mask));
return 1;
}
/* VMS:
Spawn a process executing the command in ARGV and return its pid. */
#define MAXCMDLEN 200
int
child_execute_job (argv, child)
char *argv;
struct child *child;
{
int i;
static struct dsc$descriptor_s cmddsc;
#ifndef DONTWAITFORCHILD
int spflags = 0;
#else
int spflags = CLI$M_NOWAIT;
#endif
int status;
char cmd[4096],*p,*c;
char comname[50];
/* Remove backslashes */
for (p = argv, c = cmd; *p; p++,c++)
{
if (*p == '\\') p++;
*c = *p;
}
*c = *p;
/* check for maximum dcl length and create *.com file if neccesary */
comname[0] = '\0';
if (strlen (cmd) > MAXCMDLEN)
{
FILE *outfile;
char tmp;
strcpy (comname, "sys$scratch:CMDXXXXXX.COM");
(void) mktemp (comname);
outfile = fopen (comname, "w");
if (outfile == 0)
pfatal_with_name (comname);
fprintf (outfile, "$ ");
c = cmd;
while (c)
{
p = strchr (c, ',');
if ((p == NULL) || (p-c > MAXCMDLEN))
p = strchr (c, ' ');
if (p != NULL)
{
p++;
tmp = *p;
*p = '\0';
}
else
tmp = '\0';
fprintf (outfile, "%s%s\n", c, (tmp == '\0')?"":" -");
if (p != NULL)
*p = tmp;
c = p;
}
fclose (outfile);
sprintf (cmd, "$ @%s", comname);
if (debug_flag)
printf ("Executing %s instead\n", cmd);
}
cmddsc.dsc$w_length = strlen(cmd);
cmddsc.dsc$a_pointer = cmd;
cmddsc.dsc$b_dtype = DSC$K_DTYPE_T;
cmddsc.dsc$b_class = DSC$K_CLASS_S;
child->efn = 0;
while (child->efn < 32 || child->efn > 63)
{
status = lib$get_ef(&child->efn);
if (!(status & 1))
return 0;
}
sys$clref(child->efn);
vms_jobsefnmask |= (1 << (child->efn - 32));
#ifndef DONTWAITFORCHILD
status = lib$spawn(&cmddsc,0,0,&spflags,0,&child->pid,&child->cstatus,
&child->efn,0,0);
vmsHandleChildTerm(child);
#else
status = lib$spawn(&cmddsc,0,0,&spflags,0,&child->pid,&child->cstatus,
&child->efn,vmsHandleChildTerm,child);
#endif
if (!(status & 1))
{
printf("Error spawning, %d\n",status);
fflush(stdout);
}
unlink (comname);
return (status & 1);
}
#else /* !VMS */
#ifndef _AMIGA
/* UNIX:
Replace the current process with one executing the command in ARGV.
STDIN_FD and STDOUT_FD are used as the process's stdin and stdout; ENVP is
the environment of the new program. This function does not return. */
@@ -1060,7 +1412,10 @@ child_execute_job (stdin_fd, stdout_fd, argv, envp)
/* Run the command. */
exec_command (argv, envp);
}
#endif /* !AMIGA */
#endif /* !VMS */
#ifndef _AMIGA
/* Replace the current process with one running the command in ARGV,
with environment ENVP. This function does not return. */
@@ -1068,6 +1423,12 @@ void
exec_command (argv, envp)
char **argv, **envp;
{
#ifdef VMS
/* Run the program. */
execve (argv[0], argv, envp);
perror_with_name ("execve: ", argv[0]);
_exit (EXIT_FAILURE);
#else
/* Be the user, permanently. */
child_access ();
@@ -1119,8 +1480,23 @@ exec_command (argv, envp)
}
_exit (127);
#endif /* !VMS */
}
#else /* On Amiga */
void exec_command (argv)
char **argv;
{
MyExecute (argv);
}
void clean_tmp (void)
{
DeleteFile (amiga_bname);
}
#endif /* An Amiga */
#ifndef VMS
/* Figure out the argument list necessary to run LINE as a command. Try to
avoid using a shell. This routine handles only ' quoting, and " quoting
when no backslash, $ or ` characters are seen in the quotes. Starting
@@ -1147,6 +1523,14 @@ construct_command_argv_internal (line, restp, shell, ifs)
"mkdir", "path", "pause", "prompt", "rem", "ren",
"rename", "set", "shift", "time", "type",
"ver", "verify", "vol", ":", 0 };
#endif
#ifdef _AMIGA
static char sh_chars[] = "#;\"|<>()?*$`";
static char *sh_cmds[] = { "cd", "eval", "if", "delete", "echo", "copy",
"rename", "set", "setenv", "date", "makedir",
"skip", "else", "endif", "path", "prompt",
"unset", "unsetenv", "version",
0 };
#else
static char sh_chars[] = "#;\"*?[]&|<>(){}$`^";
static char *sh_cmds[] = { "cd", "eval", "exec", "exit", "login",
@@ -1364,7 +1748,7 @@ construct_command_argv_internal (line, restp, shell, ifs)
{
/* Free the old argument list we were working on. */
free (new_argv[0]);
free (new_argv);
free ((void *)new_argv);
}
#ifdef __MSDOS__
@@ -1394,7 +1778,35 @@ construct_command_argv_internal (line, restp, shell, ifs)
new_argv[0] = strdup (dos_bname);
new_argv[1] = 0;
}
#else /* Not MSDOS. */
#endif /* MSDOS. */
#ifdef _AMIGA
{
char *ptr;
char *buffer;
char *dptr;
buffer = (char *)xmalloc (strlen (line)+1);
ptr = line;
for (dptr=buffer; *ptr; )
{
if (*ptr == '\\' && ptr[1] == '\n')
ptr += 2;
else if (*ptr == '@') /* Kludge: multiline commands */
{
ptr += 2;
*dptr++ = '\n';
}
else
*dptr++ = *ptr++;
}
*dptr = 0;
new_argv = (char **) xmalloc(2 * sizeof(char *));
new_argv[0] = buffer;
new_argv[1] = 0;
}
#else /* Not MSDOS or Amiga */
{
/* SHELL may be a multi-word command. Construct a command line
"SHELL -c LINE", with all special chars in LINE escaped.
@@ -1452,7 +1864,7 @@ construct_command_argv_internal (line, restp, shell, ifs)
new_argv = construct_command_argv_internal (new_line, (char **) NULL,
(char *) 0, (char *) 0);
}
#endif /* MSDOS. */
#endif /* Not MSDOS nor Amiga. */
return new_argv;
}
@@ -1496,8 +1908,9 @@ construct_command_argv (line, restp, file)
return argv;
}
#endif /* !VMS */
#ifndef HAVE_DUP2
#if !defined(HAVE_DUP2) && !defined(_AMIGA)
int
dup2 (old, new)
int old, new;
@@ -1515,4 +1928,4 @@ dup2 (old, new)
return fd;
}
#endif
#endif /* !HAPE_DUP2 && !_AMIGA */

31
job.h
View File

@@ -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,26 @@ 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;
#ifdef POSIX
extern void unblock_sigs ();
extern void unblock_sigs PARAMS ((void));
#else
#ifdef HAVE_SIGSETMASK
extern int fatal_signal_mask;
@@ -61,3 +76,5 @@ extern int fatal_signal_mask;
#define unblock_sigs()
#endif
#endif
#endif /* SEEN_JOB_H */

140
main.c
View File

@@ -1,5 +1,5 @@
/* Argument parsing and main program of GNU Make.
Copyright (C) 1988, 89, 90, 91, 94, 1995 Free Software Foundation, Inc.
Copyright (C) 1988, 89, 90, 91, 94, 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
@@ -17,20 +17,31 @@ 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 "variable.h"
#include "job.h"
#include "commands.h"
#include "getopt.h"
#include <assert.h>
#ifdef _AMIGA
# include <dos/dos.h>
# include <proto/dos.h>
#endif
#ifdef _AMIGA
int __stack = 20000; /* Make sure we have 20K of stack space */
#endif
extern void print_variable_data_base ();
extern void print_dir_data_base ();
extern void print_rule_data_base ();
extern void print_file_data_base ();
extern void print_vpath_data_base ();
extern void init_dir PARAMS ((void));
extern RETSIGTYPE fatal_error_signal PARAMS ((int sig));
extern RETSIGTYPE child_handler PARAMS ((int sig));
extern void print_variable_data_base PARAMS ((void));
extern void print_dir_data_base PARAMS ((void));
extern void print_rule_data_base PARAMS ((void));
extern void print_file_data_base PARAMS ((void));
extern void print_vpath_data_base PARAMS ((void));
#ifndef HAVE_UNISTD_H
extern int chdir ();
@@ -43,10 +54,12 @@ extern double atof ();
#endif
extern char *mktemp ();
static void print_data_base (), print_version ();
static void decode_switches (), decode_env_switches ();
static void define_makeflags ();
static char *quote_as_word ();
static void print_data_base PARAMS((void));
static void print_version PARAMS ((void));
static void decode_switches PARAMS ((int argc, char **argv, int env));
static void decode_env_switches PARAMS ((char *envar, unsigned int len));
static void define_makeflags PARAMS ((int all, int makefile));
static char *quote_as_word PARAMS ((char *out, char *in, int double_dollars));
/* The structure that describes an accepted command switch. */
@@ -169,9 +182,13 @@ static unsigned int inf_jobs = 0;
Negative values mean unlimited, while zero means limit to
zero load (which could be useful to start infinite jobs remotely
but one at a time locally). */
#ifndef NO_FLOAT
double max_load_average = -1.0;
double default_load_average = -1.0;
#else
int max_load_average = -1;
int default_load_average = -1;
#endif
/* List of directories given with -C switches. */
@@ -234,10 +251,17 @@ static const struct command_switch switches[] =
0, (char *) &default_keep_going_flag,
"keep-going", 0,
"Keep going when some targets can't be made" },
#ifndef NO_FLOAT
{ 'l', floating, (char *) &max_load_average, 1, 1, 0,
(char *) &default_load_average, (char *) &default_load_average,
"load-average", "N",
"Don't start multiple jobs unless load is below N" },
#else
{ 'l', positive_int, (char *) &max_load_average, 1, 1, 0,
(char *) &default_load_average, (char *) &default_load_average,
"load-average", "N",
"Don't start multiple jobs unless load is below N" },
#endif
{ 'm', ignore, 0, 0, 0, 0, 0, 0,
0, 0,
"-b" },
@@ -409,13 +433,16 @@ debug_signal_handler (sig)
debug_flag = ! debug_flag;
}
#ifndef _AMIGA
int
main (argc, argv, envp)
int argc;
char **argv;
char **envp;
#else
int main (int argc, char ** argv)
#endif
{
extern RETSIGTYPE fatal_error_signal (), child_handler ();
register struct file *f;
register unsigned int i;
char **p;
@@ -448,8 +475,12 @@ main (argc, argv, envp)
else \
ADD_SIG (sig);
#ifdef SIGHUP
FATAL_SIG (SIGHUP);
#endif
#ifdef SIGQUIT
FATAL_SIG (SIGQUIT);
#endif
FATAL_SIG (SIGINT);
FATAL_SIG (SIGTERM);
@@ -486,7 +517,11 @@ main (argc, argv, envp)
program = "make";
else
{
#ifdef VMS
program = rindex (argv[0], ']');
#else
program = rindex (argv[0], '/');
#endif
#ifdef __MSDOS__
if (program == 0)
program = rindex (argv[0], '\\');
@@ -522,6 +557,7 @@ main (argc, argv, envp)
done before $(MAKE) is are figured out so its definitions will not be
one from the environment. */
#ifndef _AMIGA
for (i = 0; envp[i] != 0; ++i)
{
register char *ep = envp[i];
@@ -539,6 +575,36 @@ main (argc, argv, envp)
be exported, because it was originally in the environment. */
->export = v_export;
}
#else /* For Amiga, read the ENV: device, ignoring all dirs */
{
BPTR env, file, old;
char buffer[1024];
int len;
__aligned struct FileInfoBlock fib;
env = Lock ("ENV:", ACCESS_READ);
if (env)
{
old = CurrentDir (DupLock(env));
Examine (env, &fib);
while (ExNext (env, &fib))
{
if (fib.fib_DirEntryType < 0) /* File */
{
/* Define an empty variable. It will be filled in
variable_lookup(). Makes startup quite a bit
faster. */
define_variable (fib.fib_FileName,
strlen (fib.fib_FileName),
"", o_env, 1)->export = v_export;
}
}
UnLock (env);
UnLock(CurrentDir(old));
}
}
#endif
/* Decode the switches. */
@@ -560,7 +626,7 @@ main (argc, argv, envp)
if (print_version_flag)
die (0);
#ifndef __MSDOS__
#if !defined(__MSDOS__) && !defined(VMS)
/* Set the "MAKE_COMMAND" variable to the name we were invoked with.
(If it is a relative pathname with a slash, prepend our directory name
so the result will run the same program regardless of the current dir.
@@ -683,7 +749,6 @@ main (argc, argv, envp)
starting_directory = current_directory;
}
/* Read any stdin makefiles into temporary files. */
if (makefiles != 0)
@@ -699,7 +764,12 @@ main (argc, argv, envp)
/* Make a unique filename. */
#ifdef HAVE_MKTEMP
#ifdef VMS
static char name[] = "sys$scratch:GmXXXXXX";
#else
static char name[] = "/tmp/GmXXXXXX";
#endif
(void) mktemp (name);
#else
static char name[L_tmpnam];
@@ -712,7 +782,7 @@ main (argc, argv, envp)
while (!feof (stdin))
{
char buf[2048];
int n = fread (buf, 1, sizeof(buf), stdin);
unsigned int n = fread (buf, 1, sizeof(buf), stdin);
if (n > 0 && fwrite (buf, 1, n, outfile) != n)
pfatal_with_name ("fwrite (temporary file)");
}
@@ -1038,6 +1108,7 @@ main (argc, argv, envp)
fatal ("Couldn't change back to original directory.");
}
#ifndef _AMIGA
for (p = environ; *p != 0; ++p)
if (!strncmp (*p, "MAKELEVEL=", 10))
{
@@ -1050,6 +1121,20 @@ main (argc, argv, envp)
sprintf (*p, "MAKELEVEL=%u", makelevel);
break;
}
#else /* AMIGA */
{
char buffer[256];
int len;
len = GetVar ("MAKELEVEL", buffer, sizeof (buffer), GVF_GLOBAL_ONLY);
if (len != -1)
{
sprintf (buffer, "%u", makelevel);
SetVar ("MAKELEVEL", buffer, -1, GVF_GLOBAL_ONLY);
}
}
#endif
if (debug_flag)
{
@@ -1063,7 +1148,12 @@ main (argc, argv, envp)
fflush (stdout);
fflush (stderr);
#ifndef _AMIGA
exec_command (argv, environ);
#else
exec_command (argv);
exit (0);
#endif
/* NOTREACHED */
}
}
@@ -1101,15 +1191,15 @@ main (argc, argv, envp)
/* Nothing happened. */
case 0:
/* Updated successfully. */
status = 0;
status = EXIT_SUCCESS;
break;
case 2:
/* Updating failed. */
status = 2;
status = EXIT_FAILURE;
break;
case 1:
/* We are under -q and would run some commands. */
status = 1;
status = EXIT_FAILURE;
break;
default:
abort ();
@@ -1359,6 +1449,7 @@ positive integral argument",
= *(unsigned int *) cs->noarg_value;
break;
#ifndef NO_FLOAT
case floating:
if (optarg == 0 && optind < argc
&& (isdigit (argv[optind][0]) || argv[optind][0] == '.'))
@@ -1370,6 +1461,7 @@ positive integral argument",
: *(double *) cs->noarg_value);
break;
#endif
}
/* We've found the switch. Stop looking. */
@@ -1589,7 +1681,11 @@ quote_as_word (out, in, double_dollars)
{
while (*in != '\0')
{
#ifdef VMS
if (index ("^;'\"*?$<>(){}|&~`\\ \t\r\n\f\v", *in) != 0)
#else
if (index ("^;'\"*?[]$<>(){}|&~`\\ \t\r\n\f\v", *in) != 0)
#endif
*out++ = '\\';
if (double_dollars && *in == '$')
*out++ = '$';
@@ -1685,6 +1781,7 @@ define_makeflags (all, makefile)
}
break;
#ifndef NO_FLOAT
case floating:
if (all)
{
@@ -1704,6 +1801,7 @@ define_makeflags (all, makefile)
}
}
break;
#endif
case string:
if (all)
@@ -1771,7 +1869,6 @@ define_makeflags (all, makefile)
flags = flags->next;
}
/* Define MFLAGS before appending variable definitions. */
if (p == &flagstring[1])
@@ -1788,7 +1885,6 @@ define_makeflags (all, makefile)
override any makefile redefinition. */
(void) define_variable ("MFLAGS", 6, flagstring, o_env, 1);
if (all && command_variables != 0)
{
/* Now write a reference to $(MAKEOVERRIDES), which contains all the

View File

@@ -63,7 +63,7 @@ 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
@@ -131,6 +131,9 @@ 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
@@ -352,7 +355,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@@}.)
@@ -405,7 +408,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
@@ -535,7 +538,8 @@ $(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
@@ -551,10 +555,11 @@ only the directories where files are installed.
Like @code{install}, but strip the executable files while installing
them. 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 +614,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
@@ -634,7 +639,7 @@ run the @code{makeinfo} program, which is part of the Texinfo
distribution.
@item dvi
Generate DVI files for all Texinfo documentation.
Generate DVI files for all Texinfo documentation.
For example:
@smallexample
@@ -649,7 +654,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 +674,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 +696,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

139
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 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. */
@@ -67,9 +78,7 @@ extern int errno;
#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
@@ -132,7 +141,7 @@ 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
@@ -153,8 +162,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 +187,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. */
@@ -214,8 +233,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 +255,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
@@ -258,19 +293,30 @@ extern char *alloca ();
#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,16 +326,22 @@ 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 void construct_include_path ();
@@ -298,8 +350,9 @@ 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>
@@ -311,12 +364,17 @@ extern void user_access (), make_access (), child_access ();
#if !defined (__GNU_LIBRARY__) && !defined (POSIX) && !defined (_POSIX_VERSION)
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)
@@ -334,7 +392,11 @@ extern int print_directory_flag, warn_undefined_variables_flag;
extern int posix_pedantic;
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 +411,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 EDITION 0.51
@set VERSION 3.75 Beta
@set UPDATED 28 February 1996
@set UPDATE-MONTH February 1996
@set UPDATED 9 May 1996
@set UPDATE-MONTH May 1996
@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
@@ -32,7 +32,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
Free Software Foundation, Inc.
Permission is granted to make and distribute verbatim copies of
@@ -68,7 +68,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 Free Software Foundation, Inc.
@sp 2
Published by the Free Software Foundation @*
59 Temple Place -- Suite 330, @*
@@ -1126,6 +1126,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}
@@ -2131,6 +2133,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
@@ -6897,17 +6920,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
@@ -8026,7 +8076,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}:

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 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,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,commands,default,dir,expand,file,function,-
implicit,job,main,misc,read,remake,remote-stub,rule,-
signame,variable,version,vmsfunctions,vmsfiy,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","NO_ARCHIVES") 'p1'
$ exit
$ endsubroutine : compileit

121
makefile.vms Normal file
View File

@@ -0,0 +1,121 @@
# Copyright (C) 1988, 1989 Free Software Foundation, Inc.
# This file is part of GNU Make.
#
# VMS extensions from GNU Make 3.60 imported by
# Klaus Kämpf (kkaempf@didymus.rmi.de)
#
# 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 1, 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","NO_ARCHIVES","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 =
# 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) $< $@

4
misc.c
View File

@@ -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)
@@ -540,6 +542,7 @@ log_access (flavor)
static void
init_access ()
{
#ifndef VMS
user_uid = getuid ();
user_gid = getgid ();
@@ -553,6 +556,7 @@ init_access ()
log_access ("Initialized");
current_access = make;
#endif
}
#endif /* GETLOADAVG_PRIVILEGED */

158
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 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,13 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "glob/glob.h"
#endif
#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
/* A `struct linebuffer' is a structure which holds a line of text.
`readline' reads a line from a stream into a linebuffer
@@ -81,9 +80,11 @@ static struct conditionals *conditionals = &toplevel_conditionals;
static char *default_include_directories[] =
{
INCLUDEDIR,
#ifndef _AMIGA
"/usr/gnu/include",
"/usr/local/include",
"/usr/include",
#endif
0
};
@@ -104,6 +105,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 +150,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 +189,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;
@@ -268,6 +290,7 @@ read_makefile (filename, flags)
#ifdef lint /* Suppress `used before set' messages. */
two_colon = 0;
pattern_percent = 0;
#endif
if (debug_flag)
@@ -302,7 +325,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;
@@ -544,15 +566,16 @@ read_makefile (filename, flags)
v->export = v_noexport;
}
}
else if (word1eq ("include", 7) || word1eq ("-include", 8))
else 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 +609,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
@@ -733,6 +756,22 @@ read_makefile (filename, flags)
/* For MS-DOS, skip a "C:\...". */
if (p != 0 && p[1] == '\\' && isalpha (p[-1]))
p = 0;
#endif
#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 (p != 0)
{
@@ -1303,7 +1342,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;
@@ -1511,7 +1550,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 +1559,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 +1578,38 @@ 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;
#endif
#ifdef _AMIGA
if (stopchar == ':' && p && *p == ':' &&
!(isspace(p[1]) || !p[1] || isspace(p[-1])))
{
p = find_char_unquote (p+1, stopchars, 1);
}
#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 +1620,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 +1885,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)
@@ -1860,6 +1961,7 @@ char *
tilde_expand (name)
char *name;
{
#ifndef VMS
if (name[1] == '/' || name[1] == '\0')
{
extern char *getenv ();
@@ -1882,6 +1984,7 @@ tilde_expand (name)
free (home_dir);
home_dir = getenv ("HOME");
}
#ifndef _AMIGA
if (home_dir == 0 || home_dir[0] == '\0')
{
extern char *getlogin ();
@@ -1894,6 +1997,7 @@ tilde_expand (name)
home_dir = p->pw_dir;
}
}
#endif /* !AMIGA */
if (home_dir != 0)
{
char *new = concat (home_dir, "", name + 1);
@@ -1902,6 +2006,7 @@ tilde_expand (name)
return new;
}
}
#ifndef _AMIGA
else
{
struct passwd *pwent;
@@ -1919,7 +2024,8 @@ tilde_expand (name)
else if (userend != 0)
*userend = '/';
}
#endif /* !AMIGA */
#endif /* !VMS */
return 0;
}
@@ -1979,7 +2085,7 @@ multi_glob (chain, size)
}
else
memname = 0;
#endif
#endif /* !NO_ARCHIVES */
switch (glob (old->name, GLOB_NOCHECK|GLOB_ALTDIRFUNC, NULL, &gl))
{
@@ -2026,7 +2132,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 +2143,7 @@ multi_glob (chain, size)
}
globfree (&gl);
free (old->name);
free (old);
free ((char *)old);
break;
}

62
readme.vms Normal file
View File

@@ -0,0 +1,62 @@
This is the VMS port of GNU Make version 3.74.
It is based on the VMS port of GNU Make 3.60 by Mike Moretti.
This port was done by Klaus Kämpf (kkaempf@didymus.rmi.de)
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 3.74 built you can just use Make with this makefile to rebuild.
Here are some notes about GNU Make for VMS:
Libraries are not supported. They were in GNU Make 3.60 but somehow I didn't
care porting the code. If there is enough interest, I'll do it at some
later time.
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]
None of the stuff in vpath.c has been implemented yet.
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.

167
remake.c
View File

@@ -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,30 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include <sys/file.h>
#endif
extern int try_implicit_rule ();
#ifdef VMS
#include <starlet.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));
#ifdef VMS
extern int vms_stat PARAMS ((char *name, struct stat *buf));
#endif
/* 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 +113,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 +122,6 @@ update_goal_chain (goals, makefiles)
int x;
time_t mtime = MTIME (file);
check_renamed (file);
if (makefiles)
{
if (file->cmd_target)
@@ -229,7 +242,6 @@ update_goal_chain (goals, makefiles)
just_print_flag = n;
job_slots = j;
}
return status;
}
@@ -706,49 +718,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 > 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;
}
}
@@ -986,12 +1027,28 @@ f_mtime (file, search)
unrecoverably absent. */
static time_t now;
#ifdef VMS
/* Handle vms 64bit to 32bit time hack introduced in vms_stat() ... */
static unsigned long vms_now[2]; /* assumes 32 bit long ! */
static int vms_now_set = 0;
if (!vms_now_set)
{
sys$gettim(vms_now);
now = ((vms_now[0]>>24) & 0xff) + ((vms_now[1]<<8) & 0xffffff00);
vms_now_set = 1;
}
#endif
if (mtime > now && ! file->updated)
{
/* This file's time appears to be in the future.
Update our concept of the present, and compare again. */
#ifndef VMS
extern time_t time ();
if (mtime > time (&now))
#else
if ((mtime != -1) && (mtime > now))
#endif
{
error ("*** File `%s' has modification time in the future",
file->name);
@@ -1021,7 +1078,11 @@ name_mtime (name)
{
struct stat st;
#ifdef VMS
if (vms_stat (name, &st) < 0)
#else
if (stat (name, &st) < 0)
#endif
return (time_t) -1;
return (time_t) st.st_mtime;
@@ -1039,8 +1100,10 @@ library_search (lib, mtime_ptr)
{
static char *dirs[] =
{
#ifndef _AMIGA
"/lib",
"/usr/lib",
#endif
LIBDIR, /* Defined by configuration. */
0
};
@@ -1054,7 +1117,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)
{
@@ -1078,7 +1145,11 @@ library_search (lib, mtime_ptr)
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

@@ -17,6 +17,8 @@ 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"

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,5 +1,5 @@
/* 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 program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -23,6 +23,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. */
@@ -239,7 +243,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 +297,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,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 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,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 "dep.h"
#include "filedef.h"
#include "job.h"
#include "commands.h"
#include "variable.h"
#include "dep.h"
#include "file.h"
/* Hash table of all global variable definitions. */
@@ -39,6 +40,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. */
@@ -360,7 +366,7 @@ define_automatic_variables ()
? "" : remote_description);
(void) define_variable ("MAKE_VERSION", 12, buf, o_default, 0);
/* 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);
@@ -605,6 +611,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);
@@ -795,6 +829,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
}
}

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,4 @@
char *version_string = "3.74.3";
char *version_string = "3.74.4";
/*
Local variables:

40
vmsdir.h Normal file
View File

@@ -0,0 +1,40 @@
/* dirent.h for vms */
#include <rms.h>
#define MAXNAMLEN 255
typedef unsigned long u_long;
typedef unsigned short u_short;
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 */

234
vmsfunctions.c Normal file
View File

@@ -0,0 +1,234 @@
#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);
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 */

925
vmsify.c Normal file
View File

@@ -0,0 +1,925 @@
/*
vmsify.c
Module for vms <-> unix file name conversion
Written by Klaus Kämpf (kkaempf@didymus.rmi.de)
*/
#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, "[.");
nstate = N_DOT;
vptr += 2;
copyto (&vptr, &fptr, '/', 1);
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)
{
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 */

10
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 Free Software Foundation, Inc.
This file is part of GNU Make.
GNU Make is free software; you can redistribute it and/or modify
@@ -17,7 +17,7 @@ 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"
@@ -41,7 +41,7 @@ static struct vpath *vpaths;
static struct vpath *general_vpath;
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
@@ -340,7 +340,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)
@@ -432,6 +432,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 +440,7 @@ selective_vpath_search (path, file, mtime_ptr)
}
}
free (name);
return 0;
}