ALDR_PATH=aldr-experiments

CPU_CORE = 0

EXECUTABLE = lut_benchmark
LIBRARY = liblut.so

ADDITIONAL_CFLAGS =
CFLAGS ?= -Wall -Wextra -Wno-unused-result -Werror -march=native -Werror -flto -fPIC -O3 -I$(ALDR_PATH) $(ADDITIONAL_CFLAGS) 
LDLIBS = -lm

SRC_DIR = src
EXCLUDE = cython

ALDR_SRC = $(shell find $(ALDR_PATH) -name "*.c" -not -path "$(ALDR_PATH)/sample.c")
SRC = $(shell find $(SRC_DIR) -name "*.c" -not -path "$(SRC_DIR)/$(EXCLUDE)/*") $(ALDR_SRC)
OBJ = $(SRC:%.c=%.o)
DEP = $(SRC:%.c=%.d)

all: $(EXECUTABLE) $(LIBRARY)

debug: $(EXECUTABLE)
debug:CFLAGS := $(filter-out -O3,$(CFLAGS)) -O0 -g

%.d: %.c
	$(CC) -MM -MG $(CFLAGS) $< > $@

-include $(DEP)

$(EXECUTABLE): $(OBJ)
	$(CC) $(OBJ) $(LDFLAGS) $(LDLIBS) -o $@

MAIN_OBJ=src/main.o
LIB_OBJ := $(filter-out $(MAIN_OBJ),$(OBJ))
$(LIBRARY): $(LIB_OBJ)
	$(CC) -shared $(LIB_OBJ) -o $@

FREQUENCY=4700MHz
setup_experiment:
	@echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
	@echo "> We will now enable all user space appllications to access "
	@echo "> hardware performance counters, exposing your system to    "
	@echo "> potential side-channel attacks by malicious software.     " 
	@echo "> To undo this later write '4' into perf_event_paranoid     "
	@echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
	echo 0 | sudo tee /proc/sys/kernel/perf_event_paranoid > /dev/null
	@echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
	@echo "> Setting your CPU frequency to $(FREQUENCY)                "
	@echo "> To choose another frequency run make with, e.g.           "
	@echo ">    $$ make FREQUENCY=3000MHz                              "
	@echo "> To get a list of supported frequencies, as well as your   "
	@echo "> current policy, run                                       "
	@echo ">    $$ sudo cpupower frequency-info                        "
	@echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
	sudo cpupower frequency-set --governor performance --min $(FREQUENCY) --max $(FREQUENCY)

DISTRIBUTIONS_ARCHIVE=dists.tar.gz
DISTRIBUTIONS_DIR = dists

$(DISTRIBUTIONS_DIR)/._distributions_extracted: $(DISTRIBUTIONS_ARCHIVE)
	tar xvzf $(DISTRIBUTIONS_ARCHIVE)
	touch $@

distributions: $(DISTRIBUTIONS_DIR)/._distributions_extracted

TIMEOUT=120s
OUTNAME=measurement_$(shell date "+%y%m%d-%H%M").log
EXPERIMENT_LIST=cLUT fldr.flat aldr.flat alias.c
c_experiment: distributions rebuild setup_experiment
	@echo "> Running '$(EXPERIMENT_LIST)' and saving to $(OUTNAME) ..."
	@echo "> To change this behavior run: "
	@echo "   $$ make OUTNAME=yourname.log EXPERIMENT_LIST='cLUT alias.c' $@"
	for sampler in $(EXPERIMENT_LIST); do \
		for file in $(DISTRIBUTIONS_DIR)/*.dist; do \
			echo "Starting $$sampler $$file"; \
			(timeout $(TIMEOUT) taskset -c $(CPU_CORE) ./$(EXECUTABLE) "$$sampler" "$$file" \
				|| echo FAIL "$$sampler" "$$file") 2>&1 | tee -a $(OUTNAME); \
		done; \
	done

c_memory_usage: distributions rebuild
	@echo "> Running '$(EXPERIMENT_LIST)' and saving to $(OUTNAME) ..."
	@echo "> To change this behavior run: "
	@echo "   $$ make OUTNAME=yourname.log EXPERIMENT_LIST='cLUT alias.c' $@"
	for sampler in $(EXPERIMENT_LIST); do \
		for file in $(DISTRIBUTIONS_DIR)/*.dist; do \
			(echo -n "$$sampler $$file "; \
				if valgrind --tool=massif --massif-out-file=massif_output.tmp ./$(EXECUTABLE) "$$sampler" "$$file" --memory 2> /dev/null; then \
					grep "mem_heap_B" massif_output.tmp | cut -d'=' -f2 | sort -n | tail -n 1; \
				else \
					echo "FAIL \"$$sampler\" \"$$file\""; \
				fi; \
				rm -f massif_output.tmp) | tee -a $(OUTNAME); \
		done; \
	done

VENV_PATH=.venv
PYTHON=$(VENV_PATH)/bin/python
venv: $(PYTHON)
$(PYTHON):
	python -m venv .venv
	$(PYTHON) -m pip install -r requirements.txt


python_experiment: venv distributions rebuild setup_experiment
	@echo "> Running for distributions from '$($(DISTRIBUTIONS_DIR))' ..."
	@echo "> To change this behavior run: "
	@echo "   $$ make DISTRIBUTIONS_DIR=yourfolder $@"
	taskset -c $(CPU_CORE) $(PYTHON) python_experiment.py $($(DISTRIBUTIONS_DIR))


cython: $(LIBRARY)
	python clut_sampling_setup.py build_ext --inplace


ARCHIVE_BASE_NAME=lut_benchmark
archive:
	git ls-files  --recurse-submodules  -- ':!*.gitmodules' | tar cvzf $(ARCHIVE_BASE_NAME).tar.gz --xform "s:^:$(ARCHIVE_BASE_NAME)/:" --verbatim-files-from -T-

rebuild: clean all

clean:
	$(RM) clut_sample.cpython-*.so clut_sample.c
	$(RM) -r build/
	$(RM) $(OBJ) $(DEP)
	$(RM) $(EXECUTABLE) $(LIBRARY)

.PHONY: all archive c_experiment clean cython debug distributions experiment python_experiment rebuild setup_experiment c_memory_usage
