Rebind kernel drivers on VPP uninstall
[vpp.git] / build-root / rpm / vpp.spec
1 %define _vpp_install_dir ../%{_install_dir}
2 %define _vpp_build_dir   ../build-tool-native
3 %define _unitdir         /lib/systemd/system
4 %define _topdir          %(pwd)
5 %define _builddir        %{_topdir}
6 %define _version         %(../scripts/version rpm-version)
7 %define _release         %(../scripts/version rpm-release)
8
9 # Failsafe backport of Python2-macros for RHEL <= 6
10 %{!?python_sitelib: %global python_sitelib      %(%{__python} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())")}
11 %{!?python_sitearch:    %global python_sitearch     %(%{__python} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib(1))")}
12 %{!?python_version: %global python_version      %(%{__python} -c "import sys; sys.stdout.write(sys.version[:3])")}
13 %{!?__python2:      %global __python2       %{__python}}
14 %{!?python2_sitelib:    %global python2_sitelib     %{python_sitelib}}
15 %{!?python2_sitearch:   %global python2_sitearch    %{python_sitearch}}
16 %{!?python2_version:    %global python2_version     %{python_version}}
17
18 %{!?python2_minor_version: %define python2_minor_version %(%{__python} -c "import sys ; print sys.version[2:3]")}
19
20 %{?systemd_requires}
21
22 Name: vpp
23 Summary: Vector Packet Processing
24 License: MIT
25 Version: %{_version}
26 Release: %{_release}
27 Requires: vpp-lib = %{_version}-%{_release}, net-tools, pciutils, python
28 BuildRequires: systemd
29
30 %description
31 This package provides VPP executables: vpp, vpp_api_test, vpp_json_test
32 vpp - the vector packet engine
33 vpp_api_test - vector packet engine API test tool
34 vpp_json_test - vector packet engine JSON test tool
35
36 %package lib
37 Summary: VPP libraries
38 Group: System Environment/Libraries
39
40 %description lib
41 This package contains the VPP shared libraries, including:
42 vppinfra - foundation library supporting vectors, hashes, bitmaps, pools, and string formatting.
43 dpdk - Intel DPDK library
44 svm - vm library
45 vlib - vector processing library
46 vlib-api - binary API library
47 vnet -  network stack library
48
49 %package devel
50 Summary: VPP header files, static libraries
51 Group: Development/Libraries
52 Requires: vpp-lib
53
54 %description devel
55 This package contains the header files and static libraries for
56 vppinfra.  Install this package if you want to write or compile a
57 program that needs vpp.
58 Do we need to list those header files or just leave it blank ? 
59 dynamic vectors (vec.c), dynamic bitmaps (bitmap.h), allocation heap of
60 objects (heap.c), allocation pool(pool.h), dynamic hash tables (hash.c), memory
61 allocator (mheap.c), extendable printf-like interface built on top of vectors
62 (format.c), formats for data structures (std-formats.c), and support for clock
63 time-based function calls (timer.c).
64 TODO: reference and describe only the .h files
65
66 %package plugins
67 Summary: Vector Packet Processing--runtime plugins
68 Group: System Environment/Libraries
69 Requires: vpp = %{_version}-%{_release}
70 %description plugins
71 This package contains VPP plugins
72
73 %package python-api
74 Summary: VPP api python bindings
75 Group: Development/Libraries
76 Requires: vpp = %{_version}-%{_release}, vpp-lib = %{_version}-%{_release}
77
78 %description python-api
79 This package contains the python bindings for the vpp api
80
81 %pre
82 # Add the vpp group
83 groupadd -f -r vpp
84
85 %install
86 #
87 # binaries
88 #
89 mkdir -p -m755 %{buildroot}%{_bindir}
90 mkdir -p -m755 %{buildroot}%{_unitdir}
91 install -p -m 755 %{_vpp_install_dir}/*/bin/* %{buildroot}%{_bindir}
92 install -p -m 755 %{_vpp_build_dir}/vppapigen/vppapigen %{buildroot}%{_bindir}
93 install -p -m 755 ../../vppapigen/pyvppapigen.py %{buildroot}%{_bindir}
94 #
95 # configs
96 #
97 mkdir -p -m755 %{buildroot}/etc/vpp
98 mkdir -p -m755 %{buildroot}/usr/lib/sysctl.d
99 install -p -m 644 vpp.service %{buildroot}%{_unitdir}
100 install -p -m 644 ../../vpp/conf/startup.uiopcigeneric.conf %{buildroot}/etc/vpp/startup.conf
101 install -p -m 644 ../../vpp/conf/80-vpp.conf %{buildroot}/usr/lib/sysctl.d
102 #
103 # libraries
104 #
105 mkdir -p -m755 %{buildroot}%{_libdir}
106 for file in $(find %{_vpp_install_dir}/*/lib* -type f -name '*.so.*.*.*' -print )
107 do
108         install -p -m 755 $file %{buildroot}%{_libdir}
109 done
110 for file in $(cd %{buildroot}%{_libdir} && find . -type f -print | sed -e 's/^\.\///')
111 do
112         # make lib symlinks
113         ( cd %{buildroot}%{_libdir} && 
114           ln -fs $file $(echo $file | sed -e 's/\(\.so\.[0-9]\+\).*/\1/') )
115         ( cd %{buildroot}%{_libdir} && 
116           ln -fs $file $(echo $file | sed -e 's/\(\.so\)\.[0-9]\+.*/\1/') )
117 done
118
119 # Python bindings
120 mkdir -p -m755 %{buildroot}%{python2_sitelib}/vpp_papi
121 for file in $(find %{_vpp_install_dir}/*/lib/python2.7/site-packages/ -type f -print | grep -v pyc | grep -v pyo)
122 do
123         install -p -m 666 $file %{buildroot}%{python2_sitelib}/vpp_papi/
124 done
125
126 #
127 # devel
128 #
129 for dir in $(find %{_vpp_install_dir}/*/include/ -maxdepth 0 -type d -print | grep -v dpdk)
130 do
131         for subdir in $(cd ${dir} && find . -type d -print)
132         do
133                 mkdir -p -m755 %{buildroot}/usr/include/${subdir}
134         done
135         for file in $(cd ${dir} && find . -type f -print)
136         do
137                 install -p -m 644 $dir/$file %{buildroot}%{_includedir}/$file
138         done
139 done
140
141 mkdir -p -m755 %{buildroot}%{python2_sitelib}/jvppgen
142 install -p -m755 ../../vpp-api/java/jvpp/gen/jvpp_gen.py %{buildroot}/usr/bin
143 for i in $(ls ../../vpp-api/java/jvpp/gen/jvppgen/*.py); do
144    install -p -m666 ${i} %{buildroot}%{python2_sitelib}/jvppgen
145 done;
146
147 # sample plugin
148 mkdir -p -m755 %{buildroot}/usr/share/doc/vpp/examples/sample-plugin/sample
149 for file in $(cd %{_vpp_install_dir}/../../sample-plugin && find -type f -print)
150 do
151         install -p -m 644 %{_vpp_install_dir}/../../sample-plugin/$file \
152            %{buildroot}/usr/share/doc/vpp/examples/sample-plugin/$file
153 done
154
155
156 #
157 # vpp-plugins
158
159 mkdir -p -m755 %{buildroot}%{_libdir}/vpp_plugins
160 mkdir -p -m755 %{buildroot}%{_libdir}/vpp_api_test_plugins
161 for file in $(cd %{_vpp_install_dir}/plugins/lib64/vpp_plugins && find -type f -print)
162 do
163         install -p -m 644 %{_vpp_install_dir}/plugins/lib64/vpp_plugins/$file \
164            %{buildroot}%{_libdir}/vpp_plugins/$file
165 done
166
167 for file in $(cd %{_vpp_install_dir}/plugins/lib64/vpp_api_test_plugins && find -type f -print)
168 do
169         install -p -m 644 %{_vpp_install_dir}/plugins/lib64/vpp_api_test_plugins/$file \
170            %{buildroot}%{_libdir}/vpp_api_test_plugins/$file
171 done
172
173 %post
174 sysctl --system
175 %systemd_post vpp.service
176
177 %preun
178 %systemd_preun vpp.service
179
180 %postun
181 %systemd_postun
182
183 # Unbind user-mode PCI drivers
184 removed=
185 pci_dirs=`find /sys/bus/pci/drivers -type d -name igb_uio -o -name uio_pci_generic -o -name vfio-pci`
186 for d in $pci_dirs; do
187     for f in ${d}/*; do
188         [ -e "${f}/config" ] || continue
189         echo 1 > ${f}/remove
190         basename `dirname ${f}` | xargs echo -n "Removing driver"; echo " for PCI ID" `basename ${f}`
191         removed=y
192     done
193 done
194 if [ -n "${removed}" ]; then
195     echo "There are changes in PCI drivers, rescaning"
196     echo 1 > /sys/bus/pci/rescan
197 else
198     echo "There weren't PCI devices binded"
199 fi
200
201 %files
202 %defattr(-,bin,bin)
203 %{_unitdir}/vpp.service
204 /usr/bin/vpp*
205 /usr/bin/svm*
206 /usr/bin/elftool
207 %config /usr/lib/sysctl.d/80-vpp.conf
208 %config /etc/vpp/startup.conf
209
210 %files lib
211 %defattr(-,bin,bin)
212 %exclude %{_libdir}/vpp_plugins
213 %exclude %{_libdir}/vpp_api_test_plugins
214 %{_libdir}/*
215
216 %files python-api
217 %defattr(644,root,root)
218 %{python2_sitelib}/vpp_papi/*
219
220 %files devel
221 %defattr(-,bin,bin)
222 /usr/bin/vppapigen
223 /usr/bin/jvpp_gen.py
224 /usr/bin/pyvppapigen.py
225 %{_includedir}/*
226 %{python2_sitelib}/jvppgen/*
227 /usr/share/doc/vpp/examples/sample-plugin
228
229 %files plugins
230 %defattr(-,bin,bin)
231 %{_libdir}/vpp_plugins/*
232 %{_libdir}/vpp_api_test_plugins/*