aboutsummaryrefslogtreecommitdiff
path: root/composer/Makefile
blob: 61622346309d15bbfb48eb9a0e4d19a123fb5ce3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#!/usr/bin/make

DEBUG?=0
OS := $(shell uname -s)
TCL_VERSION := $(shell echo 'puts $$tcl_version' | tclsh)

ifeq ($(DEBUG),0)
	CFLAGS += -O2
else
	CFLAGS += -O0 -g -ggdb -DDEBUG
endif
ifeq ($(OS),Linux)
  PDSUF = .pd_linux
  PDBUNDLEFLAGS = -shared -rdynamic
  LDSOFLAGS = -lm
endif
ifeq ($(OS),Darwin)
  PDSUF = .pd_darwin
  INCLUDES = -I/Library/Frameworks/Tcl.framework/Headers
  PDBUNDLEFLAGS = -bundle -flat_namespace -undefined dynamic_lookup
  LDSOFLAGS = -lm
endif
ifeq (MINGW,$(findstring MINGW,$(UNAME)))
  PDSUF = .dll
  PDBUNDLEFLAGS = -shared
  LDSOFLAGS = -lm
endif

LIBNAME = composer
INCLUDES =  -I../../pd/src -I/usr/include #-I/usr/include/tcl$(TCL_VERSION)
CFLAGS += -funroll-loops -fno-operator-names -fno-omit-frame-pointer -falign-functions=16 -Wno-deprecated -fPIC
CFLAGS += -DPDSUF=\"$(PDSUF)\"
LDSHARED = $(CXX) $(PDBUNDLEFLAGS)

all: $(LIBNAME)$(PDSUF)
	@echo '-----------------------------------------------------------------------------'
	@echo ' $(LIBNAME)$(PDSUF) ('`test $(DEBUG) -eq 1 && echo debug || echo release`' build) '\
		'[size: '`ls -gGh $(LIBNAME)$(PDSUF) | cut -d " " -f 3`']'

clean::
	rm -f $(LIBNAME)$(PDSUF)
	rm -f *.o *~
	rm -f editor_tk.cpp methods_pd.hpp methods_ed.hpp classsetup.cpp callwrappers_pd.cpp callwrappers_ed.cpp

.SUFFIXES: .cpp .o

SRCS = Song.cpp Pattern.cpp Track.cpp Editor.o PdClasses.cpp
OBJS = ${SRCS:.cpp=.o}

Song.o: Song.cpp Song.hpp
Pattern.o: Pattern.cpp Pattern.hpp
Track.o: Track.cpp Track.hpp
Editor.o: Editor.cpp Editor.hpp editor_tk.cpp
PdClasses.o: PdClasses.cpp PdClasses.hpp methods_pd.hpp methods_ed.hpp classsetup.cpp callwrappers_pd.cpp callwrappers_ed.cpp

.cpp.o: Makefile
	$(CXX) $(CFLAGS) $(INCLUDES) -xc++ -c $<

$(LIBNAME)$(PDSUF): Makefile $(OBJS)
	$(LDSHARED) $(LDSOFLAGS) $(CFLAGS) -xnone $(OBJS) -o $(LIBNAME)$(PDSUF)

editor_tk.cpp: editor.tk
	( echo 'static const char* editor_tk[] = {'; sed -e 's/\(["\\]\)/\\\1/g' -e 's/^/"/' -e 's/$$/",/' editor.tk; echo '"" };' ) > editor_tk.cpp

methods.hpp: PdClasses.hpp
	awk ' \
		/^\/\*#end methods\*\/$$/{M=0} \
		{if(M==1) print $$0} \
		/^\/\*#begin methods\*\/$$/{M=1}' \
		PdClasses.hpp \
	| sed \
		-e 's/\> *\(\**\) *\w\+\(,\|)\)/\1\2/g' \
		-e 's/(/( /' -e 's/)/ )/' \
	| awk '{ \
		for(x=1; x<NF; x++) { \
			if(x<=2||x==NF) \
				printf($$x" "); \
			else \
				printf($$x" arg"(x-3)", "); \
		} \
		printf("\n"); \
		}' \
	| sed \
		-e 's/,\( arg[0-9]\+\)/\1/g' \
		-e 's/, $$/);/' \
		-e 's/( /(/' \
	> methods.hpp

