- Use /usr/bin/env for shebang lines in scripts
 
  - Remove useless -Wnested-externs warning flag
 
  - Update documents
 
  - Refactor log handling in modpost
 
  - Stop building modules without MODULE_LICENSE() tag
 
  - Make the insane combination of 'static' and EXPORT_SYMBOL an error
 
  - Improve genksyms to handle _Static_assert()
 -----BEGIN PGP SIGNATURE-----
 
 iQJJBAABCgAzFiEEbmPs18K1szRHjPqEPYsBB53g2wYFAl/iIY8VHG1hc2FoaXJv
 eUBrZXJuZWwub3JnAAoJED2LAQed4NsGbfsP+gMv3F+ztqfYNoMNmZcj+fLh4zrA
 8I3d0t0AoxovV1bsyVDk9nebsYLbDdsyCdHM1ZNFAFEpf9QLL8sxtpHvaaxy+rCq
 PCmy+E6iO5B91oORhuqpYpcmmgPHf4RrpUcnEEiWOMrHE5giYbXz3AiqGAt/88J5
 Y8yaPCQVhNJNkx73KHCMYLVp97xPGa5HvNrcskAueA8uG+FCRDFaIqFX+OYbGnmC
 /3kVAJmX6i2kNPzvnXpAW6mTbI/z7+s/k5yRbEFYNUtJqN+BfaFadV8pyOGXQr1T
 fwXVtXdWqVg7rbqupyVYItLHaOq2RBm4PJuee/8s7ooBI1y7U6N0HZCj+jES92ML
 wuqEyED+lLzmxRyfhmrFH/5XhxacciO7dQb9Woe5FQ6QOm+tQPtwCnxwrSSAK4XU
 k7CsJ+OMJI+JulFrgPuC/rcESjTAsgL2j4SDhsO0GLV+Qb/P9kXR88jt5eJygmSx
 xZWpI+FUUY/Ihw648i2pkHGS/NmfOrT78X4nvbOWMDKOV02NEoMmLDYnZPUIoetn
 yUo8+xSBp6n3aTy5TDtrMblNRUJwL9OzDlDiEjsPtNUJZ6sdQzFRsxJ7+FCw2Ley
 rKN2r+i5FdyAq0LLHDhoEcJxFY7cj+yAsd0QqtBb0NZLgLsaPiP7w45CXRNpqkWG
 BbK+F1E9jP8VfiZu
 =+27V
 -----END PGP SIGNATURE-----

Merge tag 'kbuild-v5.11' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild

Pull Kbuild updates from Masahiro Yamada:

 - Use /usr/bin/env for shebang lines in scripts

 - Remove useless -Wnested-externs warning flag

 - Update documents

 - Refactor log handling in modpost

 - Stop building modules without MODULE_LICENSE() tag

 - Make the insane combination of 'static' and EXPORT_SYMBOL an error

 - Improve genksyms to handle _Static_assert()

* tag 'kbuild-v5.11' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild:
  Documentation/kbuild: Document platform dependency practises
  Documentation/kbuild: Document COMPILE_TEST dependencies
  genksyms: Ignore module scoped _Static_assert()
  modpost: turn static exports into error
  modpost: turn section mismatches to error from fatal()
  modpost: change license incompatibility to error() from fatal()
  modpost: turn missing MODULE_LICENSE() into error
  modpost: refactor error handling and clarify error/fatal difference
  modpost: rename merror() to error()
  kbuild: don't hardcode depmod path
  kbuild: doc: document subdir-y syntax
  kbuild: doc: clarify the difference between extra-y and always-y
  kbuild: doc: split if_changed explanation to a separate section
  kbuild: doc: merge 'Special Rules' and 'Custom kbuild commands' sections
  kbuild: doc: fix 'List directories to visit when descending' section
  kbuild: doc: replace arch/$(ARCH)/ with arch/$(SRCARCH)/
  kbuild: doc: update the description about kbuild Makefiles
  Makefile.extrawarn: remove -Wnested-externs warning
  tweewide: Fix most Shebang lines
This commit is contained in:
Linus Torvalds 2020-12-22 14:02:39 -08:00
Родитель 1375b9803e 18084e435f
Коммит 7b95f0563a
36 изменённых файлов: 353 добавлений и 229 удалений

Просмотреть файл

@ -553,6 +553,41 @@ with "depends on m". E.g.::
limits FOO to module (=m) or disabled (=n). limits FOO to module (=m) or disabled (=n).
Compile-testing
~~~~~~~~~~~~~~~
If a config symbol has a dependency, but the code controlled by the config
symbol can still be compiled if the dependency is not met, it is encouraged to
increase build coverage by adding an "|| COMPILE_TEST" clause to the
dependency. This is especially useful for drivers for more exotic hardware, as
it allows continuous-integration systems to compile-test the code on a more
common system, and detect bugs that way.
Note that compile-tested code should avoid crashing when run on a system where
the dependency is not met.
Architecture and platform dependencies
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Due to the presence of stubs, most drivers can now be compiled on most
architectures. However, this does not mean it makes sense to have all drivers
available everywhere, as the actual hardware may only exist on specific
architectures and platforms. This is especially true for on-SoC IP cores,
which may be limited to a specific vendor or SoC family.
To prevent asking the user about drivers that cannot be used on the system(s)
the user is compiling a kernel for, and if it makes sense, config symbols
controlling the compilation of a driver should contain proper dependencies,
limiting the visibility of the symbol to (a superset of) the platform(s) the
driver can be used on. The dependency can be an architecture (e.g. ARM) or
platform (e.g. ARCH_OMAP4) dependency. This makes life simpler not only for
distro config owners, but also for every single developer or user who
configures a kernel.
Such a dependency can be relaxed by combining it with the compile-testing rule
above, leading to:
config FOO
bool "Support for foo hardware"
depends on ARCH_FOO_VENDOR || COMPILE_TEST
Kconfig recursive dependency limitations Kconfig recursive dependency limitations
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Просмотреть файл

