Skip to content

Instantly share code, notes, and snippets.

@ingenieroariel
Created September 4, 2024 16:23
Show Gist options
  • Save ingenieroariel/e854e2d819ce517c83d7ad8e1f1cbccb to your computer and use it in GitHub Desktop.
Save ingenieroariel/e854e2d819ce517c83d7ad8e1f1cbccb to your computer and use it in GitHub Desktop.
{ lib
, stdenv
, fetchFromGitHub
, SDL2
, callPackage
, cmake
#, espeak-ng
, ffmpeg
, file
, freetype
#, glib
, gumbo
, harfbuzz
, jbig2dec
, leptonica
, libGL
, libX11
, libXau
, libXcomposite
, libXdmcp
, libXfixes
, libdrm
, libffi
, libjpeg
, libusb1
, libuvc
#, libvlc
#, libvncserver
, libxcb
, libxkbcommon
, makeWrapper
, mesa
#, mupdf
, openal
, openjpeg
, pcre2
, pkg-config
, ruby
, sqlite
#, tesseract
#, valgrind
, wayland
, wayland-protocols
, xcbutil
, xcbutilwm
, xz
, buildManPages ? true
, useBuiltinLua ? true
#, useEspeak ? !stdenv.isDarwin
, useStaticLibuvc ? true
, useStaticOpenAL ? true
, useStaticSqlite ? true
, useTracy ? false
}:
let
allSources = {
letoram-openal-src = fetchFromGitHub {
owner = "letoram";
repo = "openal";
rev = "81e1b364339b6aa2b183f39fc16c55eb5857e97a";
hash = "sha256-X3C3TDZPiOhdZdpApC4h4KeBiWFMxkFsmE3gQ1Rz420=";
};
libuvc-src = fetchFromGitHub {
owner = "libuvc";
repo = "libuvc";
rev = "68d07a00e11d1944e27b7295ee69673239c00b4b";
hash = "sha256-IdV18mnPTDBODpS1BXl4ulkFyf1PU2ZmuVGNOIdQwzE=";
};
luajit-src = fetchFromGitHub {
owner = "LuaJIT";
repo = "LuaJIT";
rev = "656ecbcf8f669feb94e0d0ec4b4f59190bcd2e48";
hash = "sha256-/gGQzHgYuWGqGjgpEl18Rbh3Sx2VP+zLlx4N9/hbYLc=";
};
tracy-src = fetchFromGitHub {
owner = "wolfpld";
repo = "tracy";
rev = "93537dff336e0796b01262e8271e4d63bf39f195";
hash = "sha256-FNB2zTbwk8hMNmhofz9GMts7dvH9phBRVIdgVjRcyQM=";
};
};
in
stdenv.mkDerivation (finalAttrs: {
pname = "arcan";
version = "0.7-pre-2024-05-14";
src = lib.fileset.toSource {
root = ./src;
fileset = ./src;
};
hardeningDisable = [ "all" ];
NIX_CFLAGS_COMPILE = "-g";
NIX_CXXFLAGS_COMPILE = "-g";
nativeBuildInputs = [
cmake
makeWrapper
pkg-config
] ++ lib.optionals buildManPages [
ruby
];
buildInputs = [
SDL2
ffmpeg
file
freetype
#glib
gumbo
harfbuzz
jbig2dec
leptonica
libGL
libX11
libXau
libXcomposite
libXdmcp
libXfixes
libdrm
libffi
libjpeg
libusb1
libuvc
#libvlc
#libvncserver
libxcb
libxkbcommon
mesa
#mupdf
openal
openjpeg
pcre2
sqlite
#tesseract
#valgrind
wayland
wayland-protocols
xcbutil
xcbutilwm
xz
#]
#++ lib.optionals useEspeak [
# espeak-ng
];
# Emulate external/git/clone.sh
postUnpack = let
inherit (allSources)
letoram-openal-src libuvc-src luajit-src tracy-src;
prepareSource = flag: source: destination:
lib.optionalString flag ''
cp -va ${source}/ ${destination}
chmod --recursive 744 ${destination}
'';
in
''
pushd $sourceRoot/external/git/
''
+ prepareSource useStaticOpenAL letoram-openal-src "openal"
+ prepareSource useStaticLibuvc libuvc-src "libuvc"
+ prepareSource useBuiltinLua luajit-src "luajit"
+ prepareSource useTracy tracy-src "tracy"
+ ''
popd
'';
postPatch = ''
substituteInPlace ./src/platform/posix/paths.c \
--replace "/usr/bin" "$out/bin" \
--replace "/usr/share" "$out/share"
substituteInPlace ./src/CMakeLists.txt \
--replace "SETUID" "# SETUID"
'';
# INFO: Arcan build scripts require the manpages to be generated *before* the
# `configure` phase
preConfigure = lib.optionalString buildManPages ''
pushd doc
ruby docgen.rb mangen
popd
'';
doStrip = false;
dontStrip = true;
cmakeFlags = [
"-DCMAKE_BUILD_TYPE=Release"
# The upstream project recommends tagging the distribution
(lib.cmakeFeature "DISTR_TAG" "Nixpkgs")
(lib.cmakeFeature "ENGINE_BUILDTAG" finalAttrs.version)
(lib.cmakeFeature "BUILD_PRESET" "everything")
(lib.cmakeBool "BUILTIN_LUA" useBuiltinLua)
(lib.cmakeBool "DISABLE_JIT" useBuiltinLua)
(lib.cmakeBool "STATIC_LIBUVC" useStaticLibuvc)
(lib.cmakeBool "STATIC_SQLite3" useStaticSqlite)
(lib.cmakeBool "STATIC_OPENAL" useStaticOpenAL)
(lib.cmakeBool "ENABLE_TRACY" useTracy)
(lib.cmakeBool "HYBRID_SDL" false)
"-DAUDIO_PLATFORM=openal"
"-DVIDEO_PLATFORM=egl-dri"
"-DAGP_PLATFORM=gl21"
"../src"
];
passthru = {
wrapper = callPackage ./wrapper.nix { };
};
meta = {
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 lib.licenses; [ bsd3 gpl2Plus lgpl2Plus ];
maintainers = with lib.maintainers; [ AndersonTorres ];
platforms = lib.platforms.unix;
};
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment