CC := gcc ifeq ($(PROD),1) CFLAGS := -std=c99 -O2 # production flags else CFLAGS := -std=c99 -Wall -Wextra -Wpedantic -g -DDEBUG # debug flags endif # compile as static for the virtual machine ifeq (vm,$(filter vm,$(MAKECMDGOALS))) SFLAGS += -static endif SRCD := src OBJD := obj BIND := bin DEPD := include TSTD := tests CFLAGS += -I$(SRCD)/$(DEPD) # all the subdirs of the source dir (except DEPD and TSTD) DIRS := $(filter-out $(DEPD) $(TSTD),$(shell find $(SRCD) -mindepth 1 -maxdepth 1 -type d -exec basename {} \;)) FILES = $(shell find $(SRCD)/$(SUBD) -type f) CSRCS = $(filter %.c, $(FILES)) COBJS = $(CSRCS:$(SRCD)/%.c=$(OBJD)/%.o) # get deps CDEPS = $(COBJS:%.o=%.d) -include $(CDEPS) MODULE_TARGET := keylogger.ko KERNEL_NAME := kernel-$(shell uname -r) INITFS_NAME := initramfs.img export .PHONY: all clean $(DIRS) $(TSTD) $(DEPD) all: $(DIRS) $(DEPD) $(TSTD) clean: rm -rf $(BIND) rm -rf $(OBJD) $(DIRS): $(eval TARGET := $($(shell echo $@ | tr 'a-z' 'A-Z')_TARGET)) $(MAKE) $(BIND)/$(if $(TARGET),$(TARGET),$@) SUBD=$@ $(DEPD) $(TSTD): $(DEPD) $(MAKE) $(BIND)/$@/ SUBD=$@ SINGLE_OBJ=1 ifeq ($(SINGLE_OBJ),1) # generic single object build $(BIND)/%: $(OBJD)/%.o mkdir -p $(dir $@) $(CC) $(CFLAGS) $(SFLAGS) $^ -o $@ else # generic build $(BIND)/%: $(COBJS) mkdir -p $(dir $@) $(CC) $(CFLAGS) $(SFLAGS) $^ -o $@ endif # generic compile to obj $(OBJD)/%.o: $(SRCD)/%.c mkdir -p $(dir $@) $(CC) $(CFLAGS) $(SFLAGS) -MMD -MF $(@:%.o=%.d) -c $< -o $@ # generic build and copy dir $(BIND)/%/: $(FILES) $(CSRCS:$(SRCD)/%.c=$(BIND)/%) mkdir -p $(dir $@) find $(@:$(BIND)/%=$(SRCD)/%) -type f ! -name "*.c" ! -name "*.h" -exec cp {} $@ \; # generic build a module $(BIND)/%.ko: $(FILES) 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 # VM things vm: vm.sh $(BIND)/$(INITFS_NAME) $(BIND)/$(KERNEL_NAME) ./vm.sh run $(BIND)/$(INITFS_NAME): $(SRCD)/initramfs-init.sh module $(TSTD) ./vm.sh initramfs $@ $< $(BIND)/$(KERNEL_NAME): ./vm.sh kernel $@