@ -15,13 +15,15 @@ This document describes the Linux kernel Makefiles.
--- 3.4 Objects which export symbols --- 3.4 Objects which export symbols
--- 3.5 Library file goals - lib-y --- 3.5 Library file goals - lib-y
--- 3.6 Descending down in directories --- 3.6 Descending down in directories
--- 3.7 Compilation flags --- 3.7 Non-builtin vmlinux targets - extra-y
--- 3.8 <deleted> --- 3.8 Always built goals - always-y
--- 3.9 Dependency tracking --- 3.9 Compilation flags
--- 3.10 Special Rules --- 3.10 Dependency tracking
--- 3.11 $(CC) support functions --- 3.11 Custom Rules
--- 3.12 $(LD) support functions --- 3.12 Command change detection
--- 3.13 Script Invocation --- 3.13 $(CC) support functions
--- 3.14 $(LD) support functions
--- 3.15 Script Invocation
=== 4 Host Program support === 4 Host Program support
--- 4.1 Simple Host Program --- 4.1 Simple Host Program
@ -46,7 +48,7 @@ This document describes the Linux kernel Makefiles.
--- 7.5 Architecture-specific boot images --- 7.5 Architecture-specific boot images
--- 7.6 Building non-kbuild targets --- 7.6 Building non-kbuild targets
--- 7.7 Commands useful for building a boot image --- 7.7 Commands useful for building a boot image
--- 7.8 Custom kbuild commands --- 7.8 <deleted>
--- 7.9 Preprocessing linker scripts --- 7.9 Preprocessing linker scripts
--- 7.10 Generic header files --- 7.10 Generic header files
--- 7.11 Post-link pass --- 7.11 Post-link pass
@ -67,11 +69,11 @@ This document describes the Linux kernel Makefiles.
The Makefiles have five parts:: The Makefiles have five parts::
Makefile the top Makefile. Makefile the top Makefile.
.config the kernel configuration file. .config the kernel configuration file.
arch/$(ARCH)/Makefile the arch Makefile. arch/$(SRCARCH)/Makefile the arch Makefile.
scripts/Makefile.* common rules etc. for all kbuild Makefiles. scripts/Makefile.* common rules etc. for all kbuild Makefiles.
kbuild Makefiles there are about 500 of these. kbuild Makefiles exist in every subdirectory
The top Makefile reads the .config file, which comes from the kernel The top Makefile reads the .config file, which comes from the kernel
configuration process. configuration process.
@ -82,7 +84,7 @@ It builds these goals by recursively descending into the subdirectories of
the kernel source tree. the kernel source tree.
The list of subdirectories which are visited depends upon the kernel The list of subdirectories which are visited depends upon the kernel
configuration. The top Makefile textually includes an arch Makefile configuration. The top Makefile textually includes an arch Makefile
with the name arch/$(ARCH)/Makefile. The arch Makefile supplies with the name arch/$(SRCARCH)/Makefile. The arch Makefile supplies
architecture-specific information to the top Makefile. architecture-specific information to the top Makefile.
Each subdirectory has a kbuild Makefile which carries out the commands Each subdirectory has a kbuild Makefile which carries out the commands
@ -278,7 +280,7 @@ more details, with real examples.
actually recognize that there is a lib.a being built, the directory actually recognize that there is a lib.a being built, the directory
shall be listed in libs-y. shall be listed in libs-y.
See also "6.4 List directories to visit when descending". See also "7.4 List directories to visit when descending".
Use of lib-y is normally restricted to `lib/` and `arch/*/lib`. Use of lib-y is normally restricted to `lib/` and `arch/*/lib`.
@ -317,11 +319,79 @@ more details, with real examples.
that directory specifies obj-y, those objects will be left orphan. that directory specifies obj-y, those objects will be left orphan.
It is very likely a bug of the Makefile or of dependencies in Kconfig. It is very likely a bug of the Makefile or of dependencies in Kconfig.
Kbuild also supports dedicated syntax, subdir-y and subdir-m, for
descending into subdirectories. It is a good fit when you know they
do not contain kernel-space objects at all. A typical usage is to let
Kbuild descend into subdirectories to build tools.
Examples::
# scripts/Makefile
subdir-$(CONFIG_GCC_PLUGINS) += gcc-plugins
subdir-$(CONFIG_MODVERSIONS) += genksyms
subdir-$(CONFIG_SECURITY_SELINUX) += selinux
Unlike obj-y/m, subdir-y/m does not need the trailing slash since this
syntax is always used for directories.
It is good practice to use a `CONFIG_` variable when assigning directory It is good practice to use a `CONFIG_` variable when assigning directory
names. This allows kbuild to totally skip the directory if the names. This allows kbuild to totally skip the directory if the
corresponding `CONFIG_` option is neither 'y' nor 'm'. corresponding `CONFIG_` option is neither 'y' nor 'm'.
3.7 Compilation flags 3.7 Non-builtin vmlinux targets - extra-y
-----------------------------------------
extra-y specifies targets which are needed for building vmlinux,
but not combined into built-in.a.
Examples are:
1) head objects
Some objects must be placed at the head of vmlinux. They are
directly linked to vmlinux without going through built-in.a
A typical use-case is an object that contains the entry point.
arch/$(SRCARCH)/Makefile should specify such objects as head-y.
Discussion:
Given that we can control the section order in the linker script,
why do we need head-y?
2) vmlinux linker script
The linker script for vmlinux is located at
arch/$(SRCARCH)/kernel/vmlinux.lds
Example::
# arch/x86/kernel/Makefile
extra-y := head_$(BITS).o
extra-y += head$(BITS).o
extra-y += ebda.o
extra-y += platform-quirks.o
extra-y += vmlinux.lds
$(extra-y) should only contain targets needed for vmlinux.
Kbuild skips extra-y when vmlinux is apparently not a final goal.
(e.g. 'make modules', or building external modules)
If you intend to build targets unconditionally, always-y (explained
in the next section) is the correct syntax to use.
3.8 Always built goals - always-y
---------------------------------
always-y specifies targets which are literally always built when
Kbuild visits the Makefile.
Example::
# ./Kbuild
offsets-file := include/generated/asm-offsets.h
always-y += $(offsets-file)
3.9 Compilation flags
--------------------- ---------------------
ccflags-y, asflags-y and ldflags-y ccflags-y, asflags-y and ldflags-y
@ -410,8 +480,8 @@ more details, with real examples.
AFLAGS_iwmmxt.o := -Wa,-mcpu=iwmmxt AFLAGS_iwmmxt.o := -Wa,-mcpu=iwmmxt
3.9 Dependency tracking 3.10 Dependency tracking
----------------------- ------------------------
Kbuild tracks dependencies on the following: Kbuild tracks dependencies on the following:
@ -422,21 +492,21 @@ more details, with real examples.
Thus, if you change an option to $(CC) all affected files will Thus, if you change an option to $(CC) all affected files will
be re-compiled. be re-compiled.
3.10 Special Rules 3.11 Custom Rules
------------------ -----------------
Special rules are used when the kbuild infrastructure does Custom rules are used when the kbuild infrastructure does
not provide the required support. A typical example is not provide the required support. A typical example is
header files generated during the build process. header files generated during the build process.
Another example are the architecture-specific Makefiles which Another example are the architecture-specific Makefiles which
need special rules to prepare boot images etc. need custom rules to prepare boot images etc.
Special rules are written as normal Make rules. Custom rules are written as normal Make rules.
Kbuild is not executing in the directory where the Makefile is Kbuild is not executing in the directory where the Makefile is
located, so all special rules shall provide a relative located, so all custom rules shall use a relative
path to prerequisite files and target files. path to prerequisite files and target files.
Two variables are used when defining special rules: Two variables are used when defining custom rules:
$(src) $(src)
$(src) is a relative path which points to the directory $(src) is a relative path which points to the directory
@ -454,7 +524,7 @@ more details, with real examples.
$(obj)/53c8xx_d.h: $(src)/53c7,8xx.scr $(src)/script_asm.pl $(obj)/53c8xx_d.h: $(src)/53c7,8xx.scr $(src)/script_asm.pl
$(CPP) -DCHIP=810 - < $< | ... $(src)/script_asm.pl $(CPP) -DCHIP=810 - < $< | ... $(src)/script_asm.pl
This is a special rule, following the normal syntax This is a custom rule, following the normal syntax
required by make. required by make.
The target file depends on two prerequisite files. References The target file depends on two prerequisite files. References
@ -471,13 +541,81 @@ more details, with real examples.
Example:: Example::
#arch/blackfin/boot/Makefile # arch/arm/Makefile
$(obj)/vmImage: $(obj)/vmlinux.gz $(BOOT_TARGETS): vmlinux
$(call if_changed,uimage) $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@
@$(kecho) 'Kernel: $@ is ready' @$(kecho) ' Kernel: $(boot)/$@ is ready'
When kbuild is executing with KBUILD_VERBOSE=0, then only a shorthand
of a command is normally displayed.
To enable this behaviour for custom commands kbuild requires
two variables to be set::
3.11 $(CC) support functions quiet_cmd_<command> - what shall be echoed
cmd_<command> - the command to execute
Example::
# lib/Makefile
quiet_cmd_crc32 = GEN $@
cmd_crc32 = $< > $@
$(obj)/crc32table.h: $(obj)/gen_crc32table
$(call cmd,crc32)
When updating the $(obj)/crc32table.h target, the line:
GEN lib/crc32table.h
will be displayed with "make KBUILD_VERBOSE=0".
3.12 Command change detection
-----------------------------
When the rule is evaluated, timestamps are compared between the target
and its prerequisite files. GNU Make updates the target when any of the
prerequisites is newer than that.
The target should be rebuilt also when the command line has changed
since the last invocation. This is not supported by Make itself, so
Kbuild achieves this by a kind of meta-programming.
if_changed is the macro used for this purpose, in the following form::
quiet_cmd_<command> = ...
cmd_<command> = ...
<target>: <source(s)> FORCE
$(call if_changed,<command>)
Any target that utilizes if_changed must be listed in $(targets),
otherwise the command line check will fail, and the target will
always be built.
If the target is already listed in the recognized syntax such as
obj-y/m, lib-y/m, extra-y/m, always-y/m, hostprogs, userprogs, Kbuild
automatically adds it to $(targets). Otherwise, the target must be
explicitly added to $(targets).
Assignments to $(targets) are without $(obj)/ prefix. if_changed may be
used in conjunction with custom rules as defined in "3.9 Custom Rules".
Note: It is a typical mistake to forget the FORCE prerequisite.
Another common pitfall is that whitespace is sometimes significant; for
instance, the below will fail (note the extra space after the comma)::
target: source(s) FORCE
**WRONG!** $(call if_changed, objcopy)
Note:
if_changed should not be used more than once per target.
It stores the executed command in a corresponding .cmd
file and multiple calls would result in overwrites and
unwanted results when the target is up to date and only the
tests on changed commands trigger execution of commands.
3.13 $(CC) support functions
---------------------------- ----------------------------
The kernel may be built with several different versions of The kernel may be built with several different versions of
@ -592,7 +730,7 @@ more details, with real examples.
endif endif
endif endif
3.12 $(LD) support functions 3.14 $(LD) support functions
---------------------------- ----------------------------
ld-option ld-option
@ -606,7 +744,7 @@ more details, with real examples.
#Makefile #Makefile
LDFLAGS_vmlinux += $(call ld-option, -X) LDFLAGS_vmlinux += $(call ld-option, -X)
3.13 Script invocation 3.15 Script invocation
---------------------- ----------------------
Make rules may invoke scripts to build the kernel. The rules shall Make rules may invoke scripts to build the kernel. The rules shall
@ -744,7 +882,7 @@ Both possibilities are described in the following.
as a prerequisite. as a prerequisite.
This is possible in two ways: This is possible in two ways:
(1) List the prerequisite explicitly in a special rule. (1) List the prerequisite explicitly in a custom rule.
Example:: Example::
@ -755,11 +893,11 @@ Both possibilities are described in the following.
The target $(obj)/devlist.h will not be built before The target $(obj)/devlist.h will not be built before
$(obj)/gen-devlist is updated. Note that references to $(obj)/gen-devlist is updated. Note that references to
the host programs in special rules must be prefixed with $(obj). the host programs in custom rules must be prefixed with $(obj).
(2) Use always-y (2) Use always-y
When there is no suitable special rule, and the host program When there is no suitable custom rule, and the host program
shall be built when a makefile is entered, the always-y shall be built when a makefile is entered, the always-y
variable shall be used. variable shall be used.
@ -933,7 +1071,7 @@ When "make clean" is executed, make will descend down in arch/x86/boot,
and clean as usual. The Makefile located in arch/x86/boot/ may use and clean as usual. The Makefile located in arch/x86/boot/ may use
the subdir- trick to descend further down. the subdir- trick to descend further down.
Note 1: arch/$(ARCH)/Makefile cannot use "subdir-", because that file is Note 1: arch/$(SRCARCH)/Makefile cannot use "subdir-", because that file is
included in the top level makefile, and the kbuild infrastructure included in the top level makefile, and the kbuild infrastructure
is not operational at that point. is not operational at that point.
@ -946,9 +1084,9 @@ be visited during "make clean".
The top level Makefile sets up the environment and does the preparation, The top level Makefile sets up the environment and does the preparation,
before starting to descend down in the individual directories. before starting to descend down in the individual directories.
The top level makefile contains the generic part, whereas The top level makefile contains the generic part, whereas
arch/$(ARCH)/Makefile contains what is required to set up kbuild arch/$(SRCARCH)/Makefile contains what is required to set up kbuild
for said architecture. for said architecture.
To do so, arch/$(ARCH)/Makefile sets up a number of variables and defines To do so, arch/$(SRCARCH)/Makefile sets up a number of variables and defines
a few targets. a few targets.
When kbuild executes, the following steps are followed (roughly): When kbuild executes, the following steps are followed (roughly):
@ -956,14 +1094,14 @@ When kbuild executes, the following steps are followed (roughly):
1) Configuration of the kernel => produce .config 1) Configuration of the kernel => produce .config
2) Store kernel version in include/linux/version.h 2) Store kernel version in include/linux/version.h
3) Updating all other prerequisites to the target prepare: 3) Updating all other prerequisites to the target prepare:
- Additional prerequisites are specified in arch/$(ARCH)/Makefile - Additional prerequisites are specified in arch/$(SRCARCH)/Makefile
4) Recursively descend down in all directories listed in 4) Recursively descend down in all directories listed in
init-* core* drivers-* net-* libs-* and build all targets. init-* core* drivers-* net-* libs-* and build all targets.
- The values of the above variables are expanded in arch/$(ARCH)/Makefile. - The values of the above variables are expanded in arch/$(SRCARCH)/Makefile.
5) All object files are then linked and the resulting file vmlinux is 5) All object files are then linked and the resulting file vmlinux is
located at the root of the obj tree. located at the root of the obj tree.
The very first objects linked are listed in head-y, assigned by The very first objects linked are listed in head-y, assigned by
arch/$(ARCH)/Makefile. arch/$(SRCARCH)/Makefile.
6) Finally, the architecture-specific part does any required post processing 6) Finally, the architecture-specific part does any required post processing
and builds the final bootimage. and builds the final bootimage.
- This includes building boot records - This includes building boot records
@ -1154,7 +1292,7 @@ When kbuild executes, the following steps are followed (roughly):
machinery is all architecture-independent. machinery is all architecture-independent.
head-y, init-y, core-y, libs-y, drivers-y, net-y head-y, core-y, libs-y, drivers-y
$(head-y) lists objects to be linked first in vmlinux. $(head-y) lists objects to be linked first in vmlinux.
$(libs-y) lists directories where a lib.a archive can be located. $(libs-y) lists directories where a lib.a archive can be located.
@ -1162,23 +1300,24 @@ When kbuild executes, the following steps are followed (roughly):
The rest list directories where a built-in.a object file can be The rest list directories where a built-in.a object file can be
located. located.
$(init-y) objects will be located after $(head-y).
Then the rest follows in this order: Then the rest follows in this order:
$(core-y), $(libs-y), $(drivers-y) and $(net-y). $(core-y), $(libs-y), $(drivers-y)
The top level Makefile defines values for all generic directories, The top level Makefile defines values for all generic directories,
and arch/$(ARCH)/Makefile only adds architecture-specific and arch/$(SRCARCH)/Makefile only adds architecture-specific
directories. directories.
Example:: Example::
#arch/sparc64/Makefile # arch/sparc/Makefile
core-y += arch/sparc64/kernel/ core-y += arch/sparc/
libs-y += arch/sparc64/prom/ arch/sparc64/lib/
drivers-$(CONFIG_OPROFILE) += arch/sparc64/oprofile/
libs-y += arch/sparc/prom/
libs-y += arch/sparc/lib/
drivers-$(CONFIG_PM) += arch/sparc/power/
drivers-$(CONFIG_OPROFILE) += arch/sparc/oprofile/
7.5 Architecture-specific boot images 7.5 Architecture-specific boot images
------------------------------------- -------------------------------------
@ -1189,15 +1328,15 @@ When kbuild executes, the following steps are followed (roughly):
The actual goals are not standardized across architectures. The actual goals are not standardized across architectures.
It is common to locate any additional processing in a boot/ It is common to locate any additional processing in a boot/
directory below arch/$(ARCH)/. directory below arch/$(SRCARCH)/.
Kbuild does not provide any smart way to support building a Kbuild does not provide any smart way to support building a
target specified in boot/. Therefore arch/$(ARCH)/Makefile shall target specified in boot/. Therefore arch/$(SRCARCH)/Makefile shall
call make manually to build a target in boot/. call make manually to build a target in boot/.
The recommended approach is to include shortcuts in The recommended approach is to include shortcuts in
arch/$(ARCH)/Makefile, and use the full path when calling down arch/$(SRCARCH)/Makefile, and use the full path when calling down
into the arch/$(ARCH)/boot/Makefile. into the arch/$(SRCARCH)/boot/Makefile.
Example:: Example::
@ -1217,7 +1356,7 @@ When kbuild executes, the following steps are followed (roughly):
#arch/x86/Makefile #arch/x86/Makefile
define archhelp define archhelp
echo '* bzImage - Image (arch/$(ARCH)/boot/bzImage)' echo '* bzImage - Compressed kernel image (arch/x86/boot/bzImage)'
endif endif
When make is executed without arguments, the first goal encountered When make is executed without arguments, the first goal encountered
@ -1235,71 +1374,12 @@ When kbuild executes, the following steps are followed (roughly):
When "make" is executed without arguments, bzImage will be built. When "make" is executed without arguments, bzImage will be built.
7.6 Building non-kbuild targets
-------------------------------
extra-y
extra-y specifies additional targets created in the current
directory, in addition to any targets specified by `obj-*`.
Listing all targets in extra-y is required for two purposes:
1) Enable kbuild to check changes in command lines
- When $(call if_changed,xxx) is used
2) kbuild knows what files to delete during "make clean"
Example::
#arch/x86/kernel/Makefile
extra-y := head.o init_task.o
In this example, extra-y is used to list object files that
shall be built, but shall not be linked as part of built-in.a.
7.7 Commands useful for building a boot image 7.7 Commands useful for building a boot image
--------------------------------------------- ---------------------------------------------
Kbuild provides a few macros that are useful when building a Kbuild provides a few macros that are useful when building a
boot image. boot image.
if_changed
if_changed is the infrastructure used for the following commands.
Usage::
target: source(s) FORCE
$(call if_changed,ld/objcopy/gzip/...)
When the rule is evaluated, it is checked to see if any files
need an update, or the command line has changed since the last
invocation. The latter will force a rebuild if any options
to the executable have changed.
Any target that utilises if_changed must be listed in $(targets),
otherwise the command line check will fail, and the target will
always be built.
Assignments to $(targets) are without $(obj)/ prefix.
if_changed may be used in conjunction with custom commands as
defined in 7.8 "Custom kbuild commands".
Note: It is a typical mistake to forget the FORCE prerequisite.
Another common pitfall is that whitespace is sometimes
significant; for instance, the below will fail (note the extra space
after the comma)::
target: source(s) FORCE
**WRONG!** $(call if_changed, ld/objcopy/gzip/...)
Note:
if_changed should not be used more than once per target.
It stores the executed command in a corresponding .cmd
file and multiple calls would result in overwrites and
unwanted results when the target is up to date and only the
tests on changed commands trigger execution of commands.
ld ld
Link target. Often, LDFLAGS_$@ is used to set specific options to ld. Link target. Often, LDFLAGS_$@ is used to set specific options to ld.
@ -1332,7 +1412,7 @@ When kbuild executes, the following steps are followed (roughly):
objcopy objcopy
Copy binary. Uses OBJCOPYFLAGS usually specified in Copy binary. Uses OBJCOPYFLAGS usually specified in
arch/$(ARCH)/Makefile. arch/$(SRCARCH)/Makefile.
OBJCOPYFLAGS_$@ may be used to set additional options. OBJCOPYFLAGS_$@ may be used to set additional options.
gzip gzip
@ -1361,41 +1441,11 @@ When kbuild executes, the following steps are followed (roughly):
targets += $(dtb-y) targets += $(dtb-y)
DTC_FLAGS ?= -p 1024 DTC_FLAGS ?= -p 1024
7.8 Custom kbuild commands
--------------------------
When kbuild is executing with KBUILD_VERBOSE=0, then only a shorthand
of a command is normally displayed.
To enable this behaviour for custom commands kbuild requires
two variables to be set::
quiet_cmd_<command> - what shall be echoed
cmd_<command> - the command to execute
Example::
#
quiet_cmd_image = BUILD $@
cmd_image = $(obj)/tools/build $(BUILDFLAGS) \
$(obj)/vmlinux.bin > $@
targets += bzImage
$(obj)/bzImage: $(obj)/vmlinux.bin $(obj)/tools/build FORCE
$(call if_changed,image)
@echo 'Kernel: $@ is ready'
When updating the $(obj)/bzImage target, the line:
BUILD arch/x86/boot/bzImage
will be displayed with "make KBUILD_VERBOSE=0".
7.9 Preprocessing linker scripts 7.9 Preprocessing linker scripts
-------------------------------- --------------------------------
When the vmlinux image is built, the linker script When the vmlinux image is built, the linker script
arch/$(ARCH)/kernel/vmlinux.lds is used. arch/$(SRCARCH)/kernel/vmlinux.lds is used.
The script is a preprocessed variant of the file vmlinux.lds.S The script is a preprocessed variant of the file vmlinux.lds.S
located in the same directory. located in the same directory.
kbuild knows .lds files and includes a rule `*lds.S` -> `*lds`. kbuild knows .lds files and includes a rule `*lds.S` -> `*lds`.
@ -1405,9 +1455,6 @@ When kbuild executes, the following steps are followed (roughly):
#arch/x86/kernel/Makefile #arch/x86/kernel/Makefile
extra-y := vmlinux.lds extra-y := vmlinux.lds
#Makefile
export CPPFLAGS_vmlinux.lds += -P -C -U$(ARCH)
The assignment to extra-y is used to tell kbuild to build the The assignment to extra-y is used to tell kbuild to build the
target vmlinux.lds. target vmlinux.lds.
The assignment to $(CPPFLAGS_vmlinux.lds) tells kbuild to use the The assignment to $(CPPFLAGS_vmlinux.lds) tells kbuild to use the
@ -1481,7 +1528,7 @@ See subsequent chapter for the syntax of the Kbuild file.
If an architecture uses a verbatim copy of a header from If an architecture uses a verbatim copy of a header from
include/asm-generic then this is listed in the file include/asm-generic then this is listed in the file
arch/$(ARCH)/include/asm/Kbuild like this: arch/$(SRCARCH)/include/asm/Kbuild like this:
Example:: Example::
@ -1492,7 +1539,7 @@ See subsequent chapter for the syntax of the Kbuild file.
During the prepare phase of the build a wrapper include During the prepare phase of the build a wrapper include
file is generated in the directory:: file is generated in the directory::
arch/$(ARCH)/include/generated/asm arch/$(SRCARCH)/include/generated/asm
When a header is exported where the architecture uses When a header is exported where the architecture uses
the generic header a similar wrapper is generated as part the generic header a similar wrapper is generated as part
@ -1527,8 +1574,8 @@ See subsequent chapter for the syntax of the Kbuild file.
to define the minimum set of ASM headers that all architectures must have. to define the minimum set of ASM headers that all architectures must have.
This works like optional generic-y. If a mandatory header is missing This works like optional generic-y. If a mandatory header is missing
in arch/$(ARCH)/include/(uapi/)/asm, Kbuild will automatically generate in arch/$(SRCARCH)/include/(uapi/)/asm, Kbuild will automatically
a wrapper of the asm-generic one. generate a wrapper of the asm-generic one.
9 Kbuild Variables 9 Kbuild Variables
================== ==================
@ -1564,6 +1611,16 @@ The top Makefile exports the following variables:
make ARCH=m68k ... make ARCH=m68k ...
SRCARCH
This variable specifies the directory in arch/ to build.
ARCH and SRCARCH may not necessarily match. A couple of arch
directories are biarch, that is, a single `arch/*/` directory supports
both 32-bit and 64-bit.
For example, you can pass in ARCH=i386, ARCH=x86_64, or ARCH=x86.
For all of them, SRCARCH=x86 because arch/x86/ supports both i386 and
x86_64.
INSTALL_PATH INSTALL_PATH
This variable defines a place for the arch Makefiles to install This variable defines a place for the arch Makefiles to install

