CC = cc CFLAGS = -std=gnu23 CFLAGS_WARNINGS = -Wall -Wextra CFLAGS_RELEASE = -O2 -fstack-protector-strong -fpie -s CFLAGS_DEBUG = -O0 -ggdb -DDEBUG -fsanitize=address -static-libasan TEST_LIBS = -lcmocka TEST_INCLUDES = $(shell pkg-config --cflags cmocka) CFLAGS_TEST = -O0 -ggdb -DTEST -fsanitize=address -static-libasan -fprofile-instr-generate -fcoverage-mapping $(TEST_LIBS) $(TEST_INCLUDES) prefix = /usr/local exec_prefix = $(prefix) bindir = $(exec_prefix)/bin SOURCE_FOLDER = src SOURCE = main.c TARGET = wamf TARGET_DEBUG = wamf-debug OUTPUT_FOLDER = output OUTPUT = $(OUTPUT_FOLDER)/$(TARGET) OUTPUT_DEBUG = $(OUTPUT_FOLDER)/$(TARGET_DEBUG) TEST_FOLDER = test TEST_SOURCE = test.c TEST_OUTPUT_FOLDER = $(OUTPUT_FOLDER)/test TEST_OUTPUT = $(TEST_OUTPUT_FOLDER)/test REMOTE_USER = root REMOTE_HOST = innovation.pvv.ntnu.no REMOTE_DIR = /tmp/wamf REMOTE_PATH = $(REMOTE_USER)@$(REMOTE_HOST):$(REMOTE_DIR) .PHONY: all install release debug clean deploy remote-build remote-clean remote-run help test all: $(OUTPUT) $(OUTPUT_FOLDER): mkdir $(OUTPUT_FOLDER) $(TEST_OUTPUT_FOLDER): $(OUTPUT_FOLDER) mkdir $(TEST_OUTPUT_FOLDER) $(OUTPUT) release: $(SOURCE_FOLDER)/$(SOURCE) $(OUTPUT_FOLDER) $(CC) $(CFLAGS) $(CFLAGS_WARNINGS) $(CFLAGS_RELEASE) -o $(OUTPUT) $(SOURCE_FOLDER)/$(SOURCE) $(OUTPUT_DEBUG) debug: $(SOURCE_FOLDER)/$(SOURCE) $(OUTPUT_FOLDER) $(CC) $(CFLAGS) $(CFLAGS_WARNINGS) $(CFLAGS_DEBUG) -o $(OUTPUT_DEBUG) $(SOURCE_FOLDER)/$(SOURCE) $(TEST_OUTPUT): $(TEST_FOLDER)/$(TEST_SOURCE) $(TEST_OUTPUT_FOLDER) $(CC) $(CFLAGS) $(CFLAGS_WARNINGS) $(CFLAGS_TEST) -o $(TEST_OUTPUT) $(TEST_FOLDER)/$(TEST_SOURCE) install: $(OUTPUT) install -Dm755 $(OUTPUT) -t $(bindir) clean: rm -rf $(OUTPUT_FOLDER) deploy: @echo "Creating remote directory..." ssh $(REMOTE_USER)@$(REMOTE_HOST) "mkdir -p $(REMOTE_DIR)" @echo "Copying source files to $(REMOTE_HOST)..." scp $(SOURCE_FOLDER)/$(SOURCE) $(REMOTE_PATH)/$(SOURCE_FOLDER) scp Makefile $(REMOTE_PATH) @echo "Files deployed successfully" remote-build: deploy @echo "Building on remote server..." ssh $(REMOTE_USER)@$(REMOTE_HOST) "cd $(REMOTE_DIR) && make all" @echo "Build completed on remote server" remote-clean: @echo "Cleaning remote build..." ssh $(REMOTE_USER)@$(REMOTE_HOST) "cd $(REMOTE_DIR) && make clean" remote-run: remote-build @echo "Running on remote server..." ssh $(REMOTE_USER)@$(REMOTE_HOST) "cd $(REMOTE_DIR) && ./$(TARGET)" check: $(TEST_OUTPUT) @echo "Running tests..." ./$(TEST_OUTPUT) help: @echo "Available targets:" @echo " all - Build locally" @echo " clean - Clean local build" @echo " deploy - Copy files to remote server" @echo " remote-build - Deploy and build on remote server" @echo " remote-clean - Clean remote build" @echo " remote-run - Build and run on remote server" @echo " check - Run tests"