Custom jshint configuration.
[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 JSHINTFLAGS += --config tests/jshint.config
20
21 TESTS = $(wildcard tests/*.js)
22 LINT_TARGETS = $(patsubst %.js,build/stamp/%.lint,$(SOURCES))
23 TEST_TARGETS = $(patsubst %.js,build/stamp/%.test,$(SOURCES)) \
24 $(patsubst tests/%.js,build/stamp/%.test,$(TESTS))
25
26 .PHONY: all check lint test ugly dist clean distclean install
27
28 all:
29 @echo "Interesting targets:"
30 @echo " lint - validate source (with jshint)"
31 @echo " test - run tests (with jstest)"
32 @echo " ugly - generate minified/mangled source files"
33 @echo " dist - generate redistributables (if git tagged)"
34 @echo
35 @echo "(Running these may download packages from npm.)"
36 @echo
37
38 %.min.js: %.js | $(UGLIFY)
39 $(UGLIFY) --comments -m < $< > $@
40
41 build/stamp/%.lint: %.js | $(JSHINT)
42 @mkdir -p $(@D)
43 $(JSHINT) $(JSHINTFLAGS) $<
44 @touch $@
45
46 build/stamp/%.test: tests/%.js %.js | $(JSTEST)
47 @mkdir -p $(@D)
48 @echo $(JSTEST) $<
49 @$(JSTEST) $< > $@ || (cat $@ && rm -f $@ && exit 1)
50 @touch $@
51
52 build/stamp/%.test: tests/%.js $(SOURCES) | $(JSTEST)
53 @mkdir -p $(@D)
54 @echo $(JSTEST) $<
55 @$(JSTEST) $< > $@ || (cat $@ && rm -f $@ && exit 1)
56 @touch $@
57
58 check: lint test
59
60 lint: $(LINT_TARGETS)
61
62 test: $(TEST_TARGETS)
63
64 ugly: $(UGLIFIED)
65
66 build/dist/$(PKGNAME)-undefined.zip build/dist/$(PKGNAME)-undefined.tar.gz:
67 $(error Distributables must be tagged or explicitly versioned)
68
69 .SECONDEXPANSION:
70 build/dist/$(PKGNAME)-%.zip: $$(call git_ls-tree,$$*)
71 @mkdir -p $(@D)
72 $(GIT) archive --prefix=$(PKGNAME)-$*/ --output=$@ $* || ($(RM) $@ && exit 1)
73
74 .SECONDEXPANSION:
75 build/dist/$(PKGNAME)-%.tar.gz: $$(call git_ls-tree,$$*)
76 @mkdir -p $(@D)
77 $(GIT) archive --prefix=$(PKGNAME)-$*/ --output=$@ $* || ($(RM) $@ && exit 1)
78
79 dist: check $(addprefix build/dist/$(PKGNAME)-$(call git_tag,HEAD),.zip .tar.gz)
80
81 clean:
82 $(RM) -r build
83 $(RM) $(UGLIFIED)
84
85 distclean: clean
86 $(RM) -r node_modules
87
88 install: check
89 $(NPM) install -g .
90
91 $(JSTEST):
92 $(NPM) install jstest
93
94 $(JSHINT):
95 $(NPM) install jshint
96
97 $(UGLIFY):
98 $(NPM) install uglify-js