Added a build rule to generate compile_commands.json
This commit is contained in:
56
Makefile
56
Makefile
@@ -2,49 +2,81 @@ KERNEL_EXEC := socks_kernel
|
|||||||
|
|
||||||
ARCH := x86_64
|
ARCH := x86_64
|
||||||
|
|
||||||
|
MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST)))
|
||||||
|
ROOT_DIR := $(patsubst %/,%,$(dir $(MAKEFILE_PATH)))
|
||||||
|
|
||||||
include tools/make/gcc-cross-compile.mk
|
include tools/make/gcc-cross-compile.mk
|
||||||
include arch/$(ARCH)/config.mk
|
include arch/$(ARCH)/config.mk
|
||||||
|
|
||||||
BUILDDIR := build
|
BUILD_DIR := build
|
||||||
|
|
||||||
|
####################################
|
||||||
|
# Architecture-specific source files
|
||||||
|
####################################
|
||||||
|
|
||||||
ARCH_C_FILES := $(wildcard arch/$(ARCH)/*.c)
|
ARCH_C_FILES := $(wildcard arch/$(ARCH)/*.c)
|
||||||
ARCH_ASM_FILES := $(wildcard arch/$(ARCH)/*.S)
|
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))
|
# Platform-independent kernel source files
|
||||||
KERNEL_OBJ := $(addprefix $(BUILDDIR)/,$(KERNEL_C_FILES:.c=.o))
|
####################################
|
||||||
|
|
||||||
|
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))
|
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)\"
|
ASMFLAGS := $(ASMFLAGS) -DBUILD_ID=\"$(BUILD_ID)\"
|
||||||
LDFLAGS := $(LDFLAGS) -g
|
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"
|
@echo " \033[1;36mLINK\033[0m \033[1m$@\033[0m"
|
||||||
@mkdir -p $(@D)
|
@mkdir -p $(@D)
|
||||||
@$(LD) $^ -o $@ $(LDFLAGS) $(ARCH_LDFLAGS)
|
@$(LD) $^ -o $@ $(LDFLAGS) $(ARCH_LDFLAGS)
|
||||||
|
|
||||||
$(BUILDDIR)/%.o: %.S
|
$(BUILD_DIR)/%.o: %.S
|
||||||
@echo " \033[1;32mASM\033[0m $<"
|
@echo " \033[1;32mASM\033[0m $<"
|
||||||
@mkdir -p $(@D)
|
@mkdir -p $(@D)
|
||||||
@$(ASM) $< -o $@ -c $(ASMFLAGS) $(ARCH_ASMFLAGS)
|
@$(ASM) $< -o $@ -c $(ASMFLAGS) $(ARCH_ASMFLAGS)
|
||||||
|
|
||||||
$(BUILDDIR)/%.o: %.c
|
$(BUILD_DIR)/%.o: %.c
|
||||||
@echo " \033[1;32mCC\033[0m $<"
|
@echo " \033[1;32mCC\033[0m $<"
|
||||||
@mkdir -p $(@D)
|
@mkdir -p $(@D)
|
||||||
@$(CC) $< -o $@ -c $(CFLAGS) $(ARCH_CFLAGS)
|
@$(CC) $< -o $@ -c $(CFLAGS) $(ARCH_CFLAGS)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
@echo " \033[1;93mCLEAN\033[0m Deleting build artefacts."
|
@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
|
include arch/$(ARCH)/extra.mk
|
||||||
|
|
||||||
.PHONY: all
|
.PHONY: all compile-db
|
||||||
|
|
||||||
.INTERMEDIATE: $(ARCH_TEMP_FILES)
|
.INTERMEDIATE: $(ARCH_TEMP_FILES)
|
||||||
|
|||||||
49
tools/make/generate_compile_commands.py
Executable file
49
tools/make/generate_compile_commands.py
Executable file
@@ -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)
|
||||||
|
|
||||||
Reference in New Issue
Block a user