git.iko.soy/typeable/pandoc
on 1a80813 help sign in
typeable/pandoc/Makefile
357 lines 12 kB history raw
1# Makefile for Pandoc.
3#-------------------------------------------------------------------------------
4# Constant names and commands in source tree
5#-------------------------------------------------------------------------------
6CABAL := pandoc.cabal
7SRCDIR := .
8MANDIR := man
9TESTDIR := tests
10BUILDDIR := dist
11BUILDCONF := $(BUILDDIR)/setup-config
12BUILDVARS := vars
13CONFIGURE := configure
15#-------------------------------------------------------------------------------
16# Cabal constants
17#-------------------------------------------------------------------------------
18PKG := $(shell sed -ne 's/^[Nn]ame:[[:space:]]*//p' $(CABAL) | tr A-Z a-z)
19VERSION := $(shell sed -ne 's/^[Vv]ersion:[[:space:]]*//p' $(CABAL))
20PKGID := $(PKG)-$(VERSION)
21EXECSBASE := $(shell sed -ne 's/^[Ee]xecutable:\{0,1\}[[:space:]]*//p' $(CABAL))
23#-------------------------------------------------------------------------------
24# Install targets
25#-------------------------------------------------------------------------------
26WRAPPERS := html2markdown markdown2pdf hsmarkdown
27# Add .exe extensions if we're running Windows/Cygwin.
28EXTENSION := $(shell uname | tr '[:upper:]' '[:lower:]' | \
29 sed -ne 's/^cygwin.*$$/\.exe/p')
30BUILDCMD := $(addsuffix $(EXTENSION), ./setup)
31EXECS := $(addsuffix $(EXTENSION),$(EXECSBASE))
32PROGS := $(EXECS) $(WRAPPERS)
33MAIN := $(firstword $(EXECS))
34DOCS := README.html README BUGS
35MANPAGES := $(patsubst %.md,%,$(wildcard $(MANDIR)/man?/*.?.md))
37#-------------------------------------------------------------------------------
38# Variables to setup through environment
39#-------------------------------------------------------------------------------
41# Specify default values.
42prefix := /usr/local
43destdir :=
44# Attempt to set variables from a previous make session.
45-include $(BUILDVARS)
46# Fallback to defaults but allow to get the values from environment.
47PREFIX ?= $(prefix)
48DESTDIR ?= $(destdir)
49DATADIR ?= $(PKGID)
50DOCDIR ?= $(PKGID)/doc
52#-------------------------------------------------------------------------------
53# Installation paths
54#-------------------------------------------------------------------------------
55DESTPATH := $(DESTDIR)$(PREFIX)
56BINPATH := $(DESTPATH)/bin
57DATAPATH := $(DESTPATH)/share
58MANPATH := $(DATAPATH)/man
59PKGDATAPATH := $(DATAPATH)/$(DATADIR)
60PKGDOCPATH := $(DATAPATH)/$(DOCDIR)
62#-------------------------------------------------------------------------------
63# Generic Makefile variables
64#-------------------------------------------------------------------------------
65INSTALL := install -c
66INSTALL_PROGRAM := $(INSTALL) -m 755
67INSTALL_DATA := $(INSTALL) -m 644
68STRIP := strip
69GHC ?= ghc
70GHC_PKG ?= ghc-pkg
71GHC_VERSION := $(shell $(GHC) --version | sed -e 's/[^0-9]*//')
73#-------------------------------------------------------------------------------
74# Recipes
75#-------------------------------------------------------------------------------
77# Default target.
78.PHONY: all
79all: build-program
81# Document process rules.
82%.html: % $(MAIN)
83 ./$(MAIN) -s -S --toc $< >$@ || rm -f $@
84%.tex: % $(MAIN)
85 ./$(MAIN) -s -w latex $< >$@ || rm -f $@
86%.rtf: % $(MAIN)
87 ./$(MAIN) -s -w rtf $< >$@ || rm -f $@
88%.pdf: % $(MAIN) markdown2pdf
89 sh ./markdown2pdf $< || rm -f $@
90%.txt: %
91 perl -p -e 's/\n/\r\n/' $< > $@ || rm -f $@ # convert to DOS line endings
92%.1: %.1.md $(MAIN)
93 ./$(MAIN) -s -S -w man $< >$@ || rm -f $@
95.PHONY: templates
96templates:
97 $(MAKE) -C $(SRCDIR)/templates
99define generate-shell-script
100echo >&2 "Generating $@..."; \
101awk ' \
102 /^[ \t]*###+ / { \
103 lead = $$0; sub(/[^ \t].*$$/, "", lead); \
104 t = "$(dir $<)/"$$2; \
105 while (getline line < t > 0) \
106 print lead line; \
107 next; \
108 } \
109 { print } \
110' <$< >$@
111chmod +x $@
112endef
114.PHONY: wrappers
115wrappers: $(WRAPPERS)
116cleanup_files+=$(WRAPPERS)
117$(WRAPPERS): %: $(SRCDIR)/wrappers/%.in $(SRCDIR)/wrappers/*.sh
118 @$(generate-shell-script)
120CABAL_BACKUP=$(CABAL).orig
121$(CABAL_BACKUP):
122 cp $(CABAL) $(CABAL_BACKUP) ; \
123 if echo $(GHC_VERSION) | grep -q '^6.6'; then \
124 cp $(CABAL).ghc66 $(CABAL); \
125 fi
127.PHONY: configure
128cleanup_files+=Setup.hi Setup.o $(BUILDCMD) $(BUILDVARS)
129configure: $(BUILDCONF) templates
130$(BUILDCMD): Setup.hs
131 $(GHC) -package Cabal Setup.hs -o $(BUILDCMD)
132$(BUILDCONF): $(CABAL) $(CABAL_BACKUP) $(BUILDCMD)
133 $(BUILDCMD) configure --prefix=$(PREFIX) --with-compiler=$(GHC) --with-hc-pkg=$(GHC_PKG)
134 @# Make configuration time settings persistent (definitely a hack).
135 @echo "PREFIX?=$(PREFIX)" >$(BUILDVARS)
136 @echo "DESTDIR?=$(DESTDIR)" >>$(BUILDVARS)
138.PHONY: build
139build: configure
140 $(BUILDCMD) build
142.PHONY: build-exec
143build-exec: $(PROGS)
144cleanup_files+=$(EXECS)
145$(EXECS): build
146 for f in $@; do \
147 find $(BUILDDIR) -type f -name "$$f" -perm +a=x \
148 -exec ln -s -f {} . \; ; \
149 done
151.PHONY: build-doc
152cleanup_files+=README.html $(MANPAGES)
153build-doc: $(DOCS) $(MANPAGES)
155.PHONY: build-program
156build-program: build-exec build-doc
158.PHONY: build-lib-doc haddock
159build-lib-doc: html
160haddock: build-lib-doc
161cleanup_files+=html
162html/: configure
163 -rm -rf html
164 $(BUILDCMD) haddock && cp -r $(BUILDDIR)/doc/html .
166.PHONY: build-all
167build-all: build-program build-lib-doc
169# User documents installation.
170.PHONY: install-doc uninstall-doc
171man_all:=$(patsubst $(MANDIR)/%,%,$(MANPAGES))
172install-doc: build-doc
173 $(INSTALL) -d $(PKGDOCPATH) && $(INSTALL_DATA) $(DOCS) $(PKGDOCPATH)/
174 for f in $(man_all); do \
175 $(INSTALL) -d $(MANPATH)/$$(dirname $$f); \
176 $(INSTALL_DATA) $(MANDIR)/$$f $(MANPATH)/$$f; \
177 done
178uninstall-doc:
179 -for f in $(DOCS); do rm -f $(PKGDOCPATH)/$$f; done
180 -for f in $(man_all); do rm -f $(MANPATH)/$$f; done
181 rmdir $(PKGDOCPATH) $(PKGDATAPATH) 2>/dev/null ||:
183# Program only installation.
184.PHONY: install-exec uninstall-exec
185install-exec: build-exec
186 $(STRIP) $(EXECS)
187 $(INSTALL) -d $(BINPATH); \
188 for f in $(PROGS); do \
189 if [ -L $$f ]; then \
190 f=$$(readlink $$f); \
191 fi; \
192 $(INSTALL_PROGRAM) $$f $(BINPATH)/; \
193 done
194uninstall-exec:
195 -for f in $(notdir $(PROGS)); do rm -f $(BINPATH)/$$f; done
197# Program + user documents installation.
198.PHONY: install-program uninstall-program
199install-program: install-exec install-doc
200uninstall-program: uninstall-exec uninstall-doc
202.PHONY: install-all uninstall-all
203# Full installation through Cabal: main + wrappers + user docs + lib + lib docs
204install-all: build-all install-program
205 destdir=$(DESTDIR); \
206 # Older Cabal versions have no '--destdir' option.
207 if $(BUILDCMD) copy --help | grep -q '\-\-destdir'; then \
208 opt="--destdir=$${destdir-/}"; \
209 else \
210 opt="--copy-prefix=$${destdir}$(PREFIX)"; \
211 fi; \
212 $(BUILDCMD) copy $$opt; $(BUILDCMD) register
213# Cabal lacks an 'uninstall' command. We have to remove some cruft manually.
214uninstall-all: uninstall-program
215 @libdir=$$($(GHC_PKG) field $(PKGID) library-dirs 2>/dev/null | \
216 sed 's/^library-dirs: *//'); \
217 htmldir=$$($(GHC_PKG) field $(PKGID) haddock-html 2>/dev/null | \
218 sed 's/^haddock-html: *//'); \
219 if [ -d $$libdir ]; then \
220 $(BUILDCMD) unregister ||:; \
221 else \
222 echo >&2 "*** Couldn't locate library for pkgid: $(PKGID). ***"; \
223 fi; \
224 for d in $$libdir $$htmldir; do \
225 [ -d $$d ] && { \
226 rm -rf $$d; rmdir $$(dirname $$d) 2>/dev/null ||:; \
227 } \
228 done; \
229 rmdir $(PKGDOCPATH) $(PKGDATAPATH) 2>/dev/null ||:
231# Default installation recipe for a common deployment scenario.
232.PHONY: install uninstall
233install: install-program
234uninstall: uninstall-program
236# FreeBSD port
237.PHONY: freebsd
238freebsd_dest:=freebsd
239freebsd_makefile:=$(freebsd_dest)/Makefile
240freebsd_template:=$(freebsd_makefile).in
241cleanup_files+=$(freebsd_makefile)
242freebsd : $(freebsd_makefile)
243$(freebsd_makefile) : $(freebsd_template)
244 sed -e 's/@VERSION@/$(VERSION)/' $< > $@
246# MacPort
247.PHONY: macport
248macport_dest:=macports
249portfile:=$(macport_dest)/Portfile
250portfile_template:=$(portfile).in
251cleanup_files+=$(portfile)
252macport : $(portfile)
253$(portfile) : $(portfile_template) tarball
254 sed -e 's/@VERSION@/$(VERSION)/' $(portfile_template) | \
255 sed -e 's/@TARBALLMD5SUM@/$(word 2, $(shell openssl md5 $(tarball)))/' > \
256 $(portfile)
258.PHONY: win-pkg
259win_pkg_name:=$(PKGID).zip
260win_docs:=COPYING.txt COPYRIGHT.txt BUGS.txt README.txt README.html
261cleanup_files+=$(win_pkg_name) $(win_docs)
262win-pkg: $(win_pkg_name)
263$(win_pkg_name): $(PKG).exe $(win_docs)
264 zip -r $(win_pkg_name) $(PKG).exe $(win_docs)
266.PHONY: test test-markdown
267test: $(MAIN)
268 @cd $(TESTDIR) && perl runtests.pl -s $(PWD)/$(MAIN)
269compat:=$(PWD)/hsmarkdown
270markdown_test_dirs:=$(wildcard $(TESTDIR)/MarkdownTest_*)
271test-markdown: $(MAIN) $(compat)
272 @for suite in $(markdown_test_dirs); do \
273 ( \
274 suite_version=$$(echo $$suite | sed -e 's/.*_//');\
275 echo >&2 "-----------------------------------------";\
276 echo >&2 "Running Markdown test suite version $${suite_version}.";\
277 PATH=$(PWD):$$PATH; export PATH; cd $$suite && \
278 perl MarkdownTest.pl -s $(compat) -tidy ; \
279 ) \
280 done
282# Stolen and slightly improved from a GPLed Makefile. Credits to John Meacham.
283src_all:=$(shell find $(SRCDIR) -type f -name '*hs' | egrep -v '^\./(_darcs|lib|test)/')
284cleanup_files+=$(patsubst %,$(SRCDIR)/%,tags tags.sorted)
285tags: $(src_all)
286 cd $(SRCDIR) && hasktags -c $(src_all:$(SRCDIR)/%=%); \
287 LC_ALL=C sort tags >tags.sorted; mv tags.sorted tags
289.PHONY: tarball
290tarball:=$(PKGID).tar.gz
291cleanup_files+=$(tarball)
292tarball: $(tarball)
293$(tarball):
294 svn export . $(PKGID)
295 $(MAKE) -C $(PKGID) templates
296 $(MAKE) -C $(PKGID) wrappers
297 tar cvzf $(tarball) $(PKGID)
298 -rm -rf $(PKGID)
300.PHONY: deb
301deb_name:=$(shell grep ^Package debian/control | cut -d' ' -f2 | head -n 1)
302deb_version:=$(shell head -n 1 debian/changelog | cut -f2 -d' ' | tr -d '()')
303deb_arch:=i386
304deb_main:=$(deb_name)_$(deb_version)_$(deb_arch).deb
305deb: debian
306 @[ -x /usr/bin/fakeroot ] || { \
307 echo >&2 "*** Please install fakeroot package. ***"; \
308 exit 1; \
309 }
310 @[ -x /usr/bin/dpkg-buildpackage ] || { \
311 echo >&2 "*** Please install dpkg-dev package. ***"; \
312 exit 1; \
313 }
314 mv $(BUILDVARS) $(BUILDVARS).old 2>/dev/null ||: # backup settings
315 if [ -x /usr/bin/debuild ]; then \
316 debuild -uc -us -i.svn -I.svn -i_darcs -I_darcs --lintian-opts -i; \
317 else \
318 echo >&2 "*** Please install devscripts package. ***"; \
319 echo >&2 "*** Using dpkg-buildpackage for package building. ***"; \
320 dpkg-buildpackage -rfakeroot -uc -us -i.svn -I.svn -i_darcs -I_darcs; \
321 fi
322 mv $(BUILDVARS).old $(BUILDVARS) 2>/dev/null ||: # restore
324.PHONY: website
325web_src:=web
326web_dest:=pandoc-website
327make_page:=./$(MAIN) -s -S -B $(web_src)/header.html \
328 -A $(web_src)/footer.html \
329 -H $(web_src)/css
330cleanup_files+=$(web_dest)
331$(web_dest) : html $(wildcard $(web_src)/*) debian/changelog \
332 INSTALL $(MANPAGES) $(MANDIR)/man1/pandoc.1.md README
333 rm -rf $(web_dest) && { \
334 mkdir $(web_dest); \
335 cp -r html $(web_dest)/doc; \
336 cp $(web_src)/* $(web_dest)/; \
337 sed -e 's#@VERSION@#$(VERSION)#g' $(web_src)/index.txt.in > \
338 $(web_dest)/index.txt; \
339 cp debian/changelog $(web_dest)/changelog.txt ; \
340 cp README $(web_dest)/ ; \
341 cp INSTALL $(web_dest)/ ; \
342 cp $(MANDIR)/man1/pandoc.1.md $(web_dest)/ ; \
343 cp $(MANPAGES) $(web_dest)/ ; \
344 } || { rm -rf $(web_dest); exit 1; }
345website: $(MAIN) $(web_dest)
346 PANDOC_PATH=$(shell pwd) make -C $(web_dest)
348.PHONY: distclean clean
349distclean: clean
350 if [ -d debian ]; then \
351 chmod +x debian/rules; fakeroot debian/rules clean; \
352 fi
354clean:
355 make -C $(SRCDIR)/templates clean
356 -if [ -f $(BUILDCONF) ]; then $(BUILDCMD) clean; fi
357 -rm -rf $(cleanup_files)