我正在尝试为两个包构建nix表达式:
OSVR-Core
OSVR-Vive
我已成功写过(1);但是,我遇到了问题(2)。这部分是因为为了构建(2),您需要(1)作为依赖。但问题在于:(2)尝试将文件粘贴到(1)。
以下是我在尝试构建时遇到的错误消息(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
,然后失败。
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
};
}
答案 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-Core
和OSVR-Vive
,这样他们就可以将文件写入同一个lib
目录。这听起来并不理想,但你可以在不进行任何修补的情况下让它工作。
要制作补丁,应该做的是在一个目录中提取软件源代码的两个副本,并使用类似" -orig"的后缀命名其中一个。然后修改其他副本。然后运行:
diff -ur mysoftware-orig mysoftware > mypatch.patch
然后你可以在你的Nix派生中加入它。如果您使用标准的nixpkgs设置进行构建,我想您只需编写类似的内容:
patches = [ ./mypatch.patch; ];
无论如何,您可以在nixpkgs存储库中查找有关如何修补软件的大量示例。