
PMD_HOME ?= /home/gatsby/Software/pmd-bin-6.0.1
OCLINT_HOME ?= /home/gatsby/Software/oclint-0.13.1

# Source files
DEBUG_LEVEL := 0
COMMON_SRC := ../src/system_monitor.h ../src/system_monitor.c
TEST_FRAME := unit_test_framework.h
UTIL_SRC := $(wildcard ../src/util/*.c ../src/util/*.h)
TMC_SRC := $(wildcard ../src/time_ctrl/*.c ../src/time_ctrl/*.h)
PHY_SRC := $(wildcard ../src/networking/phy_layer/*.c ../src/networking/phy_layer/*.h)
GEOMETRY_SRC := $(wildcard ../src/networking/link_layer/geometry/*.c ../src/networking/link_layer/geometry/*.h)
LINK_SRC := $(wildcard ../src/networking/link_layer/*.c ../src/networking/link_layer/*.h)

# Compiler
CC ?= gcc

# Compiler flags
CFLAGS ?= --std=c11 -O0 -I../src -I../src/include -Wall -Wformat=2 -Werror -pedantic -g -Wno-sign-compare -Wno-comment

# Add sanitizer flags for identifying undefined behavior.  The flags are
# different on macOS (AKA Darwin) and Windows/WSL/Linux.
UNAME := $(shell uname -s)
ifeq "$(UNAME)" "Darwin"
	CFLAGS += -fsanitize=address -fsanitize=undefined
else
	CFLAGS += -m32 -fsanitize=address -fsanitize=undefined -D_GLIBCC_DEBUG
endif

test: linklayer_emulate_unit_test.exe
	./linklayer_emulate_unit_test.exe > linklayer_emulate_unit_test.log

linklayer_emulate_unit_test.exe: linklayer_emulate_unit_test.c \
                             $(LINK_SRC) \
                             $(GEOMETRY_SRC) \
                             $(PHY_SRC) \
                             $(TMC_SRC) \
                             $(UTIL_SRC) \
                             $(COMMON_SRC) \
                             $(TEST_FRAME) \
                             Makefile
	$(CC) $(CFLAGS) -lm -DEMULATION -D_DEBUG_LEVEL=$(DEBUG_LEVEL) $(filter %.c, $^) -o $@
clean:
	rm -f *.exe *.log

# Style check
CPD ?= $(PMD_HOME)/bin/run.sh cpd
OCLINT ?= $(OCLINT_HOME)/bin/oclint
FILES := $(SRCS)
CPD_FILES := $(SRCS)
style :
	$(OCLINT) \
    -no-analytics \
    -rule=LongLine \
    -rule=HighNcssMethod \
    -rule=DeepNestedBlock \
    -rule=TooManyParameters \
    -rc=LONG_LINE=80 \
    -rc=NCSS_METHOD=1000 \
    -rc=NESTED_BLOCK_DEPTH=4 \
    -rc=TOO_MANY_PARAMETERS=4 \
    -max-priority-1 0 \
    -max-priority-2 0 \
    -max-priority-3 0 \
    $(FILES) \
    -- -xc++ --std=c99
	$(CPD) \
    --minimum-tokens 100 \
    --language c \
    --failOnViolation true \
    --files $(CPD_FILES)
	@echo "########################################"
	@echo "Style checks PASS"

.PHONY: clean test