On Wed, Jun 19, 2024, 7:28 AM Larry McVoy wrote: > On Tue, Jun 18, 2024 at 07:46:15PM -0500, Nevin Liber wrote: > > But I'll bite. There was the claim by Larry McVoy that "Writing > Makefiles > > isn't that hard". > > > > Please show these beautiful makefiles for a non-toy non-trivial product > > Works on *BSD, MacOS, Windows, Linux on a bunch of different architectures, > Solaris, HPUX, AIX, IRIX, Tru64, etc. > The posted Makefile is no a strictly conforming POSIX Makefile, but uses gmake extensions extensively... And eyes of the beholder may vary... Warner # Copyright 1999-2016 BitMover, Inc > > # Licensed under the Apache License, Version 2.0 (the "License"); > # you may not use this file except in compliance with the License. > # You may obtain a copy of the License at > > # http://www.apache.org/licenses/LICENSE-2.0 > > # Unless required by applicable law or agreed to in writing, software > # distributed under the License is distributed on an "AS IS" BASIS, > # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. > # See the License for the specific language governing permissions and > # limitations under the License. > > # Makefile for BitKeeper. > > # Bitmover makefiles try to provide the following targets: > # > # all build everything under the current directory > # > # clean remove all objects and programs > # > # clobber run clean plus 'bk -r. clean' > # > # srcs bk get all sources in current directory > # > # tags build ctags for all srcs (only needed in this (top) > makefile) > # > # tags.local build ctags for srcs under current directory relative to > top > # > #--- > # Special make variables commonly used this makefile: > # $@ target > # $^ all sources > # $< first source > > INSTALLED_BK ?= $(shell bash -c "cd / && command -v bk") > INREPO ?= $(shell bash -c "test -d ../.bk && echo true || echo false") > HERE := $(shell pwd) > ROOT := $(shell dirname $(HERE)) > REPO := $(notdir $(ROOT)) > URL := $(shell echo bk://work/$(ROOT) | sed s,/home/bk/,,) > LOG = $(shell echo LOG-`bk getuser`) > OSTYPE := $(shell bash -c 'echo $$OSTYPE') > > include conf.mk > > ## Which hosts are used for producing nightly builds > NIGHTLY_HOSTS := macos106 win7-vm debian40 debian40-64 > > ifeq "$(OSTYPE)" "msys" > SYS=win32 > EXE=.exe > XTRA=win32 > ifeq (,$(INSTALLED_BK)) > # BINDIR should really be :C:/Program Files/BitKeeper > # The shell can not handle space in pathname, so > # we use the short name here > BINDIR := "C:/PROGRA~1/BITKEE~1" > else > BINDIR := $(shell bk pwd -s "`bk _registry get > 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion' > ProgramFilesDir`/BitKeeper") > endif > INSTALL=installdir > RESOURCE=bkres.o > UWT_C=$(patsubst %,win32/uwtlib/%.c, wapi_intf wcrt_intf) > BKGUI=bkg$(EXE) > BKG_O=bkg.o > else > SYS=unix > EXE= > # You can set this to anywhere you like and do a > # build production" and you'll have an installed BitKeeper. > ifeq (,$(INSTALLED_BK)) > BINDIR := /usr/local/bitkeeper > else > BINDIR := $(shell "$(INSTALLED_BK)" bin) > endif > INSTALL=install > RESOURCE= > endif > > # By default, we don't print verbose output. If you want to see > # the full compiler command line, use 'make V=1' > # The trick is to do "$(Q)$(CC)" instead of just "$(CC)" so that if > # Q is not set, it's just "$(CC)" and if Q is set to @ it becomes > # a quiet "@$(CC)". > # For the verbose messages, gmake provides > # $(if $(Q),,) > # so we just conditionalize on Q. Empty is false. > ifndef V > Q=@ > export Q > endif > > BK=./bk$(EXE) > G =-g > TRIAL =0 > IMGDIR =$(HERE)/tmp/bitkeeper > > # Handle warning arguments in GCC > # > # -Wall enables a bunch of warnings by default > # -Wno-parentheses shuts up "suggest parentheses around assignment ...". > # Unfortunately it also turns off dangling else warnings. > # -Wno-char-subscripts shuts up "subscript has type char", which comes > # up all the time with broken implementations. > # (renabled in GCC3 since it supresses warnings in system files by > default) > # -Wno-format-y2k supresses complains about '%y' in strftime formats > # -Wstrict-prototypes Don't allow non-ansi function declarations > WARNINGS=-Wall -Wno-parentheses -Wno-char-subscripts -Wno-format-y2k \ > -Wstrict-prototypes > > # Warnings enabled with GCC newer than 3.0 > # > # -Wredundant-decls Declaring same function twice > # -Wmissing-declarations Functions without a prototype > WARNINGS_GCC3=-Wchar-subscripts -Wredundant-decls -Wmissing-declarations > > # Warnings enabled with GCC newer than 4.0 > # > # -Wextra enable a bunch of random things (called -Wextra in newer gccs) > # -Wno-pointer-sign Suppress warnings about changing the signs of pointers > # -Wno-sign-compare Suppress warnings about comparing signed and unsigned > vars > # -Wno-unsed-parameter Support warnings about function parameters that are > # no used > # -Wno-missing-field-initializers > # -Wdeclaration-after-statement Warn if someone does a C++ thing of > declaring > # a variable in the middle of a block > WARNINGS_GCC4=-Wextra -Wno-pointer-sign -Wno-sign-compare \ > -Wno-unused-parameter -Wno-missing-field-initializers \ > -Wdeclaration-after-statement -Wpointer-arith > > # Warnings enabled with GCC newer than 5.0 > # > # -Wno-unusedr-esult Do not warn if a caller ignores return value > WARNINGS_GCC5=-Wno-unused-result > > WARNINGS_GCC6= -Wno-misleading-indentation > > # XXX could not get -Wimplicit-fallthrough=3 to work > WARNINGS_GCC7= -Wno-implicit-fallthrough > > # Other options to consider enabling in the future: > # > # -Wnested-externs Prototypes declared in a function > # -Wwrite-string warn in string constant is passed to a char * > # -Wmissing-prototypes > # -Wunused-parameter > # -Wold-style-definition Would be nice, but zlib falls all over here > > GCC_MAJOR_REV=$(shell $(CC) -dumpversion | sed 's/\..*//') > GCC_MINOR_REV=$(shell $(CC) -dumpversion | sed 's/.*\.//') > ifeq ($(GCC_MAJOR_REV),3) > WARNINGS += $(WARNINGS_GCC3) > endif > ifeq ($(GCC_MAJOR_REV),4) > WARNINGS += $(WARNINGS_GCC3) $(WARNINGS_GCC4) > ifeq ($(shell expr $(GCC_MINOR_REV) \> 5), 1) > WARNINGS += -Wno-unused-result > endif > endif > ifeq ($(GCC_MAJOR_REV),5) > WARNINGS += $(WARNINGS_GCC3) $(WARNINGS_GCC4) $(WARNINGS_GCC5) > endif > ifeq ($(GCC_MAJOR_REV),6) > WARNINGS += $(WARNINGS_GCC3) $(WARNINGS_GCC4) $(WARNINGS_GCC5) \ > $(WARNINGS_GCC6) > endif > ifeq ($(GCC_MAJOR_REV),7) > WARNINGS += $(WARNINGS_GCC3) $(WARNINGS_GCC4) $(WARNINGS_GCC5) \ > $(WARNINGS_GCC6) $(WARNINGS_GCC7) > endif > ifeq ($(GCC_MAJOR_REV),8) > WARNINGS += $(WARNINGS_GCC3) $(WARNINGS_GCC4) $(WARNINGS_GCC5) \ > $(WARNINGS_GCC6) $(WARNINGS_GCC7) $(WARNINGS_GCC8) > endif > > TRACE = -DUSE_TRACE > > ifeq ($(shell uname -s), Darwin) > XLIBS += -lresolv > G += -DNOPROC > endif > > ifeq (clang, $(findstring clang, $(shell $(CC) --version))) > WARNINGS += -Wno-unused-value -Wno-empty-body -Wno-self-assign > endif > > GCCOPTS= > CC_DEBUG=$(GCCOPTS) $G $(WARNINGS) $(TRACE) > CC_FAST_DEBUG=$(GCCOPTS) $G -O2 $(WARNINGS) $(TRACE) > CC_FAST =$(CC_FAST_DEBUG) > CC_WALL=$(GCCOPTS) $G -DLINT $(WARNINGS) $(TRACE) > BINS = $(BK) $(BKGUI) > > # List of all objects in bk other than bk.o. Keep it sorted. > # But put bkver.o/cmd.o first, they generate headers. > OBJ = bkver.o cmd.o \ > abort.o adler32.o alias.o admin.o annotate.o attributes.o \ > bam.o bisect.o bkd.o bkd_bam.o bkd_cd.o \ > bkd_changes.o bkd_client.o bkd_clone.o bkd_cmdtab.o \ > bkd_findkey.o bkd_http.o \ > bkd_id.o bkd_kill.o bkd_level.o bkd_misc.o bkd_nested.o \ > bkd_partition.o bkd_pull.o bkd_push.o bkd_pwd.o \ > bkd_r2c.o \ > bkd_rclone.o bkd_rootkey.o bkd_status.o bkd_synckeys.o > bkd_version.o \ > bkverinfo.o \ > cat.o cfile.o changes.o config.o \ > check.o checksum.o clean.o cleanpath.o clone.o \ > cmdlog.o \ > collapse.o comment.o comments.o commit.o comps.o compress.o \ > contrib/cat.o \ > contrib/test.o \ > converge.o \ > cp.o \ > crypto.o \ > cset.o cset_inex.o csetprune.o csets.o cweave.o \ > dataheap.o dbfile.o delta.o diff.o dspec.o \ > export.o \ > fast-import.o fast-export.o features.o findmerge.o \ > find.o findcset.o fixtool.o fsl.o fslayer.o \ > g2bk.o gca.o get.o gethelp.o \ > gethost.o gettemp.o getuser.o gfiles.o glob.o \ > gnupatch.o graft.o grep.o \ > hash_nokey.o \ > heapdump.o help.o here.o here_check.o hostme.o http.o \ > idcache.o isascii.o info.o \ > key2rev.o key2path.o kill.o kv.o \ > libcommit.o libdiff.o libgraph.o librange.o \ > libsfiles.o lines.o \ > localtm.o lock.o locking.o \ > mail.o merge.o mklock.o \ > mailslot.o \ > mtime.o mv.o names.o ndiff.o nested.o newroot.o \ > opark.o \ > parent.o park.o partition.o \ > patch.o \ > pending.o preference.o proj.o \ > poly.o \ > populate.o \ > port/bkd_server.o \ > port/check_rsh.o \ > port/gethomedir.o \ > port/gethost.o port/getinput.o \ > port/getrealname.o port/getrusage.o port/globalroot.o port/gui.o \ > port/hostColonPath.o port/http_proxy.o \ > port/mail.o port/mnext.o port/networkfs.o \ > port/notifier.o port/ns_sock_host2ip.o port/platforminit.o \ > port/sccs_getuser.o port/sccs_lockfile.o \ > port/startmenu.o \ > port/svcinfo.o \ > port/uninstall.o \ > progress.o \ > prs.o pull.o push.o pwd.o \ > randombits.o randseed.o range.o rcheck.o rclone.o \ > rcs2bk.o rcsparse.o \ > receive.o redblack.o regex.o registry.o renumber.o \ > remap.o remote.o \ > repo.o repos.o repogca.o repostats.o repotype.o \ > resolve.o resolve_binaries.o resolve_contents.o \ > resolve_create.o resolve_filetypes.o \ > resolve_flags.o resolve_generic.o resolve_modes.o \ > resolve_renames.o resolve_tags.o restore.o review.o \ > rm.o rmdel.o rmgone.o \ > root.o rset.o sane.o scat.o sccs.o sccs2bk.o \ > sccslog.o sccs_mv.o search.o sec2hms.o send.o sendbug.o \ > set.o setup.o sfio.o shrink.o sinfo.o \ > slib.o smerge.o sort.o startmenu.o \ > stat.o stattest.o status.o stripdel.o synckeys.o \ > tagmerge.o testcode.o tclsh.o takepatch.o \ > testdates.o time.o timestamp.o touch.o trigger.o \ > unbk.o undo.o undos.o unedit.o \ > unique.o uninstall.o unlink.o unlock.o unpull.o unrm.o unwrap.o > upgrade.o \ > urlinfo.o \ > utils.o uu.o what.o which.o \ > xfile.o xflags.o \ > zone.o > SCRIPTS = bk.script import \ > uuwrap unuuwrap gzip_uuwrap ungzip_uuwrap \ > b64wrap unb64wrap gzip_b64wrap ungzip_b64wrap > PSCR = t/doit t/guitest > PROGS = libc/mtst$(EXE) > LIBS = libc/libc.a > DATA = bkmsg.txt bkhelp.txt version \ > ../doc/bk_refcard.ps ../doc/bk_refcard.pdf ../RELEASE-NOTES.md \ > dspec-changes dspec-changes-3.2 dspec-changes-4.0 dspec-changes-h \ > dspec-changes-hv dspec-changes-json dspec-changes-json-v \ > dspec-changes-vv dspec-log dspec-prs > > CONTRIB = gui/ide/emacs/vc-bk.el contrib/git2bk.l > ALL = PCRE $(LIBS) $(BINS) $(SCRIPTS) $(PSCR) $(XTRA) \ > $(PROGS) L-clean GUI L-doc $(DATA) > > CFLAGS = $(CC_DEBUG) > export CFLAGS > CPPFLAGS= -Ilibc $(TOMCRYPT_CPPFLAGS) $(TOMMATH_CPPFLAGS) \ > $(PCRE_CPPFLAGS) $(LZ4_CPPFLAGS) $(ZLIB_CPPFLAGS) > # Override this if you don't have it. > RANLIB = ranlib > > # list of C sources in bk > SRCS = bk.c $(OBJ:.o=.c) > # list of headers in bk > HDRS = bam.h bkd.h bk-features.h config.h configvars.def diff.h > fsfuncs.h \ > graph.h nested.h \ > progress.h range.h rcs.h resolve.h sccs.h \ > cmd.h poly.h proj.h redblack.h libc/system.h xfile.h > > # list of non-C sources in bk > SCRSRCS = bk.sh import.sh kwextract.pl uuwrap.sh unuuwrap.sh \ > port/unix_platform.sh port/win32_platform.sh \ > gzip_uuwrap.sh ungzip_uuwrap.sh \ > substvars.sh b64wrap.sh gzip_b64wrap.sh \ > unb64wrap.sh ungzip_b64wrap.sh > MISC = bkmsg.doc t/doit.sh > > default: > $(MAKE) p > > SUBDIRS = libc $(shell ls -d tomcrypt tommath 2>/dev/null) > > all: $(ALL) > > prof: > $(MAKE) CFLAGS="$G -pg -O2" LDFLAGS=-pg all > gprof: > $(MAKE) CFLAGS="$G -DPROFILE -pg -O2" LDFLAGS=-pg all > ggprof: > $(MAKE) CFLAGS="$G -DPROFILE -pg" LDFLAGS=-pg all > # Debugging... > d: > $(MAKE) CFLAGS="$G -DDEBUG" all > debug: > $(MAKE) CFLAGS="$G -DDEBUG" all > debug2: > $(MAKE) CFLAGS="$G -DDEBUG2" all > > gWall Wall: > $(MAKE) CFLAGS="$(CC_WALL)" all > > # production builds > p: ## Build a production version of BitKeeper (no -g) > $(MAKE) CFLAGS="$(CC_FAST) $(CF)" all > > trial: > $(MAKE) TRIAL="3*WEEK" CFLAGS="$(CC_FAST) $(CF)" all > > trial3M: > $(MAKE) TRIAL="3*MONTH" CFLAGS="$(CC_FAST) $(CF)" all > > g: ## Build a debug version of BitKeeper (-g) > $(MAKE) CFLAGS="$(CC_DEBUG)" all > gO: > $(MAKE) CFLAGS="$(CC_FAST_DEBUG)" all > gcov: > $(MAKE) CFLAGS="$(CC_DEBUG) -fprofile-arcs -ftest-coverage" all > > clean: L-clean FORCE ## Remove object files and executables > $(if $(Q),@echo Cleaning up,) > $(Q)for sub in $(SUBDIRS) ../doc ../man gui utils win32 t t/win32; > \ > do $(MAKE) -C$$sub "CFLAGS=$(CFLAGS)" $@; \ > done > $(Q)$(RM) $(OBJ) bk.o $(BKG_O) $(BINS) $(SCRIPTS) \ > $(PSRC) $(PROGS) > $(Q)$(RM) tags TAGS tags.local cscope.out substvars a.out cmd.c > cmd.h \ > core *.bb *.bbg *.da *.gcov \ > bk.ico \ > bkmsg.txt bkhelp.txt bkver.c version \ > t/doit t/guitest kw2val_lookup.c bkres.o svcmgr.exe \ > conf.mk > $(Q)$(RM) -r tmp > ifeq "$(OSTYPE)" "msys" > $(Q)$(RM) -rf gnu/bin gnu/doc gnu/etc gnu/share > $(Q)$(RM) -f gnu/m.ico gnu/msys.bat gnu/msys.ico > $(Q)-rmdir gnu/tmp > $(Q)-rmdir gnu > endif > ifeq (true,$(INREPO)) > ifneq (,$(INSTALLED_BK)) > $(Q)EXTRALIST=`"$(INSTALLED_BK)" -Aax | \ > grep -v '~$$\|conf-.*\.mk$$'` ; \ > if [ "$$EXTRALIST" ]; then \ > echo "Clean left behind the following files:" ; \ > for file in $$EXTRALIST; do \ > echo " $$file" ; \ > done ; \ > else \ > echo Clean complete ; \ > fi > endif > endif > > clobber: clean FORCE ## Same as 'clean' but also bk clean files > -@$(BK) -A clean > > # XXX subdirs? (see tags) > wc: $(HDRS) $(SRCS) $(SCRSRCS) $(MISC) > wc -l $(SRCS) $(HDRS) $(SCRSRCS) $(MISC) > > get-e: FORCE > -@$(BK) edit -qT `echo $(HDRS) $(SRCS) $(SCRSRCS) $(MISC) | fmt > -1|sort -u` > $(Q)$(MAKE) tags > > srcs: $(SRCS) $(HDRS) FORCE > $(Q)for sub in $(SUBDIRS); do $(BK) -r$$sub co -q; done > > tags: $(patsubst %,%/tags.local, $(SUBDIRS)) tags.local > @if [ -x $(BK) ]; \ > then $(BK) get -Sq tags.skippats; \ > $(BK) _sort -u $^ | grep -v -ftags.skippats > $@; \ > else \ > bk get -Sq tags.skippats; \ > bk _sort -u $^ | grep -v -ftags.skippats > $@; \ > fi > @echo ctags completed > > tags.local: $(SRCS) $(HDRS) > @ctags -f $@ --file-tags=yes --c-types=d+f+s+t $^ > > %/tags.local: FORCE > $(Q)$(MAKE) -C $(dir $@) tags.local > > ssh sshtest: > $(MAKE) realtest > > rsh rshtest: > PREFER_RSH=YES $(MAKE) realtest > > test tests: > DO_REMOTE=NO $(MAKE) -C t > > nonet nonet_test localtest: > BK_NONET=YES PREFER_RSH=YES $(MAKE) realtest > > realtest: $(ALL) t/doit > -cd gui/tcltk && $(MAKE) clobber > -$(BK) get -qS t/setup t/win32/win32_common > $(BK) -rt get -qTS 't.*' > cd t && ./doit -f 5 > > guitest: $(ALL) t/doit > -$(BK) get -qS t/SCCS/s.g.* t/setup t/win32/win32_common > t/guitest.tcl > cd t && ./doit -g -i > > t/doit: t/doit.sh substvars > ./substvars t/doit.sh > t/doit > chmod +x t/doit > > t/guitest: t/guitest.tcl > cat < t/guitest.tcl > t/guitest > > .PHONY: FORCE > FORCE: > > win32: FORCE > cd win32 && $(MAKE) BINDIR=$(BINDIR) > cd t/win32 && $(MAKE) > > # build libraries in sub directories > %.a: FORCE > $(Q)$(MAKE) -C $(dir $@) $(notdir $@) > > libc/mtst$(EXE): libc/libc.a FORCE > $(Q)$(MAKE) -C libc mtst$(EXE) > > bkres.o: win32/data/bk.rc bk.ico > windres -i win32/data/bk.rc -o bkres.o > > bk.ico: win32/data/bk.ico > @cp -f win32/data/bk.ico . > > ifneq ($(TOMCRYPT_SYSTEM),1) > # add dependency on building libraries first > $(BK): $(TOMCRYPT_LDFLAGS) > endif > ifneq ($(TOMMATH_SYSTEM),1) > # add dependency on building libraries first > $(BK): $(TOMMATH_LDFLAGS) > endif > > $(BK): $(LIBS) bk.o $(RESOURCE) $(OBJ) > $(if $(Q),@echo LINKING $(BK),) > $(Q)$(LD) $(LDFLAGS) -o $@ bk.o $(OBJ) $(RESOURCE) $(LIBS) \ > $(TOMCRYPT_LDFLAGS) $(TOMMATH_LDFLAGS) \ > $(PCRE_LDFLAGS) $(LZ4_LDFLAGS) $(ZLIB_LDFLAGS) $(XLIBS) > > # Windows only rule, BKGUI should be blank on other platforms > $(BKGUI): bkg.o $(RESOURCE) > $(if $(Q),@echo LINKING $(BKGUI),) > $(Q)$(LD) $(LDFLAGS) -o $@ bkg.o $(RESOURCE) -Llibc -lc -mwindows > $(XLIBS) > > bk.script: bk.sh port/$(SYS)_platform.sh > cat port/$(SYS)_platform.sh bk.sh > bk.script > chmod +x bk.script > > bkmsg.txt: bkmsg.doc > cp -f $< $@ > > L-clean: FORCE > @rm -f gui/share/doc/L/little.man ../man/man1/bk-little.1 > @rm -f ../man/man2help/bk-little-1.fmt > > # has to run before bkhelp.txt but after GUI > L-doc L-docs: GUI FORCE > @test -f gui/share/doc/L/little.man || { \ > echo Failed to build gui/share/doc/L/little.man; \ > exit 1; \ > } > @if [ -s gui/share/doc/L/little.man ]; \ > then cp gui/share/doc/L/little.man ../man/man1/bk-little.1; \ > else cp ../man/man1/bk-little.1.pfmt ../man/man1/bk-little.1; \ > fi; \ > chmod +w ../man/man1/bk-little.1 > > bkhelp.txt: $(BK) version L-docs FORCE > @rm -f ../man/man2help/bk-little.fmt > @cd ../man/man2help && $(MAKE) BK=$(HERE)/bk$(EXE) helptxt > @cp ../man/man2help/helptxt bkhelp.txt > @rm -f ../man/man1/bk-little.1 > > html-docs: bkhelp.txt > @cd ../man/man2html && $(MAKE) > > ../doc/bk_refcard.ps: $(BK) FORCE > $(Q)echo building $@ > $(Q)-$(BK) -r../doc co -qS > $(Q)$(MAKE) -C ../doc BK=$(HERE)/bk$(EXE) all > > ../doc/bk_refcard.pdf: ../doc/bk_refcard.ps > > # This must be rebuilt every time because it includes the build time > bkver.c: utils/bk_version FORCE > $(if $(Q),@echo Building $@,) > $(Q)echo "#include \"sccs.h\"" > bk.v > $(Q)echo "char *bk_platform = \""`./utils/bk_version`"\";" >> bk.v > $(Q)echo "int test_release = "$(TRIAL)";" >> bk.v > $(Q)echo "time_t bk_build_timet = "`perl -e "print time"`";" >> > bk.v > $(Q)echo "char *bk_build_dir = \""`pwd`"\";" >> bk.v > $(Q)mv -f bk.v bkver.c > > version: version.sh $(BK) utils/bk_version GUI FORCE > bash version.sh > $@ > > %: %.sh > $(if $(Q),@echo Building $@,) > $(Q)$(RM) $@ > $(Q)cp $< $@ > $(Q)chmod +x $@ > > %: %.l > $(if $(Q),@echo Not lexing $@,) > > import: import.sh port/$(SYS)_platform.sh > cat port/$(SYS)_platform.sh import.sh > import.T > chmod +x import.T > mv -f import.T import > > # Quick and dirty target so we can make all the gui tools without the rest > .PHONY: GUI > GUI: PCRE $(BK) > @$(MAKE) -Cgui BK=$(HERE)/bk$(EXE) gui > > install: installdir > tmp/bitkeeper/bk _install -d -f $(DESTDIR)$(BINDIR) > @echo BitKeeper is installed in $(BINDIR) > @echo We suggest you run: > @echo > @echo sudo $(BINDIR)/bk links /usr/local/bin > @echo > @echo to create the bk symlink. > > installdir: utils/registry.tcl > rm -rf $(IMGDIR) || exit 1 > mkdir -p $(IMGDIR)/contrib > mkdir -p $(IMGDIR)/lscripts > -$(BK) -rwww get -S > -cp -f -r www $(IMGDIR) > -$(BK) get -S $(CONTRIB) > tar cf - $(BINS) $(SCRIPTS) lscripts gui/bin gui/lib gui/images \ > | (cd $(IMGDIR) && tar xf -) > cp -f $(DATA) $(IMGDIR) > cp -f $(CONTRIB) $(IMGDIR)/contrib > (cd ../doc/nested && $(MAKE) install HTML=$(IMGDIR)/html) > if [ $(SYS) = unix ]; \ > then $(BK) get -S ../man/Makefile; \ > cd ../man && $(MAKE) install BINDIR=$(IMGDIR) ;\ > else \ > (cd win32 && $(MAKE) BINDIR=$(IMGDIR) install); \ > cp utils/registry.tcl $(IMGDIR)/gui/lib; \ > fi > cd $(IMGDIR); \ > find . -type l | \ > perl -ne 'chomp; $$a = readlink; print > "$$a|$$_\n";'>symlinks; \ > test -s symlinks || rm -f symlinks > @true > > image: ## Build the installer (left in src/utils/bk-*) > $(MAKE) p > $(MAKE) _image > > _image: > $(MAKE) installdir > ${MAKE} -Cutils BINDIR=$(IMGDIR) "CC=$(CC)" "BK=$(HERE)/bk$(EXE)" > "CFLAGS=$(CFLAGS)" image > > crankturn: crank.sh remote.sh ## Run a clean-build + regressions in > cluster > REPO=$(REPO) URL=$(URL) REMOTE=remote.sh LOG=$(LOG) bash crank.sh > > cranksave: crank.sh remote.sh ## Run a crankturn but save the built images > REPO=$(REPO) URL=$(URL) REMOTE=remote.sh LOG=$(LOG) bash crank.sh > save > > crankstatus: crank.sh remote.sh ## See how the crank is going > REPO=$(REPO) URL=$(URL) REMOTE=remote.sh LOG=$(LOG) bash crank.sh > status > > crankrelease nightly: $(BK) crank.sh remote.sh ## Do a BitKeeper release > (or nightly build) > @(TAG=$(shell $(BK) changes -r+ -d:TAG:) ; \ > test x$$TAG = x && { \ > echo Cannot crankrelease with a non-tagged tip ; \ > exit 1 ; \ > } ; \ > case $@ in \ > crankrelease ) \ > TYPE=release; DIR=/home/bk/images/$$TAG; \ > ;; \ > nightly ) \ > TYPE=nightly; DIR=/home/bk/images/nightly; \ > HOSTS="$(NIGHTLY_HOSTS)" ; \ > ;; \ > esac ; \ > test -d $$DIR || mkdir -p $$DIR ; \ > REPO=$(REPO) URL=$(URL) HOSTS=$$HOSTS REMOTE=remote.sh \ > LOG=$(LOG) bash crank.sh $$TYPE ; \ > $(BK) -R get -qS ../RELEASE-NOTES.md ; \ > cp ../RELEASE-NOTES.md $$DIR ; \ > SAVED_WD=$(shell pwd) ; \ > cd $$DIR && chmod +rx bk-* >/dev/null 2>&1 ; \ > rm -f MD5SUMS ; \ > md5sum bk-* >> MD5SUMS ; \ > echo "Your images are in $$DIR" ; \ > case $@ in \ > crankrelease ) \ > echo "Run './mkrelease $$TAG' to release this version of > bk."; \ > ;; \ > nightly ) \ > # cd $$SAVED_WD ; \ > # ./mkupgrades --nightly $$TAG ; \ > ;; \ > esac) > > crankclean: crank.sh remote.sh > REPO=$(REPO) URL=$(URL) REMOTE=remote.sh LOG=$(LOG) bash crank.sh > clean > > # This target assumes a bk repository > .PHONY: src-tar > src-tar: $(BK) version ## build tar.gz image for the current tree > ifeq (false,$(INREPO)) > $(error This target only works in a BK source repository) > else > ./bk here add default TCLTK > $(Q)-mkdir -p tmp/src > $(Q)(DIR=bk-$(shell $(BK) version -s) ; \ > TAR="$$DIR".tar.gz ; \ > echo "Creating $$TAR in tmp/src..." ; \ > cd tmp/src ; \ > rm -rf "$$DIR" ; \ > ../../bk export -tplain -kwr+ -sdefault -sTCLTK "$$DIR" ; \ > cat ../../version > "$$DIR/src/bkvers.txt" ; \ > tar -czf "$$TAR" "$$DIR" ; \ > rm -rf "$$DIR" ; \ > echo Done ; \ > ) > endif > > # only depend on conf.mk.local if it exists > conf.mk: mkconf.sh $(wildcard conf.mk.local) > sh mkconf.sh > $@ || { $(RM) $@; false; } > > %.o: %.c > $(if $(Q),@echo CC $<,) > $(Q)$(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@ > > port/startmenu.o: port/startmenu.c $(HDRS) > $(if $(Q),@echo CC $<,) > $(Q)$(CC) $(CFLAGS) -fno-strict-aliasing $(CPPFLAGS) -c $< -o $@ > > depend: $(SRCS) > $(CC) -MM -MG -D_DEPEND $(SRCS) > depends > > # for system.h we need to actually run libc's makefile because it includes > # calculated header files > libc/system.h: FORCE > $(MAKE) -C libc system.h > > libc/libc.a: libc/system.h > > sccs.h: PCRE > .PHONY: PCRE > PCRE: > ifneq ($(PCRE_SYSTEM),1) > $(MAKE) -Cgui/tcltk pcre > endif > > $(OBJ) bk.o: $(HDRS) > > cmd.c cmd.h: cmd.pl bk.sh $(filter bkd_%,$(SRCS)) > $(if $(Q),@echo Building $@,) > $(Q)perl cmd.pl || (rm -f cmd.c cmd.h; exit 1) > > # This parses slib.c and extracts the meta-data keywords expanded > # by kw2val() and passes them to gperf to generate hash lookup code. > slib.o: kw2val_lookup.c > kw2val_lookup.c: slib.c kw2val.pl > $(if $(Q),@echo Building $@,) > $(Q)perl kw2val.pl slib.c || (rm -f kw2val_lookup.c; exit 1) > > check-syntax: > $(CC) $(CFLAGS) $(CPPFLAGS) -c -S ${CHK_SOURCES} -o /dev/null > > # print a make variable 'make print-REPO' > # http://www.cmcrossroads.com/article/printing-value-makefile-variable > print-%: > @echo $* = \"$($*)\" > > .PHONY: help > > help: > @grep -E -h '^[-a-zA-Z_\ ]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | > awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' > @echo Suggested: make -j12 image > >