1 # SPDX-License-Identifier: GPL-2.0
4 # This file is part of Lustre, http://www.lustre.org/
8 # spec file template for RHEL package builds
11 # Declare rpmbuild --with/--without parameters
12 %bcond_without servers
13 %bcond_without ldiskfs
15 %bcond_without lustre_tests
16 %bcond_without lustre_utils
17 %bcond_without lustre_iokit
18 %bcond_without lustre_modules
20 %bcond_with gss_keyring
21 %bcond_without manpages
27 %bcond_with multiple_lnds
32 %bcond_without l_getsepol
34 %if %{with multiple_lnds}
35 %global enable_multi_lnds 1
38 # LUTF Turn off brp-python-precompile script as we don't want the python files
39 # to be compiled on installation
40 %global __os_install_post %(echo '%{__os_install_post}' | sed -e 's!/usr/lib[^[:space:]]*/brp-python-bytecompile[[:space:]].*$!!g')
42 # By default both gss and gss keyring are disabled.
43 # gss keyring requires the gss core. If the builder
44 # request gss_keyring we must enable gss core even if
45 # the builder attempts to disable gss.
46 %if %{with gss_keyring}
50 %if %{without servers}
51 # --without servers overrides --with {ldiskfs|zfs}
52 # so undefine the internal variables set by bcond_*
53 %undefine with_ldiskfs
57 %if %{without shared} && %{without static}
58 # need exit to stop build because error only displays a message
59 %{error: you can't disable both library types}
63 # lustre_tests depends on lustre_utils
64 %if %{without lustre_utils}
65 %undefine with_lustre_tests
68 %{!?version: %global version @VERSION@}
69 # if you want a custom kernel version set it variable with $ver.$arch
70 %{!?kver: %global kver @LINUXRELEASE@}
71 # cut epoch for kmodtool
72 %define _kver %(echo %{kver} | sed -e 's/^[0-9]*://')
73 # trust version from kdir - but it can lost 'epoch'
77 %if %{defined kobjdir}
80 %{!?kdir: %global kdir /lib/modules/%{_kver}/source}
81 %{!?kobjdir: %global kobjdir %(if [ "%{kdir}" = "/lib/modules/%{_kver}/source" ]; then echo "/lib/modules/%{_kver}/build"; else echo "%{kdir}"; fi)}
83 %if %{defined _take_kver}
84 # as an alternative to this implementation we could simply "make -C $kdir kernelversion"
85 %global kver %(files="include/generated/utsrelease.h include/linux/utsrelease.h include/linux/version.h"; for f in $files; do if test -r %{kobjdir}/$f && grep UTS_RELEASE %{kobjdir}/$f >/dev/null; then sed -ne '/^#define UTS_RELEASE/s/.*"\\(.*\\)"$/\\1/p' %{kobjdir}/$f; break; fi; done)
89 %if %{undefined _flavor}
90 %if 0%{?suse_version} >= 1310 && %{defined _take_kobj}
91 %global _flavor %(echo %{_kver} | sed -e 's/^.*-//')
93 %global _flavor default
97 # We set this because kernel_module_package has its own method of identifying
98 # which kernel to build against, and it is unlikely that its decision will
99 # match with Lustre's method of selecting which kernel to build against.
100 # By setting this variable, we override kernel_module_package's kernel
101 # selection with our selection.
102 # kmodtool failed to take a version if epoch set
103 %global kernel_version %_kver
105 # in order to get kernel symset and/or kernel module dependencies into
106 # the RPM, in order to support weak-modules, the internal dependency gen-
107 # erator needs to be disabled
108 # this is done with (reduce the double % down to a single %):
110 # %%global _use_internal_dependency_generator 0
112 # on SLES10, /usr/lib/rpm/macros already sets this, so no harm in also
113 # defining it here (until Suse changes their mind)
115 # on RHEL5, however, we do need to explicitly disable the internal dep-
116 # endency generator and allow the external one be used
117 # but since RedHat's kABI is only a subset of the total kernel ABI, it
118 # doesn't include all of the symbols we (or OFED for that matter) need
119 # until RedHat includes all of the symbols we need in their symsets we
120 # cannot support weak-modules
121 # we did e-mail the maintainer of all of this stuff @redhat but got no
123 #%%global _use_internal_dependency_generator 0
125 %if 0%{?rhel} > 7 || 0%{?fedora} > 33
126 ## SUSE uses another tool for provides:
127 ## https://github.com/openSUSE/kernel-source/blob/master/patches.rpmify/Add-ksym-provides-tool.patch
128 %global __find_provides %{_sourcedir}/find-provides
131 # Set the package name prefix
132 %if %{undefined lustre_name}
134 %global lustre_name lustre
136 %global lustre_name lustre-client
140 %if %{with lustre_modules}
141 %if %{undefined kmoddir}
142 %if %{defined kernel_module_package_moddir}
143 %global kmoddir %{kernel_module_package_moddir}
145 %if %{defined suse_kernel_module_package}
146 %global kmoddir updates
148 %global kmoddir extra
153 %global modules_fs_path /lib/modules/%{_kver}/%{kmoddir}
154 # requires want to set a version including epoch
155 %global krequires %(echo %{kver} | sed -e 's/\.x86_64$//' -e 's/\.i[3456]86$//' -e 's/-smp$//' -e 's/-bigsmp$//' -e 's/[-.]ppc64$//' -e 's/\.aarch64$//' -e 's/-default$//' -e 's/-%{_flavor}//')
157 %if "%{_vendor}" == "redhat" || "%{_vendor}" == "fedora" || 0%{?openEuler}
158 %global kmod_prefix kmod-
159 %global kmod_postfix %{nil}
160 %global kmod_flavor %{nil}
161 %global requires_kmod_version %{version}
164 %global kmod_prefix %{nil}
165 %global kmod_postfix -kmp
166 %global kmod_flavor -%{_flavor}
167 %if 0%{?suse_version} >= 1200
168 %global requires_kmod_version %{version}_k%(echo %{krequires} | sed -r 'y/-/_/; s/^(2\.6\.[0-9]+)_/\\1.0_/;')
170 %global requires_kmod_version %{version}_%(echo %{krequires} | sed -r 'y/-/_/; s/^(2\.6\.[0-9]+)_/\\1.0_/;')
173 %global requires_kmod_name %{kmod_prefix}%{lustre_name}%{kmod_postfix}
174 %global requires_kmod_osd_zfs_name %{kmod_prefix}%{lustre_name}-osd-zfs%{kmod_postfix}
175 %if %{with lustre_tests}
176 %global requires_kmod_tests_name %{kmod_prefix}%{lustre_name}-tests%{kmod_postfix}
178 %global kmod_devel_pkg %{kmod_prefix}%{lustre_name}%{kmod_postfix}-devel
179 %global requires_release_major_minor %(echo %version | cut -d. -f1).%(echo %version | cut -d. -f2)
182 # RHEL >= 7 comes with systemd
184 %define with_systemd 1
187 # Fedora >= 15 comes with systemd, but only >= 18 has
189 %if 0%{?fedora} >= 18
190 %define with_systemd 1
193 # opensuse >= 12.1 comes with systemd, but only >= 13.1
194 # has the proper macros
195 %if 0%{?suse_version} >= 1310
196 %define with_systemd 1
199 # openEuler comes with systemd
201 %define with_systemd 1
204 # Detect when mlnx-ofa_kernel-devel contents exist and mofed_source to 0
205 %define mofed_src_path $(echo %{?configure_args} | tr ' ' '\\n' | grep -- '--with-o2ib=' | cut -c 13-)
206 %define mofed_source %(test -f %mofed_src_path/Module.symvers; echo $?)
207 # Update the search path for mofed_scripts
208 %if 0%{?mofed_source} > 0
209 %define mofed_default_path /usr/src/ofa_kernel/
211 %define mofed_default_path %{mofed_src_path}
214 %{!?mpi_name: %global mpi_name openmpi}
216 Summary: Lustre File System
220 License: GPL-2.0-only AND LGPL-2.1-or-later
221 %if 0%{?suse_version} >= 1310
222 # SUSE needs Group for the kernel_module_package macro
225 Source: lustre-%{version}.tar.gz
226 Source1: kmp-lustre.preamble
227 Source2: kmp-lustre.files
228 Source3: kmp-lustre-osd-ldiskfs.preamble
229 Source4: kmp-lustre-osd-ldiskfs.files
230 Source5: kmp-lustre-osd-zfs.preamble
231 Source6: kmp-lustre-osd-zfs.files
232 Source7: kmp-lustre-tests.preamble
233 Source8: kmp-lustre-tests.files
234 Source9: find-provides
235 Source10: find-provides.ksyms
236 Source11: kmp-lnet-socklnd.preamble
237 Source12: kmp-lnet-socklnd.files
238 Source13: kmp-lnet-o2iblnd.preamble
239 Source14: kmp-lnet-o2iblnd.files
240 Source15: kmp-lnet-gnilnd.preamble
241 Source16: kmp-lnet-gnilnd.files
242 Source17: kmp-lnet-kfilnd.preamble
243 Source18: kmp-lnet-kfilnd.files
244 Source19: kmp-lnet-in-kernel-o2iblnd.preamble
245 Source20: kmp-lnet-in-kernel-o2iblnd.files
246 Source21: kmp-lustre-osd-wbcfs.preamble
247 Source22: kmp-lustre-osd-wbcfs.files
248 URL: https://wiki.whamcloud.com/
249 BuildRoot: %{_tmppath}/lustre-%{version}-root
250 BuildRequires: libtool pkgconfig(yaml-0.1) pkgconfig(zlib) pkgconfig(libnl-3.0) flex bison
251 Obsoletes: lustre-client < %{version}
252 Provides: lustre-client = %{version}-%{release}
254 %if %{with lustre_modules}
256 %if 0%{?suse_version} >= 1500 || 0%{?rhel} >= 8 || 0%{?fedora} >= 34
257 Requires: (%{lustre_name}-dkms or %{requires_kmod_name} >= %{requires_release_major_minor})
259 Requires: %{requires_kmod_name} >= %{requires_release_major_minor}
262 # abuild (auto-build) used by SUSE Open Build Service needs kernel-source as
263 # a build requirement, but the code which extracts these requirements does not
264 # understand the percent-open-close-paren construct aka %%()
265 # [NOTE: a percent abovie is doubled to avoid yet another rpmbuild warning]
266 # such occurances as failures. So the following dance allows the requirements
267 # to be seen by abuild, but ignored by lbuild.
268 %if "%(echo $USER)" == "abuild"
269 BuildRequires: kernel-source
273 %if %{defined kernel_module_package_buildreqs}
274 BuildRequires: %kernel_module_package_buildreqs
276 %if 0%{?rhel} >= 8 || 0%{?openEuler}
277 BuildRequires: kernel-rpm-macros
279 %if 0%{?sle_version} >= 150300
280 BuildRequires: rpm-build >= 4.14.3
285 # need to provide a /usr/lib/${uname -r)/build dir
286 BuildRequires: kernel >= 3.10
289 %if "%{_vendor}" == "redhat"
291 BuildRequires: kernel-abi-whitelists
296 # End: Lustre modules
298 # Options: lutf, gss, servers, systemd
300 %if %{with lustre_tests_lutf}
301 Requires: python3 >= 3.6.0
302 BuildRequires: python3-devel >= 3.6.0, swig
306 BuildRequires: krb5-devel openssl-devel
310 Requires: %{name}-osd
311 Requires: %{name}-osd-mount
312 Obsoletes: lustre-server < %{version}
313 Provides: lustre-server = %{version}-%{release}
317 Requires(post): systemd
318 Requires(preun): systemd
319 Requires(postun): systemd
320 BuildRequires: pkgconfig(systemd)
323 %if %{with l_getsepol}
324 BuildRequires: pkgconfig(libselinux) openssl-devel
329 %if "%{_vendor}" == "redhat" || "%{_vendor}" == "fedora" || 0%{?openEuler}
330 # selinux is used by default
331 BuildRequires: pkgconfig(libselinux)
332 %if 0%{?rhel} > 7 || 0%{?fedora} > 33 || 0%{?rhel} < 1
333 Suggests: bash-completion
335 %if "%{_vendor}" == "redhat" || "%{_vendor}" == "fedora"
336 BuildRequires: redhat-rpm-config
341 BuildRequires: kernel-debugsource
343 BuildRequires: openEuler-rpm-config
350 Userspace tools and files for the Lustre file system.
352 %if %{with lustre_modules}
354 # until we have achieved full kABI compatibility we need to
355 # restrict the kernel range that can be used to the kernel
356 # version from the RHEL minor release
357 # this is supposed to be done for kmods automatically but
358 # RHBZ#1467319 seems to be getting in the way
359 # this is true for el7.0 through el7.4
360 %define preamble %{expand:%(
362 cat %{SOURCE1} > $TMPFILE
363 kver=%{kernel_version}
364 linuxversion=${kver%%%%-*}
365 linuxrelease=${kver##*-}
366 kabiminor=${linuxrelease%%%%.*}
367 echo "Requires: kernel < $linuxversion-$((kabiminor+1)), kernel >= $linuxversion-$((kabiminor))" >> $TMPFILE
371 %define preamble %{SOURCE1}
373 %kernel_module_package -n %{name} -p %preamble -f %SOURCE2 %{_flavor}
376 %kernel_module_package -n %{name}-osd-ldiskfs -p %SOURCE3 -f %SOURCE4 %{_flavor}
377 %if %{with lustre_utils}
378 %package osd-ldiskfs-mount
379 Summary: Lustre mount's ldiskfs-specific helper library
380 BuildRequires: e2fsprogs-devel >= 1.44.3 pkgconfig(mount)
381 Requires: ldiskfsprogs > 1.45.6
382 Provides: lustre-osd-mount = %{version}
383 Provides: %{name}-osd-mount = %{version}
384 Obsoletes: %{name}-osd-mount < %{version}
385 Obsoletes: lustre-osd-mount < %{version}
387 %description osd-ldiskfs-mount
388 Provide a shared library (dso) that can be loaded into various
389 lustre tools (mount/mkfs) to provide support for ldisfs
397 %global confzfsdobjpath %(echo '%configure_args' | grep -q -- --with-zfs-obj= ; echo $?)
398 %kernel_module_package -n %{name}-osd-zfs -p %SOURCE5 -f %SOURCE6 %{_flavor}
399 %if %{with lustre_utils}
400 %package osd-zfs-mount
401 Summary: Lustre mount's zfs-specific helper library
402 BuildRequires: pkgconfig(mount)
403 Provides: %{name}-osd-mount = %{version}
404 Obsoletes: lustre-osd-mount < %{version}
405 %if 0%{confzfsdobjpath} != 0
406 %if 0%{?suse_version} >= 1500 || 0%{?rhel} >= 8 || 0%{?fedora} >= 34
407 BuildRequires: (libzfs-devel or libzfs4-devel or libzfs5-devel or libzfs6-devel)
409 # 'or' is not available, Use: --define 'zfs 5' or 'zfs 4'
410 BuildRequires: libzfs%{?zfs}-devel
413 # end confzfsdobjpath
414 # Tests also require zpool from zfs package:
416 Requires: %{requires_kmod_osd_zfs_name}
417 Provides: %{name}-osd-mount = %{version}
418 Provides: %{name}-osd-zfs-mount = %{version}
419 Requires: %{name}-osd-zfs = %{version}
421 %description osd-zfs-mount
422 Provide a shared library (dso) that can be loaded into various
423 lustre tools (mount/mkfs) to provide support for ZFS.
430 %if 0%{?suse_version:1}
433 %kernel_module_package -n %{name}-osd-wbcfs -p %SOURCE21 -f %SOURCE22 %{_flavor}
434 %if %{with lustre_utils}
435 %package osd-wbcfs-mount
436 Summary: Lustre mount's wbcfs-specific helper library
437 BuildRequires: pkgconfig(mount)
438 Provides: %{name}-osd-mount = %{version}
439 Obsoletes: lustre-osd-mount < %{version}
440 Provides: %{name}-osd-mount = %{version}
441 Provides: %{name}-osd-wbcfs-mount = %{version}
442 Requires: %{name}-osd-wbcfs = %{version}
444 %description osd-wbcfs-mount
445 Provide a shared library (dso) that can be loaded into various
446 lustre tools (mount/mkfs) to provide support for in-memory OSD
447 with writeback support.
453 # with lustre_modules
459 %package resource-agents
460 Summary: HA Resuable Cluster Resource Scripts for Lustre
462 Requires: resource-agents
464 %description resource-agents
465 A set of scripts to operate Lustre resources in a High Availablity
466 environment for both Pacemaker and rgmanager.
470 Summary: Lustre include headers
471 Provides: lustre-devel = %{version}
472 Requires: %{lustre_name} = %{version}
473 %if %{with lustre_modules}
474 %if 0%{?suse_version} >= 1500 || 0%{?rhel} >= 8 || 0%{?fedora} >= 34
475 Requires: (%{lustre_name}-dkms or %{requires_kmod_name} >= %{requires_release_major_minor})
477 Requires: %{requires_kmod_name} >= %{requires_release_major_minor}
482 This package contains the header files needed for building additional
483 applications against the Lustre / LNet utilities libraries.
485 :> lustre-devel.files
487 %if %{with lustre_tests}
489 Summary: Lustre testing framework
490 Provides: %{name}-tests = %{version}
491 %if %{with lustre_iokit}
492 Requires: %{name} = %{version}, %{lustre_name}-iokit
494 Requires: %{name} = %{version}
496 Requires: lustre-devel = %{version}
497 %if 0%{?rhel} >= 8 || 0%{?suse_version} >= 1500 || 0%{?openEuler}
498 Requires: python3 >= 3.6.0, python3-PyYAML
500 %if %{with lustre_modules}
501 %if 0%{?suse_version} >= 1500 || 0%{?rhel} >= 8 || 0%{?fedora} >= 34
502 Requires: (%{lustre_name}-dkms or %{requires_kmod_name} >= %{requires_release_major_minor})
504 Requires: %{requires_kmod_name} >= %{requires_release_major_minor}
506 Requires: %{requires_kmod_tests_name} >= %{requires_release_major_minor}
508 %if %{with lustre_tests_lutf}
509 Requires: python3 >= 3.6.0
511 Requires: attr, rsync, lsof, /usr/bin/getconf
512 Requires: /usr/sbin/getenforce, acl, /usr/bin/killall, /usr/bin/ping, bc
513 # Of the supported targets, only rhel7 doesn't support Recommends.
514 %if 0%{?rhel} > 7 || 0%{?fedora} > 33 || 0%{?rhel} < 1
515 Recommends: perl, dbench, iozone, vmtouch
516 # Either of these is sufficient
517 Suggests: pdsh, clush
520 %if "%{mpi_name}" == "mpich"
521 BuildRequires: mpich-devel
523 %if "%{mpi_name}" == "openmpi"
524 %if "%{_vendor}" == "redhat" || 0%{?openEuler} || 0%{?suse_version} < 1500
525 BuildRequires: openmpi-devel
527 %if 0%{?sle_version} && 0%{?sle_version} >= 150600
528 BuildRequires: openmpi4-devel
530 BuildRequires: openmpi2-devel
540 This package contains a set of test binaries and scripts that are intended
541 to be used by the Lustre testing framework.
543 %if %{with lustre_modules}
544 %kernel_module_package -n %{name}-tests -p %SOURCE7 -f %SOURCE8 %{_flavor}
548 %if %{with multiple_lnds}
549 # begin multiple_lnds
550 %kernel_module_package -n %{name}-lnet-socklnd -p %SOURCE11 -f %SOURCE12 %{_flavor}
552 ## in-kernel: re-write post/preun generated by kmodtool [ls -s and rm -f]
553 %define inkernmod %{modules_fs_path}/%{lustre_name}/net/in-kernel-ko2iblnd.ko
554 %define inkernsym %{modules_fs_path}/%{lustre_name}/net/ko2iblnd.ko
555 %if 0%{?rhel} >= 8 || 0%{?fedora} >= 34
556 %define inkernpost %%posttrans -n %{kmod_prefix}%{name}-lnet-in-kernel-o2iblnd%{kmod_postfix}%{kmod_flavor}
557 %define inkernaction ln -sf %{inkernmod} %{inkernsym}
559 %define inkernpost %{nil}
560 %define inkernaction %{nil}
562 %define ofed_module_package %{expand:%(
565 %kernel_module_package -n %{name}-lnet-in-kernel-o2iblnd -p %SOURCE19 -f %SOURCE20 %{_flavor}
569 sed -i -e '/^%%post .*/a ln -sf %{inkernmod} %{inkernsym}' -e '/^%%preun.*/a if test -L %{inkernsym}; then rm -f %{inkernsym} ; fi' $TMPFILE
572 %{expand:%(cat '%{ofed_module_package}')}
574 ## mofed: add a posttrans rule on el8 and later
576 %if 0%{?rhel} >= 8 || 0%{?fedora} >= 34
577 %define exkernmod %{modules_fs_path}/%{lustre_name}/net/ko2iblnd.ko
578 %define exkernpost %%posttrans -n %{kmod_prefix}%{name}-lnet-o2iblnd%{kmod_postfix}%{kmod_flavor}
579 %define exkernaction if test -L %{exkernmod}; then rm -f %{exkernmod}; fi
581 %define exkernpost %{nil}
582 %define exkernaction %{nil}
584 %define ext_ofed_module_package %{expand:%(
587 %kernel_module_package -n %{name}-lnet-o2iblnd -p %SOURCE13 -f %SOURCE14 %{_flavor}
593 %{expand:%(cat '%{ext_ofed_module_package}')}
596 %kernel_module_package -n %{name}-lnet-gnilnd -p %SOURCE15 -f %SOURCE16 %{_flavor}
599 %kernel_module_package -n %{name}-lnet-kfilnd -p %SOURCE17 -f %SOURCE18 %{_flavor}
604 %if %{with lustre_modules}
605 %package -n %kmod_devel_pkg
606 Summary: Includes and Module.symvers for kernel packages depending on Lustre/LNet
608 %description -n %kmod_devel_pkg
609 This package includes:
611 package config file: lnet.pc
615 %if %{with lustre_iokit}
616 %package -n %{lustre_name}-iokit
617 Summary: Collection of benchmark tools for a cluster with the Lustre file system
619 %if 0%{?rhel} > 7 || 0%{?fedora} > 33 || 0%{?rhel} < 1
623 %description -n %{lustre_name}-iokit
624 This package includes five tools:
626 A test of the 'bare metal' performance, bypassing as much of the kernel as we can. Uses the sgp_dd utility.
629 This survey can be run in 3 modes to test disk I/O including the filesystem,
630 network I/O, and disk I/O via the network. The script does sequential I/O
631 with varying numbers of threads and objects (files) by using lctl::test_brw
632 to drive the echo_client connected to local or remote obdfilter instances,
633 or remote obdecho instances.
636 This survey tests the client-to-disk performance of individual OSTs, and
637 ranks then for comparison.
640 This script will collect IO stats on a defined set of nodes.
643 A script to run the IOR benchmark. The latest version can be downloaded from
644 https://github.com/hpc/ior/
647 This survey tests the local metadata performance using the echo_client to drive
648 the MDD layer to perform operations. It is run with multiple threads (to
649 simulate MDT service threads) locally on the MDS node, and does not need Lustre
650 clients in order to run
653 This survey tests LNet performance between a group of clients and servers.
656 %if 0%{?suse_version}
660 %setup -qn lustre-%{version}
661 ln lustre/ChangeLog ChangeLog-lustre
662 ln lnet/ChangeLog ChangeLog-lnet
665 # Set an explicit path to our Linux tree, if we can.
666 cd $RPM_BUILD_DIR/lustre-%{version}
668 # Store the CFLAGS and LDFLAGS that would normally be used in the UTILS_CFLAGS
669 # and UTILS_LDFLAGS environment variables so that we use can them when compiling
670 # the user-space code in lustre/utils and lnet/utils. As of RHEL 8.0, the
671 # __global_* variants are deprecated in favour of build_cflags, etc. If neither
672 # style is available (e.g. on SLES), then these just end up as empty strings.
673 export UTILS_CFLAGS="%{?build_cflags:%{build_cflags}}%{!?build_cflags:%{?__global_cflags:%{__global_cflags}}}"
674 export UTILS_LDFLAGS="%{?build_ldflags:%{build_ldflags}}%{!?build_ldflags:%{?__global_ldflags:%{__global_ldflags}}}"
676 # RHEL7 on PPC64 needs __SANE_USERSPACE_TYPES__ defined so that __s64 and __u64
677 # are presented to user-land as long long instead of long long. Without this it
678 # will fail the format check whenever such a variable is printed.
681 export UTILS_CFLAGS="${UTILS_CFLAGS} -D__SANE_USERSPACE_TYPES__=1"
685 # Disable any hardening or annotation since this doesn't make sense for
686 # kernel code, and reset "optflags" so that the vendor's overzealous flags don't
687 # create build failures.
688 %define optflags -g -O2 -Werror
689 %undefine _annotated_build
690 %undefine _hardened_build
692 CONFIGURE_ARGS="%{?configure_args}"
693 if [ -n "$CONFIGURE_ARGS" ]; then
694 # make sure %%kdir and %%kobjdir are not in the configure arguments
695 CONFIGURE_ARGS=$(echo $CONFIGURE_ARGS | sed -e 's/"\?--with-linux=[^ ][^ ]* \?//')
696 CONFIGURE_ARGS=$(echo $CONFIGURE_ARGS | sed -e 's/"\?--with-linux-obj=[^ ][^ ]* \?//')
697 # remove --with-kmp-moddir from configure arguments,
698 # it will be set --with-kmp-moddir=%%kmoddir
699 CONFIGURE_ARGS=$(echo $CONFIGURE_ARGS | sed -e 's/"\?--with-kmp-moddir=[^ ][^ ]* \?//')
700 # remove env variables from config cache built by initial configure,
701 # and create dedicated cache in temporary build directory
702 if [ -f "$CONFIG_CACHE_FILE" ]; then
703 TMP_CONFIG_CACHE="$(mktemp --tmpdir newconfig-XXXXXXXX.cache)"
704 sed -e "/ac_cv_env/d" \
705 -e "/am_cv_CC_dependencies_compiler_type/d" \
706 -e "/lb_cv_mpi_tests/d" \
707 "$CONFIG_CACHE_FILE" > $TMP_CONFIG_CACHE
708 CONFIGURE_ARGS="$CONFIGURE_ARGS --cache-file=$TMP_CONFIG_CACHE"
712 # we need to eval "configure" because $CONFIGURE_ARGS could have a quoted
713 # string in it which we don't want word splitted by the shell
714 # also remove (build|host|target) options because they will be specified
715 # inside $CONFIGURE_ARGS
716 # kmod tools/scripts require "name" directory with kernel modules
719 %define _configure eval ./configure
720 %define eval_configure %configure
722 %define eval_configure %(echo -n '%configure' | sed -e 's#\./configure#eval ./configure#' -e 's/--\\(build\\|host\\|target\\)=[^ ][^ ]* //g')
726 %if "%{mpi_name}" == "mpich"
729 %if "%{mpi_name}" == "openmpi"
735 # kfabric can be either cray-kfabric or kfabric
738 for kfabric in cray-kfabric kfabric
740 path=/usr/src/${kfabric}/default/Module.symvers
741 if [ -f $path ]; then
742 WITH_KFI="--with-kfi=$(dirname $path)"
750 o2ib_path=$(find -H %{mofed_default_path} -type d -name ofed_scripts | xargs dirname)
751 if [ -z "$o2ib_path" ]; then
752 echo "ERROR: could not find OFED devel headers"
755 if [ $(echo $o2ib_path | wc -w) -ge 2 ]; then
756 echo "ERROR: multiple OFED versions installed"
759 WITH_O2IB="--with-o2ib=${o2ib_path}"
762 WITH_O2IB="--with-o2ib=no"
766 %eval_configure $CONFIGURE_ARGS \
767 %{?with_lustre_tests:--enable-tests}%{!?with_lustre_tests:--disable-tests} \
768 %{?with_lustre_utils:--enable-utils}%{!?with_lustre_utils:--disable-utils} \
769 %{?with_lustre_modules:--enable-modules}%{!?with_lustre_modules:--disable-modules} \
770 %{!?with_shared:--disable-shared} \
771 %{!?with_static:--disable-static} \
772 %{!?with_lustre_iokit:--disable-iokit} \
773 %{!?with_ldiskfs:--disable-ldiskfs} \
774 %{!?with_servers:--disable-server} \
775 %{!?with_zfs:--without-zfs} \
776 %{!?with_gss:--disable-gss} \
777 %{!?with_gss_keyring:--disable-gss-keyring} \
778 %{!?with_manpages:--disable-manpages} \
779 %{!?with_systemd:--with-systemdsystemunitdir=no} \
780 %{?with_systemd:--with-systemdsystemunitdir=%{_unitdir}} \
781 %{?with_multiple_lnds:--enable-multiple-lnds} \
783 %{?with_gni:--enable-gni} \
785 %{!?with_l_getsepol:--disable-l_getsepol} \
786 --with-linux=%{kdir} \
787 --with-linux-obj=%{kobjdir} \
788 --with-kmp-moddir=%{kmoddir}/%{name}
791 if ! grep -q define[[:space:]]*HAVE_SERVER_SUPPORT config.h 2> /dev/null; then
792 echo "Error: Server Support configured but not found"
797 make %{?_smp_mflags} -s %{?make_args}
800 %if "%{mpi_name}" == "mpich"
803 %if "%{mpi_name}" == "openmpi"
812 %if "%{mpi_name}" == "mpich"
815 %if "%{mpi_name}" == "openmpi"
821 make install DESTDIR=$RPM_BUILD_ROOT
823 %if %{with lustre_modules}
824 # RHEL's kernel_module_path macro expects that all the modules
825 # in a kmod package will be in modules_fs_path/<sub packagename>
826 # but Lustre installs all of the modules in a single pass into
827 # a shared location. Since this is a restriction imposed by
828 # RHEL, we handle this here in the spec file rather than in
829 # Lustre's build system. This is not expected to bother SLES's
830 # kernel_module_path macro.
831 basemodpath=$RPM_BUILD_ROOT%{modules_fs_path}/%{name}
832 %{__install} -D -m 0644 ${PWD}/Module.symvers %{buildroot}/Module.symvers
833 %if %{with lustre_modules}
834 %{__install} -D -m 0644 ${PWD}/Module.symvers %{buildroot}/%{_usrsrc}/lustre-%{version}/%{_arch}/%{_flavor}/Module.symvers
835 %{__install} -D -m 0644 ${PWD}/config.h %{buildroot}/%{_usrsrc}/lustre-%{version}/%{_arch}/%{_flavor}/config.h
836 for fname in $(find lnet/include -type f -name \*.h); do
837 target=$(echo ${fname} | sed 's:^lnet/include/::g')
838 %{__install} -D -m 0644 ${fname} %{buildroot}/%{_usrsrc}/lustre-%{version}/${target}
840 for fname in $(find libcfs/include/libcfs -type f -name \*.h); do
841 target=$(echo ${fname} | sed -e 's:^libcfs/include/::g')
842 %{__install} -D -m 0644 ${fname} %{buildroot}/%{_usrsrc}/lustre-%{version}/${target}
846 mkdir -p $basemodpath-osd-ldiskfs/fs
847 mv $basemodpath/fs/osd_ldiskfs.ko $basemodpath-osd-ldiskfs/fs/osd_ldiskfs.ko
848 mv $basemodpath/fs/ldiskfs.ko $basemodpath-osd-ldiskfs/fs/ldiskfs.ko
851 mkdir -p $basemodpath-osd-zfs/fs
852 mv $basemodpath/fs/osd_zfs.ko $basemodpath-osd-zfs/fs/osd_zfs.ko
854 %if 0%{?suse_version:1}
857 mkdir -p $basemodpath-osd-wbcfs/fs
858 mv $basemodpath/fs/osd_wbcfs.ko $basemodpath-osd-wbcfs/fs/osd_wbcfs.ko
861 %if %{with lustre_tests}
862 mkdir -p $basemodpath-tests/fs
863 mv $basemodpath/fs/obd_test.ko $basemodpath-tests/fs/obd_test.ko
864 mv $basemodpath/fs/obd_mod_rpcs_test.ko $basemodpath-tests/fs/obd_mod_rpcs_test.ko
865 mv $basemodpath/fs/kinode.ko $basemodpath-tests/fs/kinode.ko
867 mv $basemodpath/fs/ldlm_extent.ko $basemodpath-tests/fs/ldlm_extent.ko
868 mv $basemodpath/fs/llog_test.ko $basemodpath-tests/fs/llog_test.ko
874 if [ -d $RPM_BUILD_ROOT%{_libdir}/openmpi ] ; then
875 rm -fr $RPM_BUILD_ROOT%{_libdir}/openmpi
877 if [ -d $RPM_BUILD_ROOT%{_libdir}/mpich ] ; then
878 rm -fr $RPM_BUILD_ROOT%{_libdir}/mpich
884 %if %{with servers} && %{with lustre_utils}
885 # The .ha_v2 extension identifies the heartbeat resource agent as using
886 # legacy syntax. Install a compatibility symlink to avoid conflicts when
887 # newer-style agents are added.
888 ln -s Lustre.ha_v2 $RPM_BUILD_ROOT%{_sysconfdir}/ha.d/resource.d/Lustre
889 echo '%dir %{_sysconfdir}/ha.d' >>lustre.files
890 echo '%dir %{_sysconfdir}/ha.d/resource.d' >>lustre.files
891 echo '%{_sysconfdir}/ha.d/resource.d/Lustre.ha_v2' >>lustre.files
892 echo '%{_sysconfdir}/ha.d/resource.d/Lustre' >>lustre.files
895 # systemd is on redhat, fedora, and suse
897 echo '%{_unitdir}/lnet.service' >>lustre.files
898 echo '%{_unitdir}/lsvcgss.service' >>lustre.files
901 %if "%{_vendor}" == "redhat" || 0%{?openEuler}
902 # The following scripts are Red Hat specific
904 echo '%{_sysconfdir}/init.d/lustre' >>lustre.files
905 echo '%{_sysconfdir}/sysconfig/lustre' >>lustre.files
906 %if %{with gss_keyring}
907 echo '%{_sysconfdir}/init.d/lsvcgss' >>lustre.files
908 echo '%config(noreplace) %{_sysconfdir}/sysconfig/lsvcgss' >>lustre.files
912 %if %{without systemd}
913 echo '%{_sysconfdir}/init.d/lnet' >>lustre.files
916 %if %{with gss_keyring}
917 echo '%config(noreplace) %{_sysconfdir}/request-key.d/lgssc.conf' >>lustre.files
920 # fc18 needs 'x' permission for library files
921 find $RPM_BUILD_ROOT -name \*.so -type f -exec chmod +x {} \;
923 rm -f $RPM_BUILD_ROOT%{_libdir}/liblnetconfig.la
925 echo '%attr(-, root, root) %{_libdir}/liblnetconfig.a' >>lustre.files
928 echo '%attr(-, root, root) %{_libdir}/liblnetconfig.so' >>lustre-devel.files
929 echo '%attr(-, root, root) %{_libdir}/liblnetconfig.so.*' >>lustre.files
933 echo '%{_libdir}/libiam.a' >>lustre.files
936 %if %{with lustre_utils}
937 mkdir -p $RPM_BUILD_ROOT/%{_datadir}/lustre
938 if [ -d $RPM_BUILD_ROOT%{_libdir}/lustre ] ; then
939 find $RPM_BUILD_ROOT%{_libdir}/@PACKAGE@ -name \*.la -type f -exec rm -f {} \;
943 echo '%{_prefix}/lib/firewalld/services/*.xml' >>lustre.files
944 %if %{with lustre_modules}
945 # mark modules executable for find-debuginfo.sh
946 find $RPM_BUILD_ROOT/lib/modules -name \*.ko -type f -exec chmod u+x {} \;
949 rm -f $RPM_BUILD_ROOT%{_libdir}/liblustreapi.la
951 %if %{with lustre_tests}
952 :> lustre-tests.files
954 %if "%{mpi_name}" == "mpich"
957 %if "%{mpi_name}" == "openmpi"
962 echo '%dir %{_libdir}/lustre' >>lustre-tests.files
963 echo '%dir %{_libdir}/lustre/tests' >>lustre-tests.files
964 echo '%{_libdir}/lustre/tests/*' >>lustre-tests.files
965 echo '%{_bindir}/mcreate' >>lustre-tests.files
966 echo '%{_bindir}/statx' >>lustre-tests.files
967 echo '%{_sbindir}/wirecheck' >>lustre-tests.files
968 echo '%{_sbindir}/wiretest' >>lustre-tests.files
969 if [ -n "$MPI_BIN" ]; then
970 echo "$MPI_BIN/*" >>lustre-tests.files
972 %if %{with lustre_tests_lutf}
973 echo '%{_libdir}/lustre/tests/lutf/*' >>lustre-tests.files
977 %if %{with lustre_tests_lutf}
978 echo '%{_libdir}/lustre/tests/lutf/*' >>lustre-tests.files
981 %files devel -f lustre-devel.files
982 %defattr(-,root,root)
983 %{_libdir}/pkgconfig/lustre.pc
985 %{_libdir}/liblustreapi.a
988 %{_libdir}/liblustreapi.so
990 %{_includedir}/lustre
991 %if %{with lustre_modules}
992 %{_includedir}/linux/lnet
993 %{_includedir}/linux/lustre
995 %exclude %{_includedir}/linux/lnet
996 %exclude %{_includedir}/linux/lustre
999 %if %{with lustre_modules}
1000 %files -n %kmod_devel_pkg
1001 %{_libdir}/pkgconfig/lnet.pc
1002 %{_usrsrc}/lustre-%{version}
1005 %files -f lustre.files
1006 %defattr(-,root,root)
1008 %if %{with lustre_tests}
1009 %exclude %{_sbindir}/wirecheck
1010 %exclude %{_sbindir}/wiretest
1013 %exclude %{_sbindir}/zfsobj2fid
1015 %if %{with lustre_utils}
1017 %dir %{_libexecdir}/lustre
1018 %{_libexecdir}/lustre/lc_common
1019 %{_libexecdir}/lustre/haconfig
1020 %{_bindir}/lustre_req_history
1021 %{_bindir}/remove_changelog
1022 %{_bindir}/remove_updatelog
1023 %{_bindir}/lsvcgss_sysd
1026 %{_bindir}/llobdstat
1027 %{_bindir}/lljobstat
1029 %{_bindir}/plot-llstat
1033 %{_bindir}/lfs_migrate
1036 %ghost /sbin/mount.lustre_tgt
1038 @BASH_COMPLETION_DIR@
1041 %if %{with manpages}
1046 %{_libdir}/liblustreapi.so.*
1048 %{_udevrulesdir}/99-lustre.rules
1050 %{_udevrulesdir}/99-lustre-server.rules
1053 %config(noreplace) %{_sysconfdir}/ldev.conf
1055 %config(noreplace) %{_sysconfdir}/lnet-sysctl.conf
1056 %config(noreplace) %{_sysconfdir}/lnet.conf
1057 %config(noreplace) %{_sysconfdir}/modprobe.d/ko2iblnd.conf
1058 %if %{with lustre_utils}
1059 %config(noreplace) %{_sysconfdir}/lnet_routes.conf
1060 %config(noreplace) %{_sysconfdir}/lustre/mount.client.params
1062 %if %{with lustre_modules}
1063 %exclude /Module.symvers
1066 %if %{with lustre_utils}
1067 %files osd-ldiskfs-mount
1068 %defattr(-,root,root)
1069 %dir %{_libdir}/@PACKAGE@
1070 %{_libdir}/@PACKAGE@/mount_osd_ldiskfs.so
1077 %if %{with lustre_utils}
1078 %files osd-zfs-mount
1079 %defattr(-,root,root)
1080 %dir %{_libdir}/@PACKAGE@
1081 %{_libdir}/@PACKAGE@/mount_osd_zfs.so
1082 %{_sysconfdir}/zfs/zed.d/*
1088 %if 0%{?suse_version:1}
1091 %if %{with lustre_utils}
1092 %files osd-wbcfs-mount
1093 %defattr(-,root,root)
1094 %dir %{_libdir}/@PACKAGE@
1095 %{_libdir}/@PACKAGE@/mount_osd_wbcfs.so
1101 # with lustre_modules
1105 %files resource-agents
1106 %defattr(0755,root,root)
1107 %dir %{_prefix}/lib/ocf
1108 %dir %{_prefix}/lib/ocf/resource.d
1109 %{_prefix}/lib/ocf/resource.d/lustre/
1112 %if %{with lustre_tests}
1113 %files tests -f lustre-tests.files
1114 %defattr(-,root,root)
1117 %if %{with lustre_iokit}
1118 %files -n %{lustre_name}-iokit
1119 %defattr(-, root, root)
1120 %{_bindir}/iokit-config
1121 %{_bindir}/iokit-gather-stats
1123 %{_bindir}/iokit-libecho
1124 %{_bindir}/iokit-lstats
1125 %{_bindir}/iokit-parse-ior
1126 %{_bindir}/iokit-plot-obdfilter
1127 %{_bindir}/iokit-plot-ost
1128 %{_bindir}/iokit-plot-sgpdd
1129 %{_bindir}/ior-survey
1130 %{_bindir}/mds-survey
1131 %{_bindir}/obdfilter-survey
1132 %{_bindir}/ost-survey
1133 %{_bindir}/sgpdd-survey
1134 %{_bindir}/lst-survey
1136 %doc lustre-iokit/ior-survey/README.ior-survey
1137 %doc lustre-iokit/mds-survey/README.mds-survey
1138 %doc lustre-iokit/obdfilter-survey/README.obdfilter-survey
1139 %doc lustre-iokit/ost-survey/README.ost-survey
1140 %doc lustre-iokit/sgpdd-survey/README.sgpdd-survey
1141 %doc lustre-iokit/stats-collect/README.iokit-lstats
1142 %doc lustre-iokit/lst-survey/README.lst-survey
1147 %systemd_post lnet.service
1148 %systemd_post lsvcgss.service
1153 %systemd_preun lnet.service
1154 %systemd_preun lsvcgss.service
1159 %systemd_postun_with_restart lnet.service
1160 %systemd_postun_with_restart lsvcgss.service
1163 %if %{with lustre_modules}
1164 %post -n %kmod_devel_pkg
1165 alternatives --install %{_usrsrc}/lustre lustre %{_usrsrc}/lustre-%{version} 50
1167 %preun -n %kmod_devel_pkg
1168 alternatives --remove lustre %{_usrsrc}/lustre-%{version}
1172 rm -rf $RPM_BUILD_ROOT
1173 rm -rf %{_tmppath}/kmp