Просмотреть файл

@ -332,7 +332,7 @@ according to the following rule:
There are two notable exceptions to this rule: larger There are two notable exceptions to this rule: larger
subsystems have their own directory under include/, such as subsystems have their own directory under include/, such as
include/scsi; and architecture specific headers are located include/scsi; and architecture specific headers are located
under arch/$(ARCH)/include/. under arch/$(SRCARCH)/include/.
4.1 Kernel Includes 4.1 Kernel Includes
------------------- -------------------

Просмотреть файл

@ -1,4 +1,4 @@
#!/usr/bin/perl #!/usr/bin/env perl
use strict; use strict;
use Text::Tabs; use Text::Tabs;
use Getopt::Long; use Getopt::Long;

Просмотреть файл

@ -1,4 +1,4 @@
#!/usr/bin/python #!/usr/bin/env python
# The TCM v4 multi-protocol fabric module generation script for drivers/target/$NEW_MOD # The TCM v4 multi-protocol fabric module generation script for drivers/target/$NEW_MOD
# #
# Copyright (c) 2010 Rising Tide Systems # Copyright (c) 2010 Rising Tide Systems

Просмотреть файл

@ -1,4 +1,4 @@
#!/usr/bin/python #!/usr/bin/env python
# add symbolic names to read_msr / write_msr in trace # add symbolic names to read_msr / write_msr in trace
# decode_msr msr-index.h < trace # decode_msr msr-index.h < trace
import sys import sys

