[build]: 新更编译规则 添加编译文件
This commit is contained in:
5
arch/aarch64/meson.build
Normal file
5
arch/aarch64/meson.build
Normal file
@@ -0,0 +1,5 @@
|
||||
#aarch64
|
||||
|
||||
# 加入架构相关汇编文件
|
||||
libk_sources += files('asm_src/memory.S')
|
||||
libk_sources += files('asm_src/string.S')
|
||||
0
arch/riscv64/meson.build
Normal file
0
arch/riscv64/meson.build
Normal file
0
arch/x86_64/meson.build
Normal file
0
arch/x86_64/meson.build
Normal file
7
crt/meson.build
Normal file
7
crt/meson.build
Normal file
@@ -0,0 +1,7 @@
|
||||
# crt 实现
|
||||
|
||||
crt0_sources += files('crt0.c')
|
||||
|
||||
arch = get_option('arch')
|
||||
libk_sources += files(arch + '/libk_init.S')
|
||||
libk_sources += files(arch + '/libk_fini.S')
|
||||
89
meson.build
Normal file
89
meson.build
Normal file
@@ -0,0 +1,89 @@
|
||||
# libk 轻量级特化 libc 库
|
||||
|
||||
# 架构识别
|
||||
arch = get_option('arch')
|
||||
arch_dir = 'arch/' + arch
|
||||
|
||||
# libk的头文件
|
||||
# 创建包含多个目录的对象
|
||||
libk_inc = include_directories(
|
||||
'arch', # 架构头文件路径
|
||||
'src/include', # 源代码实现的头文件
|
||||
arch_dir, # 架构特定头文件路径
|
||||
)
|
||||
|
||||
# C 源文件变量声明
|
||||
libk_sources = []
|
||||
crt0_sources = []
|
||||
|
||||
# 引用编译文件添加
|
||||
subdir('crt') # 启动入口实现
|
||||
subdir('src') # C函数通用实现
|
||||
subdir(arch_dir) # 汇编特化实现
|
||||
|
||||
# 生成静态库
|
||||
libk = static_library(
|
||||
'k-' + arch,
|
||||
sources: libk_sources,
|
||||
include_directories: libk_inc,
|
||||
pic: false, # 内核必须固定地址
|
||||
install: false, # 不安装到系统目录
|
||||
override_options: [
|
||||
'c_std=gnu11', # 明确C标准
|
||||
],
|
||||
# 编译器专属参数
|
||||
c_args : [
|
||||
'-nostdinc', # 禁止搜索标准头文件路径
|
||||
'-ffreestanding', # 声明独立环境(无操作系统依赖)
|
||||
'-fno-builtin', # 禁用GCC内置函数(如memcpy)
|
||||
],
|
||||
# 链接器专属参数
|
||||
link_args : [
|
||||
'-nostdlib', # 禁止链接标准库(libc等)
|
||||
],
|
||||
)
|
||||
|
||||
# 依赖声明
|
||||
libk_dep = declare_dependency(
|
||||
link_with: libk,
|
||||
include_directories: libk_inc,
|
||||
compile_args: [
|
||||
'-DKERNEL_MODE', # 内核模式宏定义
|
||||
]
|
||||
)
|
||||
|
||||
|
||||
# 生成 crt0 对象文件
|
||||
cc = meson.get_compiler('c')
|
||||
# 对象文件名
|
||||
crt0_name = 'crt0-' + arch + '.o'
|
||||
# 确保只有一个源文件(crt0 通常只有一个入口文件)
|
||||
if crt0_sources.length() != 1
|
||||
error('crt0 must have exactly one source file')
|
||||
endif
|
||||
# crt0 文件
|
||||
crt0_source = crt0_sources[0]
|
||||
|
||||
# 手动编译对象文件
|
||||
crt0_obj = custom_target(
|
||||
crt0_name,
|
||||
input: crt0_source,
|
||||
output: crt0_name,
|
||||
command: [
|
||||
cc.cmd_array(),
|
||||
'-c', '@INPUT@',
|
||||
'-o', '@OUTPUT@',
|
||||
'-std=gnu11',
|
||||
'-nostdinc',
|
||||
'-ffreestanding',
|
||||
'-fno-builtin',
|
||||
'-nostdlib',
|
||||
# 添加头文件搜索路径
|
||||
'-I' + meson.current_source_dir() / 'arch',
|
||||
'-I' + meson.current_source_dir() / 'src/include',
|
||||
'-I' + meson.current_source_dir() / arch_dir,
|
||||
],
|
||||
build_by_default: true,
|
||||
)
|
||||
|
||||
|
||||
5
src/meson.build
Normal file
5
src/meson.build
Normal file
@@ -0,0 +1,5 @@
|
||||
# 通用解决方案 弱定义
|
||||
|
||||
libk_sources += files('memory.c')
|
||||
libk_sources += files('string.c')
|
||||
libk_sources += files('libk_start_main.c')
|
||||
Reference in New Issue
Block a user