diff --git a/Makefile b/Makefile index 1be4f69..8199b64 100644 --- a/Makefile +++ b/Makefile @@ -2,49 +2,81 @@ KERNEL_EXEC := socks_kernel ARCH := x86_64 +MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST))) +ROOT_DIR := $(patsubst %/,%,$(dir $(MAKEFILE_PATH))) + include tools/make/gcc-cross-compile.mk include arch/$(ARCH)/config.mk -BUILDDIR := build +BUILD_DIR := build + +#################################### +# Architecture-specific source files +#################################### ARCH_C_FILES := $(wildcard arch/$(ARCH)/*.c) ARCH_ASM_FILES := $(wildcard arch/$(ARCH)/*.S) -ARCH_OBJ := $(addprefix $(BUILDDIR)/,$(ARCH_C_FILES:.c=.o) $(ARCH_ASM_FILES:.S=.o)) +ARCH_OBJ := $(addprefix $(BUILD_DIR)/,$(ARCH_C_FILES:.c=.o) $(ARCH_ASM_FILES:.S=.o)) -SRC_DIRS := core -KERNEL_C_FILES := $(foreach dir,$(SRC_DIRS),$(wildcard $(dir)/*.c)) -KERNEL_OBJ := $(addprefix $(BUILDDIR)/,$(KERNEL_C_FILES:.c=.o)) +#################################### +# Platform-independent kernel source files +#################################### + +KERNEL_SRC_DIRS := init kernel +KERNEL_C_FILES := $(foreach dir,$(KERNEL_SRC_DIRS),$(wildcard $(dir)/*.c)) +KERNEL_OBJ := $(addprefix $(BUILD_DIR)/,$(KERNEL_C_FILES:.c=.o)) + +#################################### +# Kernel libc source files +#################################### + +LIBC_SRC_DIRS := stdio string ctype +LIBC_C_FILES := $(foreach dir,$(LIBC_SRC_DIRS),$(wildcard libc/$(dir)/*.c)) +LIBC_OBJ := $(addprefix $(BUILD_DIR)/,$(LIBC_C_FILES:.c=.o)) BUILD_ID := $(shell tools/generate_build_id.py --arch $(ARCH)) -CFLAGS := $(CFLAGS) -DBUILD_ID=\"$(BUILD_ID)\" -g +CFLAGS := $(CFLAGS) -DBUILD_ID=\"$(BUILD_ID)\" -g \ + "-I$(ROOT_DIR)/include" "-I$(ROOT_DIR)/arch/$(ARCH)/include" "-I$(ROOT_DIR)/libc/include" + ASMFLAGS := $(ASMFLAGS) -DBUILD_ID=\"$(BUILD_ID)\" LDFLAGS := $(LDFLAGS) -g -$(BUILDDIR)/$(KERNEL_EXEC): $(KERNEL_OBJ) $(ARCH_OBJ) +ALL_KERNEL_OBJECT_FILES := $(KERNEL_OBJ) $(ARCH_OBJ) $(LIBC_OBJ) + +$(BUILD_DIR)/$(KERNEL_EXEC): $(ALL_KERNEL_OBJECT_FILES) @echo " \033[1;36mLINK\033[0m \033[1m$@\033[0m" @mkdir -p $(@D) @$(LD) $^ -o $@ $(LDFLAGS) $(ARCH_LDFLAGS) -$(BUILDDIR)/%.o: %.S +$(BUILD_DIR)/%.o: %.S @echo " \033[1;32mASM\033[0m $<" @mkdir -p $(@D) @$(ASM) $< -o $@ -c $(ASMFLAGS) $(ARCH_ASMFLAGS) -$(BUILDDIR)/%.o: %.c +$(BUILD_DIR)/%.o: %.c @echo " \033[1;32mCC\033[0m $<" @mkdir -p $(@D) @$(CC) $< -o $@ -c $(CFLAGS) $(ARCH_CFLAGS) clean: @echo " \033[1;93mCLEAN\033[0m Deleting build artefacts." - @rm -rf $(BUILDDIR) + @rm -rf $(BUILD_DIR) -all: $(BUILDDIR)/$(KERNEL_EXEC) +all: $(BUILD_DIR)/$(KERNEL_EXEC) + +$(BUILD_DIR)/compile_commands.json: + @$(MAKE) clean + + @echo " \033[1;93mGEN\033[0m Generating compiler database." + + @./tools/make/generate_compile_commands.py + +compile-db: $(BUILD_DIR)/compile_commands.json include arch/$(ARCH)/extra.mk -.PHONY: all +.PHONY: all compile-db .INTERMEDIATE: $(ARCH_TEMP_FILES) diff --git a/tools/make/generate_compile_commands.py b/tools/make/generate_compile_commands.py new file mode 100755 index 0000000..9bd2e2d --- /dev/null +++ b/tools/make/generate_compile_commands.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python3 +import json +import subprocess +import os + + +def is_source_file(filepath): + return filepath.endswith('.c') or filepath.endswith('.h') or filepath.endswith('.S') + +rootdir = os.getcwd() + +compile_db = [] + +make_output = subprocess.check_output(['make', '-n']).decode('utf-8') + +make_output_lines = make_output.split('\n') + +for line in make_output_lines: + line_parts = line.split(' ') + new_line_parts = [] + + if 'gcc' not in line_parts[0]: + continue + + src_file = '' + for part in line_parts: + part = part.strip() + if is_source_file(part): + src_file = part + part = '../{}'.format(part) + + new_line_parts.append(part) + + if len(src_file) == 0: + continue + + db_entry = { + 'directory': '{}/build'.format(rootdir), + 'command': ' '.join(new_line_parts).strip(), + 'file': '{}/{}'.format(rootdir, src_file) + } + + compile_db.append(db_entry) + +os.system('make') + +out_file = open('build/compile_commands.json', 'w') +json.dump(compile_db, out_file, indent=4) +