xref: /src/sys/contrib/openzfs/module/Kbuild.in (revision 80aae8a3f8aa70712930664572be9e6885dc0be7)
1# When integrated in to a monolithic kernel the spl module must appear
2# first.  This ensures its module initialization function is run before
3# any of the other module initialization functions which depend on it.
4
5ZFS_MODULE_CFLAGS += -std=gnu11 -Wno-declaration-after-statement
6ZFS_MODULE_CFLAGS += -Wmissing-prototypes
7ZFS_MODULE_CFLAGS += @KERNEL_DEBUG_CFLAGS@ @KERNEL_NO_FORMAT_ZERO_LENGTH@
8
9ifneq ($(KBUILD_EXTMOD),)
10zfs_include = @abs_top_srcdir@/include
11icp_include = @abs_srcdir@/icp/include
12zstd_include = @abs_srcdir@/zstd/include
13ZFS_MODULE_CFLAGS += -include @abs_top_builddir@/zfs_config.h
14ZFS_MODULE_CFLAGS += -include $(zfs_include)/sys/simd_config.h
15ZFS_MODULE_CFLAGS += -I@abs_top_builddir@/include
16src = @abs_srcdir@
17obj = @abs_builddir@
18else
19zfs_include = $(srctree)/include/zfs
20icp_include = $(src)/icp/include
21zstd_include = $(src)/zstd/include
22ZFS_MODULE_CFLAGS += -include $(zfs_include)/zfs_config.h
23ZFS_MODULE_CFLAGS += -include $(zfs_include)/sys/simd_config.h
24endif
25
26ZFS_MODULE_CFLAGS += -I$(zfs_include)/os/linux/kernel
27ZFS_MODULE_CFLAGS += -I$(zfs_include)/os/linux/spl
28ZFS_MODULE_CFLAGS += -I$(zfs_include)/os/linux/zfs
29ZFS_MODULE_CFLAGS += -I$(zfs_include)
30ZFS_MODULE_CPPFLAGS += -D_KERNEL
31ZFS_MODULE_CPPFLAGS += @KERNEL_DEBUG_CPPFLAGS@
32
33# KASAN enables -Werror=frame-larger-than=1024, which
34# breaks oh so many parts of our build.
35ifeq ($(CONFIG_KASAN),y)
36ZFS_MODULE_CFLAGS += -Wno-error=frame-larger-than=
37endif
38
39# Generated binary search code is particularly bad with this optimization.
40# Oddly, range_tree.c is not affected when unrolling is not done and dsl_scan.c
41# is not affected when unrolling is done.
42# Disable it until the following upstream issue is resolved:
43# https://github.com/llvm/llvm-project/issues/62790
44ifeq ($(CONFIG_X86),y)
45ifeq ($(CONFIG_CC_IS_CLANG),y)
46CFLAGS_zfs/dsl_scan.o += -mllvm -x86-cmov-converter=false
47CFLAGS_zfs/metaslab.o += -mllvm -x86-cmov-converter=false
48CFLAGS_zfs/range_tree.o += -mllvm -x86-cmov-converter=false
49CFLAGS_zfs/zap_micro.o += -mllvm -x86-cmov-converter=false
50endif
51endif
52
53# These are internal functions for 64-bit math on 32-bit platforms. The
54# compiler will generate references to them if necessary, to be resolved at
55# link time. We don't need or provide prototypes for them, so we disable
56# warnings that would complain about them.
57CFLAGS_REMOVE_os/linux/spl/spl-math-compat.o += -Wmissing-prototypes
58CFLAGS_REMOVE_os/linux/spl/spl-math-compat.o += -Wmissing-declarations
59
60ifneq ($(KBUILD_EXTMOD),)
61@CONFIG_QAT_TRUE@ZFS_MODULE_CFLAGS += -I@QAT_SRC@/include
62@CONFIG_QAT_TRUE@KBUILD_EXTRA_SYMBOLS += @QAT_SYMBOLS@
63endif
64
65asflags-y := $(ZFS_MODULE_CFLAGS) $(ZFS_MODULE_CPPFLAGS)
66ccflags-y := $(ZFS_MODULE_CFLAGS) $(ZFS_MODULE_CPPFLAGS)
67
68ifeq ($(CONFIG_ARM64),y)
69CFLAGS_REMOVE_zcommon/zfs_fletcher_aarch64_neon.o += -mgeneral-regs-only
70CFLAGS_REMOVE_zfs/vdev_raidz_math_aarch64_neon.o += -mgeneral-regs-only
71CFLAGS_REMOVE_zfs/vdev_raidz_math_aarch64_neonx2.o += -mgeneral-regs-only
72endif
73
74# Suppress unused-value warnings in sparc64 architecture headers
75ccflags-$(CONFIG_SPARC64) += -Wno-unused-value
76
77
78obj-$(CONFIG_ZFS) := spl.o zfs.o
79
80SPL_OBJS := \
81	spl-condvar.o \
82	spl-cred.o \
83	spl-err.o \
84	spl-generic.o \
85	spl-kmem-cache.o \
86	spl-kmem.o \
87	spl-kstat.o \
88	spl-math-compat.o \
89	spl-proc.o \
90	spl-procfs-list.o \
91	spl-shrinker.o \
92	spl-taskq.o \
93	spl-thread.o \
94	spl-trace.o \
95	spl-tsd.o \
96	spl-vmem.o \
97	spl-xdr.o \
98	spl-zlib.o \
99	spl-zone.o
100
101spl-objs += $(addprefix os/linux/spl/,$(SPL_OBJS))
102
103zfs-objs += avl/avl.o
104
105ICP_OBJS := \
106	algs/aes/aes_impl.o \
107	algs/aes/aes_impl_generic.o \
108	algs/aes/aes_modes.o \
109	algs/blake3/blake3.o \
110	algs/blake3/blake3_generic.o \
111	algs/blake3/blake3_impl.o \
112	algs/edonr/edonr.o \
113	algs/modes/ccm.o \
114	algs/modes/gcm.o \
115	algs/modes/gcm_generic.o \
116	algs/modes/modes.o \
117	algs/sha2/sha2_generic.o \
118	algs/sha2/sha256_impl.o \
119	algs/sha2/sha512_impl.o \
120	algs/skein/skein.o \
121	algs/skein/skein_block.o \
122	algs/skein/skein_iv.o \
123	api/kcf_cipher.o \
124	api/kcf_ctxops.o \
125	api/kcf_mac.o \
126	core/kcf_callprov.o \
127	core/kcf_mech_tabs.o \
128	core/kcf_prov_lib.o \
129	core/kcf_prov_tabs.o \
130	core/kcf_sched.o \
131	illumos-crypto.o \
132	io/aes.o \
133	io/sha2_mod.o \
134	spi/kcf_spi.o
135
136ICP_OBJS_X86_64 := \
137	asm-x86_64/aes/aes_aesni.o \
138	asm-x86_64/aes/aes_amd64.o \
139	asm-x86_64/aes/aeskey.o \
140	asm-x86_64/blake3/blake3_avx2.o \
141	asm-x86_64/blake3/blake3_avx512.o \
142	asm-x86_64/blake3/blake3_sse2.o \
143	asm-x86_64/blake3/blake3_sse41.o \
144	asm-x86_64/sha2/sha256-x86_64.o \
145	asm-x86_64/sha2/sha512-x86_64.o \
146	asm-x86_64/modes/aesni-gcm-x86_64.o \
147	asm-x86_64/modes/aesni-gcm-avx2-vaes.o \
148	asm-x86_64/modes/gcm_pclmulqdq.o \
149	asm-x86_64/modes/ghash-x86_64.o
150
151ICP_OBJS_X86 := \
152	algs/aes/aes_impl_aesni.o \
153	algs/aes/aes_impl_x86-64.o \
154	algs/modes/gcm_pclmulqdq.o
155
156ICP_OBJS_ARM := \
157	asm-arm/sha2/sha256-armv7.o \
158	asm-arm/sha2/sha512-armv7.o
159
160ICP_OBJS_ARM64 := \
161	asm-aarch64/blake3/b3_aarch64_sse2.o \
162	asm-aarch64/blake3/b3_aarch64_sse41.o \
163	asm-aarch64/sha2/sha256-armv8.o \
164	asm-aarch64/sha2/sha512-armv8.o
165
166ICP_OBJS_PPC_PPC64 := \
167	asm-ppc64/blake3/b3_ppc64le_sse2.o \
168	asm-ppc64/blake3/b3_ppc64le_sse41.o \
169	asm-ppc64/sha2/sha256-p8.o \
170	asm-ppc64/sha2/sha512-p8.o \
171	asm-ppc64/sha2/sha256-ppc.o \
172	asm-ppc64/sha2/sha512-ppc.o
173
174zfs-objs             += $(addprefix icp/,$(ICP_OBJS))
175zfs-$(CONFIG_X86)    += $(addprefix icp/,$(ICP_OBJS_X86))
176zfs-$(CONFIG_UML_X86)+= $(addprefix icp/,$(ICP_OBJS_X86))
177zfs-$(CONFIG_X86_64) += $(addprefix icp/,$(ICP_OBJS_X86_64))
178zfs-$(CONFIG_ARM)    += $(addprefix icp/,$(ICP_OBJS_ARM))
179zfs-$(CONFIG_ARM64)  += $(addprefix icp/,$(ICP_OBJS_ARM64))
180zfs-$(CONFIG_PPC)    += $(addprefix icp/,$(ICP_OBJS_PPC_PPC64))
181zfs-$(CONFIG_PPC64)  += $(addprefix icp/,$(ICP_OBJS_PPC_PPC64))
182
183$(addprefix $(obj)/icp/,$(ICP_OBJS) $(ICP_OBJS_X86) $(ICP_OBJS_X86_64) \
184	$(ICP_OBJS_ARM64) $(ICP_OBJS_PPC_PPC64)) : asflags-y += -I$(icp_include) -I$(zfs_include)/os/linux/spl -I$(zfs_include)
185
186$(addprefix $(obj)/icp/,$(ICP_OBJS) $(ICP_OBJS_X86) $(ICP_OBJS_X86_64) \
187	$(ICP_OBJS_ARM64) $(ICP_OBJS_PPC_PPC64)) : ccflags-y += -I$(icp_include) -I$(zfs_include)/os/linux/spl -I$(zfs_include)
188
189LUA_OBJS := \
190	lapi.o \
191	lauxlib.o \
192	lbaselib.o \
193	lcode.o \
194	lcompat.o \
195	lcorolib.o \
196	lctype.o \
197	ldebug.o \
198	ldo.o \
199	lfunc.o \
200	lgc.o \
201	llex.o \
202	lmem.o \
203	lobject.o \
204	lopcodes.o \
205	lparser.o \
206	lstate.o \
207	lstring.o \
208	lstrlib.o \
209	ltable.o \
210	ltablib.o \
211	ltm.o \
212	lvm.o \
213	lzio.o \
214	setjmp/setjmp.o
215
216zfs-objs += $(addprefix lua/,$(LUA_OBJS))
217
218
219NVPAIR_OBJS := \
220	fnvpair.o \
221	nvpair.o \
222	nvpair_alloc_fixed.o \
223	nvpair_alloc_spl.o
224
225zfs-objs += $(addprefix nvpair/,$(NVPAIR_OBJS))
226
227
228ZCOMMON_OBJS := \
229	cityhash.o \
230	simd_stat.o \
231	zfeature_common.o \
232	zfs_comutil.o \
233	zfs_deleg.o \
234	zfs_fletcher.o \
235	zfs_fletcher_superscalar.o \
236	zfs_fletcher_superscalar4.o \
237	zfs_namecheck.o \
238	zfs_prop.o \
239	zfs_valstr.o \
240	zpool_prop.o \
241	zprop_common.o
242
243ZCOMMON_OBJS_X86 := \
244	zfs_fletcher_avx512.o \
245	zfs_fletcher_intel.o \
246	zfs_fletcher_sse.o
247
248ZCOMMON_OBJS_ARM64 := \
249	zfs_fletcher_aarch64_neon.o
250
251zfs-objs            += $(addprefix zcommon/,$(ZCOMMON_OBJS))
252zfs-$(CONFIG_X86)   += $(addprefix zcommon/,$(ZCOMMON_OBJS_X86))
253zfs-$(CONFIG_UML_X86)+= $(addprefix zcommon/,$(ZCOMMON_OBJS_X86))
254zfs-$(CONFIG_ARM64) += $(addprefix zcommon/,$(ZCOMMON_OBJS_ARM64))
255
256
257# Zstd uses -O3 by default, so we should follow
258ZFS_ZSTD_FLAGS := -O3
259
260# -fno-tree-vectorize gets set for gcc in zstd/common/compiler.h
261# Set it for other compilers, too.
262ZFS_ZSTD_FLAGS += -fno-tree-vectorize
263
264# SSE register return with SSE disabled if -march=znverX is passed
265ZFS_ZSTD_FLAGS += -U__BMI__
266
267# Quiet warnings about frame size due to unused code in unmodified zstd lib
268ZFS_ZSTD_FLAGS += -Wframe-larger-than=20480
269
270# Disable assembly for kernel compatibility
271ZFS_ZSTD_FLAGS += -DZSTD_DISABLE_ASM
272
273# Disable intrinsics for EL10 x86_64-v3 baseline
274ZFS_ZSTD_FLAGS += -DZSTD_NO_INTRINSICS
275
276# Disable tracing for kernel builds
277ZFS_ZSTD_FLAGS += -DZSTD_TRACE=0
278
279ZSTD_OBJS := \
280	zfs_zstd.o \
281	zstd_sparc.o
282
283ZSTD_UPSTREAM_OBJS := \
284	lib/common/entropy_common.o \
285	lib/common/error_private.o \
286	lib/common/fse_decompress.o \
287	lib/common/pool.o \
288	lib/common/zstd_common.o \
289	lib/compress/fse_compress.o \
290	lib/compress/hist.o \
291	lib/compress/huf_compress.o \
292	lib/compress/zstd_compress.o \
293	lib/compress/zstd_compress_literals.o \
294	lib/compress/zstd_compress_sequences.o \
295	lib/compress/zstd_compress_superblock.o \
296	lib/compress/zstd_double_fast.o \
297	lib/compress/zstd_fast.o \
298	lib/compress/zstd_lazy.o \
299	lib/compress/zstd_ldm.o \
300	lib/compress/zstd_opt.o \
301	lib/compress/zstd_preSplit.o \
302	lib/decompress/huf_decompress.o \
303	lib/decompress/zstd_ddict.o \
304	lib/decompress/zstd_decompress.o \
305	lib/decompress/zstd_decompress_block.o
306
307zfs-objs += $(addprefix zstd/,$(ZSTD_OBJS) $(ZSTD_UPSTREAM_OBJS))
308
309$(addprefix $(obj)/zstd/,$(ZSTD_OBJS) $(ZSTD_UPSTREAM_OBJS)) : ccflags-y += -I$(zstd_include) $(ZFS_ZSTD_FLAGS)
310$(addprefix $(obj)/zstd/,$(ZSTD_OBJS) $(ZSTD_UPSTREAM_OBJS)) : asflags-y += -I$(zstd_include)
311$(addprefix $(obj)/zstd/,$(ZSTD_UPSTREAM_OBJS)) : ccflags-y += -include $(zstd_include)/zstd_compat_wrapper.h -Wp,-w
312$(obj)/zstd/zfs_zstd.o : ccflags-y += -include $(zstd_include)/zstd_compat_wrapper.h
313
314
315ZFS_OBJS := \
316	abd.o \
317	aggsum.o \
318	arc.o \
319	blake3_zfs.o \
320	blkptr.o \
321	bplist.o \
322	bpobj.o \
323	bptree.o \
324	bqueue.o \
325	brt.o \
326	btree.o \
327	dataset_kstats.o \
328	dbuf.o \
329	dbuf_stats.o \
330	ddt.o \
331	ddt_log.o \
332	ddt_stats.o \
333	ddt_zap.o \
334	dmu.o \
335	dmu_direct.o \
336	dmu_diff.o \
337	dmu_object.o \
338	dmu_objset.o \
339	dmu_recv.o \
340	dmu_redact.o \
341	dmu_send.o \
342	dmu_traverse.o \
343	dmu_tx.o \
344	dmu_zfetch.o \
345	dnode.o \
346	dnode_sync.o \
347	dsl_bookmark.o \
348	dsl_crypt.o \
349	dsl_dataset.o \
350	dsl_deadlist.o \
351	dsl_deleg.o \
352	dsl_destroy.o \
353	dsl_dir.o \
354	dsl_pool.o \
355	dsl_prop.o \
356	dsl_scan.o \
357	dsl_synctask.o \
358	dsl_userhold.o \
359	edonr_zfs.o \
360	fm.o \
361	gzip.o \
362	hkdf.o \
363	lz4.o \
364	lz4_zfs.o \
365	lzjb.o \
366	metaslab.o \
367	mmp.o \
368	multilist.o \
369	objlist.o \
370	pathname.o \
371	range_tree.o \
372	refcount.o \
373	rrwlock.o \
374	sa.o \
375	sha2_zfs.o \
376	skein_zfs.o \
377	spa.o \
378	spa_checkpoint.o \
379	spa_config.o \
380	spa_errlog.o \
381	spa_history.o \
382	spa_log_spacemap.o \
383	spa_misc.o \
384	spa_stats.o \
385	space_map.o \
386	space_reftree.o \
387	txg.o \
388	u8_textprep.o \
389	uberblock.o \
390	unique.o \
391	vdev.o \
392	vdev_draid.o \
393	vdev_draid_rand.o \
394	vdev_file.o \
395	vdev_indirect.o \
396	vdev_indirect_births.o \
397	vdev_indirect_mapping.o \
398	vdev_initialize.o \
399	vdev_label.o \
400	vdev_mirror.o \
401	vdev_missing.o \
402	vdev_queue.o \
403	vdev_raidz.o \
404	vdev_raidz_math.o \
405	vdev_raidz_math_scalar.o \
406	vdev_rebuild.o \
407	vdev_removal.o \
408	vdev_root.o \
409	vdev_trim.o \
410	zap.o \
411	zap_leaf.o \
412	zap_micro.o \
413	zcp.o \
414	zcp_get.o \
415	zcp_global.o \
416	zcp_iter.o \
417	zcp_set.o \
418	zcp_synctask.o \
419	zfeature.o \
420	zfs_byteswap.o \
421	zfs_chksum.o \
422	zfs_debug_common.o \
423	zfs_crrd.o \
424	zfs_fm.o \
425	zfs_fuid.o \
426	zfs_impl.o \
427	zfs_ioctl.o \
428	zfs_log.o \
429	zfs_onexit.o \
430	zfs_quota.o \
431	zfs_ratelimit.o \
432	zfs_replay.o \
433	zfs_rlock.o \
434	zfs_sa.o \
435	zfs_vnops.o \
436	zfs_znode.o \
437	zil.o \
438	zio.o \
439	zio_checksum.o \
440	zio_compress.o \
441	zio_inject.o \
442	zle.o \
443	zrlock.o \
444	zthr.o \
445	zvol.o
446
447ZFS_OBJS_OS := \
448	abd_os.o \
449	arc_os.o \
450	kasan_compat.o \
451	mmp_os.o \
452	policy.o \
453	qat.o \
454	qat_compress.o \
455	qat_crypt.o \
456	spa_misc_os.o \
457	trace.o \
458	vdev_disk.o \
459	vdev_raidz.o \
460	vdev_label_os.o \
461	zfs_acl.o \
462	zfs_ctldir.o \
463	zfs_debug.o \
464	zfs_dir.o \
465	zfs_file_os.o \
466	zfs_ioctl_os.o \
467	zfs_racct.o \
468	zfs_sysfs.o \
469	zfs_uio.o \
470	zfs_vfsops.o \
471	zfs_vnops_os.o \
472	zfs_znode_os.o \
473	zio_crypt.o \
474	zpl_ctldir.o \
475	zpl_export.o \
476	zpl_file.o \
477	zpl_file_range.o \
478	zpl_inode.o \
479	zpl_super.o \
480	zpl_xattr.o \
481	zvol_os.o
482
483ZFS_OBJS_X86 := \
484	vdev_raidz_math_avx2.o \
485	vdev_raidz_math_avx512bw.o \
486	vdev_raidz_math_avx512f.o \
487	vdev_raidz_math_sse2.o \
488	vdev_raidz_math_ssse3.o
489
490ZFS_OBJS_ARM64 := \
491	vdev_raidz_math_aarch64_neon.o \
492	vdev_raidz_math_aarch64_neonx2.o
493
494ZFS_OBJS_PPC_PPC64 := \
495	vdev_raidz_math_powerpc_altivec.o
496
497zfs-objs            += $(addprefix zfs/,$(ZFS_OBJS)) $(addprefix os/linux/zfs/,$(ZFS_OBJS_OS))
498zfs-$(CONFIG_X86)   += $(addprefix zfs/,$(ZFS_OBJS_X86))
499zfs-$(CONFIG_UML_X86)+= $(addprefix zfs/,$(ZFS_OBJS_X86))
500zfs-$(CONFIG_ARM64) += $(addprefix zfs/,$(ZFS_OBJS_ARM64))
501zfs-$(CONFIG_PPC)   += $(addprefix zfs/,$(ZFS_OBJS_PPC_PPC64))
502zfs-$(CONFIG_PPC64) += $(addprefix zfs/,$(ZFS_OBJS_PPC_PPC64))
503
504UBSAN_SANITIZE_zap_leaf.o := n
505UBSAN_SANITIZE_zap_micro.o := n
506UBSAN_SANITIZE_sa.o := n
507UBSAN_SANITIZE_zfs/zap_micro.o := n
508UBSAN_SANITIZE_zfs/sa.o := n
509
510ifeq ($(CONFIG_ALTIVEC),y)
511$(obj)/zfs/vdev_raidz_math_powerpc_altivec.o : c_flags += -maltivec
512endif
513
514# The following recipes attempt to fix out of src-tree builds, where $(src) != $(obj), so that the
515# subdir %.c/%.S -> %.o targets will work as expected. The in-kernel pattern targets do not seem to
516# be working on subdirs since about ~6.10
517zobjdirs = $(dir $(zfs-objs)) $(dir $(spl-objs))                                             \
518  $(dir $(zfs-$(CONFIG_X86))) $(dir $(zfs-$(CONFIG_UML_X86))) $(dir $(zfs-$(CONFIG_ARM64)))  \
519  $(dir $(zfs-$(CONFIG_PPC64))) $(dir $(zfs-$(CONFIG_PPC)))
520
521z_cdirs = $(sort $(filter-out lua/setjmp/ $(addprefix icp/asm-aarch64/, aes/ blake3/ modes/ sha2/) \
522  $(addprefix icp/asm-x86_64/, aes/ blake3/ modes/ sha2/)                                          \
523  $(addprefix icp/asm-ppc/, aes/ blake3/ modes/ sha2/)                                             \
524  $(addprefix icp/asm-ppc64/, aes/ blake3/ modes/ sha2/), $(zobjdirs)))
525z_sdirs = $(sort $(filter lua/setjmp/ $(addprefix icp/asm-aarch64/, aes/ blake3/ modes/ sha2/)     \
526  $(addprefix icp/asm-x86_64/, aes/ blake3/ modes/ sha2/)                                          \
527  $(addprefix icp/asm-ppc/, aes/ blake3/ modes/ sha2/)                                             \
528  $(addprefix icp/asm-ppc64/, aes/ blake3/ modes/ sha2/), $(zobjdirs)))
529
530define ZKMOD_C_O_MAKE_TARGET
531$1%.o: $(src)/$1%.c FORCE
532	$$(call if_changed_rule,cc_o_c)
533	$$(call cmd,force_checksrc)
534endef
535
536define ZKMOD_S_O_MAKE_TARGET
537$1%.o: $(src)/$1%.S FORCE
538	$$(call if_changed_rule,as_o_S)
539	$$(call cmd,force_checksrc)
540endef
541
542$(foreach target,$(z_cdirs), $(eval $(call ZKMOD_C_O_MAKE_TARGET,$(target))))
543$(foreach target,$(z_sdirs), $(eval $(call ZKMOD_S_O_MAKE_TARGET,$(target))))
544