From 9e187a4e94b3b9abe925c8cd2113f0932370f641 Mon Sep 17 00:00:00 2001 From: Mark Poliakov Date: Wed, 13 Nov 2024 15:58:29 +0200 Subject: [PATCH] libc: add openlibm, hide compiler_builtins in static lib --- test.c | 14 +- userspace/lib/ygglibc/build.rs | 5 +- userspace/lib/ygglibc/crt/x86_64/crt0.S | 11 -- userspace/lib/ygglibc/crt/x86_64/crt0.c | 15 ++ .../lib/ygglibc/etc/x86_64-unknown-none.json | 7 +- userspace/lib/ygglibc/include/math.h | 20 ++ userspace/lib/ygglibc/src/allocator.rs | 8 +- .../lib/ygglibc/src/headers/ctype/mod.rs | 7 +- .../lib/ygglibc/src/headers/string/mem.rs | 26 ++- .../lib/ygglibc/src/headers/string/mod.rs | 6 - .../lib/ygglibc/src/headers/string/str.rs | 14 +- userspace/lib/ygglibc/src/lib.rs | 6 +- xtask/src/build/c.rs | 186 ++++++++++++++++++ xtask/src/build/cargo.rs | 3 +- xtask/src/build/llvm.rs | 23 --- xtask/src/build/mod.rs | 2 +- xtask/src/build/userspace.rs | 116 ++--------- xtask/src/check.rs | 1 + 18 files changed, 299 insertions(+), 171 deletions(-) delete mode 100644 userspace/lib/ygglibc/crt/x86_64/crt0.S create mode 100644 userspace/lib/ygglibc/crt/x86_64/crt0.c create mode 100644 userspace/lib/ygglibc/include/math.h create mode 100644 xtask/src/build/c.rs delete mode 100644 xtask/src/build/llvm.rs diff --git a/test.c b/test.c index e1f92417..ec2f6fba 100644 --- a/test.c +++ b/test.c @@ -1,13 +1,11 @@ -#include -#include -#include #include -#include -#include +#include +#include int main(int argc, const char **argv) { - int x = 1234; - printf("Hello %d!!!\n", x); - + double x = round(1234.123); + assert(fabs(x - 1234.000) < 0.00001); + double y = round(1234.5678); + assert(fabs(y - 1235.000) < 0.00001); return 0; } diff --git a/userspace/lib/ygglibc/build.rs b/userspace/lib/ygglibc/build.rs index cc55e167..5f35af13 100644 --- a/userspace/lib/ygglibc/build.rs +++ b/userspace/lib/ygglibc/build.rs @@ -65,14 +65,13 @@ fn compile_crt0(arch: &str, output_dir: impl AsRef) { command .arg(format!("--target={}-unknown-none", arch)) .arg("-nostdlib") - .arg("-nostdinc") .arg("-c") .arg("-o") .arg(output_dir.join("crt0.o")) - .arg(format!("crt/{}/crt0.S", arch)); + .arg(format!("crt/{}/crt0.c", arch)); if !command.status().unwrap().success() { - panic!("Couldn't compile crt0.S"); + panic!("Couldn't compile crt0.o"); } } diff --git a/userspace/lib/ygglibc/crt/x86_64/crt0.S b/userspace/lib/ygglibc/crt/x86_64/crt0.S deleted file mode 100644 index 3129f7ac..00000000 --- a/userspace/lib/ygglibc/crt/x86_64/crt0.S +++ /dev/null @@ -1,11 +0,0 @@ -.section .text - -.global _start -.extern __ygglibc_entry - -.type _start, %function -_start: - // %rdi -- kernel argument - leaq __ygglibc_entry(%rip), %rax - jmp *%rax -.size _start, . - _start diff --git a/userspace/lib/ygglibc/crt/x86_64/crt0.c b/userspace/lib/ygglibc/crt/x86_64/crt0.c new file mode 100644 index 00000000..94d72ed2 --- /dev/null +++ b/userspace/lib/ygglibc/crt/x86_64/crt0.c @@ -0,0 +1,15 @@ +#include + +extern __attribute__((noreturn)) void __ygglibc_entry(const void *); + +// // rust's shlib export breaks memset symbol +// void *memset(void *dst, int val, size_t len) __attribute__((weak)) { +// for (size_t i = 0; i < len; ++i) { +// ((char *) dst)[i] = (char) val; +// } +// return dst; +// } + +[[noreturn]] void _start(const void *arg) { + __ygglibc_entry(arg); +} diff --git a/userspace/lib/ygglibc/etc/x86_64-unknown-none.json b/userspace/lib/ygglibc/etc/x86_64-unknown-none.json index d79fc1f4..d2a2cad0 100644 --- a/userspace/lib/ygglibc/etc/x86_64-unknown-none.json +++ b/userspace/lib/ygglibc/etc/x86_64-unknown-none.json @@ -7,7 +7,7 @@ "data-layout": "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128", "max-atomic-width": 64, "target-pointer-width": "64", - "features": "-avx,-sse,+soft-float", + "features": "+sse", "disable-redzone": true, "executables": true, @@ -22,6 +22,11 @@ "linker": "rust-lld", "linker-flavor": "ld.lld", + "late-link-args-static": { + "ld.lld": [ + "--gc-sections" + ] + }, "late-link-args-dynamic": { "ld.lld": [ "--dynamic-linker=/libexec/dyn-loader" diff --git a/userspace/lib/ygglibc/include/math.h b/userspace/lib/ygglibc/include/math.h new file mode 100644 index 00000000..af1fd9c8 --- /dev/null +++ b/userspace/lib/ygglibc/include/math.h @@ -0,0 +1,20 @@ +#include + +typedef float float_t; +typedef double double_t; + +#ifndef M_PI +#define M_PI 3.14159265358979323846 /* pi */ +#endif + +#ifndef M_PI_2 +#define M_PI_2 1.57079632679489661923 /* pi/2 */ +#endif + +#ifndef M_PI_4 +#define M_PI_4 0.78539816339744830962 /* pi/4 */ +#endif + +#ifndef M_2_PI +#define M_2_PI 0.63661977236758134308 /* 2/pi */ +#endif diff --git a/userspace/lib/ygglibc/src/allocator.rs b/userspace/lib/ygglibc/src/allocator.rs index 3c8164f6..08dc8732 100644 --- a/userspace/lib/ygglibc/src/allocator.rs +++ b/userspace/lib/ygglibc/src/allocator.rs @@ -7,13 +7,7 @@ use core::{ use libyalloc::{allocator::BucketAllocator, sys::PageProvider}; use yggdrasil_rt::{mem::MappingSource, sys as syscall}; -use crate::{ - error::EResult, - headers::{ - errno, - string::{memcpy, memset}, - }, sync::Mutex, -}; +use crate::{error::EResult, headers::{errno, string::mem::{memcpy, memset}}, sync::Mutex}; struct Allocator; struct PageProviderImpl; diff --git a/userspace/lib/ygglibc/src/headers/ctype/mod.rs b/userspace/lib/ygglibc/src/headers/ctype/mod.rs index 62f913be..a803651e 100644 --- a/userspace/lib/ygglibc/src/headers/ctype/mod.rs +++ b/userspace/lib/ygglibc/src/headers/ctype/mod.rs @@ -1,4 +1,4 @@ -use core::ffi::c_int; +use core::ffi::{c_int, c_short}; use super::locale::locale_t; @@ -159,3 +159,8 @@ unsafe extern "C" fn tolower_l(_ch: c_int, _locale: locale_t) -> c_int { unsafe extern "C" fn toupper_l(_ch: c_int, _locale: locale_t) -> c_int { unimplemented!() } + +#[no_mangle] +unsafe extern "C" fn __ctype_b_loc() -> *mut *mut c_short { + todo!() +} diff --git a/userspace/lib/ygglibc/src/headers/string/mem.rs b/userspace/lib/ygglibc/src/headers/string/mem.rs index 18d76c8f..e390c663 100644 --- a/userspace/lib/ygglibc/src/headers/string/mem.rs +++ b/userspace/lib/ygglibc/src/headers/string/mem.rs @@ -1,5 +1,7 @@ - -use core::{ffi::{c_int, c_void}, ptr::null_mut}; +use core::{ + ffi::{c_int, c_void}, + ptr::null_mut, +}; #[no_mangle] unsafe extern "C" fn memccpy( @@ -69,3 +71,23 @@ pub(super) unsafe extern "C" fn mempcpy( } dst.add(n) as _ } + +#[no_mangle] +pub unsafe extern "C" fn memset(dst: *mut c_void, val: c_int, n: usize) -> *mut c_void { + compiler_builtins::mem::memset(dst.cast(), val, n).cast() +} + +#[no_mangle] +pub unsafe extern "C" fn memcpy(dst: *mut c_void, src: *const c_void, n: usize) -> *mut c_void { + compiler_builtins::mem::memcpy(dst.cast(), src.cast(), n).cast() +} + +#[no_mangle] +pub unsafe extern "C" fn memmove(dst: *mut c_void, src: *const c_void, n: usize) -> *mut c_void { + compiler_builtins::mem::memmove(dst.cast(), src.cast(), n).cast() +} + +#[no_mangle] +pub unsafe extern "C" fn memcmp(s1: *const c_void, s2: *const c_void, n: usize) -> c_int { + compiler_builtins::mem::memcmp(s1.cast(), s2.cast(), n) +} diff --git a/userspace/lib/ygglibc/src/headers/string/mod.rs b/userspace/lib/ygglibc/src/headers/string/mod.rs index 4a932565..30708ce4 100644 --- a/userspace/lib/ygglibc/src/headers/string/mod.rs +++ b/userspace/lib/ygglibc/src/headers/string/mod.rs @@ -2,9 +2,3 @@ use core::ffi::{c_char, c_int, c_void}; pub mod mem; pub mod str; - -extern "C" { - pub fn strlen(s: *const c_char) -> usize; - pub fn memset(a: *mut c_void, c: c_int, n: usize) -> *mut c_void; - pub fn memcpy(dst: *mut c_void, src: *const c_void, n: usize) -> *mut c_void; -} diff --git a/userspace/lib/ygglibc/src/headers/string/str.rs b/userspace/lib/ygglibc/src/headers/string/str.rs index ea08135b..1b826479 100644 --- a/userspace/lib/ygglibc/src/headers/string/str.rs +++ b/userspace/lib/ygglibc/src/headers/string/str.rs @@ -13,7 +13,7 @@ use crate::{ }, }; -use super::{mem::mempcpy, memcpy, memset, strlen}; +use super::mem::{memcpy, mempcpy, memset}; #[no_mangle] unsafe extern "C" fn stpcpy(dst: *mut c_char, src: *const c_char) -> *mut c_char { @@ -120,6 +120,11 @@ unsafe extern "C" fn strerror_r(e: c_int, buf: *mut c_char, n: usize) -> *mut c_ strncpy(buf, source, n) } +#[no_mangle] +unsafe extern "C" fn strlen(s: *const c_char) -> usize { + compiler_builtins::mem::strlen(s.cast()) +} + #[no_mangle] unsafe extern "C" fn strncat(dst: *mut c_char, src: *const c_char, n: usize) -> *mut c_char { if dst.is_null() || src.is_null() { @@ -336,6 +341,11 @@ unsafe extern "C" fn strxfrm(_a: *mut c_char, _b: *const c_char, _n: usize) -> u } #[no_mangle] -unsafe extern "C" fn strxfrm_l(_a: *mut c_char, _b: *const c_char, _n: usize, _l: locale_t) -> usize { +unsafe extern "C" fn strxfrm_l( + _a: *mut c_char, + _b: *const c_char, + _n: usize, + _l: locale_t, +) -> usize { unimplemented!() } diff --git a/userspace/lib/ygglibc/src/lib.rs b/userspace/lib/ygglibc/src/lib.rs index 1f2ad5b5..d929dd2e 100644 --- a/userspace/lib/ygglibc/src/lib.rs +++ b/userspace/lib/ygglibc/src/lib.rs @@ -6,13 +6,17 @@ c_variadic, arbitrary_self_types_pointers, maybe_uninit_slice, - slice_internals + slice_internals, + linkage, + rustc_private )] #![allow(internal_features)] #![cfg_attr(not(test), no_std)] extern crate alloc; +extern crate compiler_builtins; + #[cfg(test)] extern crate std; diff --git a/xtask/src/build/c.rs b/xtask/src/build/c.rs new file mode 100644 index 00000000..b94e282c --- /dev/null +++ b/xtask/src/build/c.rs @@ -0,0 +1,186 @@ +use std::{ + fs, + path::{Path, PathBuf}, + process::Command, +}; + +use crate::{env::BuildEnv, error::Error, util}; + +use super::cargo::CargoBuilder; + +pub struct Llvm { + root: PathBuf, +} + +pub struct Ygglibc { + static_lib_file: PathBuf, + shared_lib_file: PathBuf, + crt0_file: PathBuf, + include_paths: Vec, +} + +pub struct Openlibm { + shared_lib_file: PathBuf, + static_lib_file: PathBuf, + include_path: PathBuf, +} + +impl Llvm { + pub fn c_clang(&self, env: &BuildEnv) -> Command { + let mut command = Command::new(self.root.join("bin/clang")); + command.arg(format!("--target={}-unknown-yggdrasil", env.arch.name())); + command.arg(format!("--sysroot={}", env.llvm_sysroot.display())); + command + } + + pub fn clang(&self) -> PathBuf { + self.root.join("bin/clang") + } +} + +fn build_test_c_program( + env: &BuildEnv, + llvm: &Llvm, + install: &mut Vec<(PathBuf, PathBuf)>, +) -> Result<(), Error> { + log::info!("Building a test C program"); + let target_dir = &env.userspace_output_dir; + + let mut command = llvm.c_clang(env); + command + .args([ + "-Bdynamic", + "-fpie", + "-O0", + "-ggdb", + "-lm", + "-fstack-protector-strong", + ]) + .arg("-o") + .arg(target_dir.join("c-test")) + .arg(env.workspace_root.join("test.c")); + + if !command.status()?.success() { + return Err(Error::ExternalCommandFailed); + } + + let mut command = llvm.c_clang(env); + command + .args(["-static", "-O0", "-ggdb", "-fstack-protector-strong", "-lm"]) + .arg("-o") + .arg(target_dir.join("c-test-static")) + .arg(env.workspace_root.join("test.c")); + + if !command.status()?.success() { + return Err(Error::ExternalCommandFailed); + } + + install.push((target_dir.join("c-test"), "c-test".into())); + install.push((target_dir.join("c-test-static"), "c-test-static".into())); + + Ok(()) +} + +fn install_ygglibc(env: &BuildEnv, ygglibc: &Ygglibc) -> Result<(), Error> { + log::info!("Installing ygglibc into LLVM sysroot"); + + let dst_lib_dir = env.llvm_sysroot.join("lib"); + let dst_include_dir = env.llvm_sysroot.join("usr/include"); + + fs::create_dir_all(&dst_lib_dir)?; + fs::create_dir_all(&dst_include_dir)?; + + fs::copy(&ygglibc.static_lib_file, dst_lib_dir.join("libygglibc.a"))?; + fs::copy(&ygglibc.shared_lib_file, dst_lib_dir.join("libygglibc.so"))?; + fs::copy(&ygglibc.crt0_file, dst_lib_dir.join("crt0.o"))?; + + for path in ygglibc.include_paths.iter() { + util::copy_dir_recursive(path, &dst_include_dir)?; + } + + Ok(()) +} + +fn build_ygglibc(env: &BuildEnv) -> Result { + let ygglibc_dir = env.workspace_root.join("userspace/lib/ygglibc"); + let target_dir = ygglibc_dir.join(format!( + "target/{}-unknown-none/{}", + env.arch.name(), + env.profile.dir() + )); + CargoBuilder::Ygglibc(env).build(&ygglibc_dir)?; + + let static_lib_file = target_dir.join("libygglibc.a"); + let shared_lib_file = target_dir.join("libygglibc.so"); + let crt0_file = target_dir.join("crt0.o"); + let generated_includes = target_dir.join("include"); + let static_includes = ygglibc_dir.join("include"); + + Ok(Ygglibc { + static_lib_file, + shared_lib_file, + crt0_file, + include_paths: vec![generated_includes, static_includes], + }) +} + +// TODO clone openlibm +fn build_openlibm(env: &BuildEnv, llvm: &Llvm) -> Result { + fn make(env: &BuildEnv, llvm: &Llvm, libm_path: &Path) -> Command { + let mut command = Command::new("make"); + command.env("SYSROOT", &env.llvm_sysroot); + command.env("ARCH", env.arch.name()); + command.env("TRIPLE", format!("{}-unknown-yggdrasil", env.arch.name())); + command.env("USEGCC", "0"); + command.env("USECLANG", "1"); + command.env("CC", llvm.clang()); + command.current_dir(&libm_path); + command + } + + log::info!("Building openlibm"); + + let libm_path = env.workspace_root.join("toolchain-c/libs/openlibm"); + + let mut command = make(env, llvm, &libm_path); + if !command.status()?.success() { + return Err(Error::ExternalCommandFailed); + } + + Ok(Openlibm { + shared_lib_file: libm_path.join("libopenlibm.so.4.0"), + static_lib_file: libm_path.join("libopenlibm.a"), + include_path: libm_path.join("include"), + }) +} + +fn install_openlibm(env: &BuildEnv, libm: &Openlibm) -> Result<(), Error> { + fs::copy(&libm.static_lib_file, env.llvm_sysroot.join("lib/libm.a"))?; + fs::copy(&libm.shared_lib_file, env.llvm_sysroot.join("lib/libm.so"))?; + + util::copy_dir_recursive(&libm.include_path, env.llvm_sysroot.join("usr/include"))?; + + Ok(()) +} + +fn build_llvm(env: &BuildEnv) -> Result { + // TODO actually build and install LLVM + Ok(Llvm { + root: env.workspace_root.join("toolchain-c/prefix/host"), + }) +} + +pub fn build_c(env: &BuildEnv, install: &mut Vec<(PathBuf, PathBuf)>) -> Result<(), Error> { + let llvm = build_llvm(env)?; + let ygglibc = build_ygglibc(env)?; + install_ygglibc(env, &ygglibc)?; + let libm = build_openlibm(env, &llvm)?; + install_openlibm(env, &libm)?; + + build_test_c_program(env, &llvm, install)?; + + install.push((ygglibc.shared_lib_file, "lib/libygglibc.so".into())); + install.push((libm.shared_lib_file, "lib/libopenlibm.so.4".into())); + + Ok(()) +} diff --git a/xtask/src/build/cargo.rs b/xtask/src/build/cargo.rs index f474007d..b1a4def7 100644 --- a/xtask/src/build/cargo.rs +++ b/xtask/src/build/cargo.rs @@ -90,7 +90,8 @@ impl<'e> CargoBuilder<'e> { command .arg(arg) - .arg("-Zbuild-std=core,alloc,compiler_builtins") + .arg("-Zbuild-std=core,alloc") + .arg("-Zbuild-std-features=compiler-builtins-mangled-names,compiler-builtins-mem") .arg(&format!("--target={target}")); if env.verbose { diff --git a/xtask/src/build/llvm.rs b/xtask/src/build/llvm.rs deleted file mode 100644 index 8bcdabc4..00000000 --- a/xtask/src/build/llvm.rs +++ /dev/null @@ -1,23 +0,0 @@ -use std::{path::PathBuf, process::Command}; - -use crate::{env::BuildEnv, error::Error}; - -pub struct Llvm { - root: PathBuf, -} - -impl Llvm { - pub fn c_clang(&self, env: &BuildEnv) -> Command { - let mut command = Command::new(self.root.join("bin/clang")); - command.arg(format!("--target={}-unknown-yggdrasil", env.arch.name())); - command.arg(format!("--sysroot={}", env.llvm_sysroot.display())); - command - } -} - -pub fn build_llvm(env: &BuildEnv) -> Result { - // TODO actually build and install LLVM - Ok(Llvm { - root: env.workspace_root.join("toolchain-c/prefix/host"), - }) -} diff --git a/xtask/src/build/mod.rs b/xtask/src/build/mod.rs index 6b16f212..1499728f 100644 --- a/xtask/src/build/mod.rs +++ b/xtask/src/build/mod.rs @@ -13,8 +13,8 @@ use crate::{ pub mod i686; pub mod x86_64; +pub mod c; mod cargo; -pub mod llvm; mod module; pub mod toolchain; mod userspace; diff --git a/xtask/src/build/userspace.rs b/xtask/src/build/userspace.rs index dc82fcd7..fe4fd1f4 100644 --- a/xtask/src/build/userspace.rs +++ b/xtask/src/build/userspace.rs @@ -7,21 +7,14 @@ use std::{ use walkdir::WalkDir; use crate::{ - build::{cargo::CargoBuilder, llvm}, + build::{c, cargo::CargoBuilder}, check::AllOk, env::BuildEnv, error::Error, util, }; -use super::{llvm::Llvm, InitrdGenerated}; - -pub struct Ygglibc { - static_lib_file: PathBuf, - shared_lib_file: PathBuf, - crt0_file: PathBuf, - include_paths: Vec, -} +use super::InitrdGenerated; const PROGRAMS: &[(&str, &str)] = &[ // init @@ -73,102 +66,22 @@ const PROGRAMS: &[(&str, &str)] = &[ ("c-test-static", "c-test-static"), ]; -fn build_test_c_program(env: &BuildEnv, llvm: &Llvm) -> Result<(), Error> { - log::info!("Building a test C program"); - let target_dir = &env.userspace_output_dir; - - let mut command = llvm.c_clang(env); - command - .args([ - "-v", - "-Bdynamic", - "-fpie", - "-O0", - "-ggdb", - "-fstack-protector-strong", - ]) - .arg("-o") - .arg(target_dir.join("c-test")) - .arg(env.workspace_root.join("test.c")); - - if !command.status()?.success() { - return Err(Error::ExternalCommandFailed); - } - - let mut command = llvm.c_clang(env); - command - .args(["-v", "-static", "-O0", "-ggdb", "-fstack-protector-strong"]) - .arg("-o") - .arg(target_dir.join("c-test-static")) - .arg(env.workspace_root.join("test.c")); - - if !command.status()?.success() { - return Err(Error::ExternalCommandFailed); - } - - Ok(()) -} - -fn install_ygglibc(env: &BuildEnv, ygglibc: &Ygglibc) -> Result<(), Error> { - log::info!("Installing ygglibc into LLVM sysroot"); - - let dst_lib_dir = env.llvm_sysroot.join("lib"); - let dst_include_dir = env.llvm_sysroot.join("usr/include"); - - fs::create_dir_all(&dst_lib_dir)?; - fs::create_dir_all(&dst_include_dir)?; - - fs::copy(&ygglibc.static_lib_file, dst_lib_dir.join("libygglibc.a"))?; - fs::copy(&ygglibc.shared_lib_file, dst_lib_dir.join("libygglibc.so"))?; - fs::copy(&ygglibc.crt0_file, dst_lib_dir.join("crt0.o"))?; - - for path in ygglibc.include_paths.iter() { - util::copy_dir_recursive(path, &dst_include_dir)?; - } - - Ok(()) -} - -fn build_ygglibc(env: &BuildEnv) -> Result { - let ygglibc_dir = env.workspace_root.join("userspace/lib/ygglibc"); - let target_dir = ygglibc_dir.join(format!( - "target/{}-unknown-none/{}", - env.arch.name(), - env.profile.dir() - )); - CargoBuilder::Ygglibc(env).build(&ygglibc_dir)?; - - let static_lib_file = target_dir.join("libygglibc.a"); - let shared_lib_file = target_dir.join("libygglibc.so"); - let crt0_file = target_dir.join("crt0.o"); - let generated_includes = target_dir.join("include"); - let static_includes = ygglibc_dir.join("include"); - - Ok(Ygglibc { - static_lib_file, - shared_lib_file, - crt0_file, - include_paths: vec![generated_includes, static_includes], - }) -} - -fn build_userspace(env: &BuildEnv, _: AllOk) -> Result { +fn build_userspace( + env: &BuildEnv, + extra: &mut Vec<(PathBuf, PathBuf)>, + _: AllOk, +) -> Result<(), Error> { log::info!("Building userspace"); CargoBuilder::Userspace(env).build(env.workspace_root.join("userspace"))?; CargoBuilder::Userspace(env).build(env.workspace_root.join("userspace/dynload-program"))?; + c::build_c(env, extra)?; - let ygglibc = build_ygglibc(env)?; - let llvm = llvm::build_llvm(env)?; - install_ygglibc(env, &ygglibc)?; - build_test_c_program(env, &llvm)?; - - Ok(ygglibc) + Ok(()) } fn build_rootfs, D: AsRef>( env: &BuildEnv, install_extra: Vec<(PathBuf, PathBuf)>, - ygglibc: &Ygglibc, build_dir: S, rootfs_dir: D, _: AllOk, @@ -218,11 +131,6 @@ fn build_rootfs, D: AsRef>( log::info!("Installing ygglibc"); - util::copy_file( - &ygglibc.shared_lib_file, - rootfs_dir.join("lib/libygglibc.so"), - )?; - log::info!("Installing extras"); for (src, dst) in install_extra { util::copy_file(src, rootfs_dir.join(dst))?; @@ -281,16 +189,16 @@ fn pack_initrd>(env: &BuildEnv, rootfs_dir: P) -> Result, + mut install_extra: Vec<(PathBuf, PathBuf)>, check: AllOk, ) -> Result { let rootfs_dir = env.userspace_output_dir.join("rootfs"); - let ygglibc = build_userspace(env, check)?; + build_userspace(env, &mut install_extra, check)?; + build_rootfs( env, install_extra, - &ygglibc, &env.userspace_output_dir, &rootfs_dir, check, diff --git a/xtask/src/check.rs b/xtask/src/check.rs index 1f9b9a90..196668e5 100644 --- a/xtask/src/check.rs +++ b/xtask/src/check.rs @@ -41,6 +41,7 @@ fn check_commands_x86_64() -> Result { ("mtools", "Install the `mtools` package"), ("mkfs.vfat", "Install the `dosfstools` package"), ("ld64.lld", "Install LLVM"), + ("cmake", "Install cmake"), ]) }