build rpm-packaging: Remove boost dependencies from VOM
[vpp.git] / extras / rpm / vpp.spec
1 %bcond_without aesni
2 %{!?_topdir:%define _topdir %(pwd)}
3 %define _vpp_build_dir   build-tool-native
4 %define _unitdir         /lib/systemd/system
5 %define _builddir        %{_topdir}
6 %define _mu_build_dir    %{_topdir}/%{name}-%{_version}/build-root
7 %define _vpp_tag         %{getenv:TAG}
8 %if "%{_vpp_tag}" == ""
9 %define _vpp_tag         vpp
10 %endif
11 %define _vpp_install_dir install-%{_vpp_tag}-native
12
13 %{?systemd_requires}
14
15
16 # SELinux Related definitions
17 %global selinuxtype targeted
18 %global moduletype  services
19 %global modulenames vpp-custom
20
21 # Usage: _format var format
22 #   Expand 'modulenames' into various formats as needed
23 #   Format must contain '$x' somewhere to do anything useful
24 %global _format() export %1=""; for x in %{modulenames}; do %1+=%2; %1+=" "; done;
25
26 # Relabel files
27 %global relabel_files() \ # ADD files in *.fc file
28
29 # Version of distribution SELinux policy package
30 %global selinux_policyver 3.13.1-128.6.fc22
31
32
33 Name: vpp
34 Summary: Vector Packet Processing
35 License: ASL 2.0
36 Version: %{_version}
37 Release: %{_release}
38 BuildRequires: systemd, chrpath
39 BuildRequires: check, check-devel
40 BuildRequires: mbedtls-devel mbedtls
41 %if 0%{?fedora}
42 Requires: vpp-lib = %{_version}-%{_release}, vpp-selinux-policy = %{_version}-%{_release}, net-tools, pciutils
43 Requires: compat-openssl10
44 Requires: mbedtls libffi-devel
45 BuildRequires: subunit, subunit-devel
46 BuildRequires: compat-openssl10-devel
47 BuildRequires: python, python-devel, python-virtualenv, python-ply
48 BuildRequires: python3, python36-devel, python3-virtualenv
49 BuildRequires: cmake
50 %else
51 %if 0%{rhel} >= 7
52 Requires: vpp-lib = %{_version}-%{_release}, vpp-selinux-policy = %{_version}-%{_release}, net-tools, pciutils, python36
53 Requires: mbedtls libffi-devel
54 BuildRequires: epel-release
55 BuildRequires: mbedtls-devel mbedtls
56 BuildREquires: openssl-devel
57 BuildRequires: python36-devel
58 %if 0%{rhel} == 7
59 BuildRequires: devtoolset-9-toolchain
60 BuildRequires: cmake3
61 BuildRequires: glibc-static, yum-utils
62 %else
63 BuildRequires: cmake
64 BuildRequires: dnf-utils
65 %endif
66 %endif
67 %endif
68 BuildRequires: libffi-devel
69 BuildRequires: redhat-lsb
70 BuildRequires: apr-devel
71 BuildRequires: numactl-devel
72 BuildRequires: autoconf automake libtool byacc bison flex
73 BuildRequires: selinux-policy selinux-policy-devel
74
75 Source: %{name}-%{_version}-%{_release}.tar.xz
76 # Source: vpp-latest.tar.xz
77
78 %description
79 This package provides VPP executables: vpp, vpp_api_test, vpp_json_test
80 vpp - the vector packet engine
81 vpp_api_test - vector packet engine API test tool
82 vpp_json_test - vector packet engine JSON test tool
83
84 %package lib
85 Summary: VPP libraries
86 Group: System Environment/Libraries
87 Requires: vpp-selinux-policy = %{_version}-%{_release}
88
89 %description lib
90 This package contains the VPP shared libraries, including:
91 vppinfra - foundation library supporting vectors, hashes, bitmaps, pools, and string formatting.
92 svm - vm library
93 vlib - vector processing library
94 vlib-api - binary API library
95 vnet -  network stack library
96
97 %package devel
98 Summary: VPP header files, static libraries
99 Group: Development/Libraries
100 Requires: vpp-lib
101
102 %description devel
103 This package contains the header files for VPP.
104 Install this package if you want to write a
105 program for compilation and linking with vpp lib.
106 vlib
107 vlibmemory
108 vnet - devices, classify, dhcp, ethernet flow, gre, ip, etc.
109 vpp-api
110 vppinfra
111
112 %package plugins
113 Summary: Vector Packet Processing--runtime plugins
114 Group: System Environment/Libraries
115 Requires: vpp = %{_version}-%{_release} numactl-libs
116 %description plugins
117 This package contains VPP plugins
118
119 %package api-lua
120 Summary: VPP api lua bindings
121 Group: Development/Libraries
122 Requires: vpp = %{_version}-%{_release}, vpp-lib = %{_version}-%{_release}
123
124 %description api-lua
125 This package contains the lua bindings for the vpp api
126
127 %package api-python3
128 Summary: VPP api python3 bindings
129 Group: Development/Libraries
130 Requires: vpp = %{_version}-%{_release}, vpp-lib = %{_version}-%{_release}, libffi-devel
131 Requires: python3-setuptools
132
133 %description api-python3
134 This package contains the python3 bindings for the vpp api
135
136 %package selinux-policy
137 Summary: VPP Security-Enhanced Linux (SELinux) policy
138 Group: System Environment/Base
139 Requires(post): selinux-policy-base >= %{selinux_policyver}, selinux-policy-targeted >= %{selinux_policyver}, policycoreutils, libselinux-utils
140 %if 0%{rhel} < 8
141 Requires(post): policycoreutils-python
142 %else
143 Requires(post): python3-policycoreutils
144 %endif
145
146 %description selinux-policy
147 This package contains a tailored VPP SELinux policy
148
149 %prep
150 %setup -q -c -T -n %{name}-%{_version}
151 cd ..
152 unxz --stdout ./SOURCES/%{name}-%{_version}-%{_release}.tar.xz | tar --extract --touch
153 cd -
154
155 %pre
156 # Add the vpp group
157 groupadd -f -r vpp
158
159 %build
160 %if 0%{rhel} < 8
161 . /opt/rh/devtoolset-9/enable
162 %endif
163 %if %{with aesni}
164     make install-dep
165     make -C build-root PLATFORM=vpp TAG=%{_vpp_tag} install-packages
166 %else
167     make bootstrap AESNI=n
168     make -C build-root PLATFORM=vpp AESNI=n TAG=%{_vpp_tag} install-packages
169 %endif
170 cd %{_mu_build_dir}/../src/vpp-api/python && %py3_build
171 cd %{_mu_build_dir}/../extras/selinux && make -f %{_datadir}/selinux/devel/Makefile
172
173 %install
174 #
175 # binaries
176 #
177 mkdir -p -m755 %{buildroot}%{_bindir}
178 mkdir -p -m755 %{buildroot}%{_unitdir}
179 install -p -m 755 %{_mu_build_dir}/%{_vpp_install_dir}/vpp/bin/* %{buildroot}%{_bindir}
180
181 # api
182 mkdir -p -m755 %{buildroot}/usr/share/vpp/api
183
184 #
185 # configs
186 #
187 mkdir -p -m755 %{buildroot}/etc/vpp
188 mkdir -p -m755 %{buildroot}/etc/sysctl.d
189 install -p -m 644 %{_mu_build_dir}/../extras/rpm/vpp.service %{buildroot}%{_unitdir}
190 install -p -m 644 %{_mu_build_dir}/../src/vpp/conf/startup.conf %{buildroot}/etc/vpp/startup.conf
191 install -p -m 644 %{_mu_build_dir}/../src/vpp/conf/80-vpp.conf %{buildroot}/etc/sysctl.d
192 #
193 # libraries
194 #
195 mkdir -p -m755 %{buildroot}%{_libdir}
196 mkdir -p -m755 %{buildroot}/etc/bash_completion.d
197 mkdir -p -m755 %{buildroot}/usr/share/vpp
198 for file in $(find %{_mu_build_dir}/%{_vpp_install_dir}/*/lib* -type f -name '*.so.*.*' -print )
199 do
200         install -p -m 755 $file %{buildroot}%{_libdir}
201 done
202 for file in $(cd %{buildroot}%{_libdir} && find . -type f -print | sed -e 's/^\.\///')
203 do
204         # make lib symlinks
205         ( cd %{buildroot}%{_libdir} && 
206           ln -fs $file $(echo $file | sed -e 's/\(\.so\.[0-9]\+\).*/\1/') )
207         ( cd %{buildroot}%{_libdir} && 
208           ln -fs $file $(echo $file | sed -e 's/\(\.so\)\.[0-9]\+.*/\1/') )
209 done
210 for file in $(find %{_mu_build_dir}/%{_vpp_install_dir}/vpp/share/vpp/api  -type f -name '*.api.json' -print )
211 do
212         install -p -m 644 $file %{buildroot}/usr/share/vpp/api
213 done
214
215 # Lua bindings
216 mkdir -p -m755 %{buildroot}/usr/share/doc/vpp/examples/lua/examples/cli
217 mkdir -p -m755 %{buildroot}/usr/share/doc/vpp/examples/lua/examples/lute
218 # for file in $(cd %{_mu_build_dir}/%{_vpp_install_dir}/../../src/vpp-api/lua && git ls-files .)
219 for file in $(cd %{_mu_build_dir}/%{_vpp_install_dir}/../../src/vpp-api/lua && find . -type f -regex '.*/*.[luteamd]' -print | sed -e 's/^\.\///')
220 do
221         ( cd %{_mu_build_dir}/%{_vpp_install_dir}/../../src/vpp-api/lua && install -p -m 644 $file \
222            %{buildroot}/usr/share/doc/vpp/examples/lua/$file )
223 done
224
225 # Python bindings
226 cd %{_mu_build_dir}/../src/vpp-api/python && %py3_install
227
228 # SELinux Policy
229 # Install SELinux interfaces
230 %_format INTERFACES %{_mu_build_dir}/../extras/selinux/$x.if
231 install -d %{buildroot}%{_datadir}/selinux/devel/include/%{moduletype}
232 install -p -m 644 $INTERFACES \
233     %{buildroot}%{_datadir}/selinux/devel/include/%{moduletype}
234
235 # Install policy modules
236 %_format MODULES %{_mu_build_dir}/../extras/selinux/$x.pp
237 install -d %{buildroot}%{_datadir}/selinux/packages
238 install -m 0644 $MODULES \
239     %{buildroot}%{_datadir}/selinux/packages
240
241 #
242 # devel
243 #
244 for dir in %{_mu_build_dir}/%{_vpp_install_dir}/vpp/include/
245 do
246         for subdir in $(cd ${dir} && find . -type d -print)
247         do
248                 mkdir -p -m755 %{buildroot}/usr/include/${subdir}
249         done
250         for file in $(cd ${dir} && find . -type f -print)
251         do
252                 install -p -m 644 $dir/$file %{buildroot}%{_includedir}/$file
253         done
254 done
255
256 install -p -m 644 %{_mu_build_dir}/../src/tools/vppapigen/vppapigen_c.py %{buildroot}/usr/share/vpp
257 install -p -m 644 %{_mu_build_dir}/../src/tools/vppapigen/vppapigen_json.py %{buildroot}/usr/share/vpp
258
259 # sample plugin
260 mkdir -p -m755 %{buildroot}/usr/share/doc/vpp/examples/sample-plugin/sample
261 #for file in $(cd %{_mu_build_dir}/%{_vpp_install_dir}/../../src/examples/sample-plugin && git ls-files .)
262 for file in $(cd %{_mu_build_dir}/%{_vpp_install_dir}/../../src/examples/sample-plugin && find . -type f -regex '.*/*.[acdhimp]' -print | sed -e 's/^\.\///')
263 do
264         ( cd %{_mu_build_dir}/%{_vpp_install_dir}/../../src/examples/sample-plugin && install -p -m 644 $file \
265            %{buildroot}/usr/share/doc/vpp/examples/sample-plugin/$file )
266 done
267
268 # vppctl sockfile directory
269 mkdir -p -m755 %{buildroot}%{_localstatedir}/run/vpp
270 # vpp.log directory
271 mkdir -p -m755 %{buildroot}%{_localstatedir}/log/vpp
272
273 #
274 # vpp-plugins
275 #
276 mkdir -p -m755 %{buildroot}/usr/lib/vpp_plugins
277 mkdir -p -m755 %{buildroot}/usr/lib/vpp_api_test_plugins
278 for file in $(cd %{_mu_build_dir}/%{_vpp_install_dir}/vpp/%{_lib}/vpp_plugins && find -type f -print)
279 do
280         install -p -m 755 %{_mu_build_dir}/%{_vpp_install_dir}/vpp/%{_lib}/vpp_plugins/$file \
281            %{buildroot}/usr/lib/vpp_plugins/$file
282 done
283
284 for file in $(cd %{_mu_build_dir}/%{_vpp_install_dir}/vpp/%{_lib}/vpp_api_test_plugins && find -type f -print)
285 do
286         install -p -m 755 %{_mu_build_dir}/%{_vpp_install_dir}/vpp/%{_lib}/vpp_api_test_plugins/$file \
287            %{buildroot}/usr/lib/vpp_api_test_plugins/$file
288 done
289
290 for file in $(find %{_mu_build_dir}/%{_vpp_install_dir}/vpp/share/vpp/api/plugins -type f -name '*.api.json' -print )
291 do
292         install -p -m 755 $file %{buildroot}/usr/share/vpp/api
293 done
294
295 #
296 # remove RPATH from ELF binaries
297 #
298 %{_mu_build_dir}/scripts/remove-rpath %{buildroot}
299
300 %post
301 if [ $1 -eq 1 ] ; then
302     sysctl --system
303 fi
304 %systemd_post vpp.service
305
306 %preun
307 %systemd_preun vpp.service
308
309 %post selinux-policy
310 %_format MODULES %{_datadir}/selinux/packages/$x.pp
311 if %{_sbindir}/selinuxenabled ; then
312     %{_sbindir}/semodule -n -X 400 -s %{selinuxtype} -i $MODULES
313     %{_sbindir}/load_policy
314     %relabel_files
315 fi
316
317
318 %postun
319 %systemd_postun
320 if [ $1 -eq 0 ] ; then
321     echo "Uninstalling, unbind user-mode PCI drivers"
322     # Unbind user-mode PCI drivers
323     removed=
324     pci_dirs=`find /sys/bus/pci/drivers -type d -name igb_uio -o -name uio_pci_generic -o -name vfio-pci`
325     for d in $pci_dirs; do
326         for f in ${d}/*; do
327             [ -e "${f}/config" ] || continue
328             echo ${f##*/} > ${d}/unbind
329             basename `dirname ${f}` | xargs echo -n "Removing driver"; echo " for PCI ID" `basename ${f}`
330             removed=y
331         done
332     done
333     if [ -n "${removed}" ]; then
334         echo "There are changes in PCI drivers, rescaning"
335         echo 1 > /sys/bus/pci/rescan
336     else
337         echo "There weren't PCI devices binded"
338     fi
339 else
340     echo "Upgrading package, dont' unbind interfaces"
341 fi
342
343 %postun selinux-policy
344 if [ $1 -eq 0 ]; then
345     %{_sbindir}/semodule -n -r %{modulenames}
346     if %{_sbindir}/selinuxenabled ; then
347         %{_sbindir}/load_policy
348         %relabel_files
349     fi
350 fi
351
352 %files
353 %defattr(-,bin,bin)
354 %{_unitdir}/vpp.service
355 /usr/bin/vat2
356 /usr/bin/vpp*
357 /usr/bin/svm*
358 %config(noreplace) /etc/sysctl.d/80-vpp.conf
359 %config(noreplace) /etc/vpp/startup.conf
360 /usr/share/vpp/api/*
361
362 %defattr(-,root,vpp)
363 %{_localstatedir}/run/vpp*
364
365 %defattr(-,root,root)
366 %{_localstatedir}/log/vpp*
367
368 %files lib
369 %defattr(-,bin,bin)
370 %global __requires_exclude_from %{_libdir}/librte_pmd_mlx[45]_glue\\.so.*$
371 %exclude %{_libdir}/vpp_plugins
372 %exclude %{_libdir}/vpp_api_test_plugins
373 %{_libdir}/*
374 /usr/share/vpp/api/*
375
376 %files api-lua
377 %defattr(644,root,root,644)
378 /usr/share/doc/vpp/examples/lua
379
380 %files api-python3
381 %defattr(644,root,root,755)
382 %{python3_sitelib}/vpp_*
383
384 %files selinux-policy
385 %defattr(-,root,root,0755)
386 %attr(0644,root,root) %{_datadir}/selinux/packages/*.pp
387 %attr(0644,root,root) %{_datadir}/selinux/devel/include/%{moduletype}/*.if
388
389 %files devel
390 %defattr(-,bin,bin)
391 /usr/bin/vppapigen
392 /usr/bin/vapi_c_gen.py
393 /usr/bin/vapi_cpp_gen.py
394 /usr/bin/vapi_json_parser.py
395 %{_includedir}/*
396 /usr/share/doc/vpp/examples/sample-plugin
397 /usr/share/vpp
398
399 %files plugins
400 %defattr(-,bin,bin)
401 /usr/lib/vpp_plugins/*
402 /usr/lib/vpp_api_test_plugins/*
403 /usr/share/vpp/api/*