1背景
我试图为两个包构建nix表达式:
OSVR-CoreOSVR-Vive我已经成功地写了(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
};
}发布于 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-Core和OSVR-Vive,以便它们都可以将文件写入同一个lib目录。一般来说,这听起来不太理想,但你很可能不用做任何修补就能让它正常工作。
如何在Nix中修补软件
要制作补丁,应该在一个目录中提取软件源代码的两个副本,并用类似于"-orig“的后缀命名其中一个。然后修改另一个副本。然后跑:
diff -ur mysoftware-orig mysoftware > mypatch.patch然后你可以把它包含在你的尼克斯推导中。如果您正在使用标准的nixpkgs设置来构建,我认为您只需编写如下内容:
patches = [ ./mypatch.patch; ];无论如何,您可以在nixpkgs存储库中查看如何修补软件的许多示例。
https://stackoverflow.com/questions/46279065
复制相似问题