From 04e0913d03efdd470f2a9054c05c6ebc53fe3e3e Mon Sep 17 00:00:00 2001 From: Amadey Vorontsov Date: Tue, 19 May 2026 15:34:30 +0000 Subject: [PATCH] Update pkg setup --- flake.lock | 61 +++++++++++ flake.nix | 60 +++++++++-- nix/ascend-toolkit-setup-hook.sh | 12 +-- nix/bisheng-wrapper-setup-hook.sh | 16 +++ pack/pack_ascend_toolkit.sh | 162 ------------------------------ 5 files changed, 130 insertions(+), 181 deletions(-) create mode 100644 flake.lock create mode 100644 nix/bisheng-wrapper-setup-hook.sh delete mode 100755 pack/pack_ascend_toolkit.sh diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..032fb8b --- /dev/null +++ b/flake.lock @@ -0,0 +1,61 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1751274312, + "narHash": "sha256-/bVBlRpECLVzjV19t5KMdMFWSwKLtb5RyXdjz3LJT+g=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "50ab793786d9de88ee30ec4e4c24fb4236fc2674", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-24.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix index 7a95606..2ece91b 100644 --- a/flake.nix +++ b/flake.nix @@ -1,5 +1,5 @@ { - description = "Ascend CANN Toolkit Nix package"; + description = "Ascend CANN: ascend-toolkit (CANN env), bisheng-wrapper (Nix bisheng; needs ASCEND_TOOLKIT_HOME), ascend-cann (both)"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.11"; @@ -10,6 +10,23 @@ flake-utils.lib.eachDefaultSystem (system: let pkgs = import nixpkgs { inherit system; }; + lib = pkgs.lib; + + bishengNixCflags = + let + gccCc = pkgs.gcc13.cc; + cxxDev = lib.getDev gccCc; + ccVersion = gccCc.version; + host = pkgs.stdenv.hostPlatform.config; + in + builtins.concatStringsSep " " [ + "-isystem ${cxxDev}/include/c++/${ccVersion}" + "-isystem ${cxxDev}/include/c++/${ccVersion}/${host}" + "-isystem ${gccCc}/lib/gcc/${host}/${ccVersion}/include" + "-isystem ${pkgs.glibc.dev}/include" + ]; + + bishengNixCflagsFile = pkgs.writeText "bisheng-nix-cflags" bishengNixCflags; fetchAscendToolkit = pkgs.fetchurl { url = "https://git.amadey.xyz/api/packages/mozart/generic/ascend-toolkit/8.5.0/ascend-toolkit-8.5.0-310p-full.tar.gz"; @@ -52,6 +69,8 @@ find $out/tools -type f \( -name "*.py" -o -name "*.sh" \) -exec chmod +x {} + 2>/dev/null || true ''; + setupHook = ./nix/ascend-toolkit-setup-hook.sh; + postFixup = '' echo "Adding RPATH for toolkit-internal libraries..." local rpath="$out/lib64:$out/devlib:$out/tools/aml/lib64" @@ -72,13 +91,11 @@ if [ -f "$bisheng_config" ]; then cp ${./nix/bisheng_config_patched.cmake} "$bisheng_config" fi - ''; - passthru = { - setupHook = pkgs.makeSetupHook - { name = "ascend-toolkit-setup-hook.sh"; } - ./nix/ascend-toolkit-setup-hook.sh; - }; + if [ -f "$out/nix-support/setup-hook" ]; then + substituteInPlace "$out/nix-support/setup-hook" --subst-var-by ASCEND_TOOLKIT "$out" + fi + ''; }; bisheng-wrapper = pkgs.stdenv.mkDerivation { @@ -107,17 +124,42 @@ EOF touch $out/nix-support/add-local-cc-cflags-before.sh + + cp ${bishengNixCflagsFile} $out/nix-support/bisheng-nix-cflags + cp ${./nix/bisheng-wrapper-setup-hook.sh} $out/nix-support/setup-hook + substituteInPlace $out/nix-support/setup-hook \ + --subst-var-by WRAPPER_OUT "$out" ''; meta = with pkgs.lib; { - description = "Wrapper for Huawei Bisheng compiler that injects Nix compilation flags"; + description = "Bisheng wrapper with Nix CFLAGS; set ASCEND_TOOLKIT_HOME to your CANN toolkit (use with ascend-toolkit or any upstream install)"; + license = licenses.mit; + }; + }; + + # Single dependency for dev shells: propagates toolkit + bisheng-wrapper (hooks run in list order). + ascend-cann = pkgs.stdenvNoCC.mkDerivation { + pname = "ascend-cann"; + version = ascend-toolkit.version; + + dontUnpack = true; + + installPhase = "mkdir -p $out"; + + propagatedBuildInputs = [ + ascend-toolkit + bisheng-wrapper + ]; + + meta = with pkgs.lib; { + description = "Meta package: CANN toolkit + Bisheng Nix wrapper (add only this, or use ascend-toolkit / bisheng-wrapper separately)"; license = licenses.mit; }; }; in { packages = { - inherit ascend-toolkit bisheng-wrapper; + inherit ascend-toolkit bisheng-wrapper ascend-cann; default = ascend-toolkit; }; } diff --git a/nix/ascend-toolkit-setup-hook.sh b/nix/ascend-toolkit-setup-hook.sh index 64679d3..3da08ca 100644 --- a/nix/ascend-toolkit-setup-hook.sh +++ b/nix/ascend-toolkit-setup-hook.sh @@ -1,16 +1,13 @@ -# Setup hook for ascend-toolkit -# This is sourced when ascend-toolkit is in buildInputs of another derivation +# Setup hook for ascend-toolkit (sourced when package is in buildInputs) addAscendEnv() { local toolkit="${1:?ascend-toolkit path required}" - # Core environment variables export ASCEND_TOOLKIT_HOME="${toolkit}" export ASCEND_HOME_PATH="${toolkit}" export ASCEND_OPP_PATH="${toolkit}/opp" export ASCEND_AICPU_PATH="${toolkit}" export TOOLCHAIN_HOME="${toolkit}/toolkit" - # PATH addToSearchPath PATH "${toolkit}/bin" addToSearchPath PATH "${toolkit}/tools/ccec_compiler/bin" addToSearchPath PATH "${toolkit}/tools/profiler/bin" @@ -18,7 +15,6 @@ addAscendEnv() { addToSearchPath PATH "${toolkit}/tools/show_kernel_debug_data" addToSearchPath PATH "${toolkit}/tools/msobjdump" - # LD_LIBRARY_PATH addToSearchPath LD_LIBRARY_PATH "${toolkit}/lib64" addToSearchPath LD_LIBRARY_PATH "${toolkit}/lib64/plugin/opskernel" addToSearchPath LD_LIBRARY_PATH "${toolkit}/lib64/plugin/nnengine" @@ -27,15 +23,11 @@ addAscendEnv() { addToSearchPath LD_LIBRARY_PATH "${toolkit}/tools/aml/lib64/plugin" addToSearchPath LD_LIBRARY_PATH "${toolkit}/devlib" - # PYTHONPATH addToSearchPath PYTHONPATH "${toolkit}/python/site-packages" addToSearchPath PYTHONPATH "${toolkit}/opp/built-in/op_impl/ai_core/tbe" - # CMAKE_PREFIX_PATH addToSearchPath CMAKE_PREFIX_PATH "${toolkit}/lib64/cmake" addToSearchPath CMAKE_PREFIX_PATH "${toolkit}/toolkit/tools/tikicpulib/lib/cmake" } -if [ -n "${ascend-toolkit:-}" ]; then - addAscendEnv "${ascend-toolkit}" -fi +addAscendEnv "@ASCEND_TOOLKIT@" diff --git a/nix/bisheng-wrapper-setup-hook.sh b/nix/bisheng-wrapper-setup-hook.sh new file mode 100644 index 0000000..7b5a864 --- /dev/null +++ b/nix/bisheng-wrapper-setup-hook.sh @@ -0,0 +1,16 @@ +# Setup hook for bisheng-wrapper (source when package is in buildInputs). +# Use alone when ASCEND_TOOLKIT_HOME already points at a CANN install (Nix or not). +addToSearchPath PATH "@WRAPPER_OUT@/bin" + +if [ -n "${ASCEND_TOOLKIT_HOME:-}" ]; then + _ascend_arch_linux="$(uname -m)-linux" + export BISHENG_REAL="${ASCEND_TOOLKIT_HOME}/${_ascend_arch_linux}/ccec_compiler/bin/bisheng" +fi + +export CMAKE_C_COMPILER="@WRAPPER_OUT@/bin/bisheng" +export CMAKE_CXX_COMPILER="@WRAPPER_OUT@/bin/bisheng" + +if [ -f "@WRAPPER_OUT@/nix-support/bisheng-nix-cflags" ]; then + export NIX_CFLAGS_COMPILE_bisheng="$(cat "@WRAPPER_OUT@/nix-support/bisheng-nix-cflags")" + export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE_bisheng" +fi diff --git a/pack/pack_ascend_toolkit.sh b/pack/pack_ascend_toolkit.sh deleted file mode 100755 index a003702..0000000 --- a/pack/pack_ascend_toolkit.sh +++ /dev/null @@ -1,162 +0,0 @@ -#!/usr/bin/env bash -# -# pack_ascend_toolkit.sh — создаёт два tar.gz архива из собранного ascend-toolkit: -# -# 1. ascend-toolkit-8.5.0-full.tar.gz — полный архив (все файлы) -# 2. ascend-toolkit-8.5.0-minimal.tar.gz — минимальный набор для режима sim -# -# Использование: -# ./pack_ascend_toolkit.sh [path_to_result_dir] -# -# Если аргумент не указан, используется ./result - -set -euo pipefail - -RESULT_DIR="${1:-$(cd "$(dirname "$0")" && ls -d result 2>/dev/null || echo result)}" -VERSION="8.5.0" -OUTPUT_DIR="${2:-$(dirname "$0")}" - -if [ ! -d "$RESULT_DIR" ]; then - echo "[ERROR] Directory not found: $RESULT_DIR" - exit 1 -fi - -cd "$RESULT_DIR" - -# ============================================================================= -# 1. Полный архив — всё содержимое -# ============================================================================= -echo "=== Creating FULL archive ===" -FULL_ARCHIVE="${OUTPUT_DIR}/ascend-toolkit-${VERSION}-full.tar.gz" -tar czf "$FULL_ARCHIVE" . -FULL_SIZE=$(wc -c < "$FULL_ARCHIVE" | numfmt --to=iec-i --suffix=B) -echo " FULL archive: $FULL_ARCHIVE ($FULL_SIZE)" - -# ============================================================================= -# 2. Минимальный архив — только файлы для режима sim -# ============================================================================= -echo "=== Creating MINIMAL archive (sim mode) ===" - -# Создаём временную директорию с минимальным набором -MINIMAL_DIR=$(mktemp -d) -trap "rm -rf $MINIMAL_DIR" EXIT - -# Копируем только нужные для sim-режима файлы/директории -# -# Структура основана на том, что реально используется при -# bash run.sh -r sim -v Ascend310P3 -# -# Основные потребители: -# - cmake/npu_lib.cmake → compiler/tikcpp/ascendc_kernel_cmake -# - bisheng компиляция → tools/bisheng_compiler -# - cce линковка → tools/ccec_compiler (через x86_64-linux/ccec_compiler symlink) -# - симулятор → tools/simulator/Ascend310P3/lib -# - заголовки → include -# - библиотеки → lib64, devlib -# - OPP данные → opp/built-in (нужны для op_impl) -# - Python bindings → python/site-packages -# - Runtime → runtime -# - Toolkit → toolkit -# - Конфигурации → conf, compat -# - set_env.sh — корень -# ============================================================================= - -echo " Copying essential files..." - -# Корневые файлы -mkdir -p "$MINIMAL_DIR" -cp -a set_env.sh "$MINIMAL_DIR/" 2>/dev/null || true - -# bin — содержит setenv.bash symlink + ключевые утилиты -mkdir -p "$MINIMAL_DIR/bin" -cp -a bin/* "$MINIMAL_DIR/bin/" 2>/dev/null || true - -# compiler — tikcpp cmake модули -mkdir -p "$MINIMAL_DIR/compiler" -cp -a compiler/tikcpp "$MINIMAL_DIR/compiler/" 2>/dev/null || true - -# compat -mkdir -p "$MINIMAL_DIR/compat" -cp -a compat/* "$MINIMAL_DIR/compat/" 2>/dev/null || true - -# conf -mkdir -p "$MINIMAL_DIR/conf" -cp -a conf/* "$MINIMAL_DIR/conf/" 2>/dev/null || true - -# devlib — stub библиотеки для разработки -mkdir -p "$MINIMAL_DIR/devlib" -cp -a devlib/* "$MINIMAL_DIR/devlib/" 2>/dev/null || true - -# fwkacllib — framework ACL библиотеки -mkdir -p "$MINIMAL_DIR/fwkacllib" -cp -a fwkacllib/* "$MINIMAL_DIR/fwkacllib/" 2>/dev/null || true - -# include — все заголовочные файлы (критично для компиляции) -mkdir -p "$MINIMAL_DIR/include" -cp -a include/* "$MINIMAL_DIR/include/" 2>/dev/null || true - -# lib64 — основные библиотеки -mkdir -p "$MINIMAL_DIR/lib64" -cp -a lib64/* "$MINIMAL_DIR/lib64/" 2>/dev/null || true - -# pkg_inc -mkdir -p "$MINIMAL_DIR/pkg_inc" -cp -a pkg_inc/* "$MINIMAL_DIR/pkg_inc/" 2>/dev/null || true - -# python -mkdir -p "$MINIMAL_DIR/python" -cp -a python/* "$MINIMAL_DIR/python/" 2>/dev/null || true - -# runtime -mkdir -p "$MINIMAL_DIR/runtime" -cp -a runtime/* "$MINIMAL_DIR/runtime/" 2>/dev/null || true - -# toolkit -mkdir -p "$MINIMAL_DIR/toolkit" -cp -a toolkit/* "$MINIMAL_DIR/toolkit/" 2>/dev/null || true - -# x86_64-linux — содержит архитектурно-зависимые файлы (symlinks на реальные директории) -mkdir -p "$MINIMAL_DIR/x86_64-linux" -cp -a x86_64-linux/* "$MINIMAL_DIR/x86_64-linux/" 2>/dev/null || true - -# tools — выборочно: -# - bisheng_compiler — основной AscendC компилятор -# - ccec_compiler — linker для AI Core -# - simulator — библиотека симулятора для sim режима -# - tikcpp — tikcpp файлы -# - aml — используется в LD_LIBRARY_PATH -# - profiler — может использоваться -# - ascendc_tools — ascendc инструменты -mkdir -p "$MINIMAL_DIR/tools" -cp -a tools/bisheng_compiler "$MINIMAL_DIR/tools/" 2>/dev/null || true -cp -a tools/ccec_compiler "$MINIMAL_DIR/tools/" 2>/dev/null || true -cp -a tools/simulator "$MINIMAL_DIR/tools/" 2>/dev/null || true -cp -a tools/tikcpp "$MINIMAL_DIR/tools/" 2>/dev/null || true -cp -a tools/aml "$MINIMAL_DIR/tools/" 2>/dev/null || true -cp -a tools/profiler "$MINIMAL_DIR/tools/" 2>/dev/null || true -cp -a tools/ascendc_tools "$MINIMAL_DIR/tools/" 2>/dev/null || true - -# opp — operator packages -# Для sim режима нужны op_impl (tiling и kernel реализации) -mkdir -p "$MINIMAL_DIR/opp" -cp -a opp/built-in "$MINIMAL_DIR/opp/" 2>/dev/null || true -cp -a opp/include "$MINIMAL_DIR/opp/" 2>/dev/null || true -cp -a opp/lib64 "$MINIMAL_DIR/opp/" 2>/dev/null || true - -echo " Compressing..." -MINIMAL_ARCHIVE="${OUTPUT_DIR}/ascend-toolkit-${VERSION}-minimal.tar.gz" -tar czf "$MINIMAL_ARCHIVE" -C "$MINIMAL_DIR" . - -MINIMAL_SIZE=$(wc -c < "$MINIMAL_ARCHIVE" | numfmt --to=iec-i --suffix=B) -echo " MINIMAL archive: $MINIMAL_ARCHIVE ($MINIMAL_SIZE)" - -# ============================================================================= -# Итог -# ============================================================================= -echo "" -echo "=== Summary ===" -echo " FULL archive: $FULL_SIZE" -echo " MINIMAL archive: $MINIMAL_SIZE" -echo "" -echo "Upload these files to your Gitea instance." -echo "Then update flake.nix to use fetchurl instead of local path."