]> gitweb @ CieloNegro.org - cabal-shared-makefile.git/blob - cabal-package.mk
New configuration variable: USE_CABAL_COMMAND
[cabal-shared-makefile.git] / cabal-package.mk
1 # -*- makefile-gmake -*-
2 #
3 # Variables:
4 #
5 #   USE_CABAL_COMMAND :: whether to use the cabal(1) command instead
6 #   of ./Setup
7 #     default: "YES" if it's in the PATH, "NO" otherwise.
8 #
9 #   CONFIGURE_ARGS :: arguments to be passed to ./Setup configure
10 #     default: --disable-optimization
11 #
12 #   RUN_COMMAND :: command to be run for "make run"
13 #
14
15 AUTOCONF ?= autoconf
16 CABAL    ?= cabal
17 DARCS    ?= darcs
18 DITZ     ?= ditz
19 FIND     ?= find
20 GREP     ?= grep
21 GHC      ?= ghc
22 GIT      ?= git
23 HLINT    ?= hlint
24 HPC      ?= hpc
25 RM_RF    ?= rm -rf
26 RSYNC    ?= rsync
27 SUDO     ?= sudo
28
29 ifndef USE_CABAL_COMMAND
30 ifeq ($(shell which $(CABAL) >/dev/null 2>&1; echo $$?),0)
31 USE_CABAL_COMMAND := YES
32 else
33 USE_CABAL_COMMAND := NO
34 endif
35 endif
36
37 ifeq ($(strip $(USE_CABAL_COMMAND)),YES)
38 SETUP_CMD := $(shell which $(CABAL))
39 else
40 SETUP_CMD := ./Setup
41 endif
42
43 CONFIGURE_ARGS ?= --disable-optimization
44 HADDOCK_OPTS   ?= --hyperlink-source
45 HLINT_OPTS     ?= \
46         --hint=Default --hint=Dollar --hint=Generalise \
47         --cross \
48         --ignore="Parse error" \
49         --report=dist/report.html
50
51 SETUP_FILE := $(wildcard Setup.*hs)
52 CABAL_FILE := $(wildcard *.cabal)
53 PKG_NAME   := $(CABAL_FILE:.cabal=)
54
55 ifeq ($(shell ls configure.ac 2>/dev/null),configure.ac)
56   AUTOCONF_AC_FILE := configure.ac
57   AUTOCONF_FILE    := configure
58 else
59   ifeq ($(shell ls configure.in 2>/dev/null),configure.in)
60     AUTOCONF_AC_FILE := configure.in
61     AUTOCONF_FILE    := configure
62   else
63     AUTOCONF_AC_FILE :=
64     AUTOCONF_FILE    :=
65   endif
66 endif
67
68 BUILDINFO_IN_FILE := $(wildcard *.buildinfo.in)
69 BUILDINFO_FILE    := $(BUILDINFO_IN_FILE:.in=)
70
71 all: build
72
73 build: setup-config build-hook
74         $(SETUP_CMD) build
75         $(RM_RF) *.tix
76
77 build-hook:
78
79 ifeq ($(RUN_COMMAND),)
80 run:
81         @echo "cabal-package.mk: No command to run."
82         @echo "cabal-package.mk: If you want to run something, define RUN_COMMAND variable."
83 else
84 run: build
85         @echo ".:.:. Let's go .:.:."
86         $(RUN_COMMAND)
87 endif
88
89 setup-config: dist/setup-config setup-config-hook $(BUILDINFO_FILE)
90
91 setup-config-hook:
92
93 dist/setup-config: $(CABAL_FILE) $(SETUP_CMD) $(AUTOCONF_FILE)
94         $(SETUP_CMD) configure $(CONFIGURE_ARGS)
95
96 $(AUTOCONF_FILE): $(AUTOCONF_AC_FILE)
97         $(AUTOCONF)
98
99 $(BUILDINFO_FILE): $(BUILDINFO_IN_FILE) configure
100         $(SETUP_CMD) configure $(CONFIGURE_ARGS)
101
102 Setup: $(SETUP_FILE)
103         $(GHC) --make Setup
104
105 reconfigure:
106         rm -f dist/setup-config
107         $(MAKE) setup-config
108
109 clean: clean-hook
110         $(RM_RF) dist Setup *.o *.hi .setup-config *.buildinfo *.tix .hpc
111         $(FIND) . -name '*~' -exec rm -f {} \;
112
113 clean-hook:
114
115 doc: setup-config
116         $(SETUP_CMD) haddock $(HADDOCK_OPTS)
117
118 install: build
119         $(SUDO) $(SETUP_CMD) install
120
121 sdist: setup-config
122         $(SETUP_CMD) sdist
123
124 test: build
125         $(RM_RF) dist/test
126         $(SETUP_CMD) test
127         if ls *.tix >/dev/null 2>&1; then \
128                 $(HPC) sum --output="merged.tix" --union --exclude=Main *.tix; \
129                 $(HPC) markup --destdir="dist/hpc" --fun-entry-count "merged.tix"; \
130         fi
131
132 # -- Find FIXME Tags ----------------------------------------------------------
133 ifeq ($(shell ls -d .git 2>/dev/null),.git)
134 fixme:
135         @$(FIND) . \
136                 -depth 1 -not -name '*.mk' \
137                 -exec $(GIT) grep -E 'FIXME|THINKME|TODO' {} + \
138                 || echo 'No FIXME, THINKME, nor TODO found.'
139 else
140 fixme:
141         @$(FIND) . \
142                 \( -name 'dist' -or -name '.git' -or -name '_darcs' \) -prune \
143                 -or \
144                 \( -name '*.c'   -or -name '*.h'   -or \
145                    -name '*.hs'  -or -name '*.lhs' -or \
146                    -name '*.hsc' -or -name '*.cabal' \) \
147                 -exec $(GREP) -n -E 'FIXME|THINKME|TODO' {} + \
148                 || echo 'No FIXME, THINKME, nor TODO found.'
149 endif
150
151 # -- HLint --------------------------------------------------------------------
152 HLINT_TARGETS ?= $$(find -E . -type d -name dist -prune -o -regex '.*\.(hsc?|lhs)' -print)
153 lint:
154         $(HLINT) $(HLINT_TARGETS) $(HLINT_OPTS)
155
156 # -- Ditz the Distributed Issue Tracker ---------------------------------------
157 ifeq (,$(wildcard .ditz-config))
158 ditz:
159 else
160 ditz:
161         $(DITZ) html dist/ditz
162
163 ChangeLog:
164         rm -f $@
165         $(DITZ) releases | awk '{print $$1}' | sort --reverse | while read i; do \
166                 $(DITZ) changelog $$i >> $@; \
167         done
168         head $@
169 endif
170
171 # -- Pushing to remote hosts --------------------------------------------------
172 push: push-repo push-ditz push-doc
173
174 push-repo:
175         if [ -d "_darcs" ]; then \
176                 $(DARCS) push; \
177         elif [ -d ".git" ]; then \
178                 $(GIT) push --all && git push --tags; \
179         fi
180
181 push-ditz: ditz
182         if [ -d "dist/ditz" ]; then \
183                 $(RSYNC) -av --delete \
184                         dist/ditz/ \
185                         www@nem.cielonegro.org:static.cielonegro.org/htdocs/ditz/$(PKG_NAME); \
186         fi
187
188 push-doc: doc
189         if [ -d "dist/doc" ]; then \
190                 $(RSYNC) -av --delete \
191                         dist/doc/html/$(PKG_NAME)/ \
192                         www@nem.cielonegro.org:static.cielonegro.org/htdocs/doc/$(PKG_NAME); \
193         fi
194
195 # -- Phony Targets ------------------------------------------------------------
196 .PHONY: build build-hook setup-config setup-config-hook run clean clean-hook \
197                 install doc sdist test lint push push-repo push-ditz push-doc \
198                 ChangeLog