#!/usr/bin/make -f
-JSTEST ?= node_modules/.bin/jstest
-JSHINT ?= node_modules/.bin/jshint
-UGLIFY ?= node_modules/.bin/uglifyjs
-SOURCES = string-lerp.js
-MINIFIED = $(SOURCES:.js=.min.js)
-
-TESTS = $(wildcard tests/*.js);
-LINT_TARGETS = $(addprefix build/stamp/,$(addsuffix .lint,$(SOURCES)))
-TEST_TARGETS = $(addprefix build/stamp/,$(addsuffix .test,$(SOURCES)))
-
-.PHONY: all check lint test
-
-all: $(MINIFIED)
-
-%.min.js: %.js $(UGLIFY)
- $(UGLIFY) -m < $< > $@
-
-build:
- mkdir -p build/stamp build/dist
-
-build/stamp/%.lint: % build
+PKGNAME := string-lerp
+
+fallback = $(firstword $(shell command -v $(1)) $(2))
+
+GIT ?= git
+git_ls-tree = $(shell $(GIT) ls-tree -r --name-only $(1))
+git_tag = $(shell $(GIT) name-rev --tags --name-only $(shell $(GIT) rev-parse $(1)))
+
+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/% % build
+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)
check: lint test
-lint: $(JSHINT) $(LINT_TARGETS)
+lint: $(LINT_TARGETS)
+
+test: $(TEST_TARGETS)
+
+ugly: $(UGLIFIED)
-test: $(JSTEST) $(TEST_TARGETS)
+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=$@ $* || ($(RM) $@ && exit 1)
+
+.SECONDEXPANSION:
+build/dist/$(PKGNAME)-%.tar.gz: $$(call git_ls-tree,$$*)
+ @mkdir -p $(@D)
+ $(GIT) archive --prefix=$(PKGNAME)-$*/ --output=$@ $* || ($(RM) $@ && exit 1)
+
+dist: check $(addprefix build/dist/$(PKGNAME)-$(call git_tag,HEAD),.zip .tar.gz)
clean:
- rm -rf build
- rm -f $(MINIFIED)
+ $(RM) -r build
+ $(RM) $(UGLIFIED)
distclean: clean
- rm -rf node_modules
+ $(RM) -r node_modules
+
+install: check
+ $(NPM) install -g .
$(JSTEST):
- npm install jstest
+ $(NPM) install jstest
$(JSHINT):
- npm install jshint
+ $(NPM) install jshint
$(UGLIFY):
- npm install uglify-js
+ $(NPM) install uglify-js