AsciiCam/C/Makefile
2026-06-08 15:51:46 +05:30

81 lines
2.3 KiB
Makefile

CC = gcc
CFLAGS = -Wall -Wextra -O2 -Iinclude -Ilib
UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S),Linux)
CFLAGS += -fno-stack-protector -D__LINUX_NOLIBC__
# LDFLAGS = -lm
LDFLAGS += -nostdlib # drops crt startup files and default libs
# LDFLAGS += -nodefaultlibs # drops default libs but keeps crt startup files
LDFLAGS += -Wl,--no-as-needed
LDLIBS := -ldl -lpthread -lc
# LDFLAGS += -Wl,-rpath,/lib/x86_64-linux-gnu
# LDFLAGS += /lib/x86_64-linux-gnu/libdl.so.2
LDFLAGS += -Wl,-dynamic-linker,/lib64/ld-linux-x86-64.so.2
LDFLAGS += /usr/lib/x86_64-linux-gnu/crti.o
LDFLAGS += /usr/lib/x86_64-linux-gnu/crtn.o
LDFLAGS += -ldl # Dynamic loading symbols
LDFLAGS += -lpthread # Multi-threaded capture-render, pthreads producer/consumer
LDFLAGS += -lc
LDFLAGS += -msse4.1 # SIMD - SSE2 for the YUYV to gray conversion
# LDFLAGS += -static
LIBSRCS = $(wildcard lib/*.c)
else ifeq ($(UNAME_S),Darwin)
CFLAGS +=
LDFLAGS +=
LDLIBS :=
LIBSRCS =
endif
SRCDIR = src
INCDIR = include
LIBDIR = lib
BUILDDIR = build
OBJDIR = $(BUILDDIR)/obj
LIBSRCS = $(wildcard $(LIBDIR)/*.c)
SOURCES = $(wildcard $(SRCDIR)/*.c) $(LIBSRCS)
OBJECTS = $(patsubst $(SRCDIR)/%.c,$(OBJDIR)/%.o,$(SOURCES))
TARGET = $(BUILDDIR)/webcam_ascii
PLUGIN_SRCS = $(wildcard filters/*.c)
PLUGIN_C_SRCS = $(filter-out filters/%.h, $(PLUGIN_SRCS))
PLUGIN_TARGETS = $(patsubst filters/%.c,$(BUILDDIR)/%.so,$(PLUGIN_C_SRCS))
# Security Testing Targets
TEST_TARGET = $(BUILDDIR)/security_tests
TEST_SRC = ../tests/security_tests.c
FILTER_SRCS = filters/edge_detect.c filters/invert.c filters/threshold.c
.PHONY: all clean plugins test
all: $(TARGET) plugins
# Main binary
$(TARGET): $(OBJECTS)
$(CC) $^ -o $@ $(LDFLAGS)
$(OBJDIR)/%.o: $(SRCDIR)/%.c | $(OBJDIR)
$(CC) $(CFLAGS) -c $< -o $@
$(OBJDIR):
mkdir -p $(OBJDIR)
# Plugins compilation
plugins: $(PLUGIN_TARGETS)
$(BUILDDIR)/%.so: filters/%.c | $(BUILDDIR)
$(CC) $(CFLAGS) -fPIC -shared $< -o $@.tmp
mv $@.tmp $@
# Automated Unit Tests Execution
test: $(BUILDDIR)
$(CC) -I.. $(CFLAGS) -DTESTING $(TEST_SRC) $(FILTER_SRCS) -o $(TEST_TARGET) -lcheck -lsubunit -lm -lrt -lpthread
@echo " RUNNING ALL PLUGINS INVARIANT TEST "
./$(TEST_TARGET)
$(BUILDDIR):
mkdir -p $(BUILDDIR)
# Cleanup
clean:
rm -rf $(BUILDDIR)