# Standard housekeeping .PHONY: all debug release clean target install .SUFFIXES: all: targets debug: CC := clang debug: CFLAGS += -DDEBUG -g -fsanitize=address debug: INCS := -I $(INC_DIR) debug: ELIBS := -fsanitize=address debug: STATIC := debug: CINIT := debug: CFINI := debug: targets release: CFLAGS += -O2 -mtune=native -flto #-DNDEBUG release: targets # Targets & array of sources & intermediates SRCS := OBJS := DEPS := LIBS := BINS := TEST := GENS := # iterate through source directory tree DIR := src include $(DIR)/rules.mk # generic rules %.a: %.o $(ARCHIVE) %: %.o $(LINK) # explicit system layer SYS := $(OBJ_DIR)/sys/sys.a SYS_SRCS := $(sort $(wildcard $(SYS_DIR)/src/*.c)) SYS_OBJS := $(filter %.o, $(SYS_SRCS:.c=.o)) SYS_OBJS := $(patsubst $(SYS_DIR)/src/%, $(OBJ_DIR)/$(SYS_DIR)/%, $(SYS_OBJS)) # rules for kernel interface $(OBJ_DIR)/$(SYS_DIR)/%.o: $(SYS_DIR)/src/%.c $(COMPILE) $(OBJ_DIR)/$(SYS_DIR)/%.o: $(SYS_DIR)/src/%.s $(ASSEMBLE) $(SYS): $(SYS_OBJS) $(ARCHIVE) # rules for userland $(OBJ_DIR)/%.o: $(SRC_DIR)/%.c $(COMPILE) $(OBJ_DIR)/%.o: $(SRC_DIR)/%.s $(ASSEMBLE) $(OBJ_DIR)/%: $(SRC_DIR)%.c $(COMPLNK) targets: $(SYS) $(LIBS) $(BINS) $(TEST) clean: @echo removing object files @rm -f $(OBJS) @echo removing dependency files @rm -f $(DEPS) @echo removing generated source files @rm -f $(GENS) @echo removing libraries @rm -f $(LIBS) @echo removing binaries @rm -f $(BINS) @echo removing unit tests @rm -f $(TEST) install: targets @echo installing executables @if [ -n $$BINS ]; then\ install $(BINS) $(BIN_DIR);\ fi @echo installing libraries @if [ -n $$LIBS ]; then\ install $(LIBS) $(LIB_DIR);\ fi @echo installing terminfo @tic -sx $(SRC_DIR)/cmd/term/term.info database: compiledb make -j4