Files
akvorado/flake.nix
Vincent Bernat af19f6de39 build: don't use fetchurl to get IANA service names for Nix
As the file may change, even the latest tagged version of flake.nix
won't work to build Akvorado. Instead, rely on an unofficial Git
repository.

Fix #2043
2025-10-25 15:19:42 +02:00

162 lines
5.6 KiB
Nix

{
inputs = {
nixpkgs.url = "nixpkgs";
flake-utils.url = "github:numtide/flake-utils";
asn2org = {
url = "github:vincentbernat/asn2org/gh-pages";
flake = false;
};
iana-assignments = {
url = "github:larseggert/iana-assignments";
flake = false;
};
};
outputs = { self, nixpkgs, flake-utils, asn2org, iana-assignments }:
flake-utils.lib.eachDefaultSystem (system:
let
pkgs = import nixpkgs {
inherit system;
};
l = builtins // pkgs.lib;
nodejs = pkgs.nodejs_20;
pnpm = pkgs.pnpm_10;
go = pkgs.go_latest;
frontend = pkgs.stdenvNoCC.mkDerivation rec {
name = "akvorado-frontend";
src = ./console/frontend;
nativeBuildInputs = [
nodejs
pnpm.configHook
];
pnpmDeps = pnpm.fetchDeps {
inherit src;
pname = name;
buildInputs = [ nodejs ];
fetcherVersion = 2;
hash = l.readFile ./nix/npmDepsHash.txt;
};
buildPhase = ''
pnpm run build
'';
installPhase = ''
mkdir $out
cp -r node_modules $out/node_modules
cp -r ../data/frontend $out/data
'';
};
ianaServiceNames = pkgs.runCommand "service-names-port-numbers.csv" {} ''
> $out echo name,port,protocol
>> $out \
${pkgs.xmlstarlet}/bin/xmlstarlet sel -t -m "_:registry/_:record[_:name and _:number]" \
-v _:name -o , \
-v _:number -o , \
-v _:protocol -o , -n \
${iana-assignments}/service-names-port-numbers/service-names-port-numbers.xml
'';
backend = pkgs.buildGoModule.override { inherit go; } {
doCheck = false;
name = "akvorado";
src = ./.;
vendorHash = l.readFile ./nix/vendorHash.txt;
proxyVendor = true; # generated code may contain additional dependencies
nativeBuildInputs = [ pkgs.zip ];
buildPhase = ''
cp -r ${frontend}/node_modules console/frontend/node_modules
cp -r ${frontend}/data console/data/frontend
touch .fmt-js~ .fmt.go~ .lint-js~ .lint-go~
find . -print0 | xargs -0 touch -d @0
export XDG_CACHE_HOME=$TMPDIR
make all \
BUF=${pkgs.buf}/bin/buf \
ASNS_URL=${asn2org}/asns.csv \
SERVICES_URL=${ianaServiceNames}
'';
installPhase = ''
mkdir -p $out/bin
cp bin/akvorado $out/bin/.
'';
};
in
rec {
apps = l.attrsets.mapAttrs
(name: value:
let
script = pkgs.writeShellScriptBin name value;
in
{
type = "app";
program = "${script}/bin/${name}";
})
rec {
# Update various hashes
update-vendorHash = ''
sha256=$(2>&1 nix build --no-link .#backend.goModules \
| ${pkgs.gnused}/bin/sed -nE "s/\s+got:\s+(sha256-.*)/\1/p")
[[ -z "$sha256" ]] || echo $sha256 > nix/vendorHash.txt
'';
update-npmDepsHash = ''
oldSha256=$(cat nix/npmDepsHash.txt)
echo sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= > nix/npmDepsHash.txt
sha256=$(2>&1 nix build --no-link .#frontend.pnpmDeps \
| ${pkgs.gnused}/bin/sed -nE "s/\s+got:\s+(sha256-.*)/\1/p")
[[ -z "$sha256" ]] && echo $oldSha256 || echo $sha256 > nix/npmDepsHash.txt
'';
update = ''
${update-vendorHash}
${update-npmDepsHash}
'';
# Run nix build depending on TARGETPLATFORM value (for Docker).
build = ''
case $TARGETPLATFORM in
linux/amd64/v*) target=packages.x86_64-linux.backend-amd64v''${TARGETPLATFORM##*/v} ;;
linux/amd64*) target=packages.x86_64-linux.backend ;;
linux/arm64/v*) target=packages.aarch64-linux.backend-arm64v''${TARGETPLATFORM##*/v}_0 ;;
linux/arm64*) target=packages.aarch64-linux.backend ;;
*)
>&2 echo "Unknown target platform $TARGETPLATFORM"
exit 1
;;
esac
nix build --print-build-logs ".#$target"
'';
};
packages = {
inherit backend frontend;
default = backend;
} // (l.optionalAttrs (system == "x86_64-linux")
(l.attrsets.listToAttrs (l.lists.map
(v: {
name = "backend-amd64${v}";
value = backend.overrideAttrs (old: { env.GOAMD64 = v; });
})
# See https://go.dev/wiki/MinimumRequirements#amd64
[ "v1" "v2" "v3" "v4" ])))
// (l.optionalAttrs (system == "aarch64-linux")
(l.attrsets.listToAttrs (l.lists.map
(v: {
name = "backend-arm64${l.strings.replaceStrings ["."] ["_"] v}";
value = backend.overrideAttrs (old: { env.GOARM64 = v; });
})
# See https://go.dev/wiki/MinimumRequirements#arm64
((l.lists.map (m: "v8.${l.toString m}") (l.lists.range 0 9)) ++
(l.lists.map (m: "v9.${l.toString m}") (l.lists.range 0 5))))));
# Activate with "nix develop"
devShells.default = pkgs.mkShell {
name = "akvorado-dev";
nativeBuildInputs = [
go
nodejs
pkgs.git
pkgs.curl
pkgs.zip
];
};
});
}