diff --git a/.gitignore b/.gitignore index 22a1d53a879..8b1184a6c1a 100644 --- a/.gitignore +++ b/.gitignore @@ -380,3 +380,6 @@ $RECYCLE.BIN/ *.msp *.lnk *.generated.props + +# Nix +result diff --git a/flake.lock b/flake.lock new file mode 100644 index 00000000000..af9fb58832a --- /dev/null +++ b/flake.lock @@ -0,0 +1,43 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1736390910, + "narHash": "sha256-MmOb9KKtflYASR0NsEJxyWAQy8tLUzQKypMZ/D5pMfg=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "52d9f693941a15687549d05215450cefa4fc3a03", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "master", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs", + "systems": "systems" + } + }, + "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 00000000000..2599575e2d0 --- /dev/null +++ b/flake.nix @@ -0,0 +1,88 @@ +{ + description = "A Nix-flake-based C/C++ development environment"; + + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/master"; + systems.url = "github:nix-systems/default"; + }; + + outputs = + { + self, + nixpkgs, + systems, + }: + let + forEachSupportedSystem = + f: + nixpkgs.lib.genAttrs (import systems) ( + system: + f { + pkgs = import nixpkgs { inherit system; }; + } + ); + in + { + packages = forEachSupportedSystem ( + { + pkgs, + }: + { + default = pkgs.callPackage ./package.nix { + }; + } + ); + devShells = forEachSupportedSystem ( + { + pkgs, + }: + { + default = + pkgs.mkShell.override + { + # Override stdenv in order to change compiler: + # stdenv = pkgs.clangStdenv; + } + rec { + packages = + with pkgs; + [ + pkg-config + autoPatchelfHook + installShellFiles + python3 + makeWrapper + dotnet-sdk_9 + dotnet-runtime_9 + vulkan-loader + vulkan-headers + fontconfig + fontconfig.lib + scons + ] + ++ pkgs.lib.optionals pkgs.stdenv.targetPlatform.isLinux [ + speechd + alsa-lib + xorg.libX11 + xorg.libXcursor + xorg.libXinerama + xorg.libXext + xorg.libXrandr + xorg.libXrender + xorg.libXi + xorg.libXfixes + libxkbcommon + dbus + dbus.lib + udev + wayland-scanner + wayland + libdecor + libpulseaudio + ]; + LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath packages; + }; + } + ); + }; +} diff --git a/package.nix b/package.nix new file mode 100644 index 00000000000..9cdb7c53b8c --- /dev/null +++ b/package.nix @@ -0,0 +1,146 @@ +{ + stdenv, + lib, + enableWayland ? stdenv.hostPlatform.isLinux, + enablePulseAudio ? stdenv.hostPlatform.isLinux, + enableX11 ? stdenv.hostPlatform.isLinux, + enableAlsa ? stdenv.hostPlatform.isLinux, + enableSpeechd ? stdenv.hostPlatform.isLinux, + enableMono ? false, + enableVulkan ? true, + pkg-config, + autoPatchelfHook, + installShellFiles, + python3, + scons, + makeWrapper, + libGL, + vulkan-loader, + vulkan-headers, + speechd, + fontconfig, + wayland, + wayland-scanner, + wayland-protocols, + libdecor, + libxkbcommon, + libpulseaudio, + xorg, + eudev, + alsa-lib, + dbus, + xcbuild, + darwin, + dotnet-sdk_9, + dotnet-runtime_9, +}: + +stdenv.mkDerivation { + name = "redot-engine"; + src = ./.; + + nativeBuildInputs = + [ + pkg-config + autoPatchelfHook + installShellFiles + makeWrapper + python3 + scons + ] + ++ lib.optionals enableMono [ + dotnet-sdk_9 + ] + ++ lib.optionals enableWayland [ + wayland-scanner + ]; + + buildInputs = + [ + fontconfig + libGL + ] + ++ lib.optionals enableSpeechd [ speechd ] + ++ lib.optionals enableVulkan [ + vulkan-loader + vulkan-headers + ] + ++ lib.optionals enableWayland [ + wayland + wayland-protocols + libdecor + libxkbcommon + ] + ++ lib.optionals enablePulseAudio [ libpulseaudio ] + ++ lib.optionals enableX11 [ + xorg.libX11 + xorg.libXcursor + xorg.libXinerama + xorg.libXext + xorg.libXrandr + xorg.libXrender + xorg.libXi + xorg.libXfixes + ] + ++ lib.optionals enableAlsa [ alsa-lib ] + ++ lib.optionals stdenv.targetPlatform.isLinux [ + eudev + dbus + ] + ++ lib.optionals stdenv.targetPlatform.isDarwin [ + xcbuild + darwin.moltenvk + ] + ++ lib.optionals stdenv.targetPlatform.isDarwin ( + with darwin.apple_sdk.frameworks; + [ + AppKit + ] + ) + ++ lib.optionals enableMono [ + dotnet-runtime_9 + ]; + + runtimeDependencies = + [ + fontconfig.lib + libGL + ] + ++ lib.optionals stdenv.targetPlatform.isLinux [ + eudev + dbus + ] + ++ lib.optionals enableSpeechd [ speechd ] + ++ lib.optionals enableVulkan [ + vulkan-loader + ] + ++ lib.optionals enableWayland [ + wayland + libdecor + libxkbcommon + ] + ++ lib.optionals enablePulseAudio [ libpulseaudio ] + ++ lib.optionals enableX11 [ + xorg.libX11 + xorg.libXcursor + xorg.libXinerama + xorg.libXext + xorg.libXrandr + xorg.libXrender + xorg.libXi + xorg.libXfixes + ] + ++ lib.optionals enableAlsa [ alsa-lib ]; + + sconsFlags = lib.optionals stdenv.targetPlatform.isDarwin [ + "vulkan_sdk_path=${darwin.moltenvk}" + ]; + + installPhase = '' + runHook preInstall + mkdir -p "$out/bin" + cp bin/redot*.* $out/bin/redot + + runHook postInstall + ''; +} diff --git a/platform_methods.py b/platform_methods.py index c8646a40226..18b77fa0fcf 100644 --- a/platform_methods.py +++ b/platform_methods.py @@ -155,8 +155,12 @@ def detect_mvk(env, osname): ) for mvk_path in mvk_list: + # FIXME: Iterate over all files in the sdk path if mvk_path and os.path.isfile(os.path.join(mvk_path, f"{osname}/libMoltenVK.a")): print(f"MoltenVK found at: {mvk_path}") return mvk_path + elif mvk_path and os.path.isfile(os.path.join(mvk_path, f"lib/libMoltenVK.dylib")): + print(f"MoltenVK found at: {mvk_path}") + return mvk_path return ""