]> git.pld-linux.org Git - packages/zfs.git/blob - zfs.spec
3cf9fc32b6f44cd0fe0daf499ebdb67c506ba538
[packages/zfs.git] / zfs.spec
1 # TODO:
2 # - PLDify init script
3 # - unpackaged initramfs-tools support:
4 #   /usr/share/initramfs-tools/conf-hooks.d/zfs
5 #   /usr/share/initramfs-tools/hooks/zfs
6 #   /usr/share/initramfs-tools/scripts/zfs
7 #
8 # Conditional build:
9 %bcond_without  kernel          # don't build kernel modules
10 %bcond_without  userspace       # don't build userspace programs
11 %bcond_without  python2         # CPython 2.x module
12 %bcond_without  python3         # CPython 3.x module
13 %bcond_with     verbose         # verbose build (V=1)
14 #
15 # The goal here is to have main, userspace, package built once with
16 # simple release number, and only rebuild kernel packages with kernel
17 # version as part of release number, without the need to bump release
18 # with every kernel change.
19 %if 0%{?_pld_builder:1} && %{with kernel} && %{with userspace}
20 %{error:kernel and userspace cannot be built at the same time on PLD builders}
21 exit 1
22 %endif
23
24 %if %{without userspace}
25 # nothing to be placed to debuginfo package
26 %define         _enable_debug_packages  0
27 %endif
28
29 %define         _duplicate_files_terminate_build        0
30
31 %define rel     2
32 %define pname   zfs
33 Summary:        Native Linux port of the ZFS filesystem
34 Summary(pl.UTF-8):      Natywny linuksowy port systemu plików ZFS
35 Name:           %{pname}%{?_pld_builder:%{?with_kernel:-kernel}}%{_alt_kernel}
36 Version:        0.8.1
37 Release:        %{rel}%{?_pld_builder:%{?with_kernel:@%{_kernel_ver_str}}}
38 License:        CDDL
39 Group:          Applications/System
40 #Source0:       https://github.com/zfsonlinux/zfs/releases/download/zfs-%{version}/%{pname}-%{version}.tar.gz
41 Source0:        https://github.com/zfsonlinux/zfs/archive/zfs-%{version}/%{pname}-%{version}.tar.gz
42 # Source0-md5:  db6618a09f6494e1126b14a1302f77c8
43 Patch0:         x32.patch
44 Patch1:         am.patch
45 Patch2:         %{pname}-sh.patch
46 URL:            http://zfsonlinux.org/
47 BuildRequires:  autoconf >= 2.50
48 BuildRequires:  automake
49 BuildRequires:  libtool
50 BuildRequires:  rpmbuild(macros) >= 1.714
51 %if %{with kernel}
52 %{expand:%buildrequires_kernel kernel%%{_alt_kernel}-module-build >= 3:2.6.20.2}
53 %endif
54 %if %{with userspace}
55 # only for mmap_libaio test command
56 #BuildRequires: libaio-devel
57 BuildRequires:  libblkid-devel
58 BuildRequires:  libselinux-devel
59 # if xdr gets removed from glibc
60 #BuildRequires: libtirpc-devel
61 BuildRequires:  libuuid-devel
62 BuildRequires:  openssl-devel
63 BuildRequires:  pkgconfig
64 BuildRequires:  udev-devel
65 BuildRequires:  zlib-devel
66 %if %{with python2}
67 BuildRequires:  python-cffi
68 BuildRequires:  python-modules >= 1:2.6
69 BuildRequires:  python-setuptools
70 %endif
71 %if %{with python3}
72 BuildRequires:  python3-cffi
73 BuildRequires:  python3-modules >= 1:3.4
74 BuildRequires:  python3-setuptools
75 %endif
76 %if %{with python2} || %{with python3}
77 BuildRequires:  rpm-pythonprov
78 %endif
79 %endif
80 Requires:       %{pname}-libs = %{version}-%{release}
81 Obsoletes:      spl < 0.7.9-2
82 BuildRoot:      %{tmpdir}/%{name}-%{version}-root-%(id -u -n)
83
84 %define         dracutlibdir    %{_prefix}/lib/dracut
85
86 %description
87 ZFS is an advanced file system and volume manager which was originally
88 developed for Solaris and is now maintained by the Illumos community.
89
90 ZFS on Linux, which is also known as ZoL, is currently feature
91 complete. It includes fully functional and stable SPA, DMU, ZVOL, and
92 ZPL layers.
93
94 %description -l pl.UTF-8
95 ZFS to zaawansowany system plików i zarządca wolumenów, oryginalnie
96 stworzony dla Solarisa, obecnie utrzymywany przez społeczność Illumos.
97
98 ZFS dla Linuksa, znany takża jako ZoL (ZFS on Linux), jest obecnie w
99 pełni funkcjonalny. Zawiera w pełni funkcjonalne i stabilne warstwy
100 SPA, DMU, ZVOL i ZPL.
101
102 %package libs
103 Summary:        ZFS on Linux libraries
104 Summary(pl.UTF-8):      Biblioteki ZFS-a dla Linuksa
105 License:        CDDL
106 Group:          Libraries
107 Requires(post,postun):  /sbin/ldconfig
108
109 %description libs
110 ZFS on Linux libraries.
111
112 %description libs -l pl.UTF-8
113 Biblioteki ZFS-a dla Linuksa.
114
115 %package devel
116 Summary:        Header files for ZFS libraries
117 Summary(pl.UTF-8):      Pliki nagłówkowe bibliotek ZFS-a
118 License:        CDDL
119 Group:          Development/Libraries
120 Requires:       %{pname}-libs = %{version}-%{release}
121 Requires:       libselinux-devel
122 Requires:       libuuid-devel
123 Requires:       zlib-devel
124
125 %description devel
126 Header files for ZFS libraries.
127
128 %description devel -l pl.UTF-8
129 Pliki nagłówkowe bibliotek ZFS-a.
130
131 %package static
132 Summary:        Static ZFS libraries
133 Summary(pl.UTF-8):      Statyczne biblioteki ZFS-a
134 License:        CDDL
135 Group:          Development/Libraries
136 Requires:       %{pname}-devel = %{version}-%{release}
137
138 %description static
139 Static ZFS libraries.
140
141 %description static -l pl.UTF-8
142 Statyczne biblioteki ZFS-a.
143
144 %package -n dracut-zfs
145 Summary:        ZFS support for Dracut
146 Summary(pl.UTF-8):      Obsługa ZFS-a dla Dracuta
147 Group:          Applications/System
148 Requires:       %{pname} = %{version}-%{release}
149 Requires:       dracut
150
151 %description -n dracut-zfs
152 ZFS support for Dracut.
153
154 %description -n dracut-zfs -l pl.UTF-8
155 Obsługa ZFS-a dla Dracuta.
156
157 %package -n python-pyzfs
158 Summary:        Python 2 wrapper for libzfs_core C library
159 Summary(pl.UTF-8):      Interfejs Pythona 2 do biblioteki C libzfs_core
160 License:        Apache v2.0
161 Group:          Libraries/Python
162 Requires:       %{pname}-libs = %{version}-%{release}
163
164 %description -n python-pyzfs
165 Python 2 wrapper for libzfs_core C library.
166
167 %description -n python-pyzfs -l pl.UTF-8
168 Interfejs Pythona 2 do biblioteki C libzfs_core.
169
170 %package -n python3-pyzfs
171 Summary:        Python 3 wrapper for libzfs_core C library
172 Summary(pl.UTF-8):      Interfejs Pythona 3 do biblioteki C libzfs_core
173 License:        Apache v2.0
174 Group:          Libraries/Python
175 Requires:       %{pname}-libs = %{version}-%{release}
176
177 %description -n python3-pyzfs
178 Python 3 wrapper for libzfs_core C library.
179
180 %description -n python3-pyzfs -l pl.UTF-8
181 Interfejs Pythona 3 do biblioteki C libzfs_core.
182
183 %package -n kernel-zfs-common-devel
184 Summary:        ZFS Linux kernel headers
185 Summary(pl.UTF-8):      ZFS - pliki nagłówkowe jądra Linuksa
186 Group:          Development/Building
187 Obsoletes:      kernel-spl-common-devel < 0.7.9-2
188
189 %description -n kernel-zfs-common-devel
190 ZFS Linux kernel headers common for all PLD kernel versions.
191
192 %description -n kernel-zfs-common-devel -l pl.UTF-8
193 ZFS - pliki nagłówkowe jądra Linuksa wspólne na wszystkich
194 wersji jąder PLD.
195
196 %define kernel_pkg()\
197 %package -n kernel%{_alt_kernel}-zfs\
198 Summary:        ZFS Linux kernel modules\
199 Summary(pl.UTF-8):      ZFS - moduły jądra Linuksa\
200 Release:        %{rel}@%{_kernel_ver_str}\
201 Group:          Base/Kernel\
202 Requires(post,postun):  /sbin/depmod\
203 %requires_releq_kernel\
204 Requires(postun):       %releq_kernel\
205 \
206 %description -n kernel%{_alt_kernel}-zfs\
207 ZFS Linux kernel modules.\
208 \
209 %description -n kernel%{_alt_kernel}-zfs -l pl.UTF-8\
210 ZFS - moduły jądra Linuksa.\
211 \
212 %package -n kernel%{_alt_kernel}-zfs-devel\
213 Summary:        ZFS Linux kernel headers\
214 Summary(pl.UTF-8):      ZFS - pliki nagłówkowe jądra Linuksa\
215 Release:        %{rel}@%{_kernel_ver_str}\
216 Group:          Development/Building\
217 Requires:       kernel%{_alt_kernel}-headers\
218 Requires:       kernel-zfs-common-devel\
219 Obsoletes:      kernel-spl-devel < 0.7.9-2\
220 \
221 %description -n kernel%{_alt_kernel}-zfs-devel\
222 ZFS Linux kernel headers configured for PLD kernel%{_alt_kernel},\
223 version %{_kernel_ver}.\
224 \
225 %description -n kernel%{_alt_kernel}-zfs-devel -l pl.UTF-8\
226 ZFS - pliki nagłówkowe jądra Linuksa skonfigurowane dla jądra PLD z\
227 pakietu kernel%{_alt_kernel} w wersji %{_kernel_ver}.\
228 \
229 %files -n kernel%{_alt_kernel}-zfs\
230 %defattr(644,root,root,755)\
231 %dir /lib/modules/%{_kernel_ver}/misc/lua\
232 /lib/modules/%{_kernel_ver}/misc/lua/zlua.ko*\
233 %dir /lib/modules/%{_kernel_ver}/misc/avl\
234 /lib/modules/%{_kernel_ver}/misc/avl/zavl.ko*\
235 %dir /lib/modules/%{_kernel_ver}/misc/icp\
236 /lib/modules/%{_kernel_ver}/misc/icp/icp.ko*\
237 %dir /lib/modules/%{_kernel_ver}/misc/nvpair\
238 /lib/modules/%{_kernel_ver}/misc/nvpair/znvpair.ko*\
239 %dir /lib/modules/%{_kernel_ver}/misc/spl\
240 /lib/modules/%{_kernel_ver}/misc/spl/spl.ko*\
241 %dir /lib/modules/%{_kernel_ver}/misc/unicode\
242 /lib/modules/%{_kernel_ver}/misc/unicode/zunicode.ko*\
243 %dir /lib/modules/%{_kernel_ver}/misc/zcommon\
244 /lib/modules/%{_kernel_ver}/misc/zcommon/zcommon.ko*\
245 %dir /lib/modules/%{_kernel_ver}/misc/zfs\
246 /lib/modules/%{_kernel_ver}/misc/zfs/zfs.ko*\
247 \
248 %files -n kernel%{_alt_kernel}-zfs-devel\
249 %defattr(644,root,root,755)\
250 /usr/src/zfs-%{version}/%{_kernel_ver}\
251 \
252 %post   -n kernel%{_alt_kernel}-zfs\
253 %depmod %{_kernel_ver}\
254 \
255 %postun -n kernel%{_alt_kernel}-zfs\
256 %depmod %{_kernel_ver}\
257 %{nil}
258
259 %define build_kernel_pkg()\
260 %configure \\\
261         --disable-silent-rules \\\
262         --with-config="kernel" \\\
263         --with-linux=%{_kernelsrcdir}\\\
264         --with-linux-obj=%{_kernelsrcdir}\
265 \
266 %{__make} clean\
267 %{__make} %{?with_verbose:V=1}\
268 p=`pwd`\
269 %{__make} install DESTDIR=$p/installed INSTALL_MOD_DIR=misc\
270 %{nil}
271
272 %{?with_kernel:%{expand:%create_kernel_packages}}
273
274 %prep
275 %setup -q -n %{pname}-zfs-%{version}
276 %patch0 -p1
277 %patch1 -p1
278 %patch2 -p1
279
280 %build
281 %{__libtoolize}
282 %{__aclocal} -I config
283 %{__autoconf}
284 %{__autoheader}
285 %{__automake}
286 %{?with_kernel:%{expand:%build_kernel_packages}}
287
288 %if %{with userspace}
289 %configure \
290         --disable-silent-rules \
291         --enable-systemd \
292         --with-config="user" \
293         --with-linux=%{_kernelsrcdir} \
294         --with-systemdunitdir=%{systemdunitdir} \
295         --with-systemdpresetdir=/etc/systemd/system-preset \
296         --with-systemdmodulesloaddir=/etc/modules-load.d \
297         --with-systemdgeneratordir=/lib/systemd/system-generators \
298         --with-udevdir=/lib/udev
299
300 %{__make} \
301         %{?with_verbose:V=1}
302
303 %if %{with python2}
304 cd contrib/pyzfs
305 %py_build
306 cd ../..
307 %endif
308
309 %if %{with python3}
310 cd contrib/pyzfs
311 %py3_build
312 cd ../..
313 %endif
314 %endif
315
316 %install
317 rm -rf $RPM_BUILD_ROOT
318
319 %if %{with kernel}
320 install -d $RPM_BUILD_ROOT
321 cp -a installed/* $RPM_BUILD_ROOT
322 # Drop unneeded spl compat links
323 %{__rm} -r $RPM_BUILD_ROOT/usr/src/spl-%{version}
324 %endif
325
326 %if %{with userspace}
327 %{__make} install \
328         DESTDIR=$RPM_BUILD_ROOT \
329         DEFAULT_INIT_DIR=/etc/rc.d/init.d
330
331 %if %{with python2}
332 %{__rm} -rf $RPM_BUILD_ROOT%{py_sitescriptdir}
333 cd contrib/pyzfs
334 %py_install
335
336 %py_ocomp $RPM_BUILD_ROOT%{py_sitescriptdir}
337 %py_comp $RPM_BUILD_ROOT%{py_sitescriptdir}
338
339 %py_postclean
340 cd ../..
341 %{__rm} -r $RPM_BUILD_ROOT%{py_sitescriptdir}/libzfs_core/test
342 %endif
343
344 %if %{with python3}
345 %{__rm} -rf $RPM_BUILD_ROOT{%{py3_sitescriptdir},/usr/local/share/python3*}
346 cd contrib/pyzfs
347 %py3_install
348 cd ../..
349 %{__rm} -r $RPM_BUILD_ROOT%{py3_sitescriptdir}/libzfs_core/test
350 %endif
351
352 install -d $RPM_BUILD_ROOT%{_pkgconfigdir}
353 %{__mv} $RPM_BUILD_ROOT%{_npkgconfigdir}/* $RPM_BUILD_ROOT%{_pkgconfigdir}
354
355 # Debian specific stuff
356 %{__rm} -r $RPM_BUILD_ROOT%{_datadir}/initramfs-tools
357
358 # Package these? These are integration tests of the implementation.
359 %{__rm} -r $RPM_BUILD_ROOT%{_datadir}/zfs/{zfs-tests,test-runner,runfiles}
360 %{__rm} $RPM_BUILD_ROOT%{_mandir}/man1/{raidz_test,test-runner}.1*
361 %{__rm} $RPM_BUILD_ROOT%{_bindir}/raidz_test
362 %endif
363
364 %clean
365 rm -rf $RPM_BUILD_ROOT
366
367 %post   libs -p /sbin/ldconfig
368 %postun libs -p /sbin/ldconfig
369
370 %if %{with userspace}
371 %files
372 %defattr(644,root,root,755)
373 %doc AUTHORS COPYRIGHT LICENSE NEWS NOTICE README.md
374 %attr(755,root,root) /sbin/mount.zfs
375 %attr(755,root,root) %{_bindir}/arc_summary
376 %attr(755,root,root) %{_bindir}/arcstat
377 %attr(755,root,root) %{_bindir}/dbufstat
378 %attr(755,root,root) %{_bindir}/zgenhostid
379 %attr(755,root,root) %{_sbindir}/fsck.zfs
380 %attr(755,root,root) %{_sbindir}/zdb
381 %attr(755,root,root) %{_sbindir}/zed
382 %attr(755,root,root) %{_sbindir}/zfs
383 %attr(755,root,root) %{_sbindir}/zhack
384 %attr(755,root,root) %{_sbindir}/zinject
385 %attr(755,root,root) %{_sbindir}/zpool
386 %attr(755,root,root) %{_sbindir}/zstreamdump
387 %attr(755,root,root) %{_sbindir}/ztest
388 %dir %{_sysconfdir}/zfs
389 # package *.example as %doc? (they cannot act as default configuration)
390 %{_sysconfdir}/zfs/vdev_id.conf.*.example
391 %dir %{_sysconfdir}/zfs/zed.d
392 %attr(755,root,root) %config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/zfs/zed.d/*.sh
393 %config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/zfs/zed.d/zed.rc
394 %dir %{_sysconfdir}/zfs/zpool.d
395 %attr(755,root,root) %config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/zfs/zpool.d/*
396 %attr(754,root,root) /etc/rc.d/init.d/zfs-import
397 %attr(754,root,root) /etc/rc.d/init.d/zfs-mount
398 %attr(754,root,root) /etc/rc.d/init.d/zfs-share
399 %attr(754,root,root) /etc/rc.d/init.d/zfs-zed
400 %config(noreplace) %verify(not md5 mtime size) /etc/default/zfs
401 /etc/zfs/zfs-functions
402 %config(noreplace) %verify(not md5 mtime size) /etc/modules-load.d/zfs.conf
403 /etc/systemd/system-preset/50-zfs.preset
404 /lib/systemd/system-generators/zfs-mount-generator
405 %{systemdunitdir}/zfs.target
406 %{systemdunitdir}/zfs-import.target
407 %{systemdunitdir}/zfs-import-cache.service
408 %{systemdunitdir}/zfs-import-scan.service
409 %{systemdunitdir}/zfs-mount.service
410 %{systemdunitdir}/zfs-share.service
411 %{systemdunitdir}/zfs-zed.service
412 %attr(755,root,root) /lib/udev/vdev_id
413 %attr(755,root,root) /lib/udev/zvol_id
414 /lib/udev/rules.d/60-zvol.rules
415 /lib/udev/rules.d/69-vdev.rules
416 /lib/udev/rules.d/90-zfs.rules
417 %dir %{_libexecdir}/zfs
418 %dir %{_libexecdir}/zfs/zed.d
419 %attr(755,root,root) %{_libexecdir}/zfs/zed.d/*.sh
420 %dir %{_libexecdir}/zfs/zpool.d
421 %attr(755,root,root) %{_libexecdir}/zfs/zpool.d/*
422 %dir %{_datadir}/zfs
423 %attr(755,root,root) %{_datadir}/zfs/*.sh
424 %{_mandir}/man1/zhack.1*
425 %{_mandir}/man1/ztest.1*
426 %{_mandir}/man5/spl-module-parameters.5*
427 %{_mandir}/man5/vdev_id.conf.5*
428 %{_mandir}/man5/zfs-events.5*
429 %{_mandir}/man5/zfs-module-parameters.5*
430 %{_mandir}/man5/zpool-features.5*
431 %{_mandir}/man8/fsck.zfs.8*
432 %{_mandir}/man8/mount.zfs.8*
433 %{_mandir}/man8/vdev_id.8*
434 %{_mandir}/man8/zdb.8*
435 %{_mandir}/man8/zed.8*
436 %{_mandir}/man8/zfs.8*
437 %{_mandir}/man8/zfs-mount-generator.8*
438 %{_mandir}/man8/zfs-program.8*
439 %{_mandir}/man8/zgenhostid.8*
440 %{_mandir}/man8/zinject.8*
441 %{_mandir}/man8/zpool.8*
442 %{_mandir}/man8/zstreamdump.8*
443
444 %files libs
445 %defattr(644,root,root,755)
446 %attr(755,root,root) %{_libdir}/libnvpair.so.*.*.*
447 %attr(755,root,root) %ghost %{_libdir}/libnvpair.so.1
448 %attr(755,root,root) %{_libdir}/libuutil.so.*.*.*
449 %attr(755,root,root) %ghost %{_libdir}/libuutil.so.1
450 %attr(755,root,root) %{_libdir}/libzfs.so.*.*.*
451 %attr(755,root,root) %ghost %{_libdir}/libzfs.so.2
452 %attr(755,root,root) %{_libdir}/libzfs_core.so.*.*.*
453 %attr(755,root,root) %ghost %{_libdir}/libzfs_core.so.1
454 %attr(755,root,root) %{_libdir}/libzpool.so.*.*.*
455 %attr(755,root,root) %ghost %{_libdir}/libzpool.so.2
456
457 %files devel
458 %defattr(644,root,root,755)
459 %attr(755,root,root) %{_libdir}/libnvpair.so
460 %attr(755,root,root) %{_libdir}/libuutil.so
461 %attr(755,root,root) %{_libdir}/libzfs.so
462 %attr(755,root,root) %{_libdir}/libzfs_core.so
463 %attr(755,root,root) %{_libdir}/libzpool.so
464 %{_libdir}/libnvpair.la
465 %{_libdir}/libuutil.la
466 %{_libdir}/libzfs.la
467 %{_libdir}/libzfs_core.la
468 %{_libdir}/libzpool.la
469 %{_includedir}/libspl
470 %{_includedir}/libzfs
471 %{_pkgconfigdir}/libzfs.pc
472 %{_pkgconfigdir}/libzfs_core.pc
473
474 %files static
475 %defattr(644,root,root,755)
476 %{_libdir}/libnvpair.a
477 %{_libdir}/libuutil.a
478 %{_libdir}/libzfs.a
479 %{_libdir}/libzfs_core.a
480 %{_libdir}/libzpool.a
481
482 %files -n dracut-zfs
483 %defattr(644,root,root,755)
484 %doc contrib/dracut/README.dracut.markdown
485 %dir %{dracutlibdir}/modules.d/02zfsexpandknowledge
486 %attr(755,root,root) %{dracutlibdir}/modules.d/02zfsexpandknowledge/module-setup.sh
487 %dir %{dracutlibdir}/modules.d/90zfs
488 %attr(755,root,root) %{dracutlibdir}/modules.d/90zfs/export-zfs.sh
489 %attr(755,root,root) %{dracutlibdir}/modules.d/90zfs/module-setup.sh
490 %attr(755,root,root) %{dracutlibdir}/modules.d/90zfs/mount-zfs.sh
491 %attr(755,root,root) %{dracutlibdir}/modules.d/90zfs/parse-zfs.sh
492 %attr(755,root,root) %{dracutlibdir}/modules.d/90zfs/zfs-env-bootfs.service
493 %attr(755,root,root) %{dracutlibdir}/modules.d/90zfs/zfs-generator.sh
494 %attr(755,root,root) %{dracutlibdir}/modules.d/90zfs/zfs-lib.sh
495 %attr(755,root,root) %{dracutlibdir}/modules.d/90zfs/zfs-load-key.sh
496 %attr(755,root,root) %{dracutlibdir}/modules.d/90zfs/zfs-needshutdown.sh
497
498 %if %{with python2}
499 %files -n python-pyzfs
500 %defattr(644,root,root,755)
501 %doc contrib/pyzfs/README
502 %{py_sitescriptdir}/libzfs_core
503 %{py_sitescriptdir}/pyzfs-*-py*.egg-info
504 %endif
505
506 %if %{with python3}
507 %files -n python3-pyzfs
508 %defattr(644,root,root,755)
509 %doc contrib/pyzfs/README
510 %{py3_sitescriptdir}/libzfs_core
511 %{py3_sitescriptdir}/pyzfs-*-py*.egg-info
512 %endif
513 %endif
514
515 %if %{with kernel}
516 %files -n kernel-zfs-common-devel
517 %defattr(644,root,root,755)
518 %dir /usr/src/zfs-%{version}
519 /usr/src/zfs-%{version}/include
520 /usr/src/zfs-%{version}/zfs.release
521 /usr/src/zfs-%{version}/zfs_config.h
522 %endif
This page took 0.085711 seconds and 2 git commands to generate.