diff --git a/pkgs/desktops/arcan/arcan.nix b/pkgs/desktops/arcan/arcan.nix new file mode 100644 index 000000000000..8a30da9e81f2 --- /dev/null +++ b/pkgs/desktops/arcan/arcan.nix @@ -0,0 +1,157 @@ +{ lib +, stdenv +, fetchFromGitHub +, SDL2 +, cmake +, espeak +, ffmpeg +, file +, freetype +, harfbuzz +, leptonica +, libGL +, libX11 +, libXau +, libXcomposite +, libXdmcp +, libXfixes +, libdrm +, libffi +, libusb1 +, libuvc +, libvlc +, libvncserver +, libxcb +, libxkbcommon +, luajit +, makeWrapper +, mesa +, openal +, pkg-config +, sqlite +, tesseract +, valgrind +, wayland +, wayland-protocols +, xcbutil +, xcbutilwm +, xz +, buildManPages ? true, ruby +}: + +let + # TODO: investigate vendoring, especially OpenAL + # WARN: vendoring of OpenAL is required for running arcan_lwa + # INFO: maybe it needs leaveDotGit, but it is dangerous/impure + letoram-openal-src = fetchFromGitHub { + owner = "letoram"; + repo = "openal"; + rev = "1c7302c580964fee9ee9e1d89ff56d24f934bdef"; + hash = "sha256-InqU59J0zvwJ20a7KU54xTM7d76VoOlFbtj7KbFlnTU="; + }; +in +stdenv.mkDerivation rec { + pname = "arcan"; + version = "0.6.1pre1+unstable=2021-07-07"; + + src = fetchFromGitHub { + owner = "letoram"; + repo = "arcan"; + rev = "f3341ab94b32d02f3d15c3b91a512b2614e950a5"; + hash = "sha256-YBtRA5uCk4tjX3Bsu5vMkaNaCLRlM6HVQ53sna3gDsY="; + }; + + postUnpack = '' + ( + cd $sourceRoot/external/git/ + cp -a ${letoram-openal-src}/ openal/ + chmod --recursive 744 openal/ + ) + ''; + + # TODO: work with upstream in order to get rid of these hardcoded paths + postPatch = '' + substituteInPlace ./src/platform/posix/paths.c \ + --replace "/usr/bin" "$out/bin" \ + --replace "/usr/share" "$out/share" + + substituteInPlace ./src/CMakeLists.txt --replace "SETUID" "# SETUID" + ''; + + nativeBuildInputs = [ + cmake + makeWrapper + pkg-config + ] ++ lib.optionals buildManPages [ + ruby + ]; + + buildInputs = [ + SDL2 + espeak + ffmpeg + file + freetype + harfbuzz + leptonica + libGL + libX11 + libXau + libXcomposite + libXdmcp + libXfixes + libdrm + libffi + libusb1 + libuvc + libvlc + libvncserver + libxcb + libxkbcommon + luajit + mesa + openal + sqlite + tesseract + valgrind + wayland + wayland-protocols + xcbutil + xcbutilwm + xz + ]; + + # INFO: According to the source code, the manpages need to be generated before + # the configure phase + preConfigure = lib.optionalString buildManPages '' + (cd doc; ruby docgen.rb mangen) + ''; + + cmakeFlags = [ + "-DBUILD_PRESET=everything" + # The upstream project recommends tagging the distribution + "-DDISTR_TAG=Nixpkgs" + "-DENGINE_BUILDTAG=${version}" + "-DHYBRID_SDL=on" + "-DSTATIC_OPENAL=off" + "../src" + ]; + + hardeningDisable = [ + "format" + ]; + + meta = with lib; { + homepage = "https://arcan-fe.com/"; + description = "Combined Display Server, Multimedia Framework, Game Engine"; + longDescription = '' + Arcan is a portable and fast self-sufficient multimedia engine for + advanced visualization and analysis work in a wide range of applications + e.g. game development, real-time streaming video, monitoring and + surveillance, up to and including desktop compositors and window managers. + ''; + license = with licenses; [ bsd3 gpl2Plus lgpl2Plus ]; + maintainers = with maintainers; [ AndersonTorres ]; + platforms = platforms.unix; + }; +} diff --git a/pkgs/desktops/arcan/default.nix b/pkgs/desktops/arcan/default.nix new file mode 100644 index 000000000000..dba284f0100d --- /dev/null +++ b/pkgs/desktops/arcan/default.nix @@ -0,0 +1,42 @@ +{ callPackage, lib, pkgs }: + +rec { + # Dependencies + + espeak = pkgs.espeak-ng; + ffmpeg = pkgs.ffmpeg-full; + harfbuzz = pkgs.harfbuzzFull; + + # Arcan + + arcan = callPackage ./arcan.nix { }; + arcan-wrapped = callPackage ./wrapper.nix { }; + xarcan = callPackage ./xarcan.nix { }; + + # Appls + + durden = callPackage ./durden.nix { }; + durden-wrapped = callPackage ./wrapper.nix { + name = "durden-wrapped"; + appls = [ durden ]; + }; + + pipeworld = callPackage ./pipeworld.nix { }; + pipeworld-wrapped = callPackage ./wrapper.nix { + name = "pipeworld-wrapped"; + appls = [ pipeworld ]; + }; + + prio = callPackage ./prio.nix { }; + prio-wrapped = callPackage ./wrapper.nix { + name = "prio-wrapped"; + appls = [ prio ]; + }; + + # One Expression to SymlinkJoin Them All + + everyone-wrapped = callPackage ./wrapper.nix { + name = "everyone-wrapped"; + appls = [ durden pipeworld prio ]; + }; +} diff --git a/pkgs/desktops/arcan/durden.nix b/pkgs/desktops/arcan/durden.nix new file mode 100644 index 000000000000..cfe41cb6ec22 --- /dev/null +++ b/pkgs/desktops/arcan/durden.nix @@ -0,0 +1,39 @@ +{ lib +, stdenv +, fetchFromGitHub +}: + +stdenv.mkDerivation rec { + pname = "durden"; + version = "0.6.1+unstable=2021-06-25"; + + src = fetchFromGitHub { + owner = "letoram"; + repo = pname; + rev = "fb618fccc57a68b6ce933b4df5822acd1965d591"; + hash = "sha256-PovI837Xca4wV0g0s4tYUMFGVUDf+f8HcdvM1+0aDxk="; + }; + + installPhase = '' + runHook preInstall + + mkdir -p ${placeholder "out"}/share/arcan/appl/ + cp -a ./durden ${placeholder "out"}/share/arcan/appl/ + + runHook postInstall + ''; + + meta = with lib; { + homepage = "https://durden.arcan-fe.com/"; + description = "Reference Desktop Environment for Arcan"; + longDescription = '' + Durden is a desktop environment for the Arcan Display Server. It serves + both as a reference showcase on how to take advantage of some of the + features in Arcan, and as a very competent entry to the advanced-user side + of the desktop environment spectrum. + ''; + license = licenses.bsd3; + maintainers = with maintainers; [ AndersonTorres ]; + platforms = platforms.all; + }; +} diff --git a/pkgs/desktops/arcan/pipeworld.nix b/pkgs/desktops/arcan/pipeworld.nix new file mode 100644 index 000000000000..a48ce5044ca0 --- /dev/null +++ b/pkgs/desktops/arcan/pipeworld.nix @@ -0,0 +1,46 @@ +{ lib +, stdenv +, fetchFromGitHub +}: + +stdenv.mkDerivation rec { + pname = "pipeworld"; + version = "0.0.0+unstable=2021-05-27"; + + src = fetchFromGitHub { + owner = "letoram"; + repo = pname; + rev = "c26df9ca0225ce2fd4f89e7ec59d4ab1f94a4c2e"; + hash = "sha256-RkDAbM1q4o61RGPLPLXHLvbvClp+bfjodlWgUGoODzA="; + }; + + installPhase = '' + runHook preInstall + + mkdir -p ${placeholder "out"}/share/arcan/appl/ + cp -a ./pipeworld ${placeholder "out"}/share/arcan/appl/ + + runHook postInstall + ''; + + meta = with lib; { + homepage = "https://github.com/letoram/pipeworld"; + description = "Dataflow 'spreadsheet' desktop environment"; + longDescription = '' + Pipeworld is a zooming dataflow tool and desktop heavily inspired by + userland. It is built using the arcan desktop engine. + + It combines the programmable processing of shell scripts and pipes, the + interactive visual addressing/programming model of spread sheets, the + scenegraph- and interactive controls-, IPC- and client processing- of + display servers into one model with zoomable tiling window management. + + It can be used as a standalone desktop of its own, or as a normal + application within another desktop as a 'substitute' for your normal + terminal emulator. + ''; + license = licenses.bsd3; + maintainers = with maintainers; [ AndersonTorres ]; + platforms = platforms.all; + }; +} diff --git a/pkgs/desktops/arcan/prio.nix b/pkgs/desktops/arcan/prio.nix new file mode 100644 index 000000000000..764d82fae9b7 --- /dev/null +++ b/pkgs/desktops/arcan/prio.nix @@ -0,0 +1,33 @@ +{ lib +, stdenv +, fetchFromGitHub +}: + +stdenv.mkDerivation rec { + pname = "prio"; + version = "0.0.0+unstable=2018-09-13"; + + src = fetchFromGitHub { + owner = "letoram"; + repo = pname; + rev = "c3f97491339d15f063d6937d5f89bcfaea774dd1"; + hash = "sha256-Idv/duEYmDk/rO+TI8n+FY3VFDtUEh8C292jh12BJuM="; + }; + + installPhase = '' + runHook preInstall + + mkdir -p ${placeholder "out"}/share/arcan/appl/prio + cp -a ./* ${placeholder "out"}/share/arcan/appl/prio + + runHook postInstall + ''; + + meta = with lib; { + homepage = "https://github.com/letoram/prio"; + description = "Plan9- Rio like Window Manager for Arcan"; + license = licenses.bsd3; + maintainers = with maintainers; [ AndersonTorres ]; + platforms = platforms.all; + }; +} diff --git a/pkgs/desktops/arcan/wrapper.nix b/pkgs/desktops/arcan/wrapper.nix new file mode 100644 index 000000000000..a8b93ca1deac --- /dev/null +++ b/pkgs/desktops/arcan/wrapper.nix @@ -0,0 +1,28 @@ +{ arcan +, makeWrapper +, symlinkJoin +, appls ? [ ] +, name ? "arcan-wrapped" +}: + +symlinkJoin rec { + inherit name; + + paths = appls ++ [ arcan ]; + + nativeBuildInputs = [ makeWrapper ]; + + postBuild = '' + for prog in ${placeholder "out"}/bin/*; do + wrapProgram $prog \ + --prefix PATH ":" "${placeholder "out"}/bin" \ + --set ARCAN_APPLBASEPATH "${placeholder "out"}/share/arcan/appl/" \ + --set ARCAN_BINPATH "${placeholder "out"}/bin/arcan_frameserver" \ + --set ARCAN_LIBPATH "${placeholder "out"}/lib/" \ + --set ARCAN_RESOURCEPATH "${placeholder "out"}/share/arcan/resources/" \ + --set ARCAN_SCRIPTPATH "${placeholder "out"}/share/arcan/scripts/" \ + --set ARCAN_STATEBASEPATH "$HOME/.arcan/resources/savestates/" + done + ''; +} +# TODO: set ARCAN_FONTPATH to a set of fonts that can be provided in a parameter diff --git a/pkgs/desktops/arcan/xarcan.nix b/pkgs/desktops/arcan/xarcan.nix new file mode 100644 index 000000000000..9bfd7e290733 --- /dev/null +++ b/pkgs/desktops/arcan/xarcan.nix @@ -0,0 +1,118 @@ +{ lib +, stdenv +, fetchFromGitHub +, arcan +, audit +, dbus +, epoxy +, fontutil +, libGL +, libX11 +, libXau +, libXdmcp +, libXfont2 +, libdrm +, libgcrypt +, libmd +, libselinux +, libtirpc +, libxcb +, libxkbfile +, libxshmfence +, mesa +, meson +, nettle +, ninja +, openssl +, pixman +, pkg-config +, systemd +, xcbutil +, xcbutilwm +, xkbcomp +, xkeyboard_config +, xorgproto +, xtrans +}: + +stdenv.mkDerivation rec { + pname = "xarcan"; + version = "0.6.0+unstable=2021-06-14"; + + src = fetchFromGitHub { + owner = "letoram"; + repo = pname; + rev = "98d28a5f2c6860bb191fbc1c9e577c18e4c9a9b7"; + hash = "sha256-UTIVDKnYD/q0K6G7NJUKh1tHcqnsuiJ/cQxWuPMJ2G4="; + }; + + nativeBuildInputs = [ + meson + ninja + pkg-config + ]; + + buildInputs = [ + arcan + audit + dbus + epoxy + fontutil + libGL + libX11 + libXau + libXdmcp + libXfont2 + libdrm + libgcrypt + libmd + libselinux + libtirpc + libxcb + libxkbfile + libxshmfence + mesa + nettle + openssl + pixman + systemd + xcbutil + xcbutilwm + xkbcomp + xkeyboard_config + xorgproto + xtrans + ]; + + configureFlags = [ + "--disable-int10-module" + "--disable-static" + "--disable-xnest" + "--disable-xorg" + "--disable-xvfb" + "--disable-xwayland" + "--enable-glamor" + "--enable-glx" + "--enable-ipv6" + "--enable-kdrive" + "--enable-record" + "--enable-xarcan" + "--enable-xcsecurity" + "--with-xkb-bin-directory=${xkbcomp}/bin" + "--with-xkb-output=/tmp" + "--with-xkb-path=${xkeyboard_config}/share/X11/xkb" + ]; + + meta = with lib; { + homepage = "https://github.com/letoram/letoram"; + description = "Patched Xserver that bridges connections to Arcan"; + longDescription = '' + xarcan is a patched X server with a KDrive backend that uses the + arcan-shmif to map Xlib/Xcb/X clients to a running arcan instance. It + allows running an X session as a window under Arcan. + ''; + license = licenses.mit; + maintainers = with maintainers; [ AndersonTorres ]; + platforms = platforms.all; + }; +} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index f113de0cf0ac..c1b84d697b5b 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -29600,6 +29600,10 @@ in gtk = gtk2; }; + arcan = recurseIntoAttrs (callPackage ../desktops/arcan { + callPackage = newScope pkgs.arcan; + }); + xfce = recurseIntoAttrs (callPackage ../desktops/xfce { }); xrandr-invert-colors = callPackage ../applications/misc/xrandr-invert-colors { };