montnaro@sprite.crd.ge.com (Skip Montanaro) (09/29/89)
I just got GNU Make 3.56 from prep. It compiled and ran successfully on a Sun-3 (built under SunOS 3.5, run under 3.5 & 4.0.1), but doesn't work on our Convex C240 or on our Stellar GS1000, both of which ran 3.54 and 3.55 with no hitches. For the Convex, I defined "-DNO_MINUS_C_MINUS_O -DNLIST_NAME_UNION". The Convex builds cleanly, but doesn't appear to get the value of variables from the environment. Executing ./gmake-convex -n clean gives rm -f make- /*.o core instead of rm -f make-convex convex/*.o core for the GNUmakefile that appears at the end of this note. For the Stellar, I defined "-DUSG -DUSGr3" (same flags I used for building GNU Make 3.5[45]). It does not build cleanly. I get the following error message when compiling glob.c: "../glob.c", line 303: Error: struct/union member required. make-stellar: *** [stellar/glob.o] Error 1 This arises due to the new #define for d_ino placed near the top of glob.c: #if defined(USGr3) || defined(DIRENT) #include <dirent.h> # if !defined(d_ino) && !defined(d_fileno) #define d_ino d_fileno ^^^^^^^^^^^^^^^^^^^^^^^^ this'n right here # endif #define direct dirent #define D_NAMLEN(d) strlen((d)->d_name) #else /* Not USGr3 and not DIRENT. */ #define D_NAMLEN(d) ((d)->d_namlen) # ifdef USG #include "ndir.h" /* Get ndir.h from the Emacs distribution. */ # else /* Not USG. */ #include <sys/dir.h> # endif /* USG. */ #endif /* USGr3 or DIRENT. */ Stellar uses d_ino as the inode field in a dirent struct, not d_fileno. I have no other Sys V machines around to compare with, so I don't know if Stellar is quirky or the #define is incorrect. If I turn off USGr3 and copy ndir.h from the Emacs directory tree, Make builds okay, but I get a number of wierd error messages: % ./gmake-stellar clean gmake-stellar: *** No way to make target `clean'. Stop. Again, this is using the GNUmakefile that appears at the end of this note. If I explicitly name the Makefile on the command line, it works okay: % ./gmake-stellar clean -f GNUmakefile rm -f make-stellar stellar/*.o core Using the following small makefile (call it mkfile.tst) objs := glob.o commands.o job.o dir.o file.o load.o misc.o main.o read.o \ remake.o remote.o rule.o implicit.o default.o variable.o expand.o \ function.o vpath.o version.o arscan.o ar.o alloca.o archobjs := $(objs:%.o=$(ARCH)/%.o) make-$(ARCH): $(archobjs) $(CC) $(LDFLAGS) $(archobjs) $(LOADLIBES) -o make-$(ARCH) $(ARCH)/%.o : %.c cd $(ARCH) ; $(CC) $(CFLAGS) -c -I.. ../$< I get the following error message: % ./gmake-stellar -n -f mkfile.tst gmake-stellar: *** No way to make target `stellar/glob.o'. Stop. even though there is clearly a pattern rule defining how to make .o files in the stellar subdirectory from .c files in the current directory. (ARCH is defined as stellar and exported.) If you turn on debugging with -d, it appears from the emitted messages that Make is considering mkfile.tst as a target: % ./gmake-stellar -n -f mkfile.tst -d GNU Make version 3.56, by Richard Stallman and Roland McGrath. Copyright (C) 1988, 1989 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Reading makefiles... Updating makefiles.... Considering target file `mkfile.tst'. Looking for an implicit rule for `mkfile.tst'. Trying pattern rule with stem `mkfile.tst'. Trying implicit dependency `mkfile.tst,v'. Trying pattern rule with stem `mkfile.tst'. Trying implicit dependency `RCS/mkfile.tst,v'. Trying pattern rule with stem `mkfile.tst'. Trying implicit dependency `s.mkfile.tst'. Trying pattern rule with stem `mkfile.tst'. Trying implicit dependency `SCCS/s.mkfile.tst'. Trying pattern rule with stem `mkfile.tst'. Trying implicit dependency `mkfile.tst.o'. ... Here's my GNUmakefile. I modified the distributed Makefile so that I can build all architectures I'm interested in from a single source directory. We rely on the variable ARCH, defined either in the user's environment or on the Make command line, to direct Make to build the correct version. I convinced our system managers some time ago to make sure a version of the Sun shell script, arch, is installed on all our UNIX machines. We normally just set ARCH from our .login or .profile. Others may find this Makefile useful. # Skip Montanaro - 7/10/89 # modified for building separate versions for different architectures in the # same directory # Skip Montanaro - 8/31/89 # modified for version 3.55 # Skip Montanaro - 9/1/89 # added gmake shell script target # Skip Montanaro - 9/27/89 # merged 3.56 changes in where appropriate # Copyright (C) 1988, 1989 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 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. # # Makefile for GNU Make # # Define nothing for BSD, USG for System V, # and USGr3 (as well as USG) for SVR3. # If you have a USG hybrid with <sys/wait.h> and wait3, define HAVE_SYS_WAIT. # If you are USG but have sys_siglist, define HAVE_SIGLIST. # If you are USG, and not USGr3, but have dup2, define HAVE_DUP2. # If your `cc' command doesn't grok -o options with -c (true for # many 4.2 BSD derivatives), define NO_MINUS_C_MINUS_O. defines-convex = -DNO_MINUS_C_MINUS_O defines-stellar = -DUSG defines = $(defines-$(ARCH)) CFLAGS = $(defines) -g LDFLAGS = -g # Define UMAX here to use Encore's inq_stats call. If the load average is in a # symbol in /dev/kmem, define KERNEL_FILE_NAME if not "/vmunix", LDAV_SYMBOL if # not "_avenrun", LDAV_TYPE if not `long int', and LDAV_CVT to convert the # LDAV_TYPE value from LDAV_SYMBOL (in `load') to a double if this is not # "(double) load". If a `struct nlist' (as defined in <nlist.h>) has a `n_un' # union, rather than a simple `n_name' member, define NLIST_NAME_UNION. If the # `n_name' member of a `struct nlist' is an array that must be copied into, # define NLIST_NAME_ARRAY. Otherwise, define NO_LDAV. LOAD_AVG-convex = -DNLIST_NAME_UNION LOAD_AVG = $(LOAD_AVG-$(ARCH)) # If you don't want archive support, comment these out. ARCHIVES = arscan.o ar.o ARCHIVES_SRC = arscan.c ar.c # If your system needs extra libraries loaded in, define them here. # System V probably need -lPW for alloca. 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.o 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 = # Directory to install `make' in. bindir = $(prefix)/usr/local/bin # Directory to install the man page in. mandir = $(prefix)/usr/local/man/man1 # Number to put on the man page filename. manext = 1 objs = glob.o commands.o job.o dir.o file.o load.o misc.o main.o read.o \ remake.o remote.o rule.o implicit.o default.o variable.o expand.o \ function.o vpath.o version.o $(ARCHIVES) $(ALLOCA) $(extras) archobjs = ${objs:%.o=$(ARCH)/%.o} srcs = glob.c commands.c job.c dir.c file.c load.c misc.c main.c read.c \ remake.c remote.c rule.c implicit.c default.c variable.c expand.c \ function.c vpath.c version.c $(ALLOCASRC) $(ARCHIVES_SRC) \ commands.h dep.h file.h job.h make.h rule.h variable.h .SUFFIXES: .SUFFIXES: .o .c .h .ps .dvi .texinfo .PHONY: all doc all: make-$(ARCH) gmake doc: make-info make.dvi # Take your pick. makeinfo = emacs -batch make.texinfo -f texinfo-format-buffer -f save-buffer #makeinfo = makeinfo make.texinfo make-info: make.texinfo $(makeinfo) make.dvi: make.texinfo -tex make.texinfo texindex make.cp make.fn make.ky make.pg make.tp make.vr -tex make.texinfo make.ps: make.dvi dvi2ps make.dvi > make.ps make-$(ARCH): init $(archobjs) $(CC) $(LDFLAGS) $(archobjs) $(LOADLIBES) -o make-$(ARCH) init : @(mkdir $(ARCH) >/dev/null 2>&1 ; exit 0) remake : mv make-$(ARCH) make-$(ARCH).old make-$(ARCH).old $(MFLAGS) make: $(objs) $(CC) $(LDFLAGS) $(objs) $(LOADLIBES) -o make.new mv -f make.new make $(ARCH)/load.o : load.c make.h commands.h cd $(ARCH) ; $(CC) $(CFLAGS) $(LOAD_AVG) -c -I.. ../load.c $(ARCH)/remote.o : remote.c remote-stub.c make.h commands.h cd $(ARCH) ; $(CC) $(CFLAGS) $(REMOTE) -c -I.. ../remote.c $(ARCH)/%.o : %.c cd $(ARCH) ; $(CC) $(CFLAGS) -c -I.. ../$< TAGS: $(srcs) etags -tw $(srcs) tags: $(srcs) ctags -tw $(srcs) .PHONY: install install: $(bindir)/make $(mandir)/make.$(manext) $(bindir)/make: make cp make $@.new mv $@.new $@ $(mandir)/make.$(manext): make.man @(mkdir $(mandir) >/dev/null 2>&1 ; exit 0) cp make.man $@ .PHONY: clean realclean clean: -rm -f make-$(ARCH) $(ARCH)/*.o core realclean: clean -rm -f TAGS tags make.info* make-* make.dvi -rm -f make.?? make.??s make.log make.toc make.*aux % : %.sh rm -f $@ cat $< > $@ chmod a+x $@ # Automatically generated dependencies. glob.o : glob.c 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 dir.o : dir.c make.h file.o : file.c make.h commands.h dep.h file.h variable.h load.o : load.c make.h commands.h job.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 read.o : read.c make.h commands.h dep.h file.h variable.h remake.o : remake.c make.h commands.h job.h dep.h file.h remote.o : remote.c remote-stub.c make.h commands.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 version.o : version.c arscan.o : arscan.c ar.o : ar.c make.h file.h