#!/usr/bin/make -f PKGNAME := string-lerp fallback = $(firstword $(shell command -v $(1)) $(2)) git = $(shell GIT_DIR=$(firstword $(2) $(srcdir) .)/.git $(GIT) $(1)) git_ls-tree = $(call git,ls-tree -r --name-only $(1),$(2)) git_tag = $(call git,name-rev --tags --name-only $(call git,rev-parse $(1),$(2)),$(2)) GIT ?= git NPM ?= npm NPMBINDIR := ./node_modules/.bin JSTEST ?= $(NPMBINDIR)/jstest JSHINT ?= $(call fallback,jshint,$(NPMBINDIR)/jshint) UGLIFY ?= $(call fallback,uglifyjs,$(NPMBINDIR)/uglifyjs) SOURCES := string-lerp.js UGLIFIED = $(SOURCES:.js=.min.js) TESTS = $(wildcard tests/*.js) LINT_TARGETS = $(patsubst %.js,build/stamp/%.lint,$(SOURCES)) TEST_TARGETS = $(patsubst %.js,build/stamp/%.test,$(SOURCES)) \ $(patsubst tests/%.js,build/stamp/%.test,$(TESTS)) .PHONY: all check lint test ugly dist clean distclean install all: @echo "Interesting targets:" @echo " lint - validate source (with jshint)" @echo " test - run tests (with jstest)" @echo " ugly - generate minified/mangled source files" @echo " dist - generate redistributables (if git tagged)" @echo @echo "(Running these may download packages from npm.)" @echo %.min.js: %.js | $(UGLIFY) $(UGLIFY) --comments -m < $< > $@ build/stamp/%.lint: %.js | $(JSHINT) @mkdir -p $(@D) $(JSHINT) $< @touch $@ build/stamp/%.test: tests/%.js %.js | $(JSTEST) @mkdir -p $(@D) @echo $(JSTEST) $< @$(JSTEST) $< > $@ || (cat $@ && rm -f $@ && exit 1) @touch $@ build/stamp/%.test: tests/%.js $(SOURCES) | $(JSTEST) @mkdir -p $(@D) @echo $(JSTEST) $< @$(JSTEST) $< > $@ || (cat $@ && rm -f $@ && exit 1) @touch $@ check: lint test lint: $(LINT_TARGETS) test: $(TEST_TARGETS) ugly: $(UGLIFIED) build/dist/$(PKGNAME)-undefined.zip build/dist/$(PKGNAME)-undefined.tar.gz: $(error Distributables must be tagged or explicitly versioned) .SECONDEXPANSION: build/dist/$(PKGNAME)-%.zip: $$(call git_ls-tree,$$*) @mkdir -p $(@D) $(GIT) archive --prefix=$(PKGNAME)-$*/ --output=$@ $* .SECONDEXPANSION: build/dist/$(PKGNAME)-%.tar.gz: $$(call git_ls-tree,$$*) @mkdir -p $(@D) $(GIT) archive --prefix=$(PKGNAME)-$*/ --output=$@ $* dist: check $(addprefix build/dist/$(PKGNAME)-$(call git_tag,HEAD),.zip .tar.gz) clean: $(RM) -r build $(RM) $(UGLIFIED) distclean: clean $(RM) -r node_modules install: check $(NPM) install -g . $(JSTEST): $(NPM) install jstest $(JSHINT): $(NPM) install jshint $(UGLIFY): $(NPM) install uglify-js