-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathxvsdk.nix
More file actions
150 lines (124 loc) · 3.74 KB
/
Copy pathxvsdk.nix
File metadata and controls
150 lines (124 loc) · 3.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
{ stdenv
, lib
, dpkg
, autoPatchelfHook
, makeWrapper
, patchelf
, libusb1
, libjpeg8
, zlib
, opencv
, boost
, systemd
, callPackage
}:
let
octomap = callPackage ./octomap-1.9.nix { };
in
stdenv.mkDerivation rec {
pname = "xvsdk";
version = "3.2.0-20230907";
src = ./xvsdk_3.2.0-20230907_focal_amd64.deb;
nativeBuildInputs = [
dpkg
makeWrapper
patchelf
];
buildInputs = [
stdenv.cc.cc.lib
libusb1
libjpeg8
zlib
systemd
opencv
octomap
boost
];
dontAutoPatchelf = true;
unpackPhase = "dpkg-deb -x $src .";
installPhase = ''
mkdir -p $out
cp -r usr/* $out/
if [ -d lib ]; then
cp -r lib $out/
elif [ -d usr/lib ]; then
cp -r usr/lib $out/
else
echo "Error: Neither 'lib' nor 'usr/lib' directory found"
exit 1
fi
mkdir -p $out/include $out/src $out/include2
cp -r usr/include/* $out/include/
cp -r usr/include2/* $out/include2/
cp -r usr/share/xvsdk/* $out/src/
substituteInPlace $out/lib/pkgconfig/xvsdk.pc \
--replace "/usr" "$out"
mkdir -p $out/bin
if [ -d usr/bin ]; then
for f in usr/bin/*; do
if [ ! -e "$out/bin/$(basename $f)" ]; then
ln -s $out/$(realpath --relative-to="$out" "$f") $out/bin/$(basename $f)
fi
done
fi
# Handle OpenCV version mismatch by creating compatibility symlinks
mkdir -p $out/lib
# Create symlinks for OpenCV 4.2 that the binary expects
for lib in core imgproc highgui imgcodecs; do
actual_lib=$(ls ${opencv}/lib/libopencv_''${lib}.so.* 2>/dev/null | head -n1)
if [ -n "$actual_lib" ]; then
ln -sf "$actual_lib" $out/lib/libopencv_''${lib}.so.4.2
echo "Created symlink: libopencv_''${lib}.so.4.2 -> $actual_lib"
fi
done
if [ -f $out/lib/x86_64-linux-gnu/libxvuvc.so.0 ]; then
ln -sf $out/lib/x86_64-linux-gnu/libxvuvc.so.0 $out/lib/libxvuvc.so.0
fi
cp -L ${libjpeg8.out}/lib/libjpeg.so.8 $out/lib/libjpeg.so.8 || \
cp -L ${libjpeg8}/lib/libjpeg.so.8 $out/lib/libjpeg.so.8
cp ${./xv_c_wrapper.h} $out/include/xvsdk/xv_c_wrapper.h
g++ -std=c++11 -shared -fPIC \
-I$out/include/xvsdk \
-I$out/include2 \
-I${opencv}/include/opencv4 \
-L$out/lib \
-L${opencv}/lib \
-L${libjpeg8}/lib \
-o $out/lib/libxv_c_wrapper.so ${./xv_c_wrapper.cpp} \
-lxvsdk -lxslam-slam_core -lxslam-uvc-sdk -lxslam-vsc-sdk \
-loctomap -loctomath -lusb-1.0 -ljpeg \
-Wl,-rpath,$out/lib:${opencv}/lib:${octomap}/lib:${libusb1}/lib:${libjpeg8}/lib
cp ${./xv_c_wrapper.h} $out/include/xv_c_wrapper.h
'';
fixupPhase = ''
# Manually patch all ELF files
echo "Patching ELF files..."
# Define the complete RPATH
FULL_RPATH="$out/lib:${opencv}/lib:${octomap}/lib:${libusb1}/lib:${libjpeg8}/lib:${zlib}/lib:${systemd}/lib:${stdenv.cc.cc.lib}/lib"
# Patch libraries
for lib in $out/lib/*.so* $out/lib/x86_64-linux-gnu/*.so*; do
if [ -f "$lib" ] && file "$lib" | grep -q "ELF"; then
echo "Patching library: $lib"
patchelf --set-rpath "$FULL_RPATH" "$lib" || true
fi
done
# Patch binaries
for bin in $out/bin/*; do
if [ -f "$bin" ] && file "$bin" | grep -q "ELF"; then
echo "Patching binary: $bin"
patchelf --set-rpath "$FULL_RPATH" "$bin" || true
# Also wrap the program to ensure LD_LIBRARY_PATH is set
wrapProgram "$bin" \
--prefix LD_LIBRARY_PATH : "$FULL_RPATH"
fi
done
echo "Fixup phase completed"
'';
meta = with lib; {
description = "XVSDK for XVisio devices";
homepage = "https://www.xvisio.com/";
license = licenses.unfree;
platforms = ["x86_64-linux"];
maintainers = with maintainers; [ ];
};
}