Makefile 10.1 KB
Newer Older
Albert Gräf's avatar
Albert Gräf committed
1
2
3
4
5
6

# Toplevel Makefile for Purr Data. Please note that at present this is just a
# thin wrapper around l2ork_addons/tar_em_up.sh, the traditional Pd-l2ork
# build script.

# The Pd-l2ork build system is very arcane and intricate. Its main purpose is
Albert Gräf's avatar
Albert Gräf committed
7
8
9
10
11
12
# putting together a staging area with a complete Pd-l2ork installation and
# then building installers for the supported platforms from that, pulling
# together a bunch of separate packages, each with their own build system.
# Compiling sources is just one of the tasks that the builder does. Therefore
# you'll notice that, unlike with other less complicated source packages,
# `make` will rebuild lots of things even if you just finished another build.
Albert Gräf's avatar
Albert Gräf committed
13
14
15
16
17
18
19
20
21
22
23

# The available build targets are:

# all: produce a native installer for the host platform (equivalent to
# `tar_em_up.sh -Tk`); note that in order to force a complete rebuild (like
# what `tar_em_up.sh -T` does), you'll have to run `make clean` first

# incremental: like `all`, but does an "incremental build" (equivalent to
# `tar_em_up.sh -tk`), bypassing Gem which takes an eternity to compile; please
# check the tar_em_up.sh script for details

Albert Gräf's avatar
Albert Gräf committed
24
25
26
27
# light: like `incremental`, but does a light build (equivalent to
# `tar_em_up.sh -tkl`) which only includes the most essential externals;
# please check the tar_em_up.sh script for details

Albert Gräf's avatar
Albert Gräf committed
28
# checkout: convenience target to check out all submodules in preparation for
Albert Gräf's avatar
Albert Gräf committed
29
# a subsequent build (the `all`, `incremental` and `dist` targets also do this
Albert Gräf's avatar
Albert Gräf committed
30
31
32
33
34
35
36
37
# automatically when needed)

# clean: does something similar to what `tar_em_up.sh` does in order to start
# from a clean slate, so that a subsequent build starts from scratch again

# realclean: put the sources into pristine state again (WARNING: this will get
# rid of any uncommitted source changes, too); use this as a last resort to
# get the sources into a compilable state again after things have gone awry
Albert Gräf's avatar
Albert Gräf committed
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

# dist: create a self-contained distribution tarball of the source

# NOTES:

# The realclean and dist targets use git commands and thus only work in a
# working copy of the git repo, not in the static tarball snapshots produced
# by the dist target.

# On Linux systems running `make` will try to produce a Debian package. On
# Linux distributions like Arch which are no Debian derivatives, the Debian
# packaging tools are not available. In this case, `make` will stop right
# before creating the actual package and leave the ready-made staged
# installation tree under `packages/linux_make/build` from where it can be
# copied or packaged up in any desired way.
Albert Gräf's avatar
Albert Gräf committed
53

54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# The incremental and light builds assume an existing staging area
# (packages/*/build directory) which is *not* cleaned before installing. This
# makes it possible to update the existing staging area after recompiling just
# a part of the system (all but Gem in the case of "incremental", only the
# Pd core and a few essential externals in the case of "light"). Use `make
# clean` beforehand if you want to install into a clean staging area.

# When doing a `light` build, which only includes the most essential
# externals, it may be desirable to manually include additional abstractions
# and externals in the build. To these ends, after running `make light` you
# can run `make` with the `foo_abs` or `foo_ext` target, where `foo` is the
# name of the desired abstraction or external, respectively. E.g., you can run
# `make light memento_abs pdlua_ext` to get a light build with the `memento`
# abstraction and the `pdlua` external included. (This will not rebuild the
# Debian package, though, so you'll have to install manually with `make
# install` instead.) The names of the desired addons must be specified as
# given in abstractions/Makefile and externals/Makefile, respectively (look
# for targets looking like `foo_install`). Also note that even though a
# subsequent `make install` will then include your addons, they won't be
# enabled by default, so you'll have to do that manually in Purr Data's
# `Startup` dialog. Simply adding the name of the addon in the `Libraries`
# list should normally do the trick. Or you can add an option like `-lib foo`
# when running Purr Data from the command line.