Просмотреть файл

@ -1,4 +1,4 @@
#!/usr/bin/perl #!/usr/bin/env perl
# This is a POC (proof of concept or piece of crap, take your pick) for reading the # This is a POC (proof of concept or piece of crap, take your pick) for reading the
# text representation of trace output related to page allocation. It makes an attempt # text representation of trace output related to page allocation. It makes an attempt
# to extract some high-level information on what is going on. The accuracy of the parser # to extract some high-level information on what is going on. The accuracy of the parser

Просмотреть файл

@ -1,4 +1,4 @@
#!/usr/bin/perl #!/usr/bin/env perl
# This is a POC for reading the text representation of trace output related to # This is a POC for reading the text representation of trace output related to
# page reclaim. It makes an attempt to extract some high-level information on # page reclaim. It makes an attempt to extract some high-level information on
# what is going on. The accuracy of the parser may vary # what is going on. The accuracy of the parser may vary

Просмотреть файл

@ -450,7 +450,7 @@ LEX = flex
YACC = bison YACC = bison
AWK = awk AWK = awk
INSTALLKERNEL := installkernel INSTALLKERNEL := installkernel
DEPMOD = /sbin/depmod DEPMOD = depmod
PERL = perl PERL = perl
PYTHON = python PYTHON = python
PYTHON3 = python3 PYTHON3 = python3

