首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误:一个Nix包试图将文件粘贴到提交的另一个Nix包(self.NixOS)中

错误:一个Nix包试图将文件粘贴到提交的另一个Nix包(self.NixOS)中
EN

Stack Overflow用户
提问于 2017-09-18 12:15:40
回答 1查看 205关注 0票数 0

1背景

我试图为两个包构建nix表达式:

  1. OSVR-Core
  2. OSVR-Vive

我已经成功地写了(1),但是,我对(2)有一个问题。这部分是因为为了构建(2),您需要(1)作为依赖项。但问题是:(2)试图将文件粘贴到(1)中。

2错误信息

下面是我在试图构建(2)时得到的错误消息:

代码语言:javascript
复制
-- 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

代码语言:javascript
复制
{ 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

代码语言:javascript
复制
{ 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
  };
}
EN

回答 1

Stack Overflow用户

发布于 2017-09-18 15:26:55

从你的帖子来看,OSVR是某种接受插件的软件,而OSVR是OSVR的插件。插件应该以共享对象的形式存储在安装OSVR的lib/osvr-plugins-0目录中。

这个计划在正常的Linux系统上运行得很好,那里的文件系统是免费的,程序只需在自己想安装的地方安装,但Nix的行为不是这样的。

首先,您应该为OSVR-Vive制作并应用一个补丁,以便它将插件安装到它自己的Nix存储输出的某个地方。

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

另一个计划是在相同的派生中构建OSVR-CoreOSVR-Vive,以便它们都可以将文件写入同一个lib目录。一般来说,这听起来不太理想,但你很可能不用做任何修补就能让它正常工作。

如何在Nix中修补软件

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

代码语言:javascript
复制
diff -ur mysoftware-orig mysoftware > mypatch.patch

然后你可以把它包含在你的尼克斯推导中。如果您正在使用标准的nixpkgs设置来构建,我认为您只需编写如下内容:

代码语言:javascript
复制
patches = [ ./mypatch.patch; ];

无论如何,您可以在nixpkgs存储库中查看如何修补软件的许多示例。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46279065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档