Commit 28706f24 authored by Guillaume Girol's avatar Guillaume Girol
Browse files

python.pkgs.home-assistant-chip-core: build from source

parent 1d1c704b
Loading
Loading
Loading
Loading
+8 −10
Original line number Diff line number Diff line
{
  lib,
  buildPythonPackage,
  fetchPypi,
  home-assistant-chip-wheels,
  aenum,
  dacite,
}:

buildPythonPackage rec {
  pname = "home-assistant-chip-clusters";
  version = "2024.9.0";
  inherit (home-assistant-chip-wheels) version;
  format = "wheel";

  src = fetchPypi {
    inherit format version;
    pname = "home_assistant_chip_clusters";
    dist = "py3";
    python = "py3";
    hash = "sha256-h1umP5bgw1HByiZ0mAd6yWvGHPcvr//G5UhM/qIIkQE=";
  };
  src = home-assistant-chip-wheels;

  # format=wheel needs src to be a wheel not a folder of wheels
  preUnpack = ''
    src=($src/home_assistant_chip_clusters*.whl)
  '';

  propagatedBuildInputs = [
    aenum
@@ -38,6 +37,5 @@ buildPythonPackage rec {
    changelog = "https://github.com/home-assistant-libs/chip-wheels/releases/tag/${version}";
    license = licenses.asl20;
    maintainers = teams.home-assistant.members;
    sourceProvenance = with sourceTypes; [ binaryNativeCode ];
  };
}
+10 −50
Original line number Diff line number Diff line
{
  lib,
  stdenv,
  buildPythonPackage,
  fetchPypi,
  pythonOlder,

  # build
  autoPatchelfHook,

  # runtime
  glib,
  libnl,

  # propagates
  aenum,
  home-assistant-chip-wheels,
  coloredlogs,
  construct,
  cryptography,
  dacite,
  deprecation,
  ecdsa,
  rich,
  pyyaml,
  ipdb,
  deprecation,
  mobly,
  pygobject3,
  pyyaml,
  rich,
}:

buildPythonPackage rec {
  pname = "home-assistant-chip-core";
  version = "2024.9.0";
  inherit (home-assistant-chip-wheels) version;
  format = "wheel";

  disabled = pythonOlder "3.7";

  src =
    let
      system =
        {
          "aarch64-linux" = {
            name = "aarch64";
            hash = "sha256-oVqPaScNCjf1xY2iWJTXTh2YqimZk5kVsiQN586j9mc=";
          };
          "x86_64-linux" = {
            name = "x86_64";
            hash = "sha256-hWH2UCYIuDMFS/W4FELW57iQft0jfGPt8aFT1k59sWA=";
          };
        }
        .${stdenv.system} or (throw "Unsupported system: ${stdenv.system}");
    in
    fetchPypi {
      pname = "home_assistant_chip_core";
      inherit version format;
      dist = "cp37";
      python = "cp37";
      abi = "abi3";
      platform = "manylinux_2_31_${system.name}";
      hash = system.hash;
    };

  nativeBuildInputs = [ autoPatchelfHook ];
  src = home-assistant-chip-wheels;

  buildInputs = [
    glib
    libnl
  ];
  # format=wheel needs src to be a wheel not a folder of wheels
  preUnpack = ''
    src=($src/home_assistant_chip_core*.whl)
  '';

  propagatedBuildInputs = [
    aenum
@@ -104,10 +69,5 @@ buildPythonPackage rec {
    changelog = "https://github.com/home-assistant-libs/chip-wheels/releases/tag/${version}";
    license = licenses.asl20;
    maintainers = teams.home-assistant.members;
    platforms = [
      "aarch64-linux"
      "x86_64-linux"
    ];
    sourceProvenance = with sourceTypes; [ binaryNativeCode ];
  };
}
+289 −0
Original line number Diff line number Diff line
{
  appdirs,
  appnope,
  black,
  build,
  clang-tools,
  click,
  colorama,
  coloredlogs,
  coverage,
  cryptography,
  diskcache,
  fetchFromGitHub,
  glib,
  gn,
  googleapis-common-protos,
  google-cloud-storage,
  ipython,
  jinja2,
  json5,
  jsonschema,
  lark,
  lib,
  libnl,
  mobly,
  mypy,
  mypy-extensions,
  mypy-protobuf,
  ninja,
  openssl,
  packaging,
  parameterized,
  pip-tools,
  pkg-config,
  prompt-toolkit,
  protobuf,
  psutil,
  ptpython,
  pyelftools,
  pygments,
  pykwalify,
  pylint,
  pyperclip,
  pyserial,
  python3,
  python-daemon,
  pyyaml,
  requests,
  setuptools,
  six,
  sphinx,
  sphinx-argparse,
  sphinx-design,
  stdenv,
  stringcase,
  toml,
  tornado,
  types-protobuf,
  types-pyyaml,
  types-requests,
  types-setuptools,
  watchdog,
  websockets,
  wheel,
  yapf,
  zap-chip,
}:

stdenv.mkDerivation rec {
  pname = "home-assistant-chip-wheels";
  version = "2024.9.0";
  src = fetchFromGitHub {
    owner = "home-assistant-libs";
    repo = "chip-wheels";
    rev = version;
    fetchSubmodules = false;
    leaveDotGit = true;
    hash = "sha256-T0G6mxb/5wFOxPLL92Ay34oP+9Xvk9w0YV9VSzWJuzw=";
    postFetch = ''
      cd $out
      # Download connectedhomeip.
      git fetch
      git reset --hard HEAD
      git submodule update --init --depth 1 connectedhomeip

      # Initialize only necessary submodules.
      cd connectedhomeip
      ${python3}/bin/python3 scripts/checkout_submodules.py --platform linux --shallow

      # Keep the output deterministic.
      cd $out
      # in case python decided to leave a .pyc file, for example
      git clean -fxd
      rm -rf .git/
    '';
  };

  strictDeps = true;

  nativeBuildInputs = [
    gn
    pkg-config
    ninja
    clang-tools
    zap-chip
    # gdbus-codegen
    glib
    python3
    # dependencies of build scripts
    click
    jinja2
    lark
    setuptools
    stringcase
    build
    pip-tools
    black
    yapf
  ];

  buildInputs = [
    openssl
    glib
    libnl
  ];

  postPatch = ''
    cd connectedhomeip
    export HOME=$(mktemp -d)

    patchShebangs --build scripts

    for patch in ../*.patch; do
      patch -p1 < $patch
    done

    # unpin dependencies
    # there are many files to modify, in different formats
    sed -i 's/==.*$//' third_party/pigweed/repo/pw_env_setup/py/pw_env_setup/virtualenv_setup/python_base_requirements.txt
    sed -i 's/==[^;]*//' scripts/setup/constraints.txt
    sed -i 's/\(^ \+[a-zA-Z0-9-]*\)[=~><]=[^;]*/\1/' third_party/pigweed/repo/pw_protobuf_compiler/py/setup.cfg third_party/pigweed/repo/pw_protobuf/py/setup.cfg third_party/pigweed/repo/pw_protobuf_compiler/py/setup.cfg
    # remove a few dependencies not packaged in nixpkgs and which are apparently
    # not needed to build the python bindings of chip
    sed -i -e '/sphinxcontrib-mermaid/d' -e '/types-six/d' -e '/types-pygment/d' -e '/types-pyserial/d' third_party/pigweed/repo/*/py/setup.cfg

    # obtained by running a build in nix-shell with internet access
    cp ${./pigweed_environment.gni} build_overrides/pigweed_environment.gni

    # some code is generated by a templating tool (zap-cli)
    scripts/codepregen.py ./zzz_pregenerated/
  '';

  # the python parts of the build system work as follows
  # gn calls pigweed to read a dozen different files to generate
  # a file looking like requirements.txt. It then calls pip
  # to install this computed list of dependencies into a virtualenv.
  # Of course, pip fails in the sandbox, because it cannot download
  # the python packages.
  # The documented way of doing offline builds is to create a folder
  # with wheel files for all dependencies and point pip to it
  # via its configuration file or environment variables.
  # https://pigweed.dev/python_build.html#installing-offline
  # The wheel of a python package foo is available as foo.dist.
  # So that would be easy, but we also need wheels for transitive dependencies.
  # the function saturateDependencies below computes this transitive closure.
  #
  # yes this list of dependencies contains both build tools and proper dependencies.
  env.PIP_NO_INDEX = "1";
  env.PIP_FIND_LINKS =
    let
      dependencies = [
        appdirs
        appnope
        black
        build
        colorama
        coloredlogs
        coverage
        click
        cryptography
        diskcache
        googleapis-common-protos
        google-cloud-storage
        ipython
        jinja2
        json5
        jsonschema
        lark
        mobly
        mypy
        mypy-extensions
        mypy-protobuf
        packaging
        parameterized
        pip-tools
        prompt-toolkit
        protobuf
        psutil
        ptpython
        pyelftools
        pygments
        pykwalify
        pylint
        pyperclip
        pyserial
        python-daemon
        pyyaml
        requests
        setuptools
        six
        sphinx
        sphinx-argparse
        sphinx-design
        stringcase
        toml
        tornado
        types-protobuf
        types-pyyaml
        types-requests
        types-setuptools
        watchdog
        websockets
        wheel
        yapf
      ];
      depListToAttrs =
        list:
        builtins.listToAttrs (
          map (dep: {
            name = dep.name;
            value = dep;
          }) list
        );
      saturateDependencies =
        deps:
        let
          before = deps;
          new = lib.mergeAttrsList (
            map (dep: depListToAttrs (dep.propagatedBuildInputs or [ ])) (lib.attrValues before)
          );
          after = before // new;
        in
        if lib.attrNames before != lib.attrNames after then saturateDependencies after else before;
      saturateDependencyList = list: lib.attrValues (saturateDependencies (depListToAttrs list));
      saturatedDependencyList = lib.filter (drv: drv ? dist) (saturateDependencyList dependencies);
    in
    lib.concatMapStringsSep " " (dep: "file://${dep.dist}") saturatedDependencyList;

  gnFlags = [
    ''chip_project_config_include_dirs=["//.."]''
    ''chip_crypto="openssl"''
    ''enable_rtti=true''
    ''chip_config_memory_debug_checks=false''
    ''chip_config_memory_debug_dmalloc=false''
    ''chip_mdns="minimal"''
    ''chip_minmdns_default_policy="libnl"''
    ''chip_python_version="${lib.versions.majorMinor python3.version}"''
    ''chip_python_platform_tag="any"''
    ''chip_python_package_prefix="home-assistant-chip"''
    ''custom_toolchain="custom"''
    ''target_cc="${stdenv.cc.targetPrefix}cc"''
    ''target_cxx="${stdenv.cc.targetPrefix}c++"''
    ''target_ar="${stdenv.cc.targetPrefix}ar"''
  ];

  preBuild = ''
    export NIX_CFLAGS_COMPILE="$($PKG_CONFIG --cflags glib-2.0) -O2 -Wno-error"
    export NIX_CFLAGS_LINK="$($PKG_CONFIG --libs gio-2.0) $($PKG_CONFIG --libs gobject-2.0) $($PKG_CONFIG --libs glib-2.0)"
  '';

  ninjaFlags = [ "chip-repl" ];

  installPhase = ''
    runHook preInstall

    cp -r controller/python $out

    runHook postInstall
  '';

  meta = {
    description = "Python wheels for APIs and tools related to CHIP";
    homepage = "https://github.com/home-assistant-libs/chip-wheels";
    changelog = "https://github.com/home-assistant-libs/chip-wheels/releases/tag/${version}";
    license = lib.licenses.asl20;
    maintainers = lib.teams.home-assistant.members;
  };

}
+12 −0
Original line number Diff line number Diff line
# This file is automatically generated by Pigweed's environment setup. Do not
# edit it manually or check it in.

# Relative paths are interpreted with respect to this file, which helps
# determine the correct path even if the source root changes.
declare_args() {
  pw_env_setup_CIPD_ARM = get_path_info("../.environment/cipd/packages/arm", "abspath")
  pw_env_setup_CIPD_PIGWEED = get_path_info("../.environment/cipd/packages/pigweed", "abspath")
  pw_env_setup_CIPD_PYTHON = get_path_info("../.environment/cipd/packages/python", "abspath")
  pw_env_setup_CIPD_ZAP = get_path_info("../.environment/cipd/packages/zap", "abspath")
  pw_env_setup_VIRTUAL_ENV = get_path_info("../.environment/pigweed-venv", "abspath")
}
+2 −0
Original line number Diff line number Diff line
@@ -5782,6 +5782,8 @@ self: super: with self; {
  home-assistant-bluetooth = callPackage ../development/python-modules/home-assistant-bluetooth { };
  home-assistant-chip-wheels = callPackage ../development/python-modules/home-assistant-chip-wheels { };
  home-assistant-chip-clusters = callPackage ../development/python-modules/home-assistant-chip-clusters { };
  home-assistant-chip-core = callPackage ../development/python-modules/home-assistant-chip-core { };