From a8246c9b04e4a088b487288437a47fbb46068c8f Mon Sep 17 00:00:00 2001 From: Daniel Noland <daniel.noland@dnoland.cloud> Date: Thu, 26 Sep 2024 12:02:48 -0600 Subject: [PATCH] Address some of @qmonnet comments --- .../workflows/build-and-push-container.yml | 36 +++++ dpdk-sys-old/src/main.rs | 16 +- flake.lock | 6 +- nix/dev-env.nix | 153 ++++++++++++++++++ runner.sh | 23 ++- sysroot-helper/src/lib.rs | 4 +- 6 files changed, 220 insertions(+), 18 deletions(-) diff --git a/.github/workflows/build-and-push-container.yml b/.github/workflows/build-and-push-container.yml index e69de29bb..bb8a75102 100644 --- a/.github/workflows/build-and-push-container.yml +++ b/.github/workflows/build-and-push-container.yml @@ -0,0 +1,36 @@ +name: test suite +on: [ push, pull_request ] + +jobs: + build: + name: cargo build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Login to ghcr.io + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Fetch dev env container + run: | + declare -rx PROFILE=debug + docker pull "ghcr.io/githedgehog/dataplane/development-environment:${PROFILE}" || true + # container may not exist yet + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + with: + driver: remote + driver-opts: network=host + buildkitd-flags: '--allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host' + - name: Build sysroot + run: | + declare -rx PROFILE=debug + pushd dpdk-sys + ./gen-sysroot/gen-sysroot.sh "${PROFILE}" + - name: Build in debug container + run: | + declare -rx PROFILE=debug + docker tag "dpdk-sysroot-${PROFILE}" "ghcr.io/githedgehog/dataplane/development-environment:${PROFILE}" + docker push "ghcr.io/githedgehog/dataplane/development-environment:${PROFILE}" diff --git a/dpdk-sys-old/src/main.rs b/dpdk-sys-old/src/main.rs index 84b212987..da6711067 100644 --- a/dpdk-sys-old/src/main.rs +++ b/dpdk-sys-old/src/main.rs @@ -124,21 +124,21 @@ fn main() { "--huge-worker-stack=8192", "--socket-mem=4096,4096,4096,4096", // "-d", - // "/mnt/dpdk-arch-gen-sysroot/usr/lib/librte_mempool.so", + // "/mnt/dpdk-arch-gen-dev-env/usr/lib/librte_mempool.so", // "-d", - // "/mnt/dpdk-arch-gen-sysroot/usr/lib/librte_mempool_ring.so", + // "/mnt/dpdk-arch-gen-dev-env/usr/lib/librte_mempool_ring.so", // "-d", - // "/mnt/dpdk-arch-gen-sysroot/usr/lib/librte_mempool_stack.so", + // "/mnt/dpdk-arch-gen-dev-env/usr/lib/librte_mempool_stack.so", // "-d", - // "/mnt/dpdk-arch-gen-sysroot/usr/lib/dpdk/pmds-24.2/librte_bus_pci.so", + // "/mnt/dpdk-arch-gen-dev-env/usr/lib/dpdk/pmds-24.2/librte_bus_pci.so", // "-d", - // "/mnt/dpdk-arch-gen-sysroot/usr/lib/dpdk/pmds-24.2/librte_net_mlx5.so", + // "/mnt/dpdk-arch-gen-dev-env/usr/lib/dpdk/pmds-24.2/librte_net_mlx5.so", // "-d", - // "/mnt/dpdk-arch-gen-sysroot/usr/lib/dpdk/pmds-24.2/librte_common_mlx5.so", + // "/mnt/dpdk-arch-gen-dev-env/usr/lib/dpdk/pmds-24.2/librte_common_mlx5.so", // "-d", - // "/mnt/dpdk-arch-gen-sysroot/usr/lib/dpdk/pmds-24.2/librte_regex_mlx5.so", + // "/mnt/dpdk-arch-gen-dev-env/usr/lib/dpdk/pmds-24.2/librte_regex_mlx5.so", // "-d", - // "/mnt/dpdk-arch-gen-sysroot/usr/lib/dpdk/pmds-24.2/librte_vdpa_mlx5.so", + // "/mnt/dpdk-arch-gen-dev-env/usr/lib/dpdk/pmds-24.2/librte_vdpa_mlx5.so", ]; info!("DPDK arguments: {args:?}"); let eal = Eal::new(args); diff --git a/flake.lock b/flake.lock index 935f22637..6e2aab74f 100644 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1726871744, - "narHash": "sha256-V5LpfdHyQkUF7RfOaDPrZDP+oqz88lTJrMT1+stXNwo=", + "lastModified": 1727140925, + "narHash": "sha256-ZHSasdLwEEjSOD/WTW1o7dr3/EjuYsdwYB4NSgICZ2I=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "a1d92660c6b3b7c26fb883500a80ea9d33321be2", + "rev": "189e5f171b163feb7791a9118afa778d9a1db81f", "type": "github" }, "original": { diff --git a/nix/dev-env.nix b/nix/dev-env.nix index e69de29bb..69b8132ab 100644 --- a/nix/dev-env.nix +++ b/nix/dev-env.nix @@ -0,0 +1,153 @@ +rec { + nixpkgsFn = import <nixpkgs>; + + debugFlags = rec { + AR="llvm-ar"; + CC="clang"; + CFLAGS="-Og -ggdb3"; + CXX="clang++"; + CXXFLAGS=CFLAGS; + LD="mold"; + LDFLAGS="-fuse-ld=mold"; + NM="llvm-nm"; + RANLIB="llvm-ranlib"; + }; + + releaseFlags = rec { + AR="llvm-ar"; + CC="clang"; + CFLAGS="-O3 -ggdb3 -march=x86-64-v4 -mtune=znver4 -flto=thin -Werror=odr -Werror=strict-aliasing -fstack-protector-strong"; + CXX="clang++"; + CXXFLAGS=CFLAGS; + LD="mold"; + LDFLAGS="-fuse-ld=mold -Wl,-O3 -Wl,--gc-sections -Wl,-z,relro,-z,now"; + NM="llvm-nm"; + RANLIB="llvm-ranlib"; + }; + + buildWithFlags = flags: pkg: (pkg.overrideAttrs (orig: { + CFLAGS = "${orig.CFLAGS or ""} ${flags.CFLAGS}"; + CXXFLAGS = "${orig.CXXFLAGS or ""} ${flags.CXXFLAGS}"; + LDFLAGS = "${orig.LDFLAGS or ""} ${flags.LDFLAGS}"; + })); + + overlays = { + disableAppArmor = self: super: { libapparmor = null; }; + disableSystemd = self: super: { systemd = null; }; # git rekt + disableDoxygen = self: super: { doxygen = null; }; + useLatestLlvm = self: super: { llvmPackages = super.llvmPackages_latest; }; + rdma-core = self: super: { + rdma-core = super.rdma-core.overrideAttrs (orig: { + nativeBuildInputs = with super; [ cmake pkg-config python3 mold ]; + buildInputs = with super; [ libnl ethtool iproute2 ]; + outputs = super.lib.lists.remove "man" orig.outputs; + cmakeFlags = orig.cmakeFlags ++ [ + "-DENABLE_STATIC=1" + "-DNO_MAN_PAGES=1" + "-DNO_PY_VERBS=1" + ]; + }); + }; + + buildSomeThingsWithLLVM = self: super: let + cc = super.llvmPackages.clangUseLLVM; + stdenv = with super; overrideCC llvmPackages.stdenv cc; + buildWithLLVM = (pkg: pkg.override { inherit stdenv; }); + includeMold = (pkg: pkg.overrideAttrs (orig: { nativeBuildInputs = (orig.nativeBuildInputs or []) ++ [ super.mold ]; })); + in { + ethtool = (includeMold (buildWithFlags releaseFlags (buildWithLLVM super.ethtool))).overrideAttrs (orig: { + CFLAGS = "${orig.CFLAGS or ""} -ffat-lto-objects"; + }); + iproute2 = (includeMold (buildWithFlags releaseFlags (buildWithLLVM super.iproute2))).overrideAttrs (orig: { + CFLAGS = "${orig.CFLAGS or ""} -ffat-lto-objects"; + }); + iptables = (includeMold (buildWithFlags releaseFlags (buildWithLLVM super.iptables))).overrideAttrs (orig: { + CFLAGS = "${orig.CFLAGS or ""} -ffat-lto-objects"; + }); + libmnl = (includeMold (buildWithFlags releaseFlags (buildWithLLVM super.libmnl))).overrideAttrs (orig: { + CFLAGS = "${orig.CFLAGS or ""} -ffat-lto-objects"; + }); + libnl = includeMold (buildWithFlags releaseFlags (buildWithLLVM super.libnl)); + libnetfilter_conntrack = (includeMold (buildWithFlags releaseFlags (buildWithLLVM super.libnetfilter_conntrack))).overrideAttrs (orig: { + CFLAGS = "${orig.CFLAGS or ""} -ffat-lto-objects"; + }); + libnftnl = (includeMold (buildWithFlags releaseFlags (buildWithLLVM super.libnftnl))).overrideAttrs (orig: { + CFLAGS = "${orig.CFLAGS or ""} -ffat-lto-objects"; + }); + libpcap = (includeMold (buildWithFlags releaseFlags (buildWithLLVM super.libpcap))).overrideAttrs (orig: { + CFLAGS = "${orig.CFLAGS or ""} -ffat-lto-objects"; + }); +# numactl = (includeMold (buildWithFlags releaseFlags (buildWithLLVM super.numactl))).overrideAttrs (orig: { +## outputs = super.lib.lists.remove "man" orig.outputs; +# configurePhase = '' +# set -euxo pipefail; +# ./configure --prefix=$out --libdir=$out/lib --includedir=$out/include --enable-static --enable-shared; +# ''; +# CFLAGS = "${orig.CFLAGS or ""} -ffat-lto-objects"; +# }); + rdma-core = (buildWithFlags releaseFlags (buildWithLLVM super.rdma-core)).overrideAttrs (orig: { + CFLAGS = "${orig.CFLAGS or ""} -ffat-lto-objects"; + }); + udev = includeMold (buildWithFlags releaseFlags (buildWithLLVM super.udev)); + + dpdk = (includeMold (buildWithFlags releaseFlags (buildWithLLVM super.dpdk))).overrideAttrs (orig: rec { + outputs = super.lib.lists.remove "doc" orig.outputs; + version = "24.07"; + src = super.fetchurl { + url = "https://fast.dpdk.org/rel/dpdk-${version}.tar.xz"; + sha256 = "sha256-mUT35fJo56ybQZPizVTvbZj24dfd3JZ8d65PZhbW+70="; + }; + nativeBuildInputs = (orig.nativeBuildInputs or []) ++ [ super.llvmPackages.bintools super.numactl.dev ]; + buildInputs = (orig.buildInputs or []) ++ [ super.numactl.dev ]; + LIBRARY_PATH = "${super.numactl}/lib:${orig.LIBRARY_PATH or ""}"; +# configurePhase = '' +# cp -r ${super.numactl} numactl; +# cp -r ${super.numactl.dev} numactl.dev; +# ls numactl/lib +# CFLAGS="${orig.CFLAGS} -DRTE_HAS_LIBNUMA=1" LDFLAGS="${orig.LDFLAGS} -lnuma" meson setup build ${pkgs.lib.concatStringsSep " " mesonFlags} -Dc_args="${orig.CFLAGS} -Inumactl.dev/include" -Dc_link_args="${orig.LDFLAGS} -Lnumactl/lib" +# ''; + mesonFlags = [ + "-Dauto_features=auto" + "-Db_colorout=never" + "-Db_coverage=false" + "-Db_lto=true" + "-Db_lundef=true" + "-Db_pch=true" + "-Db_pgo=off" + "-Db_pie=true" + "-Db_sanitize=none" + "-Dbackend=ninja" + "-Ddefault_library=static" + "-Denable_docs=false" + "-Denable_driver_sdk=false" + "-Dibverbs_link=static" + "-Dmax_numa_nodes=1" + "-Dprefer_static=true" + "-Dstrip=false" + "-Dtests=false" + "-Duse_hpet=false" + "-Db_lto_mode=thin" + "-Doptimization=3" + # ''-Ddisabled_drivers=${pkgs.lib.concatStringsSep "," dpdkDrivers.disabled}'' + # ''-Denable_drivers=${pkgs.lib.concatStringsSep "," dpdkDrivers.enabled}'' + ]; +# buildPhase = '' +# cd build; +# ninja install; +# ''; + }); + + + }; + }; + + defaultOverlays = builtins.attrValues overlays; + + pkgs = (nixpkgsFn { + overlays = defaultOverlays; + }); + + rdma-core = pkgs.rdma-core; + numactl = pkgs.numactl; + +} diff --git a/runner.sh b/runner.sh index b8646c6f8..2af7570f7 100755 --- a/runner.sh +++ b/runner.sh @@ -1,11 +1,22 @@ #!/usr/bin/env bash -# This is a wrapper for cargo which sets up environment variables as needed +set -euo pipefail -PATH="$(pwd)/debug/sysroot/usr/bin:$PATH" -delcare -x PATH +declare script_dir +script_dir="$(dirname "$(readlink --canonicalize-existing "$(dirname "${BASH_SOURCE[0]}")")")" +declare -r script_dir -LD_LIBRARY_PATH="$(pwd)/debug/sysroot/usr/lib:$LD_LIBRARY_PATH" -declare -x LD_LIBRARY_PATH +declare -r project_dir="${script_dir}" -echo exec "${0}" "${@}" +exec docker run \ + --rm \ + -it \ + --privileged \ + --network=host \ + --name dataplane-runner \ + -v "${project_dir}:${project_dir}" \ + -v "/etc/passwd:/etc/passwd:ro" \ + --user "$(id -u):$(id -g)" \ + -w "${project_dir}" \ + ghcr.io/githedgehog/dataplane/development-environment:debug \ + "${@}" diff --git a/sysroot-helper/src/lib.rs b/sysroot-helper/src/lib.rs index 1df023906..7861d3924 100644 --- a/sysroot-helper/src/lib.rs +++ b/sysroot-helper/src/lib.rs @@ -21,7 +21,9 @@ pub fn get_project_root() -> String { pub fn get_sysroot() -> String { let project_root = get_project_root(); let profile_name = get_build_profile_name(); - format!("{project_root}/../sysroot/{profile_name}") + let path_components = project_root.split("/").collect::<Vec<_>>(); + let repo_root = path_components[..path_components.len() - 1].join("/"); + format!("{repo_root}/sysroot/{profile_name}") } pub fn get_lld_path() -> String {