:import HOME SYSTEMID ARCH VENDOR OS CPU NAME TMPDIR hash = $("#") :append $(HOME)/rc/myke/rc-append target = bin extensions= base = $("$$( $(target)base )" EE) libname = $(SRCDIR F :/^lib//) libbase = $(SRCDIR F).a binbase = $(SRCDIR F) javabase= $(SRCDIR F).jar CC = cc LD = ld INCPATH = $. # /usr/include CFLAGS = -I$((INCPATH)) LDPATH = /lib /usr/lib /opt/lib LIBS = LDFLAGS = -L$((LDPATH)) $(LIBS) # extra dependencies needs before making these binDEPS = libDEPS = objDEPS = :ifndef SRCDIR SRCDIR = $. :endif PREFIX = $(HOME)/opt/$(base) LIBDIR = $(PREFIX)/lib/$(ARCH) BINDIR = $(PREFIX)/bin/$(ARCH) MANDIR = $(PREFIX)/man INCDIR = $(PREFIX)/include SHAREDIR= $(PREFIX)/share/$(binbase) ETCDIR = $(PREFIX)/etc CFILES = $("*.c" G?) HFILES = $("*.h" G?) CCFILES = $("*.cc" G?) OFILES = $((CFILES P)).o $((CCFILES P)).o MANFILESmatch= $("*.[1-9]" G?) MANFILESmatchdirs= $("*.[1-9]/." G?D) MANFILES= $(MANFILESmatch - MANFILESmatchdirs) MANMACROS= HOME PREFIX BINDIR LIBDIR MANDIR ETCDIR SHAREDIR instbin = $(BINDIR)/$(binbase) instlib = $(LIBDIR)/$(libbase) instman(file) = $(MANDIR)/man$(file FS)/$(file) instmans = $("$$(instman($((MANFILES))))" EE) rdir(dir)= $("$$(dir :|^$(HOME)/|~/|)" EE) workpath = $. syncdir(arch) = $(TMPDIR)/myke/$(arch p[/])/$(workpath)/$(arch s[/]) objdir = $(syncdir($(ARCH))) syncmake(dir) = [ -d '$(dir)/.' ] || mkdir -p '$(dir)' || exit 1; \ rsync -av --delete --exclude=/static --exclude=/extern \ --exclude='$(base)' \ --exclude='*.$((objsuffices))' \ $./. $(dir)/. || exit 1; \ cd $(dir) || exit 1; \ echo '$$(MAKE) in $(rdir($(dir))) ...'; \ $(MAKE) 'SRCDIR=$(SRCDIR)' archmake(arch) = rm -f .$(arch p[/]); ln -s $(syncdir($(arch))) .$(arch p[/]); \ $(syncmake($(syncdir($(arch))))) objmake = $(archmake($(ARCH))) objsuffices = o a so class default: :make _$(target) _install: :make _$(target)_install :make _man_install _man_install: :make $(instmans) _bin_install: :make _bin :make $(BINDIR)/$(binbase) _lib_install: :make _lib :make $(LIBDIR)/$(libbase) _bin: :make funcs.h tags @$(objmake) $(binbase) _lib: _always :make $(libname)/funcs.h tags @$(objmake) $(libbase) _always: :make SUBMAKE(dir,args)= \ ( cd "$(dir)" || { echo "$(MAKE): can't cd to $(dir)" >&2; \ exit 1; \ }; \ wd=`pwd`; \ echo "$(MAKE) $(args) in $$wd ..."; \ $(MAKE) $(args); \ xit=$$?; \ echo "return from $$wd"; \ exit $$xit \ ) _submakes: _always @set x $("*/Mykefile" G?D); shift \ xit=0 \ owd=`pwd` \ for subdir \ do \ issymlink "$$subdir" && continue \ $(SUBMAKE($$subdir,)) || xit=$$? \ done \ echo "resuming $(MAKE) in $$owd" \ exit $$xit $(binbase): $(OFILES) $(binDEPS) $(CC) -o $@ $(OFILES) $(LDFLAGS) $(libbase): $(OFILES) $(libDEPS) [ -f $@ ] || ar qv $@ funcs.h ar rv $@ $? ranlib $@ $(BINDIR)/$(binbase): _bin :make $(@D)/. @rm -f $@ cp $(objdir)/$(binbase) $@ chmod 755 $@ $(LIBDIR)/$(libbase): _lib :make $(@D)/. @rm -f $@ cp $(objdir)/$(libbase) $@ chmod 644 $@ dosub(mac) = -e 's;{$(mac)};$("$$($(mac))" EE);g' manhdrs = $(HOME)/rc/header/man sedsub(mac) = $('sed $$("$$$$(dosub($$(($(mac)))))" EE)' EE) mkman = ( cat $(manhdrs); \ $(sedsub(MANMACROS)) \ -e 's/{{\([^}]*\)}}/\\fB\1\\fR/g' \ ) mkmanpod(s,t) = ( $(sedsub(MANMACROS)) \ -e 's/{{\([^}]*\)}}/B<\1>/g' \ | pod2man '--section=$(s)' '--center=$(t)' /dev/fd/0 /dev/fd/1 \ ) mkmanpodhtml(s,t)= ( $(sedsub(MANMACROS)) \ -e 's/{{\([^}]*\)}}/B<\1>/g' \ | pod2html '--title=$(t)' /dev/fd/0 \ ) # change # $@; $(mkman) chmod 644 $@ $(libname)/funcs.h: funcs.h rm -f $@ cp $? $@ chmod 644 $@ funcs.h: extern/$((CFILES P)).h \ static/$((CFILES P)).h @echo "write $@ ..."; cat /dev/null extern/$((CFILES P)).h >$@ mrgtags(tagfile) = ( tmp=/tmp/tags$$$$; \ ( >>$(tagfile); cat $(tagfile); cat ) \ | keeplast | sort -u >$$tmp; \ cat $$tmp >$(tagfile); \ rm $$tmp \ ) tags: $(CFILES) $(HFILES) echo "update $@ ..." \ mktags -v $? | $(mrgtags($@)) :make $(HOME)/rc/tags :precious $(HOME)/rc/tags ## tags $(HOME)/rc/tags: awk '{print $$1 " $(HOME)/s/$(SRCDIR F)/" $$2 " " $$3}' $@ static/%.h: %.c :make $(@D)/. :make extern/$(@F) # technically we want funcs.h, too, but that is overly zealous %.o: %.c extern/%.h static/%.h $(objDEPS) $(CC) -c $(CFLAGS) $(@P).c %.c.cpp: %.c extern/%.h static/%.h funcs.h $(CC) -E -c $(CFLAGS) $(@P) >$@ %.o: %.cc extern/%.h static/%.h $(objDEPS) $(CXX) -c $(CXXFLAGS) $(@P).cc %.c: [ -s "$@" ] || MYKEtarget=$(target) template "$@" >>"$@" %.1: %.pod1 $(mkmanpod(1,$(NAME): Commands)) <$? >$@ %.3: %.pod3 $(mkmanpod(3,$(NAME): Functions)) <$? >$@ %.8: %.pod8 $(mkmanpod(8,$(NAME): Admin Commands)) <$? >$@ %.%.html: %1.pod%2 $(mkmanpodhtml(%2,%1)) <$? >$@ %/.: :make $(@DD)/. mkdir $(@D) %-pl.tar.gz: $(HOME)/scripts/% ( cd $(?D) || exit $$?; \ tar cvhf - $(?F) cs/DEBUG.pm `perldeps $? | sed -n "s|^$$HOME/rc/perl/||p"` \ ) | gzip >$@ chmod 644 $@