c20843c966eee1ec2955cc009ee76773d5b88c38
[string-lerp.git] / Makefile
1 #!/usr/bin/make -f
2
3 PKGNAME := string-lerp
4
5 fallback = $(firstword $(shell command -v $(1)) $(2))
6
7 GIT ?= git
8 git_ls-tree = $(shell $(GIT) ls-tree -r --name-only $(1))
9 git_tag = $(shell $(GIT) name-rev --tags --name-only $(shell $(GIT) rev-parse $(1)))
10
11 NPM ?= npm
12 NPMBINDIR := ./node_modules/.bin
13 JSTEST ?= $(NPMBINDIR)/jstest
14 JSHINT ?= $(call fallback,jshint,$(NPMBINDIR)/jshint)
15 UGLIFY ?= $(call fallback,uglifyjs,$(NPMBINDIR)/uglifyjs)
16 SOURCES := string-lerp.js
17 UGLIFIED = $(SOURCES:.js=.min.js)
18
19 TESTS = $(wildcard tests/*.js)
20 LINT_TARGETS = $(patsubst %.js,build/stamp/%.lint,$(SOURCES))
21 TEST_TARGETS = $(patsubst %.js,build/stamp/%.test,$(SOURCES)) \
22 $(patsubst tests/%.js,build/stamp/%.test,$(TESTS))
23
24 .PHONY: all check lint test ugly dist clean distclean install
25
26 all:
27 @echo "Interesting targets:"
28 @echo " lint - validate source (with jshint)"
29 @echo " test - run tests (with jstest)"
30 @echo " ugly - generate minified/mangled source files"
31 @echo " dist - generate redistributables (if git tagged)"
32 @echo
33 @echo "(Running these may download packages from npm.)"
34 @echo
35
36 %.min.js: %.js | $(UGLIFY)
37 $(UGLIFY) --comments -m < $< > $@
38
39 build/stamp/%.lint: %.js | $(JSHINT)
40 @mkdir -p $(@D)
41 $(JSHINT) $<
42 @touch $@
43
44 build/stamp/%.test: tests/%.js %.js | $(JSTEST)
45 @mkdir -p $(@D)
46 @echo $(JSTEST) $<
47 @$(JSTEST) $< > $@ || (cat $@ && rm -f $@ && exit 1)
48 @touch $@
49
50 build/stamp/%.test: tests/%.js $(SOURCES) | $(JSTEST)
51 @mkdir -p $(@D)
52 @echo $(JSTEST) $<
53 @$(JSTEST) $< > $@ || (cat $@ && rm -f $@ && exit 1)
54 @touch $@
55
56 check: lint test
57
58 lint: $(LINT_TARGETS)
59
60 test: $(TEST_TARGETS)
61
62 ugly: $(UGLIFIED)
63
64 build/dist/$(PKGNAME)-undefined.zip build/dist/$(PKGNAME)-undefined.tar.gz:
65 $(error Distributables must be tagged or explicitly versioned)
66
67 .SECONDEXPANSION:
68 build/dist/$(PKGNAME)-%.zip: $$(call git_ls-tree,$$*)
69 @mkdir -p $(@D)
70 $(GIT) archive --prefix=$(PKGNAME)-$*/ --output=$@ $* || ($(RM) $@ && exit 1)
71
72 .SECONDEXPANSION:
73 build/dist/$(PKGNAME)-%.tar.gz: $$(call git_ls-tree,$$*)
74 @mkdir -p $(@D)
75 $(GIT) archive --prefix=$(PKGNAME)-$*/ --output=$@ $* || ($(RM) $@ && exit 1)
76
77 dist: check $(addprefix build/dist/$(PKGNAME)-$(call git_tag,HEAD),.zip .tar.gz)
78
79 clean:
80 $(RM) -r build
81 $(RM) $(UGLIFIED)
82
83 distclean: clean
84 $(RM) -r node_modules
85
86 install: check
87 $(NPM) install -g .
88
89 $(JSTEST):
90 $(NPM) install jstest
91
92 $(JSHINT):
93 $(NPM) install jshint
94
95 $(UGLIFY):
96 $(NPM) install uglify-js