2017-11-01 15:07:57 +01:00
# SPDX-License-Identifier: GPL-2.0
2007-10-15 22:25:06 +02:00
# Backward compatibility
asflags-y += $( EXTRA_AFLAGS)
ccflags-y += $( EXTRA_CFLAGS)
cppflags-y += $( EXTRA_CPPFLAGS)
ldflags-y += $( EXTRA_LDFLAGS)
2020-04-28 01:03:57 +09:00
i f n e q ( $( always ) , )
$( warning 'always ' is deprecated . Please use 'always -y ' instead )
2020-02-02 01:49:24 +09:00
always-y += $( always)
2020-04-28 01:03:57 +09:00
e n d i f
i f n e q ( $( hostprogs -y ) , )
$( warning 'hostprogs -y ' is deprecated . Please use 'hostprogs ' instead )
hostprogs += $( hostprogs-y)
e n d i f
i f n e q ( $( hostprogs -m ) , )
$( warning 'hostprogs -m ' is deprecated . Please use 'hostprogs ' instead )
hostprogs += $( hostprogs-m)
e n d i f
2007-10-15 22:25:06 +02:00
2017-10-09 11:49:11 +08:00
# flags that take effect in current and sub directories
2017-10-10 20:43:21 +09:00
KBUILD_AFLAGS += $( subdir-asflags-y)
KBUILD_CFLAGS += $( subdir-ccflags-y)
2009-04-19 11:04:26 +02:00
2005-04-16 15:20:36 -07:00
# Figure out what we need to build from the various variables
# ===========================================================================
# When an object is listed to be built compiled-in and modular,
# only build the compiled-in version
obj-m := $( filter-out $( obj-y) ,$( obj-m) )
# Libraries are always collected in one lib file.
# Filter out objects already built-in
lib-y := $( filter-out $( obj-y) , $( sort $( lib-y) $( lib-m) ) )
2020-06-01 14:56:55 +09:00
# Subdirectories we need to descend into
subdir-ym := $( sort $( subdir-y) $( subdir-m) \
$( patsubst %/,%, $( filter %/, $( obj-y) $( obj-m) ) ) )
2020-06-01 14:57:00 +09:00
# Handle objects in subdirs:
# - If we encounter foo/ in $(obj-y), replace it by foo/built-in.a and
# foo/modules.order
# - If we encounter foo/ in $(obj-m), replace it by foo/modules.order
#
# Generate modules.order to determine modorder. Unfortunately, we don't have
# information about ordering between -y and -m subdirs. Just put -y's first.
i f d e f n e e d - m o d o r d e r
obj-m := $( patsubst %/,%/modules.order, $( filter %/, $( obj-y) ) $( obj-m) )
e l s e
obj-m := $( filter-out %/, $( obj-m) )
e n d i f
2019-12-19 01:04:28 +09:00
i f d e f n e e d - b u i l t i n
2018-02-11 00:25:04 +10:00
obj-y := $( patsubst %/, %/built-in.a, $( obj-y) )
2019-12-19 01:04:28 +09:00
e l s e
obj-y := $( filter-out %/, $( obj-y) )
e n d i f
2005-04-16 15:20:36 -07:00
2019-08-06 15:39:19 +09:00
# If $(foo-objs), $(foo-y), $(foo-m), or $(foo-) exists, foo.o is a composite object
multi-used-y := $( sort $( foreach m,$( obj-y) , $( if $( strip $( $( m:.o= -objs) ) $( $( m:.o= -y) ) $( $( m:.o= -) ) ) , $( m) ) ) )
multi-used-m := $( sort $( foreach m,$( obj-m) , $( if $( strip $( $( m:.o= -objs) ) $( $( m:.o= -y) ) $( $( m:.o= -m) ) $( $( m:.o= -) ) ) , $( m) ) ) )
2005-04-16 15:20:36 -07:00
multi-used := $( multi-used-y) $( multi-used-m)
2018-03-19 20:26:08 +09:00
# Replace multi-part objects by their individual parts,
# including built-in.a from subdirectories
2019-08-06 15:39:19 +09:00
real-obj-y := $( foreach m, $( obj-y) , $( if $( strip $( $( m:.o= -objs) ) $( $( m:.o= -y) ) $( $( m:.o= -) ) ) ,$( $( m:.o= -objs) ) $( $( m:.o= -y) ) ,$( m) ) )
real-obj-m := $( foreach m, $( obj-m) , $( if $( strip $( $( m:.o= -objs) ) $( $( m:.o= -y) ) $( $( m:.o= -m) ) $( $( m:.o= -) ) ) ,$( $( m:.o= -objs) ) $( $( m:.o= -y) ) $( $( m:.o= -m) ) ,$( m) ) )
2005-04-16 15:20:36 -07:00
2020-02-02 01:49:24 +09:00
always-y += $( always-m)
2020-08-01 21:27:18 +09:00
# hostprogs-always-y += foo
# ... is a shorthand for
# hostprogs += foo
# always-y += foo
hostprogs += $( hostprogs-always-y) $( hostprogs-always-m)
always-y += $( hostprogs-always-y) $( hostprogs-always-m)
# userprogs-always-y is likewise.
userprogs += $( userprogs-always-y) $( userprogs-always-m)
always-y += $( userprogs-always-y) $( userprogs-always-m)
2017-11-05 14:30:53 +09:00
# DTB
# If CONFIG_OF_ALL_DTBS is enabled, all DT blobs are built
extra-y += $( dtb-y)
extra-$(CONFIG_OF_ALL_DTBS) += $( dtb-)
2018-09-06 13:26:07 -05:00
i f n e q ( $( CHECK_DTBS ) , )
extra-y += $( patsubst %.dtb,%.dt.yaml, $( dtb-y) )
extra-$(CONFIG_OF_ALL_DTBS) += $( patsubst %.dtb,%.dt.yaml, $( dtb-) )
e n d i f
2005-04-16 15:20:36 -07:00
# Add subdir path
extra-y := $( addprefix $( obj) /,$( extra-y) )
2020-02-02 01:49:24 +09:00
always-y := $( addprefix $( obj) /,$( always-y) )
2005-04-16 15:20:36 -07:00
targets := $( addprefix $( obj) /,$( targets) )
obj-m := $( addprefix $( obj) /,$( obj-m) )
lib-y := $( addprefix $( obj) /,$( lib-y) )
2018-03-19 20:26:07 +09:00
real-obj-y := $( addprefix $( obj) /,$( real-obj-y) )
real-obj-m := $( addprefix $( obj) /,$( real-obj-m) )
2005-04-16 15:20:36 -07:00
multi-used-m := $( addprefix $( obj) /,$( multi-used-m) )
subdir-ym := $( addprefix $( obj) /,$( subdir-ym) )
2018-03-19 18:01:27 +09:00
# Finds the multi-part object the current object will be linked into.
2019-12-19 17:33:28 +09:00
# If the object belongs to two or more multi-part objects, list them all.
modname-multi = $( sort $( foreach m,$( multi-used) ,\
$( if $( filter $* .o, $( $( m:.o= -objs) ) $( $( m:.o= -y) ) $( $( m:.o= -m) ) ) ,$( m:.o= ) ) ) )
2018-03-19 18:01:27 +09:00
2019-12-19 17:33:28 +09:00
__modname = $( if $( modname-multi) ,$( modname-multi) ,$( basetarget) )
modname = $( subst $( space) ,:,$( __modname) )
modfile = $( addprefix $( obj) /,$( __modname) )
2018-03-19 18:01:27 +09:00
2019-08-30 13:34:01 +09:00
# target with $(obj)/ and its suffix stripped
target-stem = $( basename $( patsubst $( obj) /%,%,$@ ) )
2005-04-16 15:20:36 -07:00
# These flags are needed for modversions and compiling, so we define them here
2017-10-09 11:49:11 +08:00
# $(modname_flags) defines KBUILD_MODNAME as the name of the module it will
2005-04-16 15:20:36 -07:00
# end up in (or would, if it gets compiled in)
2019-12-19 17:33:27 +09:00
name-fix = $( call stringify,$( subst $( comma) ,_,$( subst -,_,$1 ) ) )
2016-03-17 16:32:14 +01:00
basename_flags = -DKBUILD_BASENAME= $( call name-fix,$( basetarget) )
2018-03-19 18:01:24 +09:00
modname_flags = -DKBUILD_MODNAME= $( call name-fix,$( modname) )
2019-12-19 17:33:28 +09:00
modfile_flags = -DKBUILD_MODFILE= $( call stringify,$( modfile) )
2005-04-16 15:20:36 -07:00
2020-07-07 18:21:16 +09:00
_c_flags = $( filter-out $( CFLAGS_REMOVE_$( target-stem) .o) , \
$( filter-out $( ccflags-remove-y) , \
$( KBUILD_CPPFLAGS) $( KBUILD_CFLAGS) $( ccflags-y) ) \
$( CFLAGS_$( target-stem) .o) )
_a_flags = $( filter-out $( AFLAGS_REMOVE_$( target-stem) .o) , \
$( filter-out $( asflags-remove-y) , \
$( KBUILD_CPPFLAGS) $( KBUILD_AFLAGS) $( asflags-y) ) \
$( AFLAGS_$( target-stem) .o) )
2019-08-30 13:34:01 +09:00
_cpp_flags = $( KBUILD_CPPFLAGS) $( cppflags-y) $( CPPFLAGS_$( target-stem) .lds)
2005-04-16 15:20:36 -07:00
2009-06-17 16:28:08 -07:00
#
# Enable gcov profiling flags for a file, directory or for all files depending
# on variables GCOV_PROFILE_obj.o, GCOV_PROFILE and CONFIG_GCOV_PROFILE_ALL
# (in this order)
#
i f e q ( $( CONFIG_GCOV_KERNEL ) , y )
_c_flags += $( if $( patsubst n%,, \
$( GCOV_PROFILE_$( basetarget) .o) $( GCOV_PROFILE) $( CONFIG_GCOV_PROFILE_ALL) ) , \
$( CFLAGS_GCOV) )
e n d i f
2015-02-13 14:39:17 -08:00
#
# Enable address sanitizer flags for kernel except some files or directories
# we don't want to check (depends on variables KASAN_SANITIZE_obj.o, KASAN_SANITIZE)
#
i f e q ( $( CONFIG_KASAN ) , y )
_c_flags += $( if $( patsubst n%,, \
$( KASAN_SANITIZE_$( basetarget) .o) $( KASAN_SANITIZE) y) , \
2018-02-06 15:36:00 -08:00
$( CFLAGS_KASAN) , $( CFLAGS_KASAN_NOSANITIZE) )
2015-02-13 14:39:17 -08:00
e n d i f
2016-01-20 15:00:55 -08:00
i f e q ( $( CONFIG_UBSAN ) , y )
_c_flags += $( if $( patsubst n%,, \
$( UBSAN_SANITIZE_$( basetarget) .o) $( UBSAN_SANITIZE) $( CONFIG_UBSAN_SANITIZE_ALL) ) , \
$( CFLAGS_UBSAN) )
e n d i f
2016-03-22 14:27:30 -07:00
i f e q ( $( CONFIG_KCOV ) , y )
_c_flags += $( if $( patsubst n%,, \
2016-08-02 14:07:30 -07:00
$( KCOV_INSTRUMENT_$( basetarget) .o) $( KCOV_INSTRUMENT) $( CONFIG_KCOV_INSTRUMENT_ALL) ) , \
2016-03-22 14:27:30 -07:00
$( CFLAGS_KCOV) )
e n d i f
2019-11-14 19:02:54 +01:00
#
# Enable KCSAN flags except some files or directories we don't want to check
# (depends on variables KCSAN_SANITIZE_obj.o, KCSAN_SANITIZE)
#
i f e q ( $( CONFIG_KCSAN ) , y )
_c_flags += $( if $( patsubst n%,, \
$( KCSAN_SANITIZE_$( basetarget) .o) $( KCSAN_SANITIZE) y) , \
$( CFLAGS_KCSAN) )
e n d i f
2016-03-22 14:27:30 -07:00
2019-05-13 15:22:17 +09:00
# $(srctree)/$(src) for including checkin headers from generated source files
# $(objtree)/$(obj) for including generated headers from checkin source files
2019-01-16 11:56:40 +09:00
i f e q ( $( KBUILD_EXTMOD ) , )
2019-07-06 12:07:12 +09:00
i f d e f b u i l d i n g _ o u t _ o f _ s r c t r e e
2019-05-13 15:22:17 +09:00
_c_flags += -I $( srctree) /$( src) -I $( objtree) /$( obj)
_a_flags += -I $( srctree) /$( src) -I $( objtree) /$( obj)
_cpp_flags += -I $( srctree) /$( src) -I $( objtree) /$( obj)
2005-04-16 15:20:36 -07:00
e n d i f
2019-01-16 11:56:40 +09:00
e n d i f
2005-04-16 15:20:36 -07:00
2019-08-19 17:58:43 +09:00
part-of-module = $( if $( filter $( basename $@ ) .o, $( real-obj-m) ) ,y)
quiet_modtag = $( if $( part-of-module) ,[ M] , )
modkern_cflags = \
$( if $( part-of-module) , \
$( KBUILD_CFLAGS_MODULE) $( CFLAGS_MODULE) , \
2019-12-19 17:33:28 +09:00
$( KBUILD_CFLAGS_KERNEL) $( CFLAGS_KERNEL) $( modfile_flags) )
2019-08-19 17:58:43 +09:00
modkern_aflags = $( if $( part-of-module) , \
$( KBUILD_AFLAGS_MODULE) $( AFLAGS_MODULE) , \
$( KBUILD_AFLAGS_KERNEL) $( AFLAGS_KERNEL) )
2020-04-23 23:23:53 +09:00
c_flags = -Wp,-MMD,$( depfile) $( NOSTDINC_FLAGS) $( LINUXINCLUDE) \
2018-03-27 21:52:50 +09:00
-include $( srctree) /include/linux/compiler_types.h \
2019-05-13 15:22:17 +09:00
$( _c_flags) $( modkern_cflags) \
2016-03-17 16:32:14 +01:00
$( basename_flags) $( modname_flags)
2005-04-16 15:20:36 -07:00
2020-04-23 23:23:53 +09:00
a_flags = -Wp,-MMD,$( depfile) $( NOSTDINC_FLAGS) $( LINUXINCLUDE) \
2019-05-13 15:22:17 +09:00
$( _a_flags) $( modkern_aflags)
2005-04-16 15:20:36 -07:00
2020-04-23 23:23:53 +09:00
cpp_flags = -Wp,-MMD,$( depfile) $( NOSTDINC_FLAGS) $( LINUXINCLUDE) \
2019-05-13 15:22:17 +09:00
$( _cpp_flags)
2005-04-16 15:20:36 -07:00
2018-08-24 08:20:39 +09:00
ld_flags = $( KBUILD_LDFLAGS) $( ldflags-y) $( LDFLAGS_$( @F) )
2005-04-16 15:20:36 -07:00
2017-07-25 11:23:36 +09:00
DTC_INCLUDE := $( srctree) /scripts/dtc/include-prefixes
2020-04-23 23:23:53 +09:00
dtc_cpp_flags = -Wp,-MMD,$( depfile) .pre.tmp -nostdinc \
2017-07-25 11:23:36 +09:00
$( addprefix -I,$( DTC_INCLUDE) ) \
2013-02-12 15:03:37 -07:00
-undef -D__DTS__
2014-08-19 16:34:20 +09:00
# Useful for describing the dependency of composite objects
# Usage:
# $(call multi_depend, multi_used_targets, suffix_to_remove, suffix_to_add)
d e f i n e m u l t i _ d e p e n d
$( foreach m , $ ( notdir $ 1) , \
$ ( eval $ ( obj ) /$ m : \
$ ( addprefix $ ( obj ) /, $ ( foreach s , $ 3, $ ( $ ( m :%$ ( strip $ 2) =%$ ( s ) ) ) ) ) ) )
e n d e f
2020-06-26 02:04:33 +09:00
quiet_cmd_copy = COPY $@
cmd_copy = cp $< $@
2005-04-16 15:20:36 -07:00
# Shipped files
# ===========================================================================
quiet_cmd_shipped = SHIPPED $@
cmd_shipped = cat $< > $@
2011-06-07 13:09:28 -04:00
$(obj)/% : $( src ) /%_shipped
2005-04-16 15:20:36 -07:00
$( call cmd,shipped)
# Commands useful for building a boot image
# ===========================================================================
2014-04-28 16:26:18 +09:00
#
2005-04-16 15:20:36 -07:00
# Use as following:
#
# target: source(s) FORCE
# $(if_changed,ld/objcopy/gzip)
#
2007-09-30 20:34:36 +02:00
# and add target to extra-y so that we know we have to
2005-04-16 15:20:36 -07:00
# read in the saved command line
# Linking
# ---------------------------------------------------------------------------
quiet_cmd_ld = LD $@
2019-01-17 19:02:43 +09:00
cmd_ld = $( LD) $( ld_flags) $( real-prereqs) -o $@
2005-04-16 15:20:36 -07:00
2019-02-05 16:33:37 +09:00
# Archive
# ---------------------------------------------------------------------------
quiet_cmd_ar = AR $@
2019-09-21 15:49:54 +09:00
cmd_ar = rm -f $@ ; $( AR) cDPrsT $@ $( real-prereqs)
2019-02-05 16:33:37 +09:00
2005-04-16 15:20:36 -07:00
# Objcopy
# ---------------------------------------------------------------------------
quiet_cmd_objcopy = OBJCOPY $@
cmd_objcopy = $( OBJCOPY) $( OBJCOPYFLAGS) $( OBJCOPYFLAGS_$( @F) ) $< $@
# Gzip
# ---------------------------------------------------------------------------
quiet_cmd_gzip = GZIP $@
2020-06-08 12:59:44 +03:00
cmd_gzip = cat $( real-prereqs) | $( KGZIP) -n -f -9 > $@
2005-04-16 15:20:36 -07:00
2010-12-22 11:57:26 -08:00
# DTC
# ---------------------------------------------------------------------------
2016-02-11 16:28:13 -06:00
DTC ?= $( objtree) /scripts/dtc/dtc
2020-06-29 12:15:13 -06:00
DTC_FLAGS += -Wno-interrupt_provider
2010-12-22 11:57:26 -08:00
2016-03-24 10:52:42 -05:00
# Disable noisy checks by default
2019-09-01 01:25:55 +09:00
i f e q ( $( findstring 1,$ ( KBUILD_EXTRA_WARN ) ) , )
2017-03-21 09:14:20 -05:00
DTC_FLAGS += -Wno-unit_address_vs_reg \
-Wno-unit_address_format \
2018-02-28 08:09:45 -06:00
-Wno-avoid_unnecessary_addr_size \
-Wno-alias_paths \
2018-05-07 16:46:47 -05:00
-Wno-graph_child_address \
2018-11-28 19:11:50 -06:00
-Wno-simple_bus_reg \
2018-05-07 16:46:47 -05:00
-Wno-unique_unit_address \
2017-03-21 09:14:20 -05:00
-Wno-pci_device_reg
2016-03-24 10:52:42 -05:00
e n d i f
2019-09-01 01:25:55 +09:00
i f n e q ( $( findstring 2,$ ( KBUILD_EXTRA_WARN ) ) , )
2017-03-21 09:14:20 -05:00
DTC_FLAGS += -Wnode_name_chars_strict \
2020-06-29 12:15:13 -06:00
-Wproperty_name_chars_strict \
-Winterrupt_provider
2016-03-24 10:52:42 -05:00
e n d i f
2017-04-25 17:09:53 -07:00
DTC_FLAGS += $( DTC_FLAGS_$( basetarget) )
2010-12-22 11:57:26 -08:00
# Generate an assembly file to wrap the output of the device tree compiler
2013-06-13 11:53:09 +01:00
quiet_cmd_dt_S_dtb = DTB $@
2010-12-22 11:57:26 -08:00
cmd_dt_S_dtb = \
2019-01-17 19:02:44 +09:00
{ \
2010-12-22 11:57:26 -08:00
echo '\#include <asm-generic/vmlinux.lds.h>' ; \
echo '.section .dtb.init.rodata,"a"' ; \
echo '.balign STRUCT_ALIGNMENT' ; \
2018-03-08 11:02:46 +00:00
echo '.global __dtb_$(subst -,_,$(*F))_begin' ; \
echo '__dtb_$(subst -,_,$(*F))_begin:' ; \
2010-12-22 11:57:26 -08:00
echo '.incbin "$<" ' ; \
2018-03-08 11:02:46 +00:00
echo '__dtb_$(subst -,_,$(*F))_end:' ; \
echo '.global __dtb_$(subst -,_,$(*F))_end' ; \
2010-12-22 11:57:26 -08:00
echo '.balign STRUCT_ALIGNMENT' ; \
2019-01-17 19:02:44 +09:00
} > $@
2010-12-22 11:57:26 -08:00
2018-03-23 22:04:34 +09:00
$(obj)/%.dtb.S : $( obj ) /%.dtb FORCE
$( call if_changed,dt_S_dtb)
2010-12-22 11:57:26 -08:00
quiet_cmd_dtc = DTC $@
2020-06-23 17:05:49 +09:00
cmd_dtc = $( HOSTCC) -E $( dtc_cpp_flags) -x assembler-with-cpp -o $( dtc-tmp) $< ; \
2020-04-27 22:49:30 +09:00
$( DTC) -O $( patsubst .%,%,$( suffix $@ ) ) -o $@ -b 0 \
2017-07-25 11:23:36 +09:00
$( addprefix -i,$( dir $<) $( DTC_INCLUDE) ) $( DTC_FLAGS) \
2013-05-31 11:14:20 +01:00
-d $( depfile) .dtc.tmp $( dtc-tmp) ; \
cat $( depfile) .pre.tmp $( depfile) .dtc.tmp > $( depfile)
2005-04-16 15:20:36 -07:00
2018-02-27 17:49:57 -06:00
$(obj)/%.dtb : $( src ) /%.dts $( DTC ) FORCE
2020-04-27 22:49:30 +09:00
$( call if_changed_dep,dtc)
2018-09-06 13:26:07 -05:00
DT_CHECKER ?= dt-validate
DT_BINDING_DIR := Documentation/devicetree/bindings
2020-02-28 18:37:30 -06:00
# DT_TMP_SCHEMA may be overridden from Documentation/devicetree/bindings/Makefile
2020-08-13 14:26:11 +01:00
DT_TMP_SCHEMA ?= $( objtree) /$( DT_BINDING_DIR) /processed-schema.json
2018-09-06 13:26:07 -05:00
quiet_cmd_dtb_check = CHECK $@
2020-02-23 04:04:32 +09:00
cmd_dtb_check = $( DT_CHECKER) -u $( srctree) /$( DT_BINDING_DIR) -p $( DT_TMP_SCHEMA) $@
2018-09-06 13:26:07 -05:00
2020-02-23 04:04:31 +09:00
d e f i n e r u l e _ d t c
2020-04-27 22:49:30 +09:00
$( call cmd_and_fixdep ,dtc )
2018-12-31 13:09:00 +09:00
$( call cmd ,dtb_check )
2018-09-06 13:26:07 -05:00
e n d e f
$(obj)/%.dt.yaml : $( src ) /%.dts $( DTC ) $( DT_TMP_SCHEMA ) FORCE
2020-04-21 12:35:28 +09:00
$( call if_changed_rule,dtc,yaml)
2012-11-27 16:29:10 -07:00
2013-05-31 11:14:20 +01:00
dtc-tmp = $( subst $( comma) ,_,$( dot-target) .dts.tmp)
2013-02-05 12:06:28 -07:00
2009-01-04 22:46:16 +01:00
# Bzip2
# ---------------------------------------------------------------------------
2009-05-05 21:17:15 -07:00
# Bzip2 and LZMA do not include size in file... so we have to fake that;
# append the size as a 32-bit littleendian number as gzip does.
2009-10-13 22:22:46 +02:00
size_append = printf $( shell \
2009-05-05 21:17:15 -07:00
dec_size = 0; \
2019-01-17 19:02:43 +09:00
for F in $( real-prereqs) ; do \
2018-03-18 17:54:02 -07:00
fsize = $$ ( $( CONFIG_SHELL) $( srctree) /scripts/file-size.sh $$ F) ; \
2009-05-05 21:17:15 -07:00
dec_size = $$ ( expr $$ dec_size + $$ fsize) ; \
done ; \
2009-12-28 19:38:27 +00:00
printf "%08x\n" $$ dec_size | \
sed 's/\(..\)/\1 /g' | { \
read ch0 ch1 ch2 ch3; \
for ch in $$ ch3 $$ ch2 $$ ch1 $$ ch0; do \
printf '%s%03o' '\\' $$ ( ( 0x$$ ch) ) ; \
done ; \
} \
2009-05-05 21:17:15 -07:00
)
2009-01-04 22:46:16 +01:00
2009-05-05 21:17:15 -07:00
quiet_cmd_bzip2 = BZIP2 $@
2020-06-08 12:59:44 +03:00
cmd_bzip2 = { cat $( real-prereqs) | $( KBZIP2) -9; $( size_append) ; } > $@
2009-01-04 22:46:16 +01:00
# Lzma
# ---------------------------------------------------------------------------
quiet_cmd_lzma = LZMA $@
2020-06-05 10:39:55 +03:00
cmd_lzma = { cat $( real-prereqs) | $( LZMA) -9; $( size_append) ; } > $@
2010-01-08 14:42:42 -08:00
2010-03-11 17:42:14 +08:00
quiet_cmd_lzo = LZO $@
2020-06-08 12:59:44 +03:00
cmd_lzo = { cat $( real-prereqs) | $( KLZOP) -9; $( size_append) ; } > $@
2010-03-05 17:34:46 +01:00
2013-07-08 16:01:46 -07:00
quiet_cmd_lz4 = LZ4 $@
2020-06-05 10:39:55 +03:00
cmd_lz4 = { cat $( real-prereqs) | $( LZ4) -l -c1 stdin stdout; \
2019-01-17 19:02:44 +09:00
$( size_append) ; } > $@
2013-07-08 16:01:46 -07:00
2012-03-16 15:03:55 -06:00
# U-Boot mkimage
# ---------------------------------------------------------------------------
MKIMAGE := $( srctree) /scripts/mkuboot.sh
# SRCARCH just happens to match slightly more than ARCH (on sparc), so reduces
# the number of overrides in arch makefiles
UIMAGE_ARCH ?= $( SRCARCH)
UIMAGE_COMPRESSION ?= $( if $( 2) ,$( 2) ,none)
UIMAGE_OPTS-y ?=
UIMAGE_TYPE ?= kernel
UIMAGE_LOADADDR ?= arch_must_set_this
UIMAGE_ENTRYADDR ?= $( UIMAGE_LOADADDR)
UIMAGE_NAME ?= 'Linux-$(KERNELRELEASE)'
2018-12-31 10:05:01 +09:00
quiet_cmd_uimage = UIMAGE $@
2019-08-25 22:28:37 +09:00
cmd_uimage = $( BASH) $( MKIMAGE) -A $( UIMAGE_ARCH) -O linux \
2012-03-16 15:03:55 -06:00
-C $( UIMAGE_COMPRESSION) $( UIMAGE_OPTS-y) \
-T $( UIMAGE_TYPE) \
-a $( UIMAGE_LOADADDR) -e $( UIMAGE_ENTRYADDR) \
2018-12-31 10:05:01 +09:00
-n $( UIMAGE_NAME) -d $< $@
2012-03-16 15:03:55 -06:00
2011-01-12 17:01:22 -08:00
# XZ
# ---------------------------------------------------------------------------
# Use xzkern to compress the kernel image and xzmisc to compress other things.
#
# xzkern uses a big LZMA2 dictionary since it doesn't increase memory usage
# of the kernel decompressor. A BCJ filter is used if it is available for
# the target architecture. xzkern also appends uncompressed size of the data
# using size_append. The .xz format has the size information available at
# the end of the file too, but it's in more complex format and it's good to
# avoid changing the part of the boot code that reads the uncompressed size.
# Note that the bytes added by size_append will make the xz tool think that
# the file is corrupt. This is expected.
#
# xzmisc doesn't use size_append, so it can be used to create normal .xz
# files. xzmisc uses smaller LZMA2 dictionary than xzkern, because a very
# big dictionary would increase the memory usage too much in the multi-call
# decompression mode. A BCJ filter isn't used either.
quiet_cmd_xzkern = XZKERN $@
2019-07-09 12:50:50 +02:00
cmd_xzkern = { cat $( real-prereqs) | sh $( srctree) /scripts/xz_wrap.sh; \
2019-01-17 19:02:44 +09:00
$( size_append) ; } > $@
2011-01-12 17:01:22 -08:00
quiet_cmd_xzmisc = XZMISC $@
2020-06-05 10:39:55 +03:00
cmd_xzmisc = cat $( real-prereqs) | $( XZ) --check= crc32 --lzma2= dict = 1MiB > $@
2017-04-12 12:43:52 -07:00
2020-07-30 12:08:36 -07:00
# ZSTD
# ---------------------------------------------------------------------------
# Appends the uncompressed size of the data using size_append. The .zst
# format has the size information available at the beginning of the file too,
# but it's in a more complex format and it's good to avoid changing the part
# of the boot code that reads the uncompressed size.
#
# Note that the bytes added by size_append will make the zstd tool think that
# the file is corrupt. This is expected.
#
# zstd uses a maximum window size of 8 MB. zstd22 uses a maximum window size of
# 128 MB. zstd22 is used for kernel compression because it is decompressed in a
# single pass, so zstd doesn't need to allocate a window buffer. When streaming
# decompression is used, like initramfs decompression, zstd22 should likely not
# be used because it would require zstd to allocate a 128 MB buffer.
quiet_cmd_zstd = ZSTD $@
cmd_zstd = { cat $( real-prereqs) | $( ZSTD) -19; $( size_append) ; } > $@
quiet_cmd_zstd22 = ZSTD22 $@
cmd_zstd22 = { cat $( real-prereqs) | $( ZSTD) -22 --ultra; $( size_append) ; } > $@
2017-04-12 12:43:52 -07:00
# ASM offsets
# ---------------------------------------------------------------------------
# Default sed regexp - multiline due to syntax constraints
2017-04-21 15:21:11 +09:00
#
# Use [:space:] because LLVM's integrated assembler inserts <tab> around
# the .ascii directive whereas GCC keeps the <space> as-is.
2017-04-12 12:43:52 -07:00
d e f i n e s e d - o f f s e t s
2017-04-21 15:21:11 +09:00
's:^[[:space:]]*\.ascii[[:space:]]*"\(.*\)".*:\1:; \
/^->/{s:->#\(.*\):/* \1 */:; \
2017-04-12 12:43:52 -07:00
s:^->\([^ ]*\) [\$$#]*\([^ ]*\) \(.*\):#define \1 \2 /* \3 */:; \
2017-04-21 15:21:11 +09:00
s:->::; p;}'
2017-04-12 12:43:52 -07:00
e n d e f
# Use filechk to avoid rebuilds when a header changes, but the resulting file
# does not
d e f i n e f i l e c h k _ o f f s e t s
e c h o "#ifndef $2" ; \
e c h o "#define $2" ; \
e c h o "/*" ; \
e c h o " * DO NOT MODIFY." ; \
e c h o " *" ; \
e c h o " * This file was generated by Kbuild" ; \
e c h o " */" ; \
e c h o "" ; \
2018-07-25 14:16:11 +09:00
s e d - n e $( sed -offsets ) < $< ; \
2017-04-12 12:43:52 -07:00
e c h o "" ; \
2018-12-31 17:24:09 +09:00
e c h o "#endif"
2017-04-12 12:43:52 -07:00
e n d e f