Makefile 10 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 219 220 221 222 223 224
	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
# Pre-generate and put s_stuff.h into the tarball (see above; the build
# version is generated using git which can't be done outside the git repo).
	sed 's|^\(#define PD_BUILD_VERSION "\).*"|\1$(PD_BUILD_VERSION)"|' pd/src/s_stuff.h.in > $(debdist)/pd/src/s_stuff.h
# Create the source tarball.
	tar cfz $(debsrc) $(debdist)
	rm -rf $(debdist)