diff --git a/arch/aarch64/meson.build b/arch/aarch64/meson.build new file mode 100644 index 0000000..14dc9f5 --- /dev/null +++ b/arch/aarch64/meson.build @@ -0,0 +1,5 @@ +#aarch64 + +# 加入架构相关汇编文件 +libk_sources += files('asm_src/memory.S') +libk_sources += files('asm_src/string.S') \ No newline at end of file diff --git a/arch/riscv64/meson.build b/arch/riscv64/meson.build new file mode 100644 index 0000000..e69de29 diff --git a/arch/x86_64/meson.build b/arch/x86_64/meson.build new file mode 100644 index 0000000..e69de29 diff --git a/crt/meson.build b/crt/meson.build new file mode 100644 index 0000000..ede8215 --- /dev/null +++ b/crt/meson.build @@ -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') \ No newline at end of file diff --git a/meson.build b/meson.build new file mode 100644 index 0000000..2696e43 --- /dev/null +++ b/meson.build @@ -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, +) + + diff --git a/src/meson.build b/src/meson.build new file mode 100644 index 0000000..016c798 --- /dev/null +++ b/src/meson.build @@ -0,0 +1,5 @@ +# 通用解决方案 弱定义 + +libk_sources += files('memory.c') +libk_sources += files('string.c') +libk_sources += files('libk_start_main.c') \ No newline at end of file