78
79
.PHONY: all incremental checkout clean realclean dist

80
# Installation prefix under which Pd-l2ork is installed (Linux only). If this
81
82
83
# isn't set, a default location will be used (usually /usr/local). NOTE: We
# *always* assume that this variable is set properly in the install targets
# (see below).
84
85
86
87
88
89
prefix = /usr

ifneq ($(prefix),)
env = inst_dir="$(prefix)"
endif

90
91
92
93
94
95
96
97
98
99
100
101
install_vars = DESTDIR=$(firstword $(wildcard $(CURDIR)/packages/*/build)) prefix=$(prefix)

# You can set CFLAGS to whatever special compile options are needed. E.g., to
# build the double precision version: CFLAGS = -DPD_FLOATSIZE=64
CFLAGS =
export CFLAGS

# You can also set this variable to specify externals NOT to be built. E.g.,
# to prevent building Gem (which takes an eternity to build): blacklist = gem
blacklist =
export blacklist

Albert Gräf's avatar
Albert Gräf committed
102
all:
103
	cd l2ork_addons && $(env) ./tar_em_up.sh -Tk
Albert Gräf's avatar
Albert Gräf committed
104
105

incremental:
106
	cd l2ork_addons && $(env) ./tar_em_up.sh -tk
Albert Gräf's avatar
Albert Gräf committed
107

Albert Gräf's avatar
Albert Gräf committed
108
109
110
light:
	cd l2ork_addons && $(env) ./tar_em_up.sh -tkl

111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# Convenience targets to build the double precision version.

# Blacklist of externals which don't work with double precision yet.
double_blacklist = autotune smlib
# These are dubious, passing float* for t_float* pointers, and so are most
# likely broken, even though they compile with double precision.
double_blacklist += cyclone lyonpotpourri

all-double:
	cd l2ork_addons && $(env) CFLAGS=-DPD_FLOATSIZE=64 blacklist="$(double_blacklist)" ./tar_em_up.sh -Tk

incremental-double:
	cd l2ork_addons && $(env) CFLAGS=-DPD_FLOATSIZE=64 blacklist="$(double_blacklist)" ./tar_em_up.sh -tk

light-double:
	cd l2ork_addons && $(env) CFLAGS=-DPD_FLOATSIZE=64 blacklist="$(double_blacklist)" ./tar_em_up.sh -tkl

128
%_abs:
129
	make -C abstractions $(@:%_abs=%) $(@:%_abs=%_install) $(install_vars)
130
131

%_ext:
132
	make -C externals $(@:%_ext=%) $(@:%_ext=%_install) $(install_vars)
133

Albert Gräf's avatar
Albert Gräf committed
134
135
136
137
checkout:
	git submodule update --init

clean:
Albert Gräf's avatar
Albert Gräf committed
138
	test "$(shell uname -s)" = "Darwin" && make -C packages/darwin_app clean || true
Albert Gräf's avatar
Albert Gräf committed
139
140
141
	cd pd/src && aclocal && autoconf && make clean || true
	cd externals/miXed && make clean || true
	cd Gem/src/ && test -f Makefile && make distclean || true
142
	cd Gem/src/ && rm -rf ./.libs && rm -rf ./*/.libs || true
Albert Gräf's avatar
Albert Gräf committed
143
	cd Gem/ && test -f Makefile && make distclean || true
144
	cd Gem/ && rm -f gemglutwindow.pd_linux Gem.pd_linux || true
145
	rm -rf packages/*/build/
Albert Gräf's avatar
Albert Gräf committed
146
147

realclean:
148
# This requires a working copy of the git repo.
Albert Gräf's avatar
Albert Gräf committed
149
	@test -d .git || (echo "Not a git repository, bailing out." && false)
150
151
	git submodule deinit --all -f
	git checkout .
152
	git clean -dffx -e pd/nw/nw/
153

154
155
156
157
158
159
160
# Installation targets. These don't work on Mac and Windows right now, you
# should use the generated installers on these systems instead. Also,
# $(prefix) must be set. $(DESTDIR) is supported as well, so you can do staged
# installs (but then again presumably you already have a staged install
# sitting in packages/*/build, so you might as well use that instead).

# Note that these targets simply (un)install whatever is in the
161
162
163
164
165
# packages/*/build directory at the time they're invoked. If no build
# directory is present then nothing will happen, so you need to run `make` (or
# `make incremental`, etc.) before running these targets. Also note that some
# old cruft under build/etc (all but the bash auto-completions) isn't
# installed as it isn't needed on modern Linux systems any more.
166
167

builddir = $(firstword $(wildcard packages/*/build))
168
ifneq ($(builddir),)
169
manifest = etc/bash_completion.d/pd-l2ork $(prefix:/%=%)/include/pd-l2ork $(prefix:/%=%)/lib/pd-l2ork $(patsubst $(builddir)/%,%, $(wildcard $(builddir)/$(prefix:/%=%)/bin/*) $(shell find $(builddir)/usr/share -type f))
170
endif
171

172
ifneq ($(manifest),)
173
174
175
install:
	test -z "$(DESTDIR)" || (rm -rf "$(DESTDIR)" && mkdir -p "$(DESTDIR)")
	tar -c -C $(builddir) $(manifest) | tar -x -C $(DESTDIR)/
176
177
178
# Edit the library paths in the default user.settings file so that it matches
# our installation prefix.
	test -f "$(DESTDIR)"$(prefix)/lib/pd-l2ork/default.settings && cd "$(DESTDIR)"$(prefix)/lib/pd-l2ork && sed -e "s!/usr/lib/pd-l2ork!$(prefix)/lib/pd-l2ork!g" -i default.settings || true
179
180
181

uninstall:
	rm -rf $(addprefix $(DESTDIR)/, $(manifest))
182
183
184
185
186
187
188
else
install:
	@echo "no build directory, run make first" && false

uninstall:
	@echo "no build directory, run make first" && false
endif
189

190
191
192
193
194
# Build a self-contained distribution tarball (snapshot). This is pretty much
# the same as in debuild/Makefile and must be run in a working copy of the git
# repo.

# The Debian version gets derived from the date and serial number of the last
Albert Gräf's avatar
Albert Gräf committed
195
# commit.
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
debversion = $(shell grep PD_L2ORK_VERSION pd/src/m_pd.h | sed 's|^.define *PD_L2ORK_VERSION *"\(.*\)".*|\1|')+git$(shell test -d .git && git rev-list --count HEAD)+$(shell test -d .git && git rev-parse --short HEAD)
# Source tarball and folder.
debsrc = purr-data_$(debversion).orig.tar.gz
debdist = purr-data-$(debversion)

# Submodules (Gem, etc.).
submodules = $(sort $(shell test -d .git && (git config --file .gitmodules --get-regexp path | awk '{ print $$2 }')))

dist: $(debsrc)

# Determine the build version which needs git to be computed, so we can't do
# it in a stand-alone build from a tarball.
PD_BUILD_VERSION := $(shell test -d .git && (git log -1 --format=%cd --date=short | sed -e 's/-//g'))-rev.$(shell test -d .git && git rev-parse --short HEAD)

$(debsrc):
Albert Gräf's avatar
Albert Gräf committed
211
	@test -d .git || (echo "Not a git repository, bailing out." && false)
212
213
214
215
216
217
218
	rm -rf $(debdist)
# Make sure that the submodules are initialized.
	git submodule update --init
# Grab the main source.
	git archive --format=tar.gz --prefix=$(debdist)/ HEAD | tar xfz -
# Grab the submodules.
	for x in $(submodules); do (cd $(debdist) && rm -rf $$x && git -C ../$$x archive --format=tar.gz --prefix=$$x/ HEAD | tar xfz -); done
219
# Pre-generate and put s_version.h into the tarball (see above; the build
220
# version is generated using git which can't be done outside the git repo).
221
	sed 's|^\(#define PD_BUILD_VERSION "\).*"|\1$(PD_BUILD_VERSION)"|' pd/src/s_version.h.in > $(debdist)/pd/src/s_version.h
222
223
224
# Create the source tarball.
	tar cfz $(debsrc) $(debdist)
	rm -rf $(debdist)