diff --git a/.gitignore b/.gitignore index faaae889..b7d896fa 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,6 @@ outputs # Created by running NixOS tests in interactive mode .nixos-test-history + +#VScode extra files +*.code-workspace diff --git a/docs/nixos-services/options-reference/phoebus-client.rst b/docs/nixos-services/options-reference/phoebus-client.rst new file mode 100644 index 00000000..c96706f7 --- /dev/null +++ b/docs/nixos-services/options-reference/phoebus-client.rst @@ -0,0 +1,4 @@ +Phoebus Client +============== + +.. nix:automodule:: programs.phoebus-client diff --git a/nixos/module-list.nix b/nixos/module-list.nix index 399e1d06..607ec3de 100644 --- a/nixos/module-list.nix +++ b/nixos/module-list.nix @@ -5,6 +5,7 @@ ./modules/channel-finder/service.nix ./modules/phoebus/alarm-logger.nix ./modules/phoebus/alarm-server.nix + ./modules/phoebus/client.nix ./modules/phoebus/olog.nix ./modules/phoebus/save-and-restore.nix ] diff --git a/nixos/modules/phoebus/client.nix b/nixos/modules/phoebus/client.nix new file mode 100644 index 00000000..74a4324c --- /dev/null +++ b/nixos/modules/phoebus/client.nix @@ -0,0 +1,28 @@ +{ + config, + lib, + pkgs, + ... +}: let + cfg = config.programs.phoebus-client; + pkg = pkgs.epnix.phoebus.override {java_opts = cfg.java_opts;}; +in { + options.programs.phoebus-client = { + enable = lib.mkEnableOption "installing and configuring the Phoebus client"; + java_opts = lib.mkOption { + type = lib.types.str; + default = "-XX:MinHeapSize=128m -XX:MaxHeapSize=4g -XX:InitialHeapSize=1g -XX:MaxHeapFreeRatio=10 -XX:MinHeapFreeRatio=5 -XX:-ShrinkHeapInSteps -XX:NativeMemoryTracking=detail"; + example = "-XX:MinHeapSize=128m -XX:MaxHeapSize=4g -XX:InitialHeapSize=1g"; + description = '' + Set Java options for the Phoebus client. + + For more information, see: + https://docs.oracle.com/en/java/javase/17/docs/specs/man/java.html#extra-options-for-java + ''; + }; + }; + + config = lib.mkIf cfg.enable { + environment.systemPackages = [pkg]; + }; +} diff --git a/pkgs/default.nix b/pkgs/default.nix index 295b3041..0328d645 100644 --- a/pkgs/default.nix +++ b/pkgs/default.nix @@ -82,6 +82,7 @@ in pcas = callPackage ./epnix/tools/pcas {}; phoebus = callPackage ./epnix/tools/phoebus/client {}; + phoebus-unwrapped = callPackage ./epnix/tools/phoebus/client-unwrapped {}; phoebus-alarm-server = callPackage ./epnix/tools/phoebus/alarm-server {}; phoebus-alarm-logger = callPackage ./epnix/tools/phoebus/alarm-logger {}; phoebus-archive-engine = callPackage ./epnix/tools/phoebus/archive-engine {}; diff --git a/pkgs/epnix/tools/phoebus/client-unwrapped/default.nix b/pkgs/epnix/tools/phoebus/client-unwrapped/default.nix new file mode 100644 index 00000000..f9465a0c --- /dev/null +++ b/pkgs/epnix/tools/phoebus/client-unwrapped/default.nix @@ -0,0 +1,91 @@ +{ + lib, + epnixLib, + stdenv, + substituteAll, + maven, + makeWrapper, + epnix, + jdk, + openjfx, + python3, +}: let + buildDate = "2022-02-24T07:56:00Z"; +in + stdenv.mkDerivation { + pname = "phoebus-unwrapped"; + inherit (epnix.phoebus-deps) version src; + + patches = [ + (substituteAll { + src = ./fix-python-path.patch; + python = lib.getExe python3; + }) + ]; + + # TODO: make a scope, so that we don't pass around the whole `epnix` + nativeBuildInputs = [ + maven + makeWrapper + (epnix.phoebus-setup-hook.override {jdk = jdk.override {enableJavaFX = true;};}) + (epnix.phoebus-setup-hook.override { + jdk = jdk.override { + enableJavaFX = true; + openjfx = openjfx.override { + withWebKit = true; + }; + }; + }) + ]; + + # Put runtime dependencies in propagated + # because references get thrown into a jar + # which is compressed, + # so the Nix scanner won't always be able to see them + propagatedBuildInputs = [ + python3 + ]; + + buildPhase = '' + runHook preBuild + + # Copy deps to a writable directory, due to the usage of "install-jars" + local deps=$PWD/deps + cp -r --no-preserve=mode "${epnix.phoebus-deps}" $deps + + # TODO: tests fail + mvn package \ + --projects "./phoebus-product" \ + --also-make \ + --offline \ + -Dmaven.javadoc.skip=true -Dmaven.source.skip=true -DskipTests \ + -Dproject.build.outputTimestamp=${buildDate} \ + -Dmaven.repo.local="$deps" + + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + + installPhoebusJar \ + "phoebus-product/" \ + "product-$version.jar" \ + "phoebus" \ + "org.phoebus.product.Launcher" + + # MIME types for PV Tables + install -D -m 444 phoebus-product/phoebus.xml -t $out/share/mime/packages + + runHook postInstall + ''; + + meta = { + description = "Control System Studio's Phoebus client"; + homepage = "https://control-system-studio.readthedocs.io/en/latest/index.html"; + mainProgram = "phoebus"; + license = lib.licenses.epl10; + maintainers = with epnixLib.maintainers; [minijackson]; + inherit (jdk.meta) platforms; + }; + } diff --git a/pkgs/epnix/tools/phoebus/client/fix-python-path.patch b/pkgs/epnix/tools/phoebus/client-unwrapped/fix-python-path.patch similarity index 100% rename from pkgs/epnix/tools/phoebus/client/fix-python-path.patch rename to pkgs/epnix/tools/phoebus/client-unwrapped/fix-python-path.patch diff --git a/pkgs/epnix/tools/phoebus/client/default.nix b/pkgs/epnix/tools/phoebus/client/default.nix index 5913b22c..f6c3a831 100644 --- a/pkgs/epnix/tools/phoebus/client/default.nix +++ b/pkgs/epnix/tools/phoebus/client/default.nix @@ -1,112 +1,50 @@ { - lib, - epnixLib, - stdenv, - substituteAll, - maven, makeWrapper, + epnix, + epnixLib, + lib, makeDesktopItem, copyDesktopItems, - epnix, - jdk, - openjfx, - python3, -}: let - buildDate = "2022-02-24T07:56:00Z"; -in - stdenv.mkDerivation { - pname = "phoebus"; - inherit (epnix.phoebus-deps) version src; - - patches = [ - (substituteAll { - src = ./fix-python-path.patch; - python = lib.getExe python3; - }) - ]; - - # TODO: make a scope, so that we don't pass around the whole `epnix` - nativeBuildInputs = [ - maven - copyDesktopItems - makeWrapper - (epnix.phoebus-setup-hook.override {jdk = jdk.override {enableJavaFX = true;};}) - (epnix.phoebus-setup-hook.override { - jdk = jdk.override { - enableJavaFX = true; - openjfx = openjfx.override { - withWebKit = true; - }; - }; - }) - ]; - - # Put runtime dependencies in propagated - # because references get thrown into a jar - # which is compressed, - # so the Nix scanner won't always be able to see them - propagatedBuildInputs = [ - python3 - ]; - - desktopItems = [ - (makeDesktopItem { - name = "phoebus"; - exec = "phoebus -server 4918 -resource %f"; - desktopName = "Phoebus"; - keywords = ["epics" "css"]; - # https://specifications.freedesktop.org/menu-spec/menu-spec-1.0.html#category-registry - categories = [ - # Main - "Office" - - # Additional - "Java" - "Viewer" - ]; - }) - ]; - - buildPhase = '' - runHook preBuild - - # Copy deps to a writable directory, due to the usage of "install-jars" - local deps=$PWD/deps - cp -r --no-preserve=mode "${epnix.phoebus-deps}" $deps - - # TODO: tests fail - mvn package \ - --projects "./phoebus-product" \ - --also-make \ - --offline \ - -Dmaven.javadoc.skip=true -Dmaven.source.skip=true -DskipTests \ - -Dproject.build.outputTimestamp=${buildDate} \ - -Dmaven.repo.local="$deps" - - runHook postBuild - ''; - - installPhase = '' - runHook preInstall - - installPhoebusJar \ - "phoebus-product/" \ - "product-$version.jar" \ - "phoebus" \ - "org.phoebus.product.Launcher" - - # MIME types for PV Tables - install -D -m 444 phoebus-product/phoebus.xml -t $out/share/mime/packages - - runHook postInstall - ''; - - meta = { - description = "Control System Studio's Phoebus client"; - homepage = "https://control-system-studio.readthedocs.io/en/latest/index.html"; - mainProgram = "phoebus"; - license = lib.licenses.epl10; - maintainers = with epnixLib.maintainers; [minijackson]; - inherit (jdk.meta) platforms; - }; - } + stdenv, + # Inspired by: + # https://epics.anl.gov/tech-talk/2024/msg00895.php + java_opts ? "-XX:MinHeapSize=128m -XX:MaxHeapSize=4g -XX:InitialHeapSize=1g -XX:MaxHeapFreeRatio=10 -XX:MinHeapFreeRatio=5 -XX:-ShrinkHeapInSteps -XX:NativeMemoryTracking=detail", +}: +stdenv.mkDerivation { + pname = "phoebus"; + inherit (epnix.phoebus-unwrapped) version; + nativeBuildInputs = [makeWrapper copyDesktopItems]; + + dontUnpack = true; + dontBuild = true; + dontConfigure = true; + + installPhase = '' + runHook preInstall + + # This wrapper for the `phoebus-unwrapped` executable sets the `JAVA_OPTS` + makeWrapper "${lib.getExe epnix.phoebus-unwrapped}" "$out/bin/$pname" \ + --prefix JAVA_OPTS " " "${java_opts}" + + runHook postInstall + ''; + + desktopItems = [ + (makeDesktopItem { + name = "phoebus"; + exec = "phoebus -server 4918 -resource %f"; + desktopName = "Phoebus"; + keywords = ["epics" "css"]; + # https://specifications.freedesktop.org/menu-spec/menu-spec-1.0.html#category-registry + categories = [ + # Main + "Office" + # Additional + "Java" + "Viewer" + ]; + }) + ]; + + inherit (epnix.phoebus-unwrapped) meta; +}