1313# - CLAP SDK and helpers in ../../external/
1414# - C++17 compatible compiler
1515
16- CXX = g++
17- CXXFLAGS = -std=c++17 -fPIC -O2 -Wall -Wextra
18- INCLUDES = -I../../architecture \
19- -I../../external/clap-sdk/include \
20- -I../../external/clap-helpers/include \
21- -I/usr/local/include \
22- -I/opt/homebrew/include \
23- -Iefsw/include \
24- -Iefsw/src
25-
26- LIBS = -L/usr/local/lib -L/opt/homebrew/lib -lfaust -ldl -framework CoreServices -framework CoreFoundation
27-
28- TARGET = FaustDynamic.clap
29- SOURCE = simple-faust.cpp
30- HELPER_OBJS = clap-helpers-impl.o interpreter-clap.o
31- MAIN_OBJ = faust-dynamic.o
32- EFSW_LIB = efsw/build/libefsw-static.a
16+ CXX := /usr/bin/clang++
17+ CXXFLAGS := -std=c++17 -fPIC -O2 -Wall -Wextra -fvisibility=default
18+
19+ # Detect whether we're inside an installed faust2clap tree or building in-repo
20+ SCRIPT_DIR := $(realpath $(dir $(lastword $(MAKEFILE_LIST))))
21+ TOP_DIR := $(abspath $(SCRIPT_DIR)/../..)
22+
23+ # Allow override via env, useful for installed tree
24+ FAUST2CLAP_ROOT ?= $(TOP_DIR)
25+
26+ # External dependencies
27+ CLAP_SDK_INC := $(FAUST2CLAP_ROOT)/external/clap-sdk/include
28+ CLAP_HELPERS_INC := $(FAUST2CLAP_ROOT)/external/clap-helpers/include
29+ EFSW_INC := $(FAUST2CLAP_ROOT)/external/efsw/include
30+ EFSW_SRC := $(FAUST2CLAP_ROOT)/external/efsw/src
31+ EFSW_LIB := $(FAUST2CLAP_ROOT)/external/efsw/build/libefsw-static.a
32+
33+ INCLUDES = \
34+ -I$(FAUST2CLAP_ROOT)/architecture \
35+ -I$(FAUST2CLAP_ROOT)/external/clap-sdk/include \
36+ -I$(FAUST2CLAP_ROOT)/external/clap-helpers/include \
37+ -I$(FAUST2CLAP_ROOT)/external/efsw/include \
38+ -I$(FAUST2CLAP_ROOT)/external/efsw/src \
39+ -I/usr/local/include \
40+ -I/opt/homebrew/include
41+
42+ LIBS := -L$(FAUST2CLAP_ROOT)/external/efsw/build \
43+ -lfaust -ldl \
44+ -framework CoreServices -framework CoreFoundation
45+
46+ # Output target
47+ TARGET := FaustDynamic.clap
48+
49+ # Source files
50+ SOURCE := simple-faust.cpp
51+ MAIN_OBJ := faust-dynamic.o
52+ HELPER_OBJS := clap-helpers-impl.o interpreter-clap.o
3353
3454all: $(TARGET)
3555
3656$(TARGET): $(MAIN_OBJ) $(HELPER_OBJS) $(EFSW_LIB)
3757 @echo "🔗 Linking $(TARGET)..."
38- $(CXX) -shared $(MAIN_OBJ) $(HELPER_OBJS) $(EFSW_LIB) $(LIBS) -o $@
58+ $(CXX) -bundle -undefined dynamic_lookup \
59+ $(MAIN_OBJ) $(HELPER_OBJS) $(EFSW_LIB) $(LIBS) \
60+ -Wl,-headerpad_max_install_names \
61+ -Wl,-exported_symbol,_clap_entry \
62+ -Wl,-rpath,/usr/local/lib \
63+ -o $@
3964 @echo "✅ Built $(TARGET) successfully"
4065
4166$(MAIN_OBJ): $(SOURCE)
4267 @echo "🔨 Compiling main plugin source..."
43- $(CXX) $(CXXFLAGS) $(INCLUDES) -c $(SOURCE) -o $@
68+ $(CXX) $(CXXFLAGS) $(INCLUDES) -c $< -o $@
4469
4570clap-helpers-impl.o: clap-helpers-impl.cpp
4671 @echo "🔨 Compiling CLAP helpers..."
47- $(CXX) $(CXXFLAGS) $(INCLUDES) -c clap-helpers-impl.cpp -o $@
72+ $(CXX) $(CXXFLAGS) $(INCLUDES) -c $< -o $@
4873
4974interpreter-clap.o: interpreter-clap.cpp interpreter-clap.h
5075 @echo "🔨 Compiling Faust interpreter interface..."
5176 $(CXX) $(CXXFLAGS) $(INCLUDES) -c interpreter-clap.cpp -o $@
5277
78+
79+ # Build efsw automatically if missing
80+ ifeq ("$(wildcard $(EFSW_LIB))","")
81+ $(info ⚠️ efsw not built yet – will build it now)
82+ NEED_EFSW := 1
83+ endif
84+
85+
5386$(EFSW_LIB):
54- @echo "🔨 Building efsw library..."
55- @cd efsw && mkdir -p build && cd build && cmake .. && make efsw-static
87+ @echo "🔨 Building efsw..."
88+ cd $(FAUST2CLAP_ROOT)/external/efsw && \
89+ mkdir -p build && \
90+ cd build && \
91+ cmake .. && \
92+ make efsw-static
93+
94+ install: $(TARGET)
95+ @echo "📦 Installing $(TARGET)..."
96+ mkdir -p $(HOME)/Library/Audio/Plug-Ins/CLAP/
97+ mkdir -p $(HOME)/.clap/plugins/
98+ cp -f $(TARGET) $(HOME)/Library/Audio/Plug-Ins/CLAP/
99+ cp -f $(TARGET) $(HOME)/.clap/plugins/
100+ @echo "✅ Plugin installed to user plugin directories"
56101
57102clean:
58103 @echo "🧹 Cleaning build artifacts..."
59- rm -f $(MAIN_OBJ) $(HELPER_OBJS) $(TARGET)
104+ rm -f *.o $(TARGET)
60105 @echo "✅ Clean complete"
61106
62- install: $(TARGET)
63- @echo "📦 Installing $(TARGET)..."
64- @mkdir -p $(HOME)/Library/Audio/Plug-Ins/CLAP/
65- @mkdir -p $(HOME)/.clap/plugins/
66- cp $(TARGET) $(HOME)/Library/Audio/Plug-Ins/CLAP/
67- cp $(TARGET) $(HOME)/.clap/plugins/
68- @echo "✅ Installed $(TARGET) to system plugin directories"
69-
70- # Development targets
71- test: $(TARGET)
72- @echo "🧪 Testing plugin load..."
73- @if [ -n "$(CLAP_VALIDATOR)" ]; then \
74- $(CLAP_VALIDATOR) $(TARGET); \
75- else \
76- echo "⚠️ CLAP_VALIDATOR not set, skipping validation"; \
77- fi
78-
79- # Show build info
80- info:
81- @echo "🛠️ Faust Dynamic CLAP Plugin Build Configuration:"
82- @echo " Compiler: $(CXX)"
83- @echo " Flags: $(CXXFLAGS)"
84- @echo " Target: $(TARGET)"
85- @echo " Dependencies: libfaust (with interpreter), CLAP SDK"
86-
87- .PHONY: all clean install test info
107+ .PHONY: all install clean
0 commit comments