# Makefile for the DuckDB Features Extension # # Builds the extension as both a static library and a shared library # that can be loaded by the ParserManager plugin system. # # Prerequisites: # - The Lime parser generator (../../lime) must be built # - The extension registry headers must be available in ../../include # # Targets: # all - Build grammar, static lib, and shared lib # grammar - Generate parser from duckdb_grammar.lime # test - Run test queries # clean - Remove generated files CC ?= cc CFLAGS ?= -Wall -Wextra -O2 -g LIME := ../../lime INCLUDES := -I. -I../../include -I../../src LDFLAGS := -L../../builddir/src LIBS := -llime_parser -lpthread # Source files GRAMMAR_SRC := duckdb_grammar.lime GRAMMAR_C := duckdb_grammar.c GRAMMAR_H := duckdb_grammar.h GRAMMAR_OUT := duckdb_grammar.out SRCS := duckdb_semantics.c duckdb_features.c OBJS := duckdb_semantics.o duckdb_features.o GRAMMAR_OBJ := duckdb_grammar.o # Output targets STATIC_LIB := libduckdb_features.a SHARED_LIB := libduckdb_features.so TEST_BIN := test_duckdb # ==================================================================== .PHONY: all grammar test clean all: grammar $(STATIC_LIB) $(SHARED_LIB) # Generate parser from Lime grammar grammar: $(GRAMMAR_C) $(GRAMMAR_C) $(GRAMMAR_H): $(GRAMMAR_SRC) $(LIME) $(LIME) $(GRAMMAR_SRC) $(GRAMMAR_OBJ): $(GRAMMAR_C) $(GRAMMAR_H) duckdb_semantics.h $(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $(GRAMMAR_C) # Compile source files duckdb_semantics.o: duckdb_semantics.c duckdb_semantics.h $(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $< duckdb_features.o: duckdb_features.c duckdb_semantics.h $(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $< # Static library $(STATIC_LIB): $(OBJS) $(GRAMMAR_OBJ) ar rcs $@ $^ # Shared library (for dynamic loading via ParserManager) $(SHARED_LIB): $(SRCS) $(GRAMMAR_C) duckdb_semantics.h $(CC) $(CFLAGS) $(INCLUDES) -shared -fPIC -o $@ $(SRCS) $(GRAMMAR_C) $(LIBS) # Test binary $(TEST_BIN): test_duckdb.c $(STATIC_LIB) duckdb_semantics.h $(CC) $(CFLAGS) $(INCLUDES) -o $@ test_duckdb.c -L. -lduckdb_features $(LDFLAGS) $(LIBS) test: $(TEST_BIN) ./$(TEST_BIN) clean: rm -f $(OBJS) $(GRAMMAR_OBJ) rm -f $(GRAMMAR_C) $(GRAMMAR_H) $(GRAMMAR_OUT) rm -f $(STATIC_LIB) $(SHARED_LIB) rm -f $(TEST_BIN)