1#!/usr/bin/make -f
2
3# these can be overridden using make variables. e.g.
4#   make CXXFLAGS=-O2
5#   make install DESTDIR=$(CURDIR)/debian/fat1.lv2 PREFIX=/usr
6#
7PREFIX ?= /usr/local
8BINDIR ?= $(PREFIX)/bin
9MANDIR ?= $(PREFIX)/share/man/man1
10# see http://lv2plug.in/pages/filesystem-hierarchy-standard.html, don't use libdir
11LV2DIR ?= $(PREFIX)/lib/lv2
12
13OPTIMIZATIONS ?= $(PORT_SIMD_FLAGS) -ffast-math -fomit-frame-pointer -fno-finite-math-only -DNDEBUG
14CXXFLAGS ?= -Wall -g -Wno-unused-function
15
16PKG_CONFIG?=pkg-config
17STRIP  ?= strip
18
19BUILDOPENGL?=yes
20BUILDJACKAPP?=yes
21
22fat1_VERSION?=$(shell git describe --tags HEAD 2>/dev/null | sed 's/-g.*$$//;s/^v//' || echo "LV2")
23RW ?= robtk/
24
25###############################################################################
26
27BUILDDIR = build/
28APPBLD   = x42/
29
30###############################################################################
31
32LV2NAME=fat1
33LV2GUI=fat1UI_gl
34BUNDLE=fat1.lv2
35targets=
36
37LOADLIBES=-lm
38LV2UIREQ=
39GLUICFLAGS=-I.
40
41ifneq ($(MOD),)
42  BUILDOPENGL=no
43  BUILDJACKAPP=no
44  MODLABEL=mod:label \"AT1\";
45  MODBRAND=mod:brand \"x42\";
46else
47  MODLABEL=
48  MODBRAND=
49endif
50
51UNAME=$(shell uname)
52ifeq ($(UNAME),Darwin)
53  LV2LDFLAGS=-dynamiclib
54  LIB_EXT=.dylib
55  EXE_EXT=
56  UI_TYPE=ui:CocoaUI
57  PUGL_SRC=$(RW)pugl/pugl_osx.m
58  PKG_GL_LIBS=
59  GLUILIBS=-framework Cocoa -framework OpenGL -framework CoreFoundation
60  STRIPFLAGS=-u -r -arch all -s $(RW)lv2syms
61  EXTENDED_RE=-E
62else
63  LV2LDFLAGS=-Wl,-Bstatic -Wl,-Bdynamic -Wl,--as-needed -pthread
64  LIB_EXT=.so
65  EXE_EXT=
66  UI_TYPE=ui:X11UI
67  PUGL_SRC=$(RW)pugl/pugl_x11.c
68  PKG_GL_LIBS=glu gl
69  GLUILIBS=-lX11
70  GLUICFLAGS+=`$(PKG_CONFIG) --cflags glu`
71  STRIPFLAGS= -s
72  EXTENDED_RE=-r
73endif
74
75ifneq ($(XWIN),)
76  CC=$(XWIN)-gcc
77  CXX=$(XWIN)-g++
78  STRIP=$(XWIN)-strip
79  LV2LDFLAGS=-Wl,-Bstatic -Wl,-Bdynamic -Wl,--as-needed -pthread
80  LIB_EXT=.dll
81  EXE_EXT=.exe
82  PUGL_SRC=$(RW)pugl/pugl_win.cpp
83  PKG_GL_LIBS=
84  UI_TYPE=ui:WindowsUI
85  GLUILIBS=-lws2_32 -lwinmm -lopengl32 -lglu32 -lgdi32 -lcomdlg32 -lpthread
86  GLUICFLAGS=-I.
87  override LDFLAGS += -static-libgcc -static-libstdc++
88endif
89
90ifeq ($(EXTERNALUI), yes)
91  UI_TYPE=
92endif
93
94ifeq ($(UI_TYPE),)
95  UI_TYPE=kx:Widget
96  LV2UIREQ+=lv2:requiredFeature kx:Widget;
97  override CXXFLAGS += -DXTERNAL_UI
98endif
99
100targets+=$(BUILDDIR)$(LV2NAME)$(LIB_EXT)
101
102UITTL=
103ifneq ($(BUILDOPENGL), no)
104  targets+=$(BUILDDIR)$(LV2GUI)$(LIB_EXT)
105  UITTL=ui:ui $(LV2NAME):ui_gl ;
106endif
107ifneq ($(MOD),)
108  targets+=$(BUILDDIR)modgui
109  override CXXFLAGS += -DMOD
110endif
111
112###############################################################################
113# extract versions
114LV2VERSION=$(fat1_VERSION)
115include git2lv2.mk
116
117###############################################################################
118# check for build-dependencies
119ifeq ($(shell $(PKG_CONFIG) --exists lv2 || echo no), no)
120  $(error "LV2 SDK was not found")
121endif
122
123ifeq ($(shell $(PKG_CONFIG) --exists fftw3f || echo no), no)
124  $(error "fftw3f library was not found")
125endif
126
127ifeq ($(shell $(PKG_CONFIG) --atleast-version=1.6.0 lv2 || echo no), no)
128  $(error "LV2 SDK needs to be version 1.6.0 or later")
129endif
130
131ifneq ($(BUILDOPENGL)$(BUILDJACKAPP), nono)
132 ifeq ($(shell $(PKG_CONFIG) --exists pango cairo $(PKG_GL_LIBS) || echo no), no)
133  $(error "This plugin requires cairo pango $(PKG_GL_LIBS)")
134 endif
135endif
136
137ifneq ($(BUILDJACKAPP), no)
138 ifeq ($(shell $(PKG_CONFIG) --exists jack || echo no), no)
139  $(warning *** libjack from http://jackaudio.org is required)
140  $(error   Please install libjack-dev or libjack-jackd2-dev)
141 endif
142 JACKAPP=$(APPBLD)x42-fat1$(EXE_EXT)
143endif
144
145# check for lv2_atom_forge_object  new in 1.8.1 deprecates lv2_atom_forge_blank
146ifeq ($(shell $(PKG_CONFIG) --atleast-version=1.8.1 lv2 && echo yes), yes)
147  override CXXFLAGS += -DHAVE_LV2_1_8
148endif
149
150ifneq ($(BUILDOPENGL)$(BUILDJACKAPP), nono)
151 ifneq ($(MAKECMDGOALS), submodules)
152  ifeq ($(wildcard $(RW)robtk.mk),)
153    $(warning "**********************************************************")
154    $(warning This plugin needs https://github.com/x42/robtk)
155    $(warning "**********************************************************")
156    $(info )
157    $(info set the RW environment variale to the location of the robtk headers)
158    ifeq ($(wildcard .git),.git)
159      $(info or run 'make submodules' to initialize robtk as git submodule)
160    endif
161    $(info )
162    $(warning "**********************************************************")
163    $(error robtk not found)
164  endif
165 endif
166endif
167
168# LV2 idle >= lv2-1.6.0
169GLUICFLAGS+=-DHAVE_IDLE_IFACE
170LV2UIREQ+=lv2:requiredFeature ui:idleInterface; lv2:extensionData ui:idleInterface;
171
172# add library dependent flags and libs
173override CXXFLAGS += $(OPTIMIZATIONS) -DVERSION="\"$(fat1_VERSION)\""
174override CXXFLAGS += `$(PKG_CONFIG) --cflags lv2 fftw3f`
175ifeq ($(XWIN),)
176override CXXFLAGS += -fPIC -fvisibility=hidden
177else
178override CXXFLAGS += -DPTW32_STATIC_LIB
179endif
180override LOADLIBES += `$(PKG_CONFIG) --libs lv2 fftw3f`
181
182
183GLUICFLAGS+=`$(PKG_CONFIG) --cflags cairo pango` $(CXXFLAGS)
184GLUILIBS+=`$(PKG_CONFIG) $(PKG_UI_FLAGS) --libs cairo pango pangocairo $(PKG_GL_LIBS)`
185
186ifneq ($(XWIN),)
187GLUILIBS+=-lpthread -lusp10
188endif
189
190GLUICFLAGS+=$(LIC_CFLAGS)
191GLUILIBS+=$(LIC_LOADLIBES)
192
193
194ifneq ($(LIC_CFLAGS),)
195  LV2SIGN=lv2:extensionData <http:\\/\\/harrisonconsoles.com\\/lv2\\/license\#interface>\\;
196  override CXXFLAGS += -I$(RW)
197endif
198
199ROBGL+= Makefile
200
201JACKCFLAGS=-I. $(CXXFLAGS) $(LIC_CFLAGS)
202JACKCFLAGS+=`$(PKG_CONFIG) --cflags jack lv2 pango pangocairo $(PKG_GL_LIBS)`
203JACKLIBS=-lm $(GLUILIBS) $(LOADLIBES)
204
205
206###############################################################################
207# build target definitions
208default: all
209
210submodule_pull:
211	-test -d .git -a .gitmodules -a -f Makefile.git && $(MAKE) -f Makefile.git submodule_pull
212
213submodule_update:
214	-test -d .git -a .gitmodules -a -f Makefile.git && $(MAKE) -f Makefile.git submodule_update
215
216submodule_check:
217	-test -d .git -a .gitmodules -a -f Makefile.git && $(MAKE) -f Makefile.git submodule_check
218
219submodules:
220	-test -d .git -a .gitmodules -a -f Makefile.git && $(MAKE) -f Makefile.git submodules
221
222all: submodule_check $(BUILDDIR)manifest.ttl $(BUILDDIR)$(LV2NAME).ttl $(targets) $(JACKAPP)
223
224$(BUILDDIR)manifest.ttl: lv2ttl/manifest.ttl.in lv2ttl/manifest.gui.in lv2ttl/manifest.modgui.in Makefile
225	@mkdir -p $(BUILDDIR)
226	sed "s/@LV2NAME@/$(LV2NAME)/g;s/@LIB_EXT@/$(LIB_EXT)/" \
227		lv2ttl/manifest.ttl.in > $(BUILDDIR)manifest.ttl
228ifneq ($(BUILDOPENGL), no)
229	sed "s/@LV2NAME@/$(LV2NAME)/g;s/@LIB_EXT@/$(LIB_EXT)/;s/@UI_TYPE@/$(UI_TYPE)/;s/@LV2GUI@/$(LV2GUI)/g" \
230		lv2ttl/manifest.gui.in >> $(BUILDDIR)manifest.ttl
231endif
232ifneq ($(MOD),)
233	sed "s/@LV2NAME@/$(LV2NAME)/g" \
234		lv2ttl/manifest.modgui.in >> $(BUILDDIR)manifest.ttl
235endif
236
237$(BUILDDIR)$(LV2NAME).ttl: Makefile lv2ttl/$(LV2NAME).ttl.in lv2ttl/$(LV2NAME).base.ttl.in lv2ttl/$(LV2NAME).chroma.ttl.in lv2ttl/$(LV2NAME).micro.ttl.in lv2ttl/$(LV2NAME).scales.ttl.in lv2ttl/$(LV2NAME).gui.in
238	@mkdir -p $(BUILDDIR)
239	sed "s/@LV2NAME@/$(LV2NAME)/g" \
240		lv2ttl/$(LV2NAME).ttl.in > $(BUILDDIR)$(LV2NAME).ttl
241	sed "s/@LV2NAME@/$(LV2NAME)/g;s/@SIGNATURE@/$(LV2SIGN)/;s/@VERSION@/lv2:microVersion $(LV2MIC) ;lv2:minorVersion $(LV2MIN) ;/g;s/@UITTL@/$(UITTL)/;s/@MODBRAND@/$(MODBRAND)/;s/@MODLABEL@/$(MODLABEL)/;s/@URISUFFIX@//;s/@NAMESUFFIX@//" \
242		lv2ttl/$(LV2NAME).base.ttl.in >> $(BUILDDIR)$(LV2NAME).ttl
243	cat lv2ttl/$(LV2NAME).chroma.ttl.in >> $(BUILDDIR)$(LV2NAME).ttl
244	sed "s/@LV2NAME@/$(LV2NAME)/g;s/@SIGNATURE@/$(LV2SIGN)/;s/@VERSION@/lv2:microVersion $(LV2MIC) ;lv2:minorVersion $(LV2MIN) ;/g;s/@UITTL@/$(UITTL)/;s/@MODBRAND@/$(MODBRAND)/;s/@MODLABEL@/$(MODLABEL)/;s/@URISUFFIX@/#microtonal/;s/@NAMESUFFIX@/ (microtonal)/" \
245		lv2ttl/$(LV2NAME).base.ttl.in >> $(BUILDDIR)$(LV2NAME).ttl
246	cat lv2ttl/$(LV2NAME).micro.ttl.in >> $(BUILDDIR)$(LV2NAME).ttl
247	sed "s/@LV2NAME@/$(LV2NAME)/g;s/@SIGNATURE@/$(LV2SIGN)/;s/@VERSION@/lv2:microVersion $(LV2MIC) ;lv2:minorVersion $(LV2MIN) ;/g;s/@UITTL@/$(UITTL)/;s/@MODBRAND@/$(MODBRAND)/;s/@MODLABEL@/$(MODLABEL)/;s/@URISUFFIX@/#scales/;s/@NAMESUFFIX@/ (scales)/" \
248		lv2ttl/$(LV2NAME).scales.ttl.in >> $(BUILDDIR)$(LV2NAME).ttl
249ifneq ($(BUILDOPENGL), no)
250	sed "s/@LV2NAME@/$(LV2NAME)/g;s/@UI_TYPE@/$(UI_TYPE)/;s/@UI_REQ@/$(LV2UIREQ)/" \
251	    lv2ttl/$(LV2NAME).gui.in >> $(BUILDDIR)$(LV2NAME).ttl
252endif
253
254
255DSP_SRC = src/$(LV2NAME).cc src/retuner.cc src/resampler.cc src/resampler-table.cc
256DSP_DEPS = $(DSP_SRC) src/$(LV2NAME).h src/retuner.h src/resampler.h src/resampler-table.h
257GUI_DEPS = gui/$(LV2NAME).c src/$(LV2NAME).h
258
259$(BUILDDIR)$(LV2NAME)$(LIB_EXT): $(DSP_DEPS) Makefile
260	@mkdir -p $(BUILDDIR)
261	$(CXX) $(CPPFLAGS) $(CXXFLAGS) $(LIC_CFLAGS)\
262	  -o $(BUILDDIR)$(LV2NAME)$(LIB_EXT) $(DSP_SRC) \
263	  -shared $(LV2LDFLAGS) $(LDFLAGS) $(LOADLIBES) $(LIC_LOADLIBES)
264	$(STRIP) $(STRIPFLAGS) $(BUILDDIR)$(LV2NAME)$(LIB_EXT)
265
266jackapps: $(JACKAPP)
267
268$(eval x42_fat1_JACKSRC = -DX42_MULTIPLUGIN src/fat1.cc src/retuner.cc src/resampler.cc src/resampler-table.cc)
269x42_fat1_JACKGUI = gui/fat1.c
270x42_fat1_LV2HTTL = lv2ttl/plugins.h
271x42_fat1_JACKDESC = lv2ui_descriptor
272$(APPBLD)x42-fat1$(EXE_EXT): $(DSP_DEPS) $(GUI_DEPS) \
273	        $(x42_fat1_LV2HTTL) lv2ttl/fat1_chroma.h lv2ttl/fat1_micro.h
274
275ifneq ($(BUILDOPENGL)$(BUILDJACKAPP), nono)
276 -include $(RW)robtk.mk
277endif
278
279$(BUILDDIR)$(LV2GUI)$(LIB_EXT): gui/$(LV2NAME).c
280
281$(BUILDDIR)modgui: modgui/
282	@mkdir -p $(BUILDDIR)/modgui
283	cp -r modgui/* $(BUILDDIR)modgui/
284
285###############################################################################
286# install/uninstall/clean target definitions
287
288install: install-bin install-man
289
290uninstall: uninstall-bin uninstall-man
291
292install-bin: all
293	install -d $(DESTDIR)$(LV2DIR)/$(BUNDLE)
294	install -m644 $(BUILDDIR)manifest.ttl $(BUILDDIR)$(LV2NAME).ttl $(DESTDIR)$(LV2DIR)/$(BUNDLE)
295	install -m755 $(BUILDDIR)$(LV2NAME)$(LIB_EXT) $(DESTDIR)$(LV2DIR)/$(BUNDLE)
296ifneq ($(BUILDOPENGL), no)
297	install -m755 $(BUILDDIR)$(LV2GUI)$(LIB_EXT) $(DESTDIR)$(LV2DIR)/$(BUNDLE)
298endif
299ifneq ($(BUILDJACKAPP), no)
300	install -d $(DESTDIR)$(BINDIR)
301	install -m755 $(APPBLD)x42-fat1$(EXE_EXT) $(DESTDIR)$(BINDIR)
302endif
303ifneq ($(MOD),)
304	install -d $(DESTDIR)$(LV2DIR)/$(BUNDLE)/modgui
305	install -t $(DESTDIR)$(LV2DIR)/$(BUNDLE)/modgui $(BUILDDIR)modgui/*
306endif
307
308uninstall-bin:
309	rm -f $(DESTDIR)$(LV2DIR)/$(BUNDLE)/manifest.ttl
310	rm -f $(DESTDIR)$(LV2DIR)/$(BUNDLE)/$(LV2NAME).ttl
311	rm -f $(DESTDIR)$(LV2DIR)/$(BUNDLE)/$(LV2NAME)$(LIB_EXT)
312	rm -f $(DESTDIR)$(LV2DIR)/$(BUNDLE)/$(LV2GUI)$(LIB_EXT)
313	rm -rf $(DESTDIR)$(LV2DIR)/$(BUNDLE)/modgui
314	rm -f $(DESTDIR)$(BINDIR)/x42-fat1$(EXE_EXT)
315	-rmdir $(DESTDIR)$(LV2DIR)/$(BUNDLE)
316	-rmdir $(DESTDIR)$(BINDIR)
317
318install-man:
319ifneq ($(BUILDJACKAPP), no)
320	install -d $(DESTDIR)$(MANDIR)
321	install -m644 x42-fat1.1 $(DESTDIR)$(MANDIR)
322endif
323
324uninstall-man:
325	rm -f $(DESTDIR)$(MANDIR)/x42-fat1.1
326	-rmdir $(DESTDIR)$(MANDIR)
327
328man: $(APPBLD)x42-fat1
329	help2man -N -o x42-fat1.1 -n "x42 JACK Auto Tune" $(APPBLD)x42-fat1
330
331clean:
332	rm -f $(BUILDDIR)manifest.ttl $(BUILDDIR)$(LV2NAME).ttl \
333	  $(BUILDDIR)$(LV2NAME)$(LIB_EXT) \
334	  $(BUILDDIR)$(LV2GUI)$(LIB_EXT)
335	rm -rf $(BUILDDIR)*.dSYM
336	rm -rf $(APPBLD)x42-*
337	rm -rf $(BUILDDIR)modgui
338	-test -d $(APPBLD) && rmdir $(APPBLD) || true
339	-test -d $(BUILDDIR) && rmdir $(BUILDDIR) || true
340
341distclean: clean
342	rm -f cscope.out cscope.files tags
343
344.PHONY: clean all install uninstall distclean jackapps man \
345        install-bin uninstall-bin install-man uninstall-man \
346        submodule_check submodules submodule_update submodule_pull
347