# SPDX-FileCopyrightText: Emery Hemingway # # SPDX-License-Identifier: LicenseRef-Hippocratic-1.1 { stdenv, buildPackages, fetchgit, llvmPackages }: let version = "19.08-64-g69eb762e4a"; inherit (stdenv) lib targetPlatform; specs = with targetPlatform; [] ++ lib.optional is32bit "32bit" ++ lib.optional is64bit "64bit" ++ lib.optional isAarch32 "arm" ++ lib.optional isAarch64 "arm_64" ++ lib.optional isRiscV "riscv" ++ lib.optional isx86 "x86" ++ lib.optional isx86_32 "x86_32" ++ lib.optional isx86_64 "x86_64"; buildRepo = { repo, srcHash }: let src = stdenv.mkDerivation { name = "genode-" + repo + "-src"; inherit repo; preferLocalBuild = true; outputHashMode = "recursive"; outputHashAlgo = "sha256"; outputHash = srcHash; src = fetchgit { url = "https://git.sr.ht/~ehmry/genode"; rev = "dc0084cd5bebfdba74323bbe8f0a9dd1e8b7c524"; sha256 = "12qwv6xq51dr5lps60c0r9dmxgk2agd8jgh0prafjk0wxq3xs95p"; fetchSubmodules = false; }; phases = [ "unpackPhase" "patchPhase" "installPhase" ]; postPatch = '' # Disable other repos for R in repos/*; do if [ -d "$R" ] ; then case $R in repos/$repo) ;; repos/base) find $R -name Tupfile -delete ;; *) rm -r $R ;; esac fi done ''; installPhase = "cp -r . $out"; }; tupArch = with stdenv.targetPlatform; if isAarch32 then "arm" else if isAarch64 then "arm64" else if isx86_32 then "i386" else if isx86_64 then "x86_64" else abort "unhandled targetPlatform"; toTupConfig = attrs: with builtins; let op = config: name: "${config}CONFIG_${name}=${getAttr name attrs} "; in foldl' op "" (attrNames attrs); in stdenv.mkDerivation { name = "genode-${repo}-${version}"; outputs = [ "out" "dev" ]; inherit src repo specs version; setupHook = ./../tool/setup-hooks.sh; depsBuildBuild = with buildPackages; [ llvm pkgconfig tup ]; tupConfig = toTupConfig { LIBCXX = llvmPackages.libcxx; LIBCXXABI = llvmPackages.libcxxabi; LIBUNWIND = llvmPackages.libunwind; LIBUNWIND_BAREMETAL = llvmPackages.libunwind.override { isBaremetal = true; }; LINUX_HEADERS = buildPackages.glibc.dev; OLEVEL = "-O2"; TUP_ARCH = tupArch; VERSION = version; }; configurePhase = '' # Configure Tup echo $tupConfig | tr ' CONFIG_' '\nCONFIG_' > tup.config echo CONFIG_NIX_OUTPUTS_OUT=$out >> tup.config echo CONFIG_NIX_OUTPUTS_DEV=$dev >> tup.config # Scan repository and generate script tup init tup generate buildPhase.sh # Redirect artifacts to Nix store mkdir -p $out $dev/include ln -s $out out ln -s $dev dev ''; buildPhase = '' test -d repos/$repo/src/ld && cp -rv repos/$repo/src/ld $dev/ pushd . set -v source buildPhase.sh set +v popd ''; installPhase = '' # Populate the "dev" headers if [ -d "repos/$repo/include" ]; then for DIR in repos/$repo/include; do for SPEC in $specs; do if [ -d $DIR/spec/$SPEC ]; then cp -r $DIR/spec/$SPEC/* $dev/include rm -r $DIR/spec/$SPEC fi done rm -rf $DIR/spec cp -r $DIR $dev/ done fi touch $dev/.genode for pc in $dev/lib/pkgconfig/*.pc; do sed -i "s|-l:|$dev/lib/|g" $pc done ''; meta = with stdenv.lib; { description = "The Genode operation system framework (${repo} repository)."; homepage = "https://genode.org/"; license = licenses.agpl3; maintainers = [ maintainers.ehmry ]; }; shellHook = '' export PROMPT_DIRTRIM=2 export PS1="\[\033[1;30m\]Genode-dev [\[\033[1;37m\]\w\[\033[1;30m\]] $\[\033[0m\] " export PS2="\[\033[1;30m\]>\[\033[0m\] " if [ -e "configs/.gitignore" ]; then local CFG_PATH=configs/${targetPlatform.config}.config echo $tupConfig | tr ' CONFIG_' '\nCONFIG_' > $CFG_PATH echo "Tup configuration placed at $CFG_PATH, to activate run the following command:" echo " tup variant $CFG_PATH" fi ''; }; in rec { # reset hashes to 0000000000000000000000000000000000000000000000000000 # when updating git revision base = buildRepo { repo = "base"; srcHash = "1jiqgflpgivwik3cswz9ni9qr6x01gmd3sj61vx7bzs7yck1s5l6"; }; base-linux = (buildRepo { repo = "base-linux"; srcHash = "1dmsq5znbcqy5kjm0v2a5k1mdxl4gbrr1k1g1in1hr0p460cjyrg"; }).overrideAttrs (attrs: { nativeBuildInputs = [ base ]; }); base-nova = (buildRepo { repo = "base-nova"; srcHash = "1lp7wnp99mrhccylvs1ys9kvjvyg3m7y16h3bg9zy0qlrkn668ja"; }).overrideAttrs (attrs: { nativeBuildInputs = [ base ]; }); os = (buildRepo { repo = "os"; srcHash = "035r8v1xnsz0xlz2f3g4350ay8bwrsj4linzd1dca663i6x7nv9m"; }).overrideAttrs (attrs: { nativeBuildInputs = [ base ]; }); }