PKG_CPPFLAGS = -I../inst/include -I./llama -I./ggml -I./ggml/ggml-cpu -DUSING_R=1 -include r_output_redirect.h
PKG_CXXFLAGS = -DNDEBUG -DGGML_USE_CPU 
PKG_CFLAGS = -DNDEBUG -DGGML_USE_CPU

# Override warnings for ggml source files
GGML_CXXFLAGS = $(PKG_CXXFLAGS) -fPIC
GGML_CFLAGS = $(PKG_CFLAGS) -DUSING_R=1 -fPIC
PKG_LIBS = $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)

# Complete static list of ALL object files - no variables, no wildcards
OBJECTS = bindings.o RcppExports.o \
	ggml/ggml.o ggml/ggml-alloc.o ggml/gguf.o \
	ggml/ggml-backend.o ggml/ggml-backend-reg.o \
	ggml/ggml-quants.o ggml/ggml-threading.o ggml/ggml-opt.o \
	llama/llama-adapter.o llama/llama-arch.o llama/llama-batch.o llama/llama-chat.o \
	llama/llama-context.o llama/llama-cparams.o llama/llama-grammar.o llama/llama-graph.o \
	llama/llama-hparams.o llama/llama-impl.o llama/llama-io.o llama/llama-kv-cache-iswa.o \
	llama/llama-kv-cache.o llama/llama-memory-hybrid.o llama/llama-memory-recurrent.o \
	llama/llama-memory.o llama/llama-mmap.o llama/llama-model-loader.o llama/llama-model-saver.o llama/llama-model.o \
	llama/llama-quant.o llama/llama-sampling.o llama/llama-vocab.o llama/llama.o \
	llama/unicode-data.o llama/unicode.o \
	ggml/ggml-cpu/ggml-cpu-c.o ggml/ggml-cpu/ggml-cpu-cpp.o ggml/ggml-cpu/ops.o \
	ggml/ggml-cpu/binary-ops.o ggml/ggml-cpu/unary-ops.o ggml/ggml-cpu/vec.o \
	ggml/ggml-cpu/traits.o ggml/ggml-cpu/repack.o ggml/ggml-cpu/quants.o \
	ggml/ggml-cpu/arch/x86/cpu-feats.o ggml/ggml-cpu/arch/x86/quants.o \
	ggml/ggml-cpu/arch/x86/repack.o

all: $(SHLIB)

clean:
	rm -f $(OBJECTS) $(SHLIB)

# Special rules for conflicting ggml-cpu files
ggml/ggml-cpu/ggml-cpu-c.o: ggml/ggml-cpu/ggml-cpu.c
	$(CC) $(ALL_CPPFLAGS) $(GGML_CFLAGS) -c $< -o $@

ggml/ggml-cpu/ggml-cpu-cpp.o: ggml/ggml-cpu/ggml-cpu.cpp
	$(CXX) $(ALL_CPPFLAGS) $(GGML_CXXFLAGS) -c $< -o $@

# Standard compilation rules for main source files (with suppression for Rcpp and format)
bindings.o: bindings.cpp
	$(CXX) $(ALL_CPPFLAGS) $(ALL_CXXFLAGS) -fPIC -c $< -o $@

RcppExports.o: RcppExports.cpp
	$(CXX) $(ALL_CPPFLAGS) $(ALL_CXXFLAGS) -fPIC -c $< -o $@

# Special rules for GGML/LLAMA files with warning suppression
ggml/%.o: ggml/%.c
	$(CC) $(ALL_CPPFLAGS) $(GGML_CFLAGS) -c $< -o $@

ggml/%.o: ggml/%.cpp
	$(CXX) $(ALL_CPPFLAGS) $(GGML_CXXFLAGS) -c $< -o $@

llama/%.o: llama/%.cpp
	$(CXX) $(ALL_CPPFLAGS) $(GGML_CXXFLAGS) -c $< -o $@

# Standard fallback rules
%.o: %.c
	$(CC) $(ALL_CPPFLAGS) $(ALL_CFLAGS) -fPIC -c $< -o $@

%.o: %.cpp
	$(CXX) $(ALL_CPPFLAGS) $(ALL_CXXFLAGS) -fPIC -c $< -o $@
