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