90 lines
3.2 KiB
Nix
90 lines
3.2 KiB
Nix
{
|
||
description = "RootFS";
|
||
|
||
inputs = {
|
||
fenix = {
|
||
url = "github:nix-community/fenix";
|
||
inputs.nixpkgs.follows = "nixpkgs";
|
||
};
|
||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11";
|
||
flake-parts.url = "github:hercules-ci/flake-parts";
|
||
};
|
||
|
||
outputs = inputs@{ self, nixpkgs, fenix, flake-parts }: flake-parts.lib.mkFlake { inherit inputs; } {
|
||
systems = [
|
||
"x86_64-linux"
|
||
];
|
||
perSystem = { self', inputs', system, ... }:
|
||
let
|
||
nixpkgs = inputs.nixpkgs;
|
||
fenix = inputs.fenix;
|
||
pkgs = nixpkgs.legacyPackages.${system};
|
||
lib = pkgs.lib;
|
||
rootfsType = "ext4";
|
||
buildDir = "./bin"; # Specifying temp file location
|
||
|
||
testOpt = {
|
||
# 自动测试项目,指定内核启动环境变量参数 AUTO_TEST
|
||
autotest = "none";
|
||
syscall = {
|
||
enable = true;
|
||
testDir = "/opt/gvisor";
|
||
version = "20251218";
|
||
};
|
||
};
|
||
|
||
mkOutputs = target:
|
||
let
|
||
diskPath = "${buildDir}/disk-image-${target}.img";
|
||
qemuScripts = import ./tools/qemu/default.nix {
|
||
inherit lib pkgs testOpt diskPath;
|
||
# QEMU 相关参数:
|
||
# 内核位置
|
||
kernel = "${buildDir}/kernel/kernel.elf"; # TODO: make it a drv 用nix构建内核,避免指定相对目录
|
||
# -s -S
|
||
debug = false;
|
||
# 启用 VM 状态管理,与 make qemu 行为保持一致
|
||
vmstateDir = "${buildDir}/vmstate";
|
||
};
|
||
|
||
startPkg = qemuScripts.${target};
|
||
rootfsPkg = pkgs.callPackage ./user/default.nix {
|
||
inherit lib pkgs nixpkgs fenix system target testOpt rootfsType buildDir diskPath;
|
||
};
|
||
in
|
||
{
|
||
apps = {
|
||
# start-${target} 的产物只是一个shell脚本,因此启动相关的参数,直接在上面修改即可,
|
||
# 脚本不占什么空间所以重复eval也没关系,并且最终产出的脚本可读性更好.
|
||
"start-${target}" = {
|
||
type = "app";
|
||
program = "${startPkg}/bin/dragonos-run";
|
||
meta.description = "以 ${target} 启动DragonOS";
|
||
};
|
||
# rootfs 中涉及到基于docker镜像的rootfs构建,修改了 user/ 下软件包相关内容后,
|
||
# rootfs 的docker镜像会重复构建,并且由于nix特性,副本会全部保留
|
||
# 因此可能会占很多空间,如果要清理空间请执行 nix store gc
|
||
"rootfs-${target}" = {
|
||
type = "app";
|
||
program = "${rootfsPkg}/bin/dragonos-rootfs";
|
||
meta.description = "构建 ${target} rootfs 镜像";
|
||
};
|
||
};
|
||
packages = {
|
||
"start-${target}" = startPkg;
|
||
"rootfs-${target}" = rootfsPkg;
|
||
};
|
||
};
|
||
|
||
allOutputs = map mkOutputs [ "x86_64" "riscv64" ];
|
||
merged = lib.foldl' (acc: elem: {
|
||
apps = acc.apps // elem.apps;
|
||
packages = acc.packages // elem.packages;
|
||
}) { apps = {}; packages = {}; } allOutputs;
|
||
|
||
in {
|
||
inherit (merged) apps packages;
|
||
};
|
||
};
|
||
}
|