1SHELL     ?= sh
2PREFIX    ?= /usr/local
3
4CRAM_OPTS ?= -v
5
6PROJECT   ?= $(CURDIR)
7BIN       ?= ${PROJECT}/bin
8SRC       ?= ${PROJECT}/src
9TESTS     ?= ${PROJECT}/tests
10TOOLS     ?= ${PROJECT}/tools
11TEST      ?= ${PROJECT}/tests
12
13ZSH_VERSION     ?= zsh-5.3
14CONTAINER_ROOT  ?= /antigen
15USE_CONTAINER   ?= docker
16CONTAINER_IMAGE ?= desyncr/zsh-docker-
17
18TARGET     ?= ${BIN}/antigen.zsh
19SRC        ?= ${SRC}
20EXTENSIONS ?=
21GLOB       ?=
22
23WITH_DEBUG      ?= yes
24WITH_EXTENSIONS ?= yes
25WITH_DEFER      ?= yes
26WITH_LOCK       ?= yes
27WITH_PARALLEL   ?= yes
28WITH_CACHE      ?= yes
29WITH_COMPLETION ?= yes
30
31ifeq (${WITH_EXTENSIONS}, yes)
32EXTENSIONS += ${SRC}/ext/ext.zsh
33endif
34ifeq (${WITH_DEFER}, yes)
35EXTENSIONS += ${SRC}/ext/defer.zsh
36endif
37ifeq (${WITH_LOCK}, yes)
38EXTENSIONS += ${SRC}/ext/lock.zsh
39endif
40ifeq (${WITH_PARALLEL}, yes)
41EXTENSIONS += ${SRC}/ext/parallel.zsh
42endif
43ifeq (${WITH_CACHE}, yes)
44GLOB       += ${SRC}/boot.zsh
45EXTENSIONS += ${SRC}/ext/cache.zsh
46endif
47
48LIB     = $(filter-out ${SRC}/lib/log.zsh,$(sort $(wildcard ${PWD}/src/lib/*.zsh)))
49HELPERS = $(sort $(wildcard ${PWD}/src/helpers/*.zsh))
50COMMANDS= $(sort $(wildcard ${PWD}/src/commands/*.zsh))
51GLOB   += ${SRC}/antigen.zsh ${HELPERS} ${LIB} ${COMMANDS} ${EXTENSIONS}
52
53ifeq (${WITH_COMPLETION}, yes)
54GLOB  += ${SRC}/_antigen
55endif
56# If debug is enabled then load debug functions
57ifeq (${WITH_DEBUG}, yes)
58GLOB  += ${SRC}/lib/log.zsh
59endif
60
61VERSION      ?= develop
62VERSION_FILE  = ${PROJECT}/VERSION
63
64BANNER_SEP    =$(shell printf '%*s' 70 | tr ' ' '\#')
65BANNER_TEXT   =This file was autogenerated by \`make\`. Do not edit it directly!
66BANNER        =${BANNER_SEP}\n\# ${BANNER_TEXT}\n${BANNER_SEP}\n
67
68HEADER_TEXT   =\# Antigen: A simple plugin manager for zsh\n\
69\# Authors: Shrikant Sharat Kandula\n\
70\#          and Contributors <https://github.com/zsh-users/antigen/contributors>\n\
71\# Homepage: http://antigen.sharats.me\n\
72\# License: MIT License <mitl.sharats.me>\n
73
74define ised
75	sed $(1) $(2) > "$(2).1"
76	mv "$(2).1" "$(2)"
77endef
78
79define isede
80	sed -E $(1) $(2) > "$(2).1"
81	mv "$(2).1" "$(2)"
82endef
83
84.PHONY: itests tests install all
85
86build:
87	@echo Building Antigen...
88	@printf "${BANNER}" > ${BIN}/antigen.zsh
89	@printf "${HEADER_TEXT}" >> ${BIN}/antigen.zsh
90	@for src in ${GLOB}; do echo "----> $$src"; cat "$$src" >> ${TARGET}; done
91	@echo "-antigen-env-setup" >> ${TARGET}
92	@echo "${VERSION}" > ${VERSION_FILE}
93	@$(call ised,"s/{{ANTIGEN_VERSION}}/$$(cat ${VERSION_FILE})/",${TARGET})
94	@$(call ised,"s/{{ANTIGEN_REVISION}}/$$(git log -n1 --format=%h -- src)/",${TARGET})
95	@$(call ised,"s/{{ANTIGEN_REVISION_DATE}}/$$(git log -n1 --format='%ai' -- src)/",${TARGET})
96ifeq (${WITH_DEBUG}, no)
97	@$(call isede,"s/ (WARN|LOG|ERR|TRACE) .*&//",${TARGET})
98	@$(call isede,"/ (WARN|LOG|ERR|TRACE) .*/d",${TARGET})
99endif
100	@echo Done.
101	@ls -sh ${TARGET}
102
103release:
104	# Move to release branch
105	git checkout develop
106	git checkout -b release/${VERSION}
107	# Run build and tests
108	${MAKE} build tests
109	# Update changelog
110	${EDITOR} CHANGELOG.md
111	# Build release commit
112	git add CHANGELOG.md README.mkd ${VERSION_FILE}
113	git commit -S -m "Update changelog for ${VERSION}"
114	# Update binary artifact
115	git add ${TARGET}
116	git commit -S -m "Build release ${VERSION}"
117
118publish:
119	git push origin release/${VERSION}
120	# Merge release branch into develop before deploying
121
122deploy:
123	git checkout develop
124	git tag -m "Build release ${VERSION}" -s ${VERSION}
125	git archive --output=${VERSION}.tar.gz --prefix=antigen-$$(echo ${VERSION}|sed s/v//)/ ${VERSION}
126	zcat ${VERSION}.tar.gz | gpg --armor --detach-sign >${VERSION}.tar.gz.sign
127	# Verify signature
128	zcat ${VERSION}.tar.gz | gpg --verify ${VERSION}.tar.gz.sign -
129	# Push upstream
130	git push upstream ${VERSION}
131
132.container:
133ifeq (${USE_CONTAINER}, docker)
134	@docker run --rm --privileged=true -it -v ${PROJECT}:/antigen ${CONTAINER_IMAGE}${ZSH_VERSION} $(shell echo "${COMMAND}" | sed "s|${PROJECT}|${CONTAINER_ROOT}|g")
135else ifeq (${USE_CONTAINER}, no)
136	${COMMAND}
137endif
138
139info:
140	@${MAKE} .container COMMAND="sh -c 'cat ${PROJECT}/VERSION; zsh --version; git --version; env'"
141
142itests:
143	@${MAKE} tests CRAM_OPTS=-i
144
145tests:
146	@${MAKE} .container COMMAND="sh -c 'ZDOTDIR=${TESTS} ANTIGEN=${PROJECT} cram ${CRAM_OPTS} --shell=zsh ${TEST}'"
147
148stats:
149	@${MAKE} .container COMMAND="${TOOLS}/stats --zsh zsh --antigen ${PROJECT}"
150
151install:
152	mkdir -p ${PREFIX}/share && cp ${TARGET} ${PREFIX}/share/antigen.zsh
153
154clean:
155	rm -f ${PREFIX}/share/antigen.zsh
156
157install-deps:
158	sudo pip install cram=='0.6.*'
159
160all: clean build install
161