Просмотреть файл

@ -1,4 +1,4 @@
#!/usr/bin/python #!/usr/bin/env python
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
# #
# Usage: unwcheck.py FILE # Usage: unwcheck.py FILE

Просмотреть файл

@ -61,7 +61,6 @@ endif
ifneq ($(findstring 2, $(KBUILD_EXTRA_WARN)),) ifneq ($(findstring 2, $(KBUILD_EXTRA_WARN)),)
KBUILD_CFLAGS += -Wdisabled-optimization KBUILD_CFLAGS += -Wdisabled-optimization
KBUILD_CFLAGS += -Wnested-externs
KBUILD_CFLAGS += -Wshadow KBUILD_CFLAGS += -Wshadow
KBUILD_CFLAGS += $(call cc-option, -Wlogical-op) KBUILD_CFLAGS += $(call cc-option, -Wlogical-op)
KBUILD_CFLAGS += -Wmissing-field-initializers KBUILD_CFLAGS += -Wmissing-field-initializers

Просмотреть файл

@ -1,4 +1,4 @@
#!/usr/bin/python #!/usr/bin/env python
# #
# Copyright 2004 Matt Mackall <mpm@selenic.com> # Copyright 2004 Matt Mackall <mpm@selenic.com>
# #

Просмотреть файл

