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