From 0130cdcba46b676ab265db23075f5fef084903c0 Mon Sep 17 00:00:00 2001 From: h7x4 Date: Wed, 12 Jun 2024 17:38:32 +0200 Subject: [PATCH 1/6] segger-jlink: add `updateScript` --- pkgs/by-name/se/segger-jlink/package.nix | 24 ++----- pkgs/by-name/se/segger-jlink/source.nix | 19 ++++++ pkgs/by-name/se/segger-jlink/update.py | 87 ++++++++++++++++++++++++ 3 files changed, 111 insertions(+), 19 deletions(-) create mode 100644 pkgs/by-name/se/segger-jlink/source.nix create mode 100755 pkgs/by-name/se/segger-jlink/update.py diff --git a/pkgs/by-name/se/segger-jlink/package.nix b/pkgs/by-name/se/segger-jlink/package.nix index d7b2e0cfcaeb..7af48bf2e6d9 100755 --- a/pkgs/by-name/se/segger-jlink/package.nix +++ b/pkgs/by-name/se/segger-jlink/package.nix @@ -12,28 +12,12 @@ }: let - supported = { - x86_64-linux = { - name = "x86_64"; - hash = "sha256-UsDP+wMS7ZeWMQBObwv5RxbwuWU8nLnHes7LEXK6imE="; - }; - i686-linux = { - name = "i386"; - hash = "sha256-InNHXWAc6QZEWyEcTTUCRMDsKd0RtR8d7O0clWKuFo8="; - }; - aarch64-linux = { - name = "arm64"; - hash = "sha256-ueIGdqfuIRCuEwaPkgZMgghO9DU11IboLLMryg/mxQ8="; - }; - armv7l-linux = { - name = "arm"; - hash = "sha256-6nTQGQpkbqQntheQqiUAdVS4rp30nl2KRUn5Adsfeoo="; - }; - }; + source = import ./source.nix; + supported = removeAttrs source ["version"]; platform = supported.${stdenv.system} or (throw "unsupported platform ${stdenv.system}"); - version = "796b"; + inherit (source) version; url = "https://www.segger.com/downloads/jlink/JLink_Linux_V${version}_${platform.name}.tgz"; @@ -218,6 +202,8 @@ in stdenv.mkDerivation { runHook postInstall ''; + passthru.updateScript = ./update.py; + meta = with lib; { description = "J-Link Software and Documentation pack"; homepage = "https://www.segger.com/downloads/jlink/#J-LinkSoftwareAndDocumentationPack"; diff --git a/pkgs/by-name/se/segger-jlink/source.nix b/pkgs/by-name/se/segger-jlink/source.nix new file mode 100644 index 000000000000..fef64e688351 --- /dev/null +++ b/pkgs/by-name/se/segger-jlink/source.nix @@ -0,0 +1,19 @@ +{ + version = "796b"; + x86_64-linux = { + name = "x86_64"; + hash = "sha256-UsDP+wMS7ZeWMQBObwv5RxbwuWU8nLnHes7LEXK6imE="; + }; + i686-linux = { + name = "i386"; + hash = "sha256-InNHXWAc6QZEWyEcTTUCRMDsKd0RtR8d7O0clWKuFo8="; + }; + aarch64-linux = { + name = "arm64"; + hash = "sha256-ueIGdqfuIRCuEwaPkgZMgghO9DU11IboLLMryg/mxQ8="; + }; + armv7l-linux = { + name = "arm"; + hash = "sha256-6nTQGQpkbqQntheQqiUAdVS4rp30nl2KRUn5Adsfeoo="; + }; +} diff --git a/pkgs/by-name/se/segger-jlink/update.py b/pkgs/by-name/se/segger-jlink/update.py new file mode 100755 index 000000000000..73e5e274ab69 --- /dev/null +++ b/pkgs/by-name/se/segger-jlink/update.py @@ -0,0 +1,87 @@ +#! /usr/bin/env nix-shell +#! nix-shell -i python3 -p python3 python3Packages.beautifulsoup4 python3Packages.requests + +import requests +import subprocess + +from bs4 import BeautifulSoup +from pathlib import Path +from tempfile import NamedTemporaryFile +from textwrap import indent, dedent + + +ARCH_MAP = { + 'x86_64-linux': 'x86_64', + 'i686-linux': 'i386', + 'aarch64-linux': 'arm64', + 'armv7l-linux': 'arm', +} + + +def find_latest_jlink_version() -> str: + try: + response = requests.get('https://www.segger.com/downloads/jlink/') + response.raise_for_status() + except requests.RequestException as e: + raise RuntimeError(f"Error fetching J-Link version: {e}") + + soup = BeautifulSoup(response.text, 'html.parser') + + jlink_download_tile = soup.find(lambda tag: tag.name == 'tbody' and "J-Link Software and Documentation pack" in tag.text) + version_select = jlink_download_tile.find('select') + version = next(o.text for o in version_select.find_all('option')) + + if version is None: + raise RuntimeError("Could not find the J-Link version on the download page.") + + return version.removeprefix('V').replace('.', '') + + +def nar_hash(url: str) -> str: + try: + response = requests.post(url, data={'accept_license_agreement': 'accepted'}) + response.raise_for_status() + except requests.RequestException as e: + raise RuntimeError(f"Error downloading file from {url}: {e}") + + with NamedTemporaryFile() as tmpfile: + tmpfile.write(response.content) + tmpfile.flush() + output = subprocess.check_output([ + "nix", + "--extra-experimental-features", "nix-command", + "hash", "file", "--sri", tmpfile.name + ]).decode("utf8") + + return output.strip() + + +def calculate_package_hashes(version: str) -> list[tuple[str, str, str]]: + result = [] + for (arch_nix, arch_web) in ARCH_MAP.items(): + url = f"https://www.segger.com/downloads/jlink/JLink_Linux_V{version}_{arch_web}.tgz"; + nhash = nar_hash(url) + result.append((arch_nix, arch_web, nhash)) + return result + + +def update_source(version: str, package_hashes: list[tuple[str, str, str]]): + content = f'version = "{version}";\n' + for arch_nix, arch_web, nhash in package_hashes: + content += dedent(f''' + {arch_nix} = {{ + name = "{arch_web}"; + hash = "{nhash}"; + }};''').strip() + '\n' + + content = '{\n' + indent(content, ' ') + '}\n' + + with open(Path(__file__).parent / 'source.nix', 'w') as file: + file.write(content) + + +if __name__ == '__main__': + version = find_latest_jlink_version() + package_hashes = calculate_package_hashes(version) + update_source(version, package_hashes) + From 96a36465896c176f3d6fc94abb290dccd5b540fd Mon Sep 17 00:00:00 2001 From: h7x4 Date: Wed, 12 Jun 2024 17:39:39 +0200 Subject: [PATCH 2/6] segger-jlink: 796b -> 796k --- pkgs/by-name/se/segger-jlink/source.nix | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pkgs/by-name/se/segger-jlink/source.nix b/pkgs/by-name/se/segger-jlink/source.nix index fef64e688351..89517ffb0073 100644 --- a/pkgs/by-name/se/segger-jlink/source.nix +++ b/pkgs/by-name/se/segger-jlink/source.nix @@ -1,19 +1,19 @@ { - version = "796b"; + version = "796k"; x86_64-linux = { name = "x86_64"; - hash = "sha256-UsDP+wMS7ZeWMQBObwv5RxbwuWU8nLnHes7LEXK6imE="; + hash = "sha256-GDmdKjMD9nJLPl4Qaxgrb5+b9CsUdyNqNak1JG4ERjo="; }; i686-linux = { name = "i386"; - hash = "sha256-InNHXWAc6QZEWyEcTTUCRMDsKd0RtR8d7O0clWKuFo8="; + hash = "sha256-8j2UkPtDyIA+mfXl4jIVp89CpGA+T4eU5IQ0GwROgwU="; }; aarch64-linux = { name = "arm64"; - hash = "sha256-ueIGdqfuIRCuEwaPkgZMgghO9DU11IboLLMryg/mxQ8="; + hash = "sha256-FIzg7vAPlhnjuKEm5uGa7a37srp1U0e4eqlG9C6q26s="; }; armv7l-linux = { name = "arm"; - hash = "sha256-6nTQGQpkbqQntheQqiUAdVS4rp30nl2KRUn5Adsfeoo="; + hash = "sha256-NceqkV54QVXEJr4pJ3nvY3zxSYb9Er0uQWQ4vaojkv8="; }; } From 66fc9e60cf2bba5be74e1a4dc0a5c2d196a9a001 Mon Sep 17 00:00:00 2001 From: h7x4 Date: Wed, 12 Jun 2024 17:38:33 +0200 Subject: [PATCH 3/6] segger-jlink: add `headless` variant --- pkgs/by-name/se/segger-jlink/package.nix | 93 +++++++++++++----------- pkgs/top-level/all-packages.nix | 2 + 2 files changed, 52 insertions(+), 43 deletions(-) mode change 100755 => 100644 pkgs/by-name/se/segger-jlink/package.nix diff --git a/pkgs/by-name/se/segger-jlink/package.nix b/pkgs/by-name/se/segger-jlink/package.nix old mode 100755 new mode 100644 index 7af48bf2e6d9..d3bd7a5123b1 --- a/pkgs/by-name/se/segger-jlink/package.nix +++ b/pkgs/by-name/se/segger-jlink/package.nix @@ -5,6 +5,7 @@ , udev , config , acceptLicense ? config.segger-jlink.acceptLicense or false +, headless ? false , fontconfig , xorg , makeDesktopItem @@ -120,10 +121,11 @@ in stdenv.mkDerivation { nativeBuildInputs = [ autoPatchelfHook + ] ++ lib.optionals (!headless) [ copyDesktopItems ]; - buildInputs = [ + buildInputs = lib.optionals (!headless) [ qt4-bundled ]; @@ -135,55 +137,60 @@ in stdenv.mkDerivation { dontConfigure = true; dontBuild = true; - desktopItems = map (entry: - (makeDesktopItem { - name = entry; - exec = entry; - icon = "applications-utilities"; - desktopName = entry; - genericName = "SEGGER ${entry}"; - categories = [ "Development" ]; - type = "Application"; - terminal = false; - startupNotify = false; - }) - ) [ - "JFlash" - "JFlashLite" - "JFlashSPI" - "JLinkConfig" - "JLinkGDBServer" - "JLinkLicenseManager" - "JLinkRTTViewer" - "JLinkRegistration" - "JLinkRemoteServer" - "JLinkSWOViewer" - "JLinkUSBWebServer" - "JMem" - ]; + desktopItems = lib.optionals (!headless) ( + map (entry: + (makeDesktopItem { + name = entry; + exec = entry; + icon = "applications-utilities"; + desktopName = entry; + genericName = "SEGGER ${entry}"; + categories = [ "Development" ]; + type = "Application"; + terminal = false; + startupNotify = false; + }) + ) [ + "JFlash" + "JFlashLite" + "JFlashSPI" + "JLinkConfig" + "JLinkGDBServer" + "JLinkLicenseManager" + "JLinkRTTViewer" + "JLinkRegistration" + "JLinkRemoteServer" + "JLinkSWOViewer" + "JLinkUSBWebServer" + "JMem" + ] + ); installPhase = '' runHook preInstall - # Install binaries and runtime files into /opt/ mkdir -p $out/opt - mv J* ETC GDBServer Firmwares $out/opt - # Link executables into /bin/ - mkdir -p $out/bin - for binr in $out/opt/*Exe; do - binrlink=''${binr#"$out/opt/"} - ln -s $binr $out/bin/$binrlink - # Create additional symlinks without "Exe" suffix - binrlink=''${binrlink/%Exe} - ln -s $binr $out/bin/$binrlink - done + ${lib.optionalString (!headless) '' + # Install binaries and runtime files into /opt/ + mv J* ETC GDBServer Firmwares $out/opt - # Copy special alias symlinks - for slink in $(find $out/opt/. -type l); do - cp -P -n $slink $out/bin || true - rm $slink - done + # Link executables into /bin/ + mkdir -p $out/bin + for binr in $out/opt/*Exe; do + binrlink=''${binr#"$out/opt/"} + ln -s $binr $out/bin/$binrlink + # Create additional symlinks without "Exe" suffix + binrlink=''${binrlink/%Exe} + ln -s $binr $out/bin/$binrlink + done + + # Copy special alias symlinks + for slink in $(find $out/opt/. -type l); do + cp -P -n $slink $out/bin || true + rm $slink + done + ''} # Install libraries install -Dm444 libjlinkarm.so* -t $out/lib diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 44f640d30b5a..a83648a0af94 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -12758,6 +12758,8 @@ with pkgs; seehecht = callPackage ../tools/text/seehecht { }; + segger-jlink-headless = callPackage ../by-name/se/segger-jlink/package.nix { headless = true; }; + selectdefaultapplication = libsForQt5.callPackage ../applications/misc/selectdefaultapplication { }; semantic-release = callPackage ../development/tools/semantic-release { From d4cbe1f370e2924fb8c095dc1de330bff1210e84 Mon Sep 17 00:00:00 2001 From: h7x4 Date: Wed, 12 Jun 2024 17:38:33 +0200 Subject: [PATCH 4/6] segger-jlink: move `qt4-bundled` expression to separate file --- pkgs/by-name/se/segger-jlink/package.nix | 67 +----------------- pkgs/by-name/se/segger-jlink/qt4-bundled.nix | 74 ++++++++++++++++++++ 2 files changed, 76 insertions(+), 65 deletions(-) create mode 100644 pkgs/by-name/se/segger-jlink/qt4-bundled.nix diff --git a/pkgs/by-name/se/segger-jlink/package.nix b/pkgs/by-name/se/segger-jlink/package.nix index d3bd7a5123b1..e974b700ad8a 100644 --- a/pkgs/by-name/se/segger-jlink/package.nix +++ b/pkgs/by-name/se/segger-jlink/package.nix @@ -1,13 +1,12 @@ { lib , stdenv , fetchurl +, callPackage , autoPatchelfHook , udev , config , acceptLicense ? config.segger-jlink.acceptLicense or false , headless ? false -, fontconfig -, xorg , makeDesktopItem , copyDesktopItems }: @@ -51,69 +50,7 @@ let curlOpts = "--data accept_license_agreement=accepted"; }; - qt4-bundled = stdenv.mkDerivation { - pname = "segger-jlink-qt4"; - inherit src version; - - nativeBuildInputs = [ - autoPatchelfHook - ]; - - buildInputs = [ - stdenv.cc.cc.lib - fontconfig - xorg.libXrandr - xorg.libXfixes - xorg.libXcursor - xorg.libSM - xorg.libICE - xorg.libX11 - ]; - - dontConfigure = true; - dontBuild = true; - - installPhase = '' - runHook preInstall - - # Install libraries - mkdir -p $out/lib - mv libQt* $out/lib - - runHook postInstall - ''; - - meta = with lib; { - description = "Bundled QT4 libraries for the J-Link Software and Documentation pack"; - homepage = "https://www.segger.com/downloads/jlink/#J-LinkSoftwareAndDocumentationPack"; - license = licenses.lgpl21; - maintainers = with maintainers; [ stargate01 ]; - knownVulnerabilities = [ - "This bundled version of Qt 4 has reached its end of life after 2015. See https://github.com/NixOS/nixpkgs/pull/174634" - "CVE-2023-43114" - "CVE-2023-38197" - "CVE-2023-37369" - "CVE-2023-34410" - "CVE-2023-32763" - "CVE-2023-32762" - "CVE-2023-32573" - "CVE-2022-25634" - "CVE-2020-17507" - "CVE-2020-0570" - "CVE-2018-21035" - "CVE-2018-19873" - "CVE-2018-19871" - "CVE-2018-19870" - "CVE-2018-19869" - "CVE-2015-1290" - "CVE-2014-0190" - "CVE-2013-0254" - "CVE-2012-6093" - "CVE-2012-5624" - "CVE-2009-2700" - ]; - }; - }; + qt4-bundled = callPackage ./qt4-bundled.nix { inherit src version; }; in stdenv.mkDerivation { pname = "segger-jlink"; diff --git a/pkgs/by-name/se/segger-jlink/qt4-bundled.nix b/pkgs/by-name/se/segger-jlink/qt4-bundled.nix new file mode 100644 index 000000000000..b1cce1f4a351 --- /dev/null +++ b/pkgs/by-name/se/segger-jlink/qt4-bundled.nix @@ -0,0 +1,74 @@ +{ + lib +, stdenv +, src +, version +, autoPatchelfHook +, fontconfig +, xorg +}: + +stdenv.mkDerivation { + pname = "segger-jlink-qt4"; + inherit src version; + + nativeBuildInputs = [ + autoPatchelfHook + ]; + + buildInputs = [ + stdenv.cc.cc.lib + fontconfig + xorg.libXrandr + xorg.libXfixes + xorg.libXcursor + xorg.libSM + xorg.libICE + xorg.libX11 + ]; + + dontConfigure = true; + dontBuild = true; + + installPhase = '' + runHook preInstall + + # Install libraries + mkdir -p $out/lib + mv libQt* $out/lib + + runHook postInstall + ''; + + meta = with lib; { + description = "Bundled QT4 libraries for the J-Link Software and Documentation pack"; + homepage = "https://www.segger.com/downloads/jlink/#J-LinkSoftwareAndDocumentationPack"; + license = licenses.lgpl21; + maintainers = with maintainers; [ stargate01 ]; + knownVulnerabilities = [ + "This bundled version of Qt 4 has reached its end of life after 2015. See https://github.com/NixOS/nixpkgs/pull/174634" + "CVE-2023-43114" + "CVE-2023-38197" + "CVE-2023-37369" + "CVE-2023-34410" + "CVE-2023-32763" + "CVE-2023-32762" + "CVE-2023-32573" + "CVE-2022-25634" + "CVE-2020-17507" + "CVE-2020-0570" + "CVE-2018-21035" + "CVE-2018-19873" + "CVE-2018-19871" + "CVE-2018-19870" + "CVE-2018-19869" + "CVE-2015-1290" + "CVE-2014-0190" + "CVE-2013-0254" + "CVE-2012-6093" + "CVE-2012-5624" + "CVE-2009-2700" + ]; + }; +} + From 8855f6bcbad6fd34984bb34dd48a07d398141355 Mon Sep 17 00:00:00 2001 From: h7x4 Date: Wed, 12 Jun 2024 17:38:34 +0200 Subject: [PATCH 5/6] segger-jlink: add `meta.changelog` --- pkgs/by-name/se/segger-jlink/package.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/pkgs/by-name/se/segger-jlink/package.nix b/pkgs/by-name/se/segger-jlink/package.nix index e974b700ad8a..d0f886e7db03 100644 --- a/pkgs/by-name/se/segger-jlink/package.nix +++ b/pkgs/by-name/se/segger-jlink/package.nix @@ -151,6 +151,7 @@ in stdenv.mkDerivation { meta = with lib; { description = "J-Link Software and Documentation pack"; homepage = "https://www.segger.com/downloads/jlink/#J-LinkSoftwareAndDocumentationPack"; + changelog = "https://www.segger.com/downloads/jlink/ReleaseNotes_JLink.html"; license = licenses.unfree; platforms = attrNames supported; maintainers = with maintainers; [ FlorianFranzen stargate01 ]; From 053ded012b89017d8c757a4a51301d96f7674681 Mon Sep 17 00:00:00 2001 From: h7x4 Date: Wed, 12 Jun 2024 17:38:34 +0200 Subject: [PATCH 6/6] segger-jlink: add h7x4 to maintainers --- pkgs/by-name/se/segger-jlink/package.nix | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pkgs/by-name/se/segger-jlink/package.nix b/pkgs/by-name/se/segger-jlink/package.nix index d0f886e7db03..a092097bce3b 100644 --- a/pkgs/by-name/se/segger-jlink/package.nix +++ b/pkgs/by-name/se/segger-jlink/package.nix @@ -154,6 +154,10 @@ in stdenv.mkDerivation { changelog = "https://www.segger.com/downloads/jlink/ReleaseNotes_JLink.html"; license = licenses.unfree; platforms = attrNames supported; - maintainers = with maintainers; [ FlorianFranzen stargate01 ]; + maintainers = with maintainers; [ + FlorianFranzen + h7x4 + stargate01 + ]; }; }