@ -1,4 +1,4 @@
#!/bin/bash #!/usr/bin/env bash
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
# Manipulate options in a .config file from the command line # Manipulate options in a .config file from the command line

Просмотреть файл

@ -1,4 +1,4 @@
#!/usr/bin/python #!/usr/bin/env python
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
# #
# diffconfig - a tool to compare .config files. # diffconfig - a tool to compare .config files.

Просмотреть файл

@ -32,6 +32,9 @@ static struct resword {
{ "restrict", RESTRICT_KEYW }, { "restrict", RESTRICT_KEYW },
{ "asm", ASM_KEYW }, { "asm", ASM_KEYW },
// c11 keywords that can be used at module scope
{ "_Static_assert", STATIC_ASSERT_KEYW },
// attribute commented out in modutils 2.4.2. People are using 'attribute' as a // attribute commented out in modutils 2.4.2. People are using 'attribute' as a
// field name which breaks the genksyms parser. It is not a gcc keyword anyway. // field name which breaks the genksyms parser. It is not a gcc keyword anyway.
// KAO. }, // KAO. },

Просмотреть файл

@ -118,7 +118,7 @@ yylex(void)
{ {
static enum { static enum {
ST_NOTSTARTED, ST_NORMAL, ST_ATTRIBUTE, ST_ASM, ST_TYPEOF, ST_TYPEOF_1, ST_NOTSTARTED, ST_NORMAL, ST_ATTRIBUTE, ST_ASM, ST_TYPEOF, ST_TYPEOF_1,
ST_BRACKET, ST_BRACE, ST_EXPRESSION, ST_BRACKET, ST_BRACE, ST_EXPRESSION, ST_STATIC_ASSERT,
ST_TABLE_1, ST_TABLE_2, ST_TABLE_3, ST_TABLE_4, ST_TABLE_1, ST_TABLE_2, ST_TABLE_3, ST_TABLE_4,
ST_TABLE_5, ST_TABLE_6 ST_TABLE_5, ST_TABLE_6
} lexstate = ST_NOTSTARTED; } lexstate = ST_NOTSTARTED;
@ -201,6 +201,11 @@ repeat:
case EXPORT_SYMBOL_KEYW: case EXPORT_SYMBOL_KEYW:
goto fini; goto fini;
case STATIC_ASSERT_KEYW:
lexstate = ST_STATIC_ASSERT;
count = 0;
goto repeat;
} }
} }
if (!suppress_type_lookup) if (!suppress_type_lookup)
@ -401,6 +406,26 @@ repeat:
} }
break; break;
case ST_STATIC_ASSERT:
APP;
switch (token)
{
case '(':
++count;
goto repeat;
case ')':
if (--count == 0)
{
lexstate = ST_NORMAL;
token = STATIC_ASSERT_PHRASE;
break;
}
goto repeat;
default:
goto repeat;
}
break;
case ST_TABLE_1: case ST_TABLE_1:
goto repeat; goto repeat;

Просмотреть файл

