diff --git a/alvr/vrcompositor_wrapper/build.rs b/alvr/vrcompositor_wrapper/build.rs index 7d67110e76..b9c04d5e81 100644 --- a/alvr/vrcompositor_wrapper/build.rs +++ b/alvr/vrcompositor_wrapper/build.rs @@ -7,6 +7,7 @@ fn main() { let target_dir = out_dir.join("../../.."); let sh = Shell::new().unwrap(); + // g++ because this build wants __builtin_apply_args and friends let command = format!("g++ -shared -fPIC $(pkg-config --cflags libdrm) drm-lease-shim.cpp -o {}/alvr_drm_lease_shim.so", target_dir.display()); cmd!(sh, "bash -c {command}").run().unwrap(); } diff --git a/fix-finding-libs.patch b/fix-finding-libs.patch new file mode 100644 index 0000000000..6e2600c1a2 --- /dev/null +++ b/fix-finding-libs.patch @@ -0,0 +1,45 @@ +From 1e792a4e7356f070856e4bf5775a07b18c3cc5ee Mon Sep 17 00:00:00 2001 +From: jopejoe1 +Date: Sat, 7 Sep 2024 23:28:25 +0200 +Subject: [PATCH] fix finding libs + +--- + alvr/server_openvr/build.rs | 18 +++--------------- + alvr/session/build.rs | 4 +--- + 2 files changed, 4 insertions(+), 18 deletions(-) + +diff --git a/alvr/server_openvr/build.rs b/alvr/server_openvr/build.rs +index b9bc4bd8..0581de0d 100644 +--- a/alvr/server_openvr/build.rs ++++ b/alvr/server_openvr/build.rs +@@ -1,24 +1,12 @@ +-use std::{env, path::PathBuf}; ++use std::{env, path::{Path, PathBuf}}; + + fn get_ffmpeg_path() -> PathBuf { +- let ffmpeg_path = alvr_filesystem::deps_dir() +- .join(if cfg!(target_os = "linux") { +- "linux" +- } else { +- "windows" +- }) +- .join("ffmpeg"); +- +- if cfg!(target_os = "linux") { +- ffmpeg_path.join("alvr_build") +- } else { +- ffmpeg_path +- } ++ Path::new("@ffmpeg@").to_owned() + } + + #[cfg(all(target_os = "linux", feature = "gpl"))] + fn get_linux_x264_path() -> PathBuf { +- alvr_filesystem::deps_dir().join("linux/x264/alvr_build") ++ Path::new("@x264@").to_owned() + } + + fn main() { +-- +2.46.0 + diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000000..b56c7c4f0c --- /dev/null +++ b/flake.lock @@ -0,0 +1,95 @@ +{ + "nodes": { + "flakeUtils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1739486406, + "narHash": "sha256-b3JGAmrZLF8LK/Ufguac8R/eDJ4RouCOnk9FN/0CLCM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4ef254b3bd20bd0553c903f124e2321d5814a370", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "master", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgsStaging": { + "locked": { + "lastModified": 1739470556, + "narHash": "sha256-D67sFmdCo8vLqlQJHxB7eTSjv0+g5LyrWv+H7AJg22c=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "496b396e7d429afe3d8fdf16097744d2dadd1051", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "staging", + "repo": "nixpkgs", + "type": "github" + } + }, + "openvr": { + "flake": false, + "locked": { + "lastModified": 1711497237, + "narHash": "sha256-bIKjZ7DvJVmDK386WgXaAFQrS0E1TNEUMhfQp7FNnvk=", + "owner": "ValveSoftware", + "repo": "openvr", + "rev": "ae46a8dd0172580648c8922658a100439115d3eb", + "type": "github" + }, + "original": { + "owner": "ValveSoftware", + "repo": "openvr", + "type": "github" + } + }, + "root": { + "inputs": { + "flakeUtils": "flakeUtils", + "nixpkgs": "nixpkgs", + "nixpkgsStaging": "nixpkgsStaging", + "openvr": "openvr" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000000..8c5db2c369 --- /dev/null +++ b/flake.nix @@ -0,0 +1,137 @@ +{ + description = "Stream VR games from your PC to your headset via Wi-Fi"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/master"; + nixpkgsStaging.url = "github:NixOS/nixpkgs/staging"; + flakeUtils.url = "github:numtide/flake-utils"; # TODO use upstream nix utils + openvr = {url = "github:ValveSoftware/openvr"; flake = false;}; + }; + + outputs = { self, nixpkgs, nixpkgsStaging, flakeUtils, openvr }: + flakeUtils.lib.eachDefaultSystem (system: + with nixpkgs.legacyPackages.${system}; + let + buildPackages = [ + alsa-lib + cargo + libclang + ffmpeg.dev + jack1 + git + llvmPackages.libclang + openssl + pipewire.dev + pkg-config + nixpkgsStaging.legacyPackages.${system}.rustc + vulkan-headers + ]; + + dependencyPackages = [ + brotli + celt + ffmpeg + gccStdenv.cc # g++ for vrcompositor_wrapper + gccStdenv.cc.cc.lib # crti.o and friends + lame + libdrm + libglvnd + libogg + libpng + libtheora + libunwind + libva + libvdpau + libxkbcommon + nasm + openssl + pipewire + soxr + stdenv.cc.cc.lib + vaapiVdpau + vulkan-headers + vulkan-headers + vulkan-loader + wayland + x264 + xorg.libX11 + xorg.libXcursor + xorg.libXi + xorg.libXrandr + xvidcore + ]; + + nvidiaPackages = with cudaPackages; [ + cuda_cudart + cuda_nvcc + libnpp + ]; + + libsPatch = toString (replaceVars + ./fix-finding-libs.patch { + ffmpeg = lib.getDev ffmpeg; + x264 = lib.getDev x264; + }); + + devShell = {stdenv, nvidia}: (mkShell.override { + stdenv = stdenv; + }) { + # LIBCLANG_PATH="${llvmPackages.libclang.lib}"; + LIBCLANG_PATH="${libclang.lib}/lib"; + buildInputs = buildPackages ++ dependencyPackages ++ (lib.optionals nvidia nvidiaPackages) ++ [ + watchexec + ]; + # LIBS_PATCH = writeText "libs.patch" libsPatch; + RUSTFLAGS = map (a: "-C link-arg=${a}") [ + "-Wl,--push-state,--no-as-needed" + "-lEGL" + "-lclang" + "-lva" + "-lpng" + "-lbrotlidec" + "-lwayland-client" + "-lxkbcommon" + "-Wl,--pop-state" + ]; + RUST_BACKTRACE = "1"; # TODO + shellHook = '' + git apply ${libsPatch} + ''; + }; + in + { + # packages.default = pkgs.rustPlatform.buildRustPackage rec { + # pname = "alvr"; + # BINDGEN_EXTRA_CLANG_ARGS = [ + # ''-I"${pkgs.llvmPackages.libclang.lib}/lib/clang/${pkgs.llvmPackages.libclang.version}/include"'' + # "-I ${pkgs.glibc.dev}/include" + # ]; # TODO + # version = "21"; # TODO + # OPENVR_PATH = "${openvr}"; + # doCheck = false; # TODO + # # LIBCLANG_PATH = "${pkgs.libclang.lib}/lib"; + # LIBCLANG_PATH = "${pkgs.llvmPackages.libclang.lib}/lib"; + # postUnpack = '' + # # Deal with submodules which is still annoying in Nix. + # ln -s $OPENVR_PATH $(ls | grep -- -source)/openvr + # ''; + # src = ./.; + # RUST_BACKTRACE = "full"; # TODO + # nativeBuildInputs = buildPackages; + # buildInputs = buildPackages ++ dependencyPackages; + # dontCargoInstall = true; # TODO + # cargoLock = { + # lockFile = ./Cargo.lock; + # outputHashes = { + # "openxr-0.17.1" = "sha256-fG/JEqQQwKP5aerANAt5OeYYDZxcvUKCCaVdWRqHBPU="; + # "settings-schema-0.2.0" = "sha256-luEdAKDTq76dMeo5kA+QDTHpRMFUg3n0qvyQ7DkId0k="; + # }; + # }; + # CARGO_MANIFEST_DIR = ./.; # probably unneeded + # }; + + devShells.default = devShell { stdenv = clangStdenv; nvidia = false; }; + devShells.nvidia = devShell { stdenv = clangStdenv; nvidia = true; }; + } + ); +}