Trying to build a Zephyr RTOS project for their native_posix target errors with incompatible libasan.so

Needed a multiarch GCC, which gnat isn’t (of course, it’s GCC Native!).

# Basic configuration for Zephyr development.
{ pkgs ? import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/refs/tags/23.05.tar.gz") { } }:
let
  pp = pkgs.python3.pkgs;
  imgtool = pp.buildPythonPackage rec {
    version = "1.10.0";
    pname = "imgtool";

    src = pp.fetchPypi {
      inherit pname version;
      sha256 = "sha256-A7NOdZNKw9lufEK2vK8Rzq9PRT98bybBfXJr0YMQS0A=";
    };

    propagatedBuildInputs = with pp; [
      cbor2
      click
      intelhex
      cryptography
    ];
    doCheck = false;
    pythonImportsCheck = [
      "imgtool"
    ];
  };

  python-packages = pkgs.python3.withPackages (p: with p; [
    autopep8
    pyelftools
    pyyaml
    pykwalify
    canopen
    packaging
    progress
    psutil
    anytree
    intelhex
    west
    imgtool

    cryptography
    intelhex
    click
    cbor2

    # For mcuboot CI
    toml

    # For twister
    tabulate
    ply

    # For TFM
    pyasn1
    graphviz
    jinja2

    requests
    beautifulsoup4

    # These are here because pip stupidly keeps trying to install
    # these in /nix/store.
    wcwidth
    sortedcontainers
  ]);

  # Build the Zephyr SDK as a nix package.
  new-zephyr-sdk-pkg =
    { stdenv
    , fetchurl
    , which
    , python38
    , wget
    , file
    , cmake
    , libusb
    , autoPatchelfHook
    }:
    let
      version = "0.15.0";
      arch = "arm";
      sdk = fetchurl {
        url = "https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v${version}/zephyr-sdk-${version}_linux-x86_64_minimal.tar.gz";
        hash = "sha256-dn+7HVBtvDs2EyXSLMb12Q+Q26+x6HYyPP69QdLKka8=";
      };
      armToolchain = fetchurl {
        url = "https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v${version}/toolchain_linux-x86_64_arm-zephyr-eabi.tar.gz";
        hash = "sha256-B7YIZEyuqE+XNI7IWnN6WiC1k9UdFEt4YN4Yr7Vn3Po=";
      };
      x86_64Toolchain = fetchurl {
        url = "https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v${version}/toolchain_linux-x86_64_x86_64-zephyr-elf.tar.gz";
        hash = "sha256-9PoILowiS8wgfB/vdrpJUostIMyS62jjd21nRzWBQ/k=";
      };
    in
    stdenv.mkDerivation {
      name = "zephyr-sdk";
      inherit version;
      srcs = [ sdk armToolchain x86_64Toolchain ];
      srcRoot = ".";
      nativeBuildInputs = [
        which
        wget
        file
        python38
        autoPatchelfHook
        cmake
        libusb
      ];
      phases = [ "installPhase" "fixupPhase" ];
      installPhase = ''
        runHook preInstall
        echo out=$out
        mkdir -p $out
        set $srcs
        tar -xf $1 -C $out --strip-components=1
        tar -xf $2 -C $out
        tar -xf $3 -C $out
        (cd $out; bash ./setup.sh -h)
        rm $out/zephyr-sdk-x86_64-hosttools-standalone-0.9.sh
        runHook postInstall
      '';
    };
  zephyr-sdk = pkgs.callPackage new-zephyr-sdk-pkg { };

  packages = with pkgs; [
    # Tools for building the languages we are using
    llvmPackages_16.clang-unwrapped # Newer than base clang, includes clang-format options Zephyr uses
    gcc_multi
    glibc_multi

    # Dependencies of the Zephyr build system.
    (python-packages)
    cmake
    ninja
    gperf
    python3
    ccache
    dtc
    gmp.dev

    zephyr-sdk
  ];
in
pkgs.mkShell {
  nativeBuildInputs = [ packages ];

  # For Zephyr work, we need to initialize some environment variables,
  # and then invoke the zephyr setup script.
  shellHook = ''
    export ZEPHYR_SDK_INSTALL_DIR=${zephyr-sdk}
    export PATH=$PATH:${zephyr-sdk}/arm-zephyr-eabi/bin
    unset CFLAGS
    unset LDFLAGS
    source ./workspace/zephyr/zephyr-env.sh
  '';
}

works.

1 Like