CC := gcc CFLAGS = -std=c99 -Wall -Wextra -Wpedantic -g SRCD := src OBJD := obj BIND := bin FILES = $(shell find $(SRCD)/$(SUBD) -type f) CSRCS = $(filter %.c, $(FILES)) HSRCS = $(filter %.h, $(FILES)) COBJS = $(CSRCS:$(SRCD)/%.c=$(OBJD)/%.o) MODULE_TARGET := keylogger.ko KERNEL_NAME := kernel-$(shell uname -r) INITFS_NAME := initramfs.img export all: daemon client module tests vm clean: rm -rf $(BIND) rm -rf $(OBJD) daemon client module tests libs: $(eval TARGET := $($(shell echo $@ | tr 'a-z' 'A-Z')_TARGET)) $(MAKE) $(BIND)/$(if $(TARGET),$(TARGET),$@) SUBD=$@ # generic link $(BIND)/%: $(COBJS) $(HSRCS) mkdir -p $(dir $@) $(CC) $(CFLAGS) $(SFLAGS) $^ -o $@ # generic bulid $(OBJD)/%.o: $(SRCD)/%.c mkdir -p $(dir $@) $(CC) $(CFLAGS) $(SFLAGS) -c $^ -o $@ # build a module $(BIND)/%.ko: $(CSRCS) $(HSRCS) mkdir -p $(dir $@); mkdir -p $(OBJD)/$(SUBD) make -C $(SRCD)/$(SUBD) name=$(@:$(BIND)/%.ko=%) mv $(SRCD)/$(SUBD)/*.o $(OBJD)/$(SUBD) mv $(SRCD)/$(SUBD)/*.ko $@ make -C $(SRCD)/$(SUBD) clean # copy and build the testing files and other shared files (no .c files) $(BIND)/tests: libs $(BIND)/tests $(BIND)/libs: $(FILES) $(CSRCS:$(SRCD)/%.c=$(BIND)/%) mkdir -p $(BIND)/$(SUBD) find $(SRCD)/$(SUBD) -type f ! -name '*.c' -exec cp {} $(BIND)/$(SUBD) \; # VM things vm: vm.sh $(BIND)/$(INITFS_NAME) $(BIND)/$(KERNEL_NAME) ./vm.sh run $(BIND)/$(INITFS_NAME): $(SRCD)/initramfs-init.sh module ./vm.sh initramfs $@ $^ $(BIND)/$(KERNEL_NAME): ./vm.sh kernel $@