APPNAME = networkc SRCDIR = src BUILDDIR = build VENDORDIR = vendor target ?= linux profile ?= debug valgrind ?= false ifeq ($(target), windows) CC = x86_64-w64-mingw32-gcc EXT = .exe OPT_FLAGS = -O2 -DNDEBUG INCLUDES = -I$(SRCDIR) LIBS = # Command to copy DLL after build POST_BUILD_CMD = #@cp .. $(BUILDDIR); @echo "Build complete." else CC = gcc EXT = INCLUDES = -I$(SRCDIR) LIBS = -lpthread POST_BUILD_CMD = @echo "Build complete." # Profile Logic ifeq ($(profile), release) OPT_FLAGS = -O3 -DNDEBUG -march=native else OPT_FLAGS = -O0 -g -DDEBUG -Wall -Wextra endif endif # Combine Flags CFLAGS = -Wall $(OPT_FLAGS) $(INCLUDES) SRC = $(shell find $(SRCDIR) -name "*.c") OBJ = $(SRC:$(SRCDIR)/%.c=$(BUILDDIR)/%.o) all: $(BUILDDIR)/$(APPNAME)$(EXT) $(BUILDDIR)/$(APPNAME)$(EXT): $(OBJ) @echo "Linking $@ (Target: $(target), Profile: $(profile))" @mkdir -p $(dir $@) $(CC) $(OBJ) -o $@ $(LIBS) $(POST_BUILD_CMD) $(BUILDDIR)/%.o: $(SRCDIR)/%.c @echo "Compiling $<" @mkdir -p $(dir $@) $(CC) $(CFLAGS) -c $< -o $@ clean: rm -rf $(BUILDDIR) ifeq ($(valgrind), true) RUN_CMD = valgrind --leak-check=full ./$(BUILDDIR)/$(APPNAME)$(EXT) else RUN_CMD = ./$(BUILDDIR)/$(APPNAME)$(EXT) endif run: all $(RUN_CMD) .PHONY: all clean run