Skip to content

Commit 5f5376f

Browse files
committed
nix: Add a FHS shell with the toolchain to build linux for mocha
Signed-off-by: Douglas Reis <doreis@lowrisc.org>
1 parent eec1903 commit 5f5376f

4 files changed

Lines changed: 264 additions & 5 deletions

File tree

flake.lock

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

flake.nix

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@
7272
};
7373
ftditool-cli = inputs.ftditool.packages.${system}.default;
7474

75+
cheri-toolchain = pkgs.callPackage ./nix/cheri_toolchain.nix {inherit (lrPkgs) llvm_cheri;};
76+
7577
commonPackages = with pkgs; [
7678
bison
7779
cmake
@@ -93,8 +95,8 @@
9395
in {
9496
formatter = pkgs.alejandra;
9597
devShells = rec {
96-
default = cheri;
97-
cheri = pkgs.mkShell {
98+
default = baremetal;
99+
baremetal = pkgs.mkShell {
98100
name = "mocha-cheri";
99101
nativeBuildInputs =
100102
commonPackages
@@ -110,6 +112,35 @@
110112
UV_PYTHON = pythonSet.python.interpreter;
111113
};
112114
};
115+
linux =
116+
(pkgs.buildFHSEnv {
117+
name = "mocha-linux";
118+
targetPkgs = pkgs:
119+
commonPackages
120+
++ [lrPkgs.llvm_cheri]
121+
++ (with pkgs; [
122+
cheri-toolchain.cheriStdenv.cc
123+
autoconf
124+
automake
125+
bc
126+
bison
127+
bmake
128+
byacc
129+
flex
130+
libarchive
131+
libarchive.dev
132+
libelf
133+
libtool
134+
pkg-config
135+
zlib
136+
zlib.dev
137+
]);
138+
profile = ''
139+
export HOSTCC="${pkgs.llvmPackages_21.clang}/bin/clang";
140+
export HOSTCXX="${pkgs.llvmPackages_21.clang}/bin/clang++";
141+
export HOSTLD="${pkgs.llvmPackages_21.lld}/bin/ld.lld";
142+
'';
143+
}).env;
113144
};
114145

115146
apps = {

nix/CrossToolchain.cmake.in

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# Copyright lowRISC contributors.
2+
#
3+
# SPDX-License-Identifier: MIT
4+
5+
set(CMAKE_SYSTEM_NAME Linux)
6+
set(CMAKE_SYSTEM_PROCESSOR riscv64)
7+
8+
set(CMAKE_C_COMPILER "@llvmCheri@/bin/clang")
9+
set(CMAKE_C_COMPILER_TARGET "riscv64-linux-musl")
10+
set(CMAKE_CXX_COMPILER "@llvmCheri@/bin/clang++")
11+
set(CMAKE_CXX_COMPILER_TARGET "riscv64-linux-musl")
12+
set(CMAKE_ASM_COMPILER "@llvmCheri@/bin/clang")
13+
set(CMAKE_ASM_COMPILER_TARGET "riscv64-linux-musl")
14+
15+
set(CMAKE_AR
16+
"@llvmCheri@/bin/llvm-ar"
17+
CACHE FILEPATH "ar")
18+
set(CMAKE_RANLIB
19+
"@llvmCheri@/bin/llvm-ranlib"
20+
CACHE FILEPATH "ranlib")
21+
set(CMAKE_NM
22+
"@llvmCheri@/bin/llvm-nm"
23+
CACHE FILEPATH "nm")
24+
set(CMAKE_STRIP
25+
"@llvmCheri@/bin/llvm-strip"
26+
CACHE FILEPATH "strip")
27+
set(CMAKE_LINKER
28+
"@llvmCheri@/bin/ld.lld"
29+
CACHE FILEPATH "linker")
30+
31+
set(CHERI_COMMON_FLAGS
32+
"-target riscv64-linux-musl -B@llvmCheri@/bin -march=rv64imafdczcherihybrid_zcherilevels -mabi=l64pc128d -mno-relax -Xclang -target-feature -Xclang +cheri-bounded-vararg -Xclang -target-feature -Xclang +cheri-bounded-memarg-caller -Xclang -target-feature -Xclang +cheri-bounded-memarg-callee -isystem @linuxHeadersPurecap@/usr/include -ggdb -gz -Wno-error=unused-command-line-argument -ffreestanding -Werror=implicit-function-declaration -Werror=format -Werror=incompatible-pointer-types -Werror=cheri-capability-misuse -Werror=cheri-bitwise-operations -Werror=pass-failed -Werror=cheri-prototypes -Werror=undefined-internal"
33+
)
34+
35+
set(CHERI_LINKER_FLAGS "${CHERI_COMMON_FLAGS} -fuse-ld=lld")
36+
37+
set(CMAKE_C_FLAGS_INIT "${CHERI_COMMON_FLAGS}")
38+
set(CMAKE_CXX_FLAGS_INIT "${CHERI_COMMON_FLAGS}")
39+
set(CMAKE_ASM_FLAGS_INIT "${CHERI_COMMON_FLAGS}")
40+
set(CMAKE_EXE_LINKER_FLAGS_INIT "${CHERI_LINKER_FLAGS}")
41+
set(CMAKE_SHARED_LINKER_FLAGS_INIT "${CHERI_LINKER_FLAGS}")
42+
set(CMAKE_MODULE_LINKER_FLAGS_INIT "${CHERI_LINKER_FLAGS}")
43+
44+
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
45+
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
46+
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
47+
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

nix/cheri_toolchain.nix

Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
# Copyright lowRISC contributors.
2+
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
3+
# SPDX-License-Identifier: Apache-2.0
4+
{
5+
lib,
6+
stdenv,
7+
gnumake,
8+
cmake,
9+
rsync,
10+
fetchFromGitHub,
11+
llvm_cheri,
12+
pkgsCross,
13+
}: rec {
14+
linux-headers-purecap = stdenv.mkDerivation {
15+
pname = "linux-headers-purecap";
16+
version = "6.18";
17+
18+
src = fetchFromGitHub {
19+
owner = "CHERI-Alliance";
20+
repo = "linux";
21+
rev = "af04d488044fa684760d6480f3623e51b46568ca";
22+
fetchSubmodules = true;
23+
hash = "sha256-Gjjs+vV0meFHOAt9i88WMzpFEq8IZ1oXDFVXb7ZuLI8=";
24+
};
25+
26+
nativeBuildInputs = [
27+
gnumake
28+
rsync
29+
];
30+
31+
dontConfigure = true;
32+
dontBuild = true;
33+
34+
installPhase = ''
35+
runHook preInstall
36+
37+
make -j$NIX_BUILD_CORES headers_install \
38+
ARCH=riscv \
39+
INSTALL_HDR_PATH=$out/usr
40+
41+
runHook postInstall
42+
'';
43+
44+
meta = {
45+
description = "CHERI RISC-V 64 purecap Linux kernel (codasip-cheri-riscv-6.18)";
46+
platforms = ["x86_64-linux"];
47+
};
48+
};
49+
50+
muslc-linux-riscv64-purecap = stdenv.mkDerivation {
51+
pname = "muslc-linux-riscv64-purecap";
52+
version = "std093";
53+
54+
src = fetchFromGitHub {
55+
owner = "CHERI-Alliance";
56+
repo = "musl";
57+
rev = "12d15cddabcfb3f4f0612730f7147e7cf8c5579f";
58+
fetchSubmodules = true;
59+
hash = "sha256-8cEUnBQSsWEUoe5gLR/3jFO3KwTddJOhDTDnNZgUIXQ=";
60+
};
61+
62+
nativeBuildInputs = [
63+
gnumake
64+
llvm_cheri
65+
];
66+
67+
dontConfigure = false;
68+
69+
configurePhase = ''
70+
runHook preConfigure
71+
72+
# Dynamically fetch the resource dir
73+
RESOURCE_DIR=$(${llvm_cheri}/bin/clang -print-resource-dir)
74+
75+
./configure \
76+
--prefix= \
77+
--disable-shared \
78+
CC="clang \
79+
-target riscv64-linux-musl \
80+
-march=rv64imafdczcherihybrid_zcherilevels \
81+
-mabi=l64pc128d \
82+
-mno-relax \
83+
-Xclang -target-feature -Xclang +cheri-bounded-vararg \
84+
-Xclang -target-feature -Xclang +cheri-bounded-memarg-caller \
85+
-Xclang -target-feature -Xclang +cheri-bounded-memarg-callee \
86+
-idirafter $RESOURCE_DIR/include"
87+
88+
runHook postConfigure
89+
'';
90+
91+
installPhase = ''
92+
runHook preInstall
93+
94+
make install-headers DESTDIR=$out
95+
make install-libs DESTDIR=$out
96+
97+
runHook postInstall
98+
'';
99+
100+
dontFixup = true;
101+
};
102+
103+
compiler-rt-builtins-purecap = stdenv.mkDerivation {
104+
pname = "compiler-rt-builtins-purecap";
105+
version = "std093";
106+
107+
src = llvm_cheri.src;
108+
sourceRoot = "source/compiler-rt/lib/builtins";
109+
110+
nativeBuildInputs = [
111+
cmake
112+
llvm_cheri
113+
];
114+
115+
llvmCheri = llvm_cheri;
116+
linuxHeadersPurecap = linux-headers-purecap;
117+
118+
preConfigure = ''
119+
substituteAll ${./CrossToolchain.cmake.in} CrossToolchain.cmake
120+
'';
121+
122+
cmakeFlags = [
123+
"--toolchain=../CrossToolchain.cmake"
124+
(lib.cmakeFeature "CMAKE_BUILD_TYPE" "RelWithDebInfo")
125+
(lib.cmakeFeature "LLVM_CONFIG_PATH" "NOTFOUND")
126+
(lib.cmakeBool "CMAKE_DISABLE_FIND_PACKAGE_LLVM" true)
127+
(lib.cmakeBool "COMPILER_RT_EXCLUDE_ATOMIC_BUILTIN" false)
128+
(lib.cmakeBool "COMPILER_RT_BAREMETAL_BUILD" false)
129+
(lib.cmakeBool "COMPILER_RT_DEFAULT_TARGET_ONLY" true)
130+
(lib.cmakeFeature "TARGET_TRIPLE" "riscv64-linux-musl")
131+
(lib.cmakeFeature "CMAKE_SYSROOT" "${muslc-linux-riscv64-purecap}")
132+
(lib.cmakeBool "COMPILER_RT_DEBUG" true)
133+
(lib.cmakeFeature "CMAKE_C_COMPILER" "${llvm_cheri}/bin/clang")
134+
(lib.cmakeFeature "CMAKE_CXX_COMPILER" "${llvm_cheri}/bin/clang++")
135+
(lib.cmakeFeature "CMAKE_ASM_COMPILER" "${llvm_cheri}/bin/clang")
136+
];
137+
138+
postInstall = ''
139+
mkdir -p $out/lib
140+
141+
ln -fsn $out/lib/linux/libclang_rt.builtins-riscv64.a $out/lib/libclang_rt.builtins-riscv64.a
142+
ln -fsn $out/lib/linux/libclang_rt.builtins-riscv64.a $out/lib/libgcc.a
143+
144+
ln -fsn $out/lib/linux/clang_rt.crtbegin-riscv64.o $out/lib/crtbeginT.o
145+
ln -fsn $out/lib/linux/clang_rt.crtbegin-riscv64.o $out/lib/crtbeginS.o
146+
ln -fsn $out/lib/linux/clang_rt.crtend-riscv64.o $out/lib/crtend.o
147+
ln -fsn $out/lib/linux/clang_rt.crtend-riscv64.o $out/lib/crtendS.o
148+
'';
149+
150+
dontFixup = true;
151+
};
152+
153+
cheriBintools = pkgsCross.riscv64.wrapBintoolsWith {
154+
bintools = llvm_cheri;
155+
libc = muslc-linux-riscv64-purecap;
156+
coreutils = pkgsCross.riscv64.buildPackages.coreutils;
157+
};
158+
159+
cheriCC = pkgsCross.riscv64.wrapCCWith {
160+
cc = llvm_cheri;
161+
bintools = cheriBintools;
162+
libc = muslc-linux-riscv64-purecap;
163+
extraBuildCommands = ''
164+
echo "-isystem ${linux-headers-purecap}/usr/include" >> $out/nix-support/cc-cflags
165+
echo "-B${compiler-rt-builtins-purecap}/lib" >> $out/nix-support/cc-cflags
166+
echo "-L${compiler-rt-builtins-purecap}/lib" >> $out/nix-support/cc-ldflags
167+
'';
168+
};
169+
170+
cheriStdenv = pkgsCross.riscv64.stdenv.override {
171+
cc = cheriCC;
172+
allowedRequisites = null;
173+
174+
targetPlatform =
175+
stdenv.targetPlatform
176+
// {
177+
config = "riscv64-linux-musl";
178+
libc = "musl";
179+
};
180+
};
181+
}

0 commit comments

Comments
 (0)