methods_pd.hpp: methods.hpp
	sed -e 's/\<track_proxy_\w\+\>/\0P/' methods.hpp > methods_pd.hpp

methods_ed.hpp: methods.hpp
	sed -e 's/\<track_proxy_\w\+\>/\0E/' methods.hpp > methods_ed.hpp

classsetup.cpp: methods.hpp
	sed \
		-e 's/\<track_proxy_\(\w\+\)\>/\0 \1/' \
		-e 's/);$$/, /' \
		-e 's/(t_track_proxy\* arg0,\?//' \
		-e 's/ arg[0-9]\+, / /g' \
		-e 's/\<t_symbol\* int t_atom\>\*/A_GIMME, /g' \
		-e 's/\<t_symbol\>\*/A_SYMBOL, /g' \
		-e 's/\<t_floatarg\>/A_FLOAT, /g' \
		methods.hpp \
	| awk '{ \
		printf("class_addmethod(track_proxy_class, (t_method)%sP, gensym(\"%s\"), ", $$2, $$3); \
		for(i=4; i<=NF; i++) printf("%s ", $$i); \
		printf("A_NULL);\n"); \
		\
		printf("class_addmethod(track_proxy_class, (t_method)%sE, gensym(\"%sE\"), ", $$2, $$3); \
		for(i=4; i<=NF; i++) printf("%s ", $$i); \
		printf("A_NULL);\n"); \
	}' \
	> classsetup.cpp

callwrappers_pd.cpp: methods.hpp
	sed \
		-e 's/;$$//' \
		-e 's/^\(.*\)\(\<track_proxy_\w\+\>\)\((.*)\)$$/\1\2P\3 {\n    \2\3;\/\/real call\n    track_proxy_send_result(arg0, 1, 0);\n}/' \
		methods.hpp \
	| sed \
		-e '/\/\/real call/s/(t_track_proxy\* arg0/(arg0/' \
		-e '/\/\/real call/s/\(arg[0-9]\+, \)[A-Za-z_*]\+ \(arg[0-9]\+\)/\1\2/g' \
		-e '/\/\/real call/s/\(arg[0-9]\+, \)[A-Za-z_*]\+ \(arg[0-9]\+\)/\1\2/g' \
		-e '/\/\/real call/s/\(arg[0-9]\+, \)[A-Za-z_*]\+ \(arg[0-9]\+\)/\1\2/g' \
		-e '/\/\/real call/s/\(arg[0-9]\+, \)[A-Za-z_*]\+ \(arg[0-9]\+\)/\1\2/g' \
	> callwrappers_pd.cpp

callwrappers_ed.cpp: methods.hpp
	sed \
		-e 's/;$$//' \
		-e 's/^\(.*\)\(\<track_proxy_\w\+\>\)\((.*)\)$$/\1\2E\3 {\n    \2\3;\/\/real call\n    track_proxy_send_result(arg0, 0, 1);\n}/' \
		methods.hpp \
	| sed \
		-e '/\/\/real call/s/(t_track_proxy\* arg0/(arg0/' \
		-e '/\/\/real call/s/\(arg[0-9]\+, \)[A-Za-z_*]\+ \(arg[0-9]\+\)/\1\2/g' \
		-e '/\/\/real call/s/\(arg[0-9]\+, \)[A-Za-z_*]\+ \(arg[0-9]\+\)/\1\2/g' \
		-e '/\/\/real call/s/\(arg[0-9]\+, \)[A-Za-z_*]\+ \(arg[0-9]\+\)/\1\2/g' \
		-e '/\/\/real call/s/\(arg[0-9]\+, \)[A-Za-z_*]\+ \(arg[0-9]\+\)/\1\2/g' \
	> callwrappers_ed.cpp