CXX = g++
CXXFLAGS = -std=c++17 -Wall -Wextra -pedantic
LDFLAGS = -lstdc++fs

BUILD_DIR = build
CONTAINER_BIN_NAME = container_test
SOCKER_BIN = $(BUILD_DIR)/socker
SOCKER_MONITOR_BIN = $(BUILD_DIR)/socker_monitor
CONTAINER_BIN = $(BUILD_DIR)/$(CONTAINER_BIN_NAME)
CONTAINERIZED_SUBDIRS = bin dev etc lib lib64 proc sys tmp

BOOKWORM_IMAGE = debian:bookworm
BOOKWORM_CONTAINER_NAME = bookworm_temp
BOOKWORM_ROOTFS_DIR = $(BUILD_DIR)/bookworm-rootfs
	
all:
	@echo "'make monitor' to build the container monitor. 'make plain' to build and run the sample or 'make containerized' to build socker, the sample and then run the sample containerized"

bookworm-rootfs: $(BOOKWORM_ROOTFS_DIR)

$(BOOKWORM_ROOTFS_DIR):
	sudo docker pull $(BOOKWORM_IMAGE)
	sudo docker create --name $(BOOKWORM_CONTAINER_NAME) $(BOOKWORM_IMAGE)
	mkdir -p $(BOOKWORM_ROOTFS_DIR)
	sudo docker export $(BOOKWORM_CONTAINER_NAME) | tar -C $(BOOKWORM_ROOTFS_DIR) -xf -
	sudo docker rm $(BOOKWORM_CONTAINER_NAME)

plain: $(CONTAINER_BIN)
	./$(CONTAINER_BIN) 50 5

containerized: $(SOCKER_BIN) $(CONTAINER_BIN)
	mkdir -m 777 -p $(BUILD_DIR)/container_fs
	@for dir in $(CONTAINERIZED_SUBDIRS); do \
		mkdir -m 777 -p $(BUILD_DIR)/container_fs/$$dir; \
	done
	cp $(CONTAINER_BIN) $(BUILD_DIR)/container_fs/bin/
	sudo ./$(SOCKER_BIN) container1 ./$(BUILD_DIR)/container_fs /bin/$(CONTAINER_BIN_NAME) 50 5

containerized_sh: $(SOCKER_BIN) bookworm-rootfs
	mkdir -m 777 -p $(BUILD_DIR)/container_fs
	@for dir in $(CONTAINERIZED_SUBDIRS); do \
		mkdir -m 777 -p $(BUILD_DIR)/container_fs/$$dir; \
	done
	sudo ./$(SOCKER_BIN) container2 $(BOOKWORM_ROOTFS_DIR) /bin/sh

monitor: $(SOCKER_MONITOR_BIN)
	./$(SOCKER_MONITOR_BIN)

$(SOCKER_BIN): socker.cpp | $(BUILD_DIR)
	$(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)

$(SOCKER_MONITOR_BIN): socker_monitor.cpp | $(BUILD_DIR)
	$(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)

$(CONTAINER_BIN): container_test.cpp | $(BUILD_DIR)
	$(CXX) $(CXXFLAGS) -static -o $@ $^

$(BUILD_DIR):
	mkdir -m 777 -p $(BUILD_DIR)

clean:
	rm -rf $(BUILD_DIR)

.PHONY: all clean plain containerized
