nixpkgs/pkgs/by-name/ec/ecc/package.nix
stuebinm ff1a94e523 treewide: add meta.mainProgram to packages with a single binary
The nixpkgs-unstable channel's programs.sqlite was used to identify
packages producing exactly one binary, and these automatically added
to their package definitions wherever possible.
2024-03-19 03:14:51 +01:00

126 lines
3.1 KiB
Nix

{ lib
, makeWrapper
, fetchFromGitHub
, rustPackages
, pkg-config
, elfutils
, zlib
}:
let
inherit (rustPackages.rustc) llvmPackages;
inherit (rustPackages) rustPlatform;
bpftool = llvmPackages.stdenv.mkDerivation {
pname = "bpftool";
version = "unstable-2023-03-11";
# this fork specialized for some functions
# and has eventually been embedded into the ecc binary
src = fetchFromGitHub {
owner = "eunomia-bpf";
repo = "bpftool";
rev = "05940344f5db18d0cb1bc1c42e628f132bc93123";
hash = "sha256-g2gjixfuGwVnFlqCMGLWVPbtKOSpQI+vZwIZciXFPTc=";
fetchSubmodules = true;
};
buildInputs = [
llvmPackages.libllvm
elfutils
zlib
];
buildPhase = ''
make -C src
'';
installPhase = ''
# We don't use the default `make install` because we are looking to create a
# directory structure compatible with `build.rs` of `ecc`.
mkdir -p $out/src/libbpf
# some headers are required
cp -r src/libbpf/include $out/src/libbpf
cp src/bpftool $out/src
'';
};
vmlinux-headers = fetchFromGitHub {
owner = "eunomia-bpf";
repo = "vmlinux";
rev = "933f83becb45f5586ed5fd089e60d382aeefb409";
hash = "sha256-CVEmKkzdFNLKCbcbeSIoM5QjYVLQglpz6gy7+ZFPgCY=";
};
in
rustPlatform.buildRustPackage rec {
pname = "ecc";
version = "1.0.12";
src = fetchFromGitHub {
owner = "eunomia-bpf";
repo = "eunomia-bpf";
rev = "v${version}";
hash = "sha256-EK/SZ9LNAk88JpHJEoxw12NHje6QdCqO/vT2TfkWlb0=";
};
sourceRoot = "${src.name}/compiler/cmd";
cargoHash = "sha256-ymBEzFsMTxKSdJRYoDY3AC0QpgtcMlU0fQV03emCxQc=";
nativeBuildInputs = [
pkg-config
makeWrapper
rustPlatform.bindgenHook
];
buildInputs = [
elfutils
zlib
];
CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER = "gcc";
preBuild = ''
# `SANDBOX` defined by upstream to disable build-time network access
export SANDBOX=1
# specify dependencies' location
export VMLINUX_DIR=${vmlinux-headers}
export BPFTOOL_DIR=${bpftool}
'';
preCheck = ''
export HOME=$NIX_BUILD_TOP
'';
checkFlags = [
# requires network access
"--skip=bpf_compiler::tests::test_generate_custom_btf"
# FIXME: requires dynamic link `libclang` or clang binary which are not found in check env
"--skip=bpf_compiler::tests::test_compile_bpf"
"--skip=bpf_compiler::tests::test_export_multi_and_pack"
"--skip=document_parser::test::test_parse_empty"
"--skip=document_parser::test::test_parse_maps"
"--skip=document_parser::test::test_parse_progss"
"--skip=document_parser::test::test_parse_variables"
];
passthru = {
inherit bpftool;
};
postFixup = ''
wrapProgram $out/bin/ecc-rs \
--prefix LIBCLANG_PATH : ${llvmPackages.libclang.lib}/lib \
--prefix PATH : ${lib.makeBinPath (with llvmPackages; [clang bintools-unwrapped])}
'';
meta = with lib; {
homepage = "https://eunomia.dev";
description = "the eBPF compile toolchain for eunomia-bpf";
mainProgram = "ecc-rs";
maintainers = with maintainers; [ oluceps ];
platforms = platforms.linux;
license = licenses.mit;
};
}