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

# Cross-platform configuration without OpenMP for stability
GGML_CXXFLAGS = $(PKG_CXXFLAGS) -fPIC
GGML_CFLAGS = $(PKG_CFLAGS) -DUSING_R=1 -fPIC
PKG_LIBS = $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)

# Core object files (common to all architectures)
CORE_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

# Platform-independent configuration
# Use generic CPU implementation for all architectures to ensure portability
GGML_CXXFLAGS += -DGGML_CPU_GENERIC
GGML_CFLAGS += -DGGML_CPU_GENERIC

# No architecture-specific objects
ARCH_OBJECTS =

# Complete objects list with architecture support
OBJECTS = $(CORE_OBJECTS) $(ARCH_OBJECTS)

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
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
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 $@

# No architecture-specific rules needed - using generic CPU implementation

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

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