@ -80,6 +80,7 @@ static void record_compound(struct string_list **keyw,
%token SHORT_KEYW %token SHORT_KEYW
%token SIGNED_KEYW %token SIGNED_KEYW
%token STATIC_KEYW %token STATIC_KEYW
%token STATIC_ASSERT_KEYW
%token STRUCT_KEYW %token STRUCT_KEYW
%token TYPEDEF_KEYW %token TYPEDEF_KEYW
%token UNION_KEYW %token UNION_KEYW
@ -97,6 +98,7 @@ static void record_compound(struct string_list **keyw,
%token BRACE_PHRASE %token BRACE_PHRASE
%token BRACKET_PHRASE %token BRACKET_PHRASE
%token EXPRESSION_PHRASE %token EXPRESSION_PHRASE
%token STATIC_ASSERT_PHRASE
%token CHAR %token CHAR
%token DOTS %token DOTS
@ -130,6 +132,7 @@ declaration1:
| function_definition | function_definition
| asm_definition | asm_definition
| export_definition | export_definition
| static_assert
| error ';' { $$ = $2; } | error ';' { $$ = $2; }
| error '}' { $$ = $2; } | error '}' { $$ = $2; }
; ;
@ -493,6 +496,10 @@ export_definition:
{ export_symbol((*$3)->string); $$ = $5; } { export_symbol((*$3)->string); $$ = $5; }
; ;
/* Ignore any module scoped _Static_assert(...) */
static_assert:
STATIC_ASSERT_PHRASE ';' { $$ = $2; }
;
%% %%

Просмотреть файл

@ -1,4 +1,4 @@
#!/usr/bin/perl #!/usr/bin/env perl
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
use strict; use strict;

Просмотреть файл

@ -34,12 +34,14 @@ static int external_module = 0;
static int warn_unresolved = 0; static int warn_unresolved = 0;
/* How a symbol is exported */ /* How a symbol is exported */
static int sec_mismatch_count = 0; static int sec_mismatch_count = 0;
static int sec_mismatch_fatal = 0; static int sec_mismatch_warn_only = true;
/* ignore missing files */ /* ignore missing files */
static int ignore_missing_files; static int ignore_missing_files;
/* If set to 1, only warn (instead of error) about missing ns imports */ /* If set to 1, only warn (instead of error) about missing ns imports */
static int allow_missing_ns_imports; static int allow_missing_ns_imports;
static bool error_occurred;
enum export { enum export {
export_plain, export_unused, export_gpl, export_plain, export_unused, export_gpl,
export_unused_gpl, export_gpl_future, export_unknown export_unused_gpl, export_gpl_future, export_unknown
@ -78,6 +80,8 @@ modpost_log(enum loglevel loglevel, const char *fmt, ...)
if (loglevel == LOG_FATAL) if (loglevel == LOG_FATAL)
exit(1); exit(1);
if (loglevel == LOG_ERROR)
error_occurred = true;
} }
static inline bool strends(const char *str, const char *postfix) static inline bool strends(const char *str, const char *postfix)
@ -403,8 +407,8 @@ static void sym_update_namespace(const char *symname, const char *namespace)
* actually an assertion. * actually an assertion.
*/ */
if (!s) { if (!s) {
merror("Could not update namespace(%s) for symbol %s\n", error("Could not update namespace(%s) for symbol %s\n",
namespace, symname); namespace, symname);
return; return;
} }
@ -2014,7 +2018,7 @@ static void read_symbols(const char *modname)
if (!mod->is_vmlinux) { if (!mod->is_vmlinux) {
license = get_modinfo(&info, "license"); license = get_modinfo(&info, "license");
if (!license) if (!license)
warn("missing MODULE_LICENSE() in %s\n", modname); error("missing MODULE_LICENSE() in %s\n", modname);
while (license) { while (license) {
if (license_is_gpl_compatible(license)) if (license_is_gpl_compatible(license))
mod->gpl_compatible = 1; mod->gpl_compatible = 1;
@ -2141,11 +2145,11 @@ static void check_for_gpl_usage(enum export exp, const char *m, const char *s)
{ {
switch (exp) { switch (exp) {
case export_gpl: case export_gpl:
fatal("GPL-incompatible module %s.ko uses GPL-only symbol '%s'\n", error("GPL-incompatible module %s.ko uses GPL-only symbol '%s'\n",
m, s); m, s);
break; break;
case export_unused_gpl: case export_unused_gpl:
fatal("GPL-incompatible module %s.ko uses GPL-only symbol marked UNUSED '%s'\n", error("GPL-incompatible module %s.ko uses GPL-only symbol marked UNUSED '%s'\n",
m, s); m, s);
break; break;
case export_gpl_future: case export_gpl_future:
@ -2174,22 +2178,18 @@ static void check_for_unused(enum export exp, const char *m, const char *s)
} }
} }
static int check_exports(struct module *mod) static void check_exports(struct module *mod)
{ {
struct symbol *s, *exp; struct symbol *s, *exp;
int err = 0;
for (s = mod->unres; s; s = s->next) { for (s = mod->unres; s; s = s->next) {
const char *basename; const char *basename;
exp = find_symbol(s->name); exp = find_symbol(s->name);
if (!exp || exp->module == mod) { if (!exp || exp->module == mod) {
if (have_vmlinux && !s->weak) { if (have_vmlinux && !s->weak)
modpost_log(warn_unresolved ? LOG_WARN : LOG_ERROR, modpost_log(warn_unresolved ? LOG_WARN : LOG_ERROR,
"\"%s\" [%s.ko] undefined!\n", "\"%s\" [%s.ko] undefined!\n",
s->name, mod->name); s->name, mod->name);
if (!warn_unresolved)
err = 1;
}
continue; continue;
} }
basename = strrchr(mod->name, '/'); basename = strrchr(mod->name, '/');
@ -2203,8 +2203,6 @@ static int check_exports(struct module *mod)
modpost_log(allow_missing_ns_imports ? LOG_WARN : LOG_ERROR, modpost_log(allow_missing_ns_imports ? LOG_WARN : LOG_ERROR,
"module %s uses symbol %s from namespace %s, but does not import it.\n", "module %s uses symbol %s from namespace %s, but does not import it.\n",
basename, exp->name, exp->namespace); basename, exp->name, exp->namespace);
if (!allow_missing_ns_imports)
err = 1;
add_namespace(&mod->missing_namespaces, exp->namespace); add_namespace(&mod->missing_namespaces, exp->namespace);
} }
@ -2212,11 +2210,9 @@ static int check_exports(struct module *mod)
check_for_gpl_usage(exp->export, basename, exp->name); check_for_gpl_usage(exp->export, basename, exp->name);
check_for_unused(exp->export, basename, exp->name); check_for_unused(exp->export, basename, exp->name);
} }
return err;
} }
static int check_modname_len(struct module *mod) static void check_modname_len(struct module *mod)
{ {
const char *mod_name; const char *mod_name;
@ -2225,12 +2221,8 @@ static int check_modname_len(struct module *mod)
mod_name = mod->name; mod_name = mod->name;
else else
mod_name++; mod_name++;
if (strlen(mod_name) >= MODULE_NAME_LEN) { if (strlen(mod_name) >= MODULE_NAME_LEN)
merror("module name is too long [%s.ko]\n", mod->name); error("module name is too long [%s.ko]\n", mod->name);
return 1;
}
return 0;
} }
/** /**
@ -2289,10 +2281,9 @@ static void add_staging_flag(struct buffer *b, const char *name)
/** /**
* Record CRCs for unresolved symbols * Record CRCs for unresolved symbols
**/ **/
static int add_versions(struct buffer *b, struct module *mod) static void add_versions(struct buffer *b, struct module *mod)
{ {
struct symbol *s, *exp; struct symbol *s, *exp;
int err = 0;
for (s = mod->unres; s; s = s->next) { for (s = mod->unres; s; s = s->next) {
exp = find_symbol(s->name); exp = find_symbol(s->name);
@ -2304,7 +2295,7 @@ static int add_versions(struct buffer *b, struct module *mod)
} }
if (!modversions) if (!modversions)
return err; return;
buf_printf(b, "\n"); buf_printf(b, "\n");
buf_printf(b, "static const struct modversion_info ____versions[]\n"); buf_printf(b, "static const struct modversion_info ____versions[]\n");
@ -2319,9 +2310,8 @@ static int add_versions(struct buffer *b, struct module *mod)
continue; continue;
} }
if (strlen(s->name) >= MODULE_NAME_LEN) { if (strlen(s->name) >= MODULE_NAME_LEN) {
merror("too long symbol \"%s\" [%s.ko]\n", error("too long symbol \"%s\" [%s.ko]\n",
s->name, mod->name); s->name, mod->name);
err = 1;
break; break;
} }
buf_printf(b, "\t{ %#8x, \"%s\" },\n", buf_printf(b, "\t{ %#8x, \"%s\" },\n",
@ -2329,8 +2319,6 @@ static int add_versions(struct buffer *b, struct module *mod)
} }
buf_printf(b, "};\n"); buf_printf(b, "};\n");
return err;
} }
static void add_depends(struct buffer *b, struct module *mod) static void add_depends(struct buffer *b, struct module *mod)
@ -2554,7 +2542,6 @@ int main(int argc, char **argv)
char *missing_namespace_deps = NULL; char *missing_namespace_deps = NULL;
char *dump_write = NULL, *files_source = NULL; char *dump_write = NULL, *files_source = NULL;
int opt; int opt;
int err;
int n; int n;
struct dump_list *dump_read_start = NULL; struct dump_list *dump_read_start = NULL;
struct dump_list **dump_read_iter = &dump_read_start; struct dump_list **dump_read_iter = &dump_read_start;
@ -2589,7 +2576,7 @@ int main(int argc, char **argv)
warn_unresolved = 1; warn_unresolved = 1;
break; break;
case 'E': case 'E':
sec_mismatch_fatal = 1; sec_mismatch_warn_only = false;
break; break;
case 'N': case 'N':
allow_missing_ns_imports = 1; allow_missing_ns_imports = 1;
@ -2624,8 +2611,6 @@ int main(int argc, char **argv)
if (!have_vmlinux) if (!have_vmlinux)
warn("Symbol info of vmlinux is missing. Unresolved symbol check will be entirely skipped.\n"); warn("Symbol info of vmlinux is missing. Unresolved symbol check will be entirely skipped.\n");
err = 0;
for (mod = modules; mod; mod = mod->next) { for (mod = modules; mod; mod = mod->next) {
char fname[PATH_MAX]; char fname[PATH_MAX];
@ -2634,14 +2619,14 @@ int main(int argc, char **argv)
buf.pos = 0; buf.pos = 0;
err |= check_modname_len(mod); check_modname_len(mod);
err |= check_exports(mod); check_exports(mod);
add_header(&buf, mod); add_header(&buf, mod);
add_intree_flag(&buf, !external_module); add_intree_flag(&buf, !external_module);
add_retpoline(&buf); add_retpoline(&buf);
add_staging_flag(&buf, mod->name); add_staging_flag(&buf, mod->name);
err |= add_versions(&buf, mod); add_versions(&buf, mod);
add_depends(&buf, mod); add_depends(&buf, mod);
add_moddevtable(&buf, mod); add_moddevtable(&buf, mod);
add_srcversion(&buf, mod); add_srcversion(&buf, mod);
@ -2655,21 +2640,21 @@ int main(int argc, char **argv)
if (dump_write) if (dump_write)
write_dump(dump_write); write_dump(dump_write);
if (sec_mismatch_count && sec_mismatch_fatal) if (sec_mismatch_count && !sec_mismatch_warn_only)
fatal("Section mismatches detected.\n" error("Section mismatches detected.\n"
"Set CONFIG_SECTION_MISMATCH_WARN_ONLY=y to allow them.\n"); "Set CONFIG_SECTION_MISMATCH_WARN_ONLY=y to allow them.\n");
for (n = 0; n < SYMBOL_HASH_SIZE; n++) { for (n = 0; n < SYMBOL_HASH_SIZE; n++) {
struct symbol *s; struct symbol *s;
for (s = symbolhash[n]; s; s = s->next) { for (s = symbolhash[n]; s; s = s->next) {
if (s->is_static) if (s->is_static)
warn("\"%s\" [%s] is a static %s\n", error("\"%s\" [%s] is a static %s\n",
s->name, s->module->name, s->name, s->module->name,
export_str(s->export)); export_str(s->export));
} }
} }
free(buf.p); free(buf.p);
return err; return error_occurred ? 1 : 0;
} }

Просмотреть файл

@ -201,6 +201,19 @@ enum loglevel {
void modpost_log(enum loglevel loglevel, const char *fmt, ...); void modpost_log(enum loglevel loglevel, const char *fmt, ...);
/*
* warn - show the given message, then let modpost continue running, still
* allowing modpost to exit successfully. This should be used when
* we still allow to generate vmlinux and modules.
*
* error - show the given message, then let modpost continue running, but fail
* in the end. This should be used when we should stop building vmlinux
* or modules, but we can continue running modpost to catch as many
* issues as possible.
*
* fatal - show the given message, and bail out immediately. This should be
* used when there is no point to continue running modpost.
*/
#define warn(fmt, args...) modpost_log(LOG_WARN, fmt, ##args) #define warn(fmt, args...) modpost_log(LOG_WARN, fmt, ##args)
#define merror(fmt, args...) modpost_log(LOG_ERROR, fmt, ##args) #define error(fmt, args...) modpost_log(LOG_ERROR, fmt, ##args)
#define fatal(fmt, args...) modpost_log(LOG_FATAL, fmt, ##args) #define fatal(fmt, args...) modpost_log(LOG_FATAL, fmt, ##args)

Просмотреть файл

@ -1,4 +1,4 @@
#!/usr/bin/python #!/usr/bin/env python
# SPDX-License-Identifier: GPL-2.0-only # SPDX-License-Identifier: GPL-2.0-only
# #
# show_deltas: Read list of printk messages instrumented with # show_deltas: Read list of printk messages instrumented with

Просмотреть файл

@ -1,4 +1,4 @@
#!/usr/bin/perl #!/usr/bin/env perl
# SPDX-License-Identifier: GPL-2.0-or-later # SPDX-License-Identifier: GPL-2.0-or-later
use strict; use strict;

Просмотреть файл

@ -1,4 +1,4 @@
#!/usr/bin/perl #!/usr/bin/env perl
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
# #
# Author: Mauro Carvalho Chehab <mchehab+samsung@kernel.org> # Author: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>

Просмотреть файл

@ -1,4 +1,4 @@
#!/usr/bin/python #!/usr/bin/env python
# SPDX-License-Identifier: GPL-2.0-only # SPDX-License-Identifier: GPL-2.0-only
""" """

Просмотреть файл

@ -1,4 +1,4 @@
#! /usr/bin/python #! /usr/bin/env python
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
# -*- python -*- # -*- python -*-
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-

Просмотреть файл

@ -1,4 +1,4 @@
#! /usr/bin/python #! /usr/bin/env python
# SPDX-License-Identifier: GPL-2.0-only # SPDX-License-Identifier: GPL-2.0-only
# -*- python -*- # -*- python -*-
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-

Просмотреть файл

@ -1,4 +1,4 @@
#!/usr/bin/python #!/usr/bin/env python
# SPDX-License-Identifier: GPL-2.0-only # SPDX-License-Identifier: GPL-2.0-only
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# #

Просмотреть файл

@ -1,4 +1,4 @@
#!/usr/bin/perl #!/usr/bin/env perl
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
open (IN,"ktest.pl"); open (IN,"ktest.pl");

Просмотреть файл

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
# #
# A thin wrapper on top of the KUnit Kernel # A thin wrapper on top of the KUnit Kernel

Просмотреть файл

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
# #
# A collection of tests for tools/testing/kunit/kunit.py # A collection of tests for tools/testing/kunit/kunit.py

Просмотреть файл

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
# Copyright (C) 2017 Netronome Systems, Inc. # Copyright (C) 2017 Netronome Systems, Inc.
# Copyright (c) 2019 Mellanox Technologies. All rights reserved # Copyright (c) 2019 Mellanox Technologies. All rights reserved

Просмотреть файл

@ -1,4 +1,4 @@
#!/usr/bin/python #!/usr/bin/env python
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
import subprocess import subprocess

Просмотреть файл

@ -1,4 +1,4 @@
#!/usr/bin/perl #!/usr/bin/env perl
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
# Prefix all lines with "# ", unbuffered. Command being piped in may need # Prefix all lines with "# ", unbuffered. Command being piped in may need
# to have unbuffering forced with "stdbuf -i0 -o0 -e0 $cmd". # to have unbuffering forced with "stdbuf -i0 -o0 -e0 $cmd".

Просмотреть файл

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
from subprocess import PIPE, Popen from subprocess import PIPE, Popen

Просмотреть файл

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
""" """
tdc_batch.py - a script to generate TC batch file tdc_batch.py - a script to generate TC batch file

Просмотреть файл

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
""" """
tdc_multibatch.py - a thin wrapper over tdc_batch.py to generate multiple batch tdc_multibatch.py - a thin wrapper over tdc_batch.py to generate multiple batch