错误:一个Nix包尝试将文件粘贴到另一个Nix包(self.NixOS)中

时间:2017-09-18 12:15:40

标签: nix

1上下文

我正在尝试为两个包构建nix表达式:

  1. OSVR-Core
  2. OSVR-Vive
  3. 我已成功写过(1);但是,我遇到了问题(2)。这部分是因为为了构建(2),您需要(1)作为依赖。但问题在于:(2)尝试将文件粘贴到(1)。

    2错误消息

    以下是我在尝试构建时遇到的错误消息(2):

    -- Installing: /nix/store/9y6p1npy94sbpb39l0rd8rgdhbknll6r-OSVR-Core/lib/osvr-plugins-0/com_osvr_Vive.so
    CMake Error at cmake_install.cmake:50 (file):
      file INSTALL cannot copy file
      "/tmp/nix-build-OSVR-Core.drv-0/OSVR-Vive-e0ebcdb/build/nix/store/9y6p1npy94sbpb39l0rd8rgdhbknll6r-OSV
    R-Core/lib/osvr-plugins-0/com_osvr_Vive.so"                                                            
      to
      "/nix/store/9y6p1npy94sbpb39l0rd8rgdhbknll6r-OSVR-Core/lib/osvr-plugins-0/com_osvr_Vive.so".
    
    
    make: *** [Makefile:74: install] Error 1
    builder for ‘/nix/store/cj1yzm9x1pdyzwd76dh7xn1vq6zvcnq2-OSVR-Core.drv’ failed with exit code 2
    

    如您所见,OSVR-Vive尝试将文件粘贴到/nix/store/*-OSVR-Core/lib/osvr-plugins-0,然后失败。

    3 Nix表达式(如果相关)

    OSVR-Core.nix

    { pkgs, stdenv, fetchgit, cmake, jsoncpp, opencv, python27, libusb1, boost }:
    
    stdenv.mkDerivation {
      name = "OSVR-Core";
      buildInputs = with pkgs; [ cmake
                                jsoncpp
                                opencv
                                python27
                                libusb1
                                boost
                                (callPackage ./libfunctionality.nix { })
                                ];
      src = fetchgit {
        url       = "https://github.com/OSVR/OSVR-Core.git";
        rev       = "95655d3174851670b85e9be8e8620ba28f9872f4";
        sha256    = "16sbfv4fxcvxqhm81in8lkvjpfbiz312kh7pm4vipj7dja1fchy8";
        deepClone = true; # git clone --recursive
      };
    }
    

    OSVR-Vive.nix

    { pkgs, stdenv, fetchgit, cmake, eigen3_3, boost, jsoncpp }:
    
    stdenv.mkDerivation {
      name = "OSVR-Vive";
      buildInputs = with pkgs; [ cmake
                                (callPackage ./libfunctionality.nix { })
                                (callPackage ./OSVR-Core.nix { })
                                eigen3_3
                                boost
                                jsoncpp
                                ];
      src = fetchgit {
        url    = "https://github.com/OSVR/OSVR-Vive.git";
        rev    = "e0ebcdbe2d065448fcebacc2828712a946695004";
        #sha256 = "1cf90x2ddqgylh98ssigr5c86l8psa3q512rl933kpz93n2can5g";
        sha256 = "1d10gp7xalqdclskxc804fp56gz3k1sqzzqbdm3y54iwshmahwfw";
        deepClone = true; # git clone --recursive
      };
    }
    

1 个答案:

答案 0 :(得分:1)

从你的帖子看,OSVR-Core看起来像某种接受插件的软件,OSVR-Vive是OSVR-Core的插件。插件应作为共享对象存储在安装OSVR-Core的lib/osvr-plugins-0目录中。

该计划适用于普通的Linux系统,其中文件系统是免费的,程序只是自己安装在任何地方,但这不是Nix的行为。

首先,您应该为OSVR-Vive制作并应用补丁,以便将其插件安装到自己的Nix商店输出中的某个位置。

接下来,您应该更改OSVR-Core,以便它知道如何在运行时找到这样的插件。我建议应该有一个名为OSVR_PLUGIN_PATH的环境变量,OSVR-Core应该搜索该变量中列出的所有目录。这种机制可能已经存在;您可以查看OSVR-Core的文档和源代码,看看是否存在。

另一个计划是在同一派生中构建OSVR-CoreOSVR-Vive,这样他们就可以将文件写入同一个lib目录。这听起来并不理想,但你可以在不进行任何修补的情况下让它工作。

如何在Nix中修补软件

要制作补丁,应该做的是在一个目录中提取软件源代码的两个副本,并使用类似" -orig"的后缀命名其中一个。然后修改其他副本。然后运行:

diff -ur mysoftware-orig mysoftware > mypatch.patch

然后你可以在你的Nix派生中加入它。如果您使用标准的nixpkgs设置进行构建,我想您只需编写类似的内容:

patches = [ ./mypatch.patch; ];

无论如何,您可以在nixpkgs存储库中查找有关如何修补软件的大量示例。