Makefile

← Back to explorer
Makefile
Raw
Plain Text 85 lines · UTF-8
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
CC        := cc
CFLAGS    := -O2 -Wall -Wextra -std=c11
TEDDY_CFLAGS := -Iinclude -D_POSIX_C_SOURCE=200809L
BUILD_DIR := build

SRCS := src/compute_backend.c src/gpu_compute.c src/math_ops.c src/matrix_ops.c src/computation_engine.c src/dataset_ops.c src/model_train.c
OBJS := $(SRCS:src/%.c=$(BUILD_DIR)/%.o)

KERNEL := $(shell uname -s)
SYSTEM_HAS_OPENCL := 0
OPENCL_HEADER_DIRECTORY :=

ifneq ($(wildcard /usr/include/CL/cl.h),)
	OPENCL_HEADER_DIRECTORY := /usr/include
else ifneq ($(wildcard /usr/local/include/CL/cl.h),)
	OPENCL_HEADER_DIRECTORY := /usr/local/include
else ifneq ($(wildcard /opt/rocm/include/CL/cl.h),)
	OPENCL_HEADER_DIRECTORY := /opt/rocm/include
endif

ifeq ($(KERNEL),Darwin)
	SYSTEM_HAS_OPENCL := 1
	LDFLAGS := -framework OpenCL
else
	ifneq ($(shell pkg-config --exists OpenCL 2>/dev/null && echo yes),)
    SYSTEM_HAS_OPENCL := 1
    TEDDY_CFLAGS += $(shell pkg-config --cflags OpenCL)
    LDFLAGS := $(shell pkg-config --libs OpenCL) -lm
  else ifneq ($(and $(OPENCL_HEADER_DIRECTORY),$(wildcard /usr/lib/libOpenCL.*)),)
    SYSTEM_HAS_OPENCL := 1
    TEDDY_CFLAGS += -I$(OPENCL_HEADER_DIRECTORY)
    LDFLAGS := -lOpenCL -lm
  else ifneq ($(and $(OPENCL_HEADER_DIRECTORY),$(wildcard /usr/lib/x86_64-linux-gnu/libOpenCL.*)),)
    SYSTEM_HAS_OPENCL := 1
    TEDDY_CFLAGS += -I$(OPENCL_HEADER_DIRECTORY)
    LDFLAGS := -lOpenCL -lm
  else ifneq ($(wildcard /opt/rocm/lib/libOpenCL.*),)
    SYSTEM_HAS_OPENCL := 1
    TEDDY_CFLAGS += -I/opt/rocm/include
    LDFLAGS := -L/opt/rocm/lib -lOpenCL -lm
  else
    LDFLAGS := -lm
  endif
endif

ifeq ($(SYSTEM_HAS_OPENCL),1)
	TEDDY_CFLAGS += -DSYSTEM_HAS_OPENCL
endif

ifeq ($(FORCE_CPU),1)
	SYSTEM_HAS_OPENCL := 0
	TEDDY_CFLAGS := $(filter-out -DSYSTEM_HAS_OPENCL,$(TEDDY_CFLAGS))
	LDFLAGS := -lm
endif

TARGET := $(BUILD_DIR)/teddy_train

.PHONY: all clean data info

all: $(TARGET)

info:
ifeq ($(SYSTEM_HAS_OPENCL),1)
	@echo "Teddy: OpenCL detected, using GPU for Model training..."
else
	@echo "Teddy: OpenCL not detected, using CPU for Model training..."
endif

$(BUILD_DIR):
	mkdir -p $(BUILD_DIR)

$(BUILD_DIR)/%.o: src/%.c | $(BUILD_DIR)
	$(CC) $(CFLAGS) $(TEDDY_CFLAGS) -c $< -o $@

$(BUILD_DIR)/teddy_train.o: train_teddy/train_teddy.c | $(BUILD_DIR)
	$(CC) $(CFLAGS) $(TEDDY_CFLAGS) -c $< -o $@

$(TARGET): $(OBJS) $(BUILD_DIR)/teddy_train.o
	$(CC) $(CFLAGS) $(TEDDY_CFLAGS) $^ $(LDFLAGS) -o $@

data:
	python3 dwnldr/download_dataset.py

clean:
	rm -rf $(BUILD_DIR)