1#!/usr/bin/make -f
2
3OPTIMIZATIONS ?= $(PORT_SIMD_FLAGS) -ffast-math -fomit-frame-pointer -fno-finite-math-only
4PREFIX ?= /usr/local
5CFLAGS ?= $(OPTIMIZATIONS) -Wall
6
7PKG_CONFIG?=pkg-config
8STRIP?=strip
9STRIPFLAGS?=-s
10
11controlfilter_VERSION?=$(shell git describe --tags HEAD 2>/dev/null | sed 's/-g.*$$//;s/^v//' || echo "LV2")
12###############################################################################
13
14LV2DIR ?= $(PREFIX)/lib/lv2
15LOADLIBES=-lm
16LV2NAME=controlfilter
17BUNDLE=controlfilter.lv2
18BUILDDIR=build/
19targets=
20
21UNAME=$(shell uname)
22ifeq ($(UNAME),Darwin)
23  LV2LDFLAGS=-dynamiclib
24  LIB_EXT=.dylib
25  STRIPFLAGS=-u -r -arch all -s lv2syms
26  targets+=lv2syms
27  EXTENDED_RE=-E
28else
29  LV2LDFLAGS=-Wl,-Bstatic -Wl,-Bdynamic
30  LIB_EXT=.so
31  EXTENDED_RE=-r
32endif
33
34ifneq ($(XWIN),)
35  CC=$(XWIN)-gcc
36  STRIP=$(XWIN)-strip
37  LV2LDFLAGS=-Wl,-Bstatic -Wl,-Bdynamic -Wl,--as-needed
38  LIB_EXT=.dll
39  override LDFLAGS += -static-libgcc -static-libstdc++
40endif
41
42targets+=$(BUILDDIR)$(LV2NAME)$(LIB_EXT)
43
44###############################################################################
45# extract versions
46LV2VERSION=$(controlfilter_VERSION)
47include git2lv2.mk
48
49###############################################################################
50# check for build-dependencies
51ifeq ($(shell $(PKG_CONFIG) --exists lv2 || echo no), no)
52  $(error "LV2 SDK was not found")
53endif
54
55ifeq ($(XWIN),)
56override CFLAGS += -fPIC -fvisibility=hidden
57endif
58override CFLAGS += -std=c99 `$(PKG_CONFIG) --cflags lv2` -DVERSION="\"$(controlfilter_VERSION)\""
59
60###############################################################################
61# build target definitions
62default: all
63
64all: $(BUILDDIR)manifest.ttl $(BUILDDIR)presets.ttl $(BUILDDIR)$(LV2NAME).ttl $(targets)
65
66FILTERS := $(wildcard filters/*.c)
67
68lv2syms:
69	echo "_lv2_descriptor" > lv2syms
70
71filters.c: $(FILTERS)
72	echo "#include \"src/ttl.h\"" > filters.c
73	i=0; for file in $(FILTERS); do \
74		echo "/* --- */" >> filters.c; \
75		echo "#define CSC_FILTER(FNX) CSC_FLT($$i, FNX)" >> filters.c; \
76		echo "#define INIT_FN(NAME) XINIT_FN(NAME)" >> filters.c; \
77		echo "#define PROC_FN(NAME) XPROC_FN(NAME)" >> filters.c; \
78		echo "#include \"$${file}\"" >> filters.c; \
79		echo "CSC_FILTER(CSC_NAME)" >> filters.c; \
80		echo "#undef CSC_FILTER" >> filters.c; \
81		echo "#undef INIT_FN" >> filters.c; \
82		echo "#undef PROC_FN" >> filters.c; \
83		echo "#undef CSC_NAME" >> filters.c; \
84		i=`expr $$i + 1`; \
85		done;
86	echo "/* --- */" >> filters.c; \
87	echo "#define LOOP_DESC(FN) \\" >> filters.c;
88	i=0; for file in $(FILTERS); do \
89		echo "FN($$i) \\" >> filters.c; \
90		i=`expr $$i + 1`; \
91		done;
92	echo >> filters.c;
93
94$(BUILDDIR)manifest.ttl: lv2ttl/manifest.ttl.in src/ttl.h filters.c
95	@mkdir -p $(BUILDDIR)
96	cat lv2ttl/manifest.ttl.in > $(BUILDDIR)manifest.ttl
97	$(CC) -E -I. -DCSC_MANIFEST filters.c \
98		| grep -v '^\#' \
99		| sed "s/HTTPP/http:\//g;s/HASH/#/g;s/@LV2NAME@/$(LV2NAME)/g;s/@LIB_EXT@/$(LIB_EXT)/g" \
100		| uniq \
101		>> $(BUILDDIR)manifest.ttl
102	for file in presets/*.ttl; do head -n 3 $$file >> $(BUILDDIR)manifest.ttl; echo "rdfs:seeAlso <presets.ttl> ." >> $(BUILDDIR)manifest.ttl; done
103
104$(BUILDDIR)presets.ttl: lv2ttl/presets.ttl.in presets/*.ttl
105	@mkdir -p $(BUILDDIR)
106	cat lv2ttl/presets.ttl.in > $(BUILDDIR)presets.ttl
107	cat presets/*.ttl >> $(BUILDDIR)presets.ttl
108
109$(BUILDDIR)$(LV2NAME).ttl: lv2ttl/$(LV2NAME).ttl.in src/ttl.h filters.c
110	@mkdir -p $(BUILDDIR)
111	cat lv2ttl/$(LV2NAME).ttl.in > $(BUILDDIR)$(LV2NAME).ttl
112	$(CC) -E -I. -DCSC_TTF filters.c \
113		| grep -v '^\#' \
114		| sed 's/HTTPP/http:\//g;s/@VERSION@/lv2:microVersion $(LV2MIC) ;lv2:minorVersion $(LV2MIN) ;/g' \
115		| uniq \
116		>> $(BUILDDIR)$(LV2NAME).ttl
117
118$(BUILDDIR)$(LV2NAME)$(LIB_EXT): src/$(LV2NAME).c filters.c
119	@mkdir -p $(BUILDDIR)
120	$(CC) -I. $(CPPFLAGS) $(CFLAGS) \
121	  -o $(BUILDDIR)$(LV2NAME)$(LIB_EXT) src/$(LV2NAME).c \
122	  -shared $(LV2LDFLAGS) $(LDFLAGS) $(LOADLIBES)
123	$(STRIP) $(STRIPFLAGS) $(BUILDDIR)$(LV2NAME)$(LIB_EXT)
124
125###############################################################################
126# install/uninstall/clean target definitions
127
128install: all
129	install -d $(DESTDIR)$(LV2DIR)/$(BUNDLE)
130	install -m755 $(BUILDDIR)$(LV2NAME)$(LIB_EXT) $(DESTDIR)$(LV2DIR)/$(BUNDLE)
131	install -m644 $(BUILDDIR)manifest.ttl $(BUILDDIR)$(LV2NAME).ttl $(BUILDDIR)presets.ttl $(DESTDIR)$(LV2DIR)/$(BUNDLE)
132
133uninstall:
134	rm -f $(DESTDIR)$(LV2DIR)/$(BUNDLE)/manifest.ttl
135	rm -f $(DESTDIR)$(LV2DIR)/$(BUNDLE)/presets.ttl
136	rm -f $(DESTDIR)$(LV2DIR)/$(BUNDLE)/$(LV2NAME).ttl
137	rm -f $(DESTDIR)$(LV2DIR)/$(BUNDLE)/$(LV2NAME)$(LIB_EXT)
138	-rmdir $(DESTDIR)$(LV2DIR)/$(BUNDLE)
139
140clean:
141	rm -f $(BUILDDIR)manifest.ttl $(BUILDDIR)presets.ttl $(BUILDDIR)$(LV2NAME).ttl $(BUILDDIR)$(LV2NAME)$(LIB_EXT) lv2syms filters.c
142	-test -d $(BUILDDIR) && rmdir $(BUILDDIR) || true
143
144.PHONY: clean all install uninstall
145