Kbuild updates for v5.11
- 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:
Коммит
7b95f0563a
|
@ -553,6 +553,41 @@ with "depends on m". E.g.::
|
|||
|
||||
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
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
|
|
|
@ -15,13 +15,15 @@ This document describes the Linux kernel Makefiles.
|
|||
--- 3.4 Objects which export symbols
|
||||
--- 3.5 Library file goals - lib-y
|
||||
--- 3.6 Descending down in directories
|
||||
--- 3.7 Compilation flags
|
||||
--- 3.8 <deleted>
|
||||
--- 3.9 Dependency tracking
|
||||
--- 3.10 Special Rules
|
||||
--- 3.11 $(CC) support functions
|
||||
--- 3.12 $(LD) support functions
|
||||
--- 3.13 Script Invocation
|
||||
--- 3.7 Non-builtin vmlinux targets - extra-y
|
||||
--- 3.8 Always built goals - always-y
|
||||
--- 3.9 Compilation flags
|
||||
--- 3.10 Dependency tracking
|
||||
--- 3.11 Custom Rules
|
||||
--- 3.12 Command change detection
|
||||
--- 3.13 $(CC) support functions
|
||||
--- 3.14 $(LD) support functions
|
||||
--- 3.15 Script Invocation
|
||||
|
||||
=== 4 Host Program support
|
||||
--- 4.1 Simple Host Program
|
||||
|
@ -46,7 +48,7 @@ This document describes the Linux kernel Makefiles.
|
|||
--- 7.5 Architecture-specific boot images
|
||||
--- 7.6 Building non-kbuild targets
|
||||
--- 7.7 Commands useful for building a boot image
|
||||
--- 7.8 Custom kbuild commands
|
||||
--- 7.8 <deleted>
|
||||
--- 7.9 Preprocessing linker scripts
|
||||
--- 7.10 Generic header files
|
||||
--- 7.11 Post-link pass
|
||||
|
@ -67,11 +69,11 @@ This document describes the Linux kernel Makefiles.
|
|||
|
||||
The Makefiles have five parts::
|
||||
|
||||
Makefile the top Makefile.
|
||||
.config the kernel configuration file.
|
||||
arch/$(ARCH)/Makefile the arch Makefile.
|
||||
scripts/Makefile.* common rules etc. for all kbuild Makefiles.
|
||||
kbuild Makefiles there are about 500 of these.
|
||||
Makefile the top Makefile.
|
||||
.config the kernel configuration file.
|
||||
arch/$(SRCARCH)/Makefile the arch Makefile.
|
||||
scripts/Makefile.* common rules etc. for all kbuild Makefiles.
|
||||
kbuild Makefiles exist in every subdirectory
|
||||
|
||||
The top Makefile reads the .config file, which comes from the kernel
|
||||
configuration process.
|
||||
|
@ -82,7 +84,7 @@ It builds these goals by recursively descending into the subdirectories of
|
|||
the kernel source tree.
|
||||
The list of subdirectories which are visited depends upon the kernel
|
||||
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.
|
||||
|
||||
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
|
||||
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`.
|
||||
|
||||
|
@ -317,11 +319,79 @@ more details, with real examples.
|
|||
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.
|
||||
|
||||
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
|
||||
names. This allows kbuild to totally skip the directory if the
|
||||
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
|
||||
|
@ -410,8 +480,8 @@ more details, with real examples.
|
|||
AFLAGS_iwmmxt.o := -Wa,-mcpu=iwmmxt
|
||||
|
||||
|
||||
3.9 Dependency tracking
|
||||
-----------------------
|
||||
3.10 Dependency tracking
|
||||
------------------------
|
||||
|
||||
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
|
||||
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
|
||||
header files generated during the build process.
|
||||
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
|
||||
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.
|
||||
|
||||
Two variables are used when defining special rules:
|
||||
Two variables are used when defining custom rules:
|
||||
|
||||
$(src)
|
||||
$(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
|
||||
$(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.
|
||||
|
||||
The target file depends on two prerequisite files. References
|
||||
|
@ -471,13 +541,81 @@ more details, with real examples.
|
|||
|
||||
Example::
|
||||
|
||||
#arch/blackfin/boot/Makefile
|
||||
$(obj)/vmImage: $(obj)/vmlinux.gz
|
||||
$(call if_changed,uimage)
|
||||
@$(kecho) 'Kernel: $@ is ready'
|
||||
# arch/arm/Makefile
|
||||
$(BOOT_TARGETS): vmlinux
|
||||
$(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@
|
||||
@$(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
|
||||
|
@ -592,7 +730,7 @@ more details, with real examples.
|
|||
endif
|
||||
endif
|
||||
|
||||
3.12 $(LD) support functions
|
||||
3.14 $(LD) support functions
|
||||
----------------------------
|
||||
|
||||
ld-option
|
||||
|
@ -606,7 +744,7 @@ more details, with real examples.
|
|||
#Makefile
|
||||
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
|
||||
|
@ -744,7 +882,7 @@ Both possibilities are described in the following.
|
|||
as a prerequisite.
|
||||
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::
|
||||
|
||||
|
@ -755,11 +893,11 @@ Both possibilities are described in the following.
|
|||
|
||||
The target $(obj)/devlist.h will not be built before
|
||||
$(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
|
||||
|
||||
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
|
||||
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
|
||||
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
|
||||
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,
|
||||
before starting to descend down in the individual directories.
|
||||
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.
|
||||
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.
|
||||
|
||||
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
|
||||
2) Store kernel version in include/linux/version.h
|
||||
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
|
||||
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
|
||||
located at the root of the obj tree.
|
||||
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
|
||||
and builds the final bootimage.
|
||||
- This includes building boot records
|
||||
|
@ -1154,7 +1292,7 @@ When kbuild executes, the following steps are followed (roughly):
|
|||
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.
|
||||
|
||||
$(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
|
||||
located.
|
||||
|
||||
$(init-y) objects will be located after $(head-y).
|
||||
|
||||
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,
|
||||
and arch/$(ARCH)/Makefile only adds architecture-specific
|
||||
and arch/$(SRCARCH)/Makefile only adds architecture-specific
|
||||
directories.
|
||||
|
||||
Example::
|
||||
|
||||
#arch/sparc64/Makefile
|
||||
core-y += arch/sparc64/kernel/
|
||||
libs-y += arch/sparc64/prom/ arch/sparc64/lib/
|
||||
drivers-$(CONFIG_OPROFILE) += arch/sparc64/oprofile/
|
||||
# arch/sparc/Makefile
|
||||
core-y += arch/sparc/
|
||||
|
||||
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
|
||||
-------------------------------------
|
||||
|
@ -1189,15 +1328,15 @@ When kbuild executes, the following steps are followed (roughly):
|
|||
The actual goals are not standardized across architectures.
|
||||
|
||||
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
|
||||
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/.
|
||||
|
||||
The recommended approach is to include shortcuts in
|
||||
arch/$(ARCH)/Makefile, and use the full path when calling down
|
||||
into the arch/$(ARCH)/boot/Makefile.
|
||||
arch/$(SRCARCH)/Makefile, and use the full path when calling down
|
||||
into the arch/$(SRCARCH)/boot/Makefile.
|
||||
|
||||
Example::
|
||||
|
||||
|
@ -1217,7 +1356,7 @@ When kbuild executes, the following steps are followed (roughly):
|
|||
|
||||
#arch/x86/Makefile
|
||||
define archhelp
|
||||
echo '* bzImage - Image (arch/$(ARCH)/boot/bzImage)'
|
||||
echo '* bzImage - Compressed kernel image (arch/x86/boot/bzImage)'
|
||||
endif
|
||||
|
||||
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.
|
||||
|
||||
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
|
||||
---------------------------------------------
|
||||
|
||||
Kbuild provides a few macros that are useful when building a
|
||||
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
|
||||
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
|
||||
Copy binary. Uses OBJCOPYFLAGS usually specified in
|
||||
arch/$(ARCH)/Makefile.
|
||||
arch/$(SRCARCH)/Makefile.
|
||||
OBJCOPYFLAGS_$@ may be used to set additional options.
|
||||
|
||||
gzip
|
||||
|
@ -1361,41 +1441,11 @@ When kbuild executes, the following steps are followed (roughly):
|
|||
targets += $(dtb-y)
|
||||
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
|
||||
--------------------------------
|
||||
|
||||
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
|
||||
located in the same directory.
|
||||
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
|
||||
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
|
||||
target vmlinux.lds.
|
||||
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
|
||||
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::
|
||||
|
||||
|
@ -1492,7 +1539,7 @@ See subsequent chapter for the syntax of the Kbuild file.
|
|||
During the prepare phase of the build a wrapper include
|
||||
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
|
||||
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.
|
||||
|
||||
This works like optional generic-y. If a mandatory header is missing
|
||||
in arch/$(ARCH)/include/(uapi/)/asm, Kbuild will automatically generate
|
||||
a wrapper of the asm-generic one.
|
||||
in arch/$(SRCARCH)/include/(uapi/)/asm, Kbuild will automatically
|
||||
generate a wrapper of the asm-generic one.
|
||||
|
||||
9 Kbuild Variables
|
||||
==================
|
||||
|
@ -1564,6 +1611,16 @@ The top Makefile exports the following variables:
|
|||
|
||||
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
|
||||
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
|
||||
subsystems have their own directory under include/, such as
|
||||
include/scsi; and architecture specific headers are located
|
||||
under arch/$(ARCH)/include/.
|
||||
under arch/$(SRCARCH)/include/.
|
||||
|
||||
4.1 Kernel Includes
|
||||
-------------------
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/perl
|
||||
#!/usr/bin/env perl
|
||||
use strict;
|
||||
use Text::Tabs;
|
||||
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
|
||||
#
|
||||
# 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
|
||||
# decode_msr msr-index.h < trace
|
||||
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
|
||||
# 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
|
||||
|
|
|
@ -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
|
||||
# page reclaim. It makes an attempt to extract some high-level information on
|
||||
# what is going on. The accuracy of the parser may vary
|
||||
|
|
2
Makefile
2
Makefile
|
@ -450,7 +450,7 @@ LEX = flex
|
|||
YACC = bison
|
||||
AWK = awk
|
||||
INSTALLKERNEL := installkernel
|
||||
DEPMOD = /sbin/depmod
|
||||
DEPMOD = depmod
|
||||
PERL = perl
|
||||
PYTHON = python
|
||||
PYTHON3 = python3
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/python
|
||||
#!/usr/bin/env python
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
#
|
||||
# Usage: unwcheck.py FILE
|
||||
|
|
|
@ -61,7 +61,6 @@ endif
|
|||
ifneq ($(findstring 2, $(KBUILD_EXTRA_WARN)),)
|
||||
|
||||
KBUILD_CFLAGS += -Wdisabled-optimization
|
||||
KBUILD_CFLAGS += -Wnested-externs
|
||||
KBUILD_CFLAGS += -Wshadow
|
||||
KBUILD_CFLAGS += $(call cc-option, -Wlogical-op)
|
||||
KBUILD_CFLAGS += -Wmissing-field-initializers
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/python
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# Copyright 2004 Matt Mackall <mpm@selenic.com>
|
||||
#
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/bin/bash
|
||||
#!/usr/bin/env bash
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# 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
|
||||
#
|
||||
# diffconfig - a tool to compare .config files.
|
||||
|
|
|
@ -32,6 +32,9 @@ static struct resword {
|
|||
{ "restrict", RESTRICT_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
|
||||
// field name which breaks the genksyms parser. It is not a gcc keyword anyway.
|
||||
// KAO. },
|
||||
|
|
|
@ -118,7 +118,7 @@ yylex(void)
|
|||
{
|
||||
static enum {
|
||||
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_5, ST_TABLE_6
|
||||
} lexstate = ST_NOTSTARTED;
|
||||
|
@ -201,6 +201,11 @@ repeat:
|
|||
|
||||
case EXPORT_SYMBOL_KEYW:
|
||||
goto fini;
|
||||
|
||||
case STATIC_ASSERT_KEYW:
|
||||
lexstate = ST_STATIC_ASSERT;
|
||||
count = 0;
|
||||
goto repeat;
|
||||
}
|
||||
}
|
||||
if (!suppress_type_lookup)
|
||||
|
@ -401,6 +406,26 @@ repeat:
|
|||
}
|
||||
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:
|
||||
goto repeat;
|
||||
|
||||
|
|
|
@ -80,6 +80,7 @@ static void record_compound(struct string_list **keyw,
|
|||
%token SHORT_KEYW
|
||||
%token SIGNED_KEYW
|
||||
%token STATIC_KEYW
|
||||
%token STATIC_ASSERT_KEYW
|
||||
%token STRUCT_KEYW
|
||||
%token TYPEDEF_KEYW
|
||||
%token UNION_KEYW
|
||||
|
@ -97,6 +98,7 @@ static void record_compound(struct string_list **keyw,
|
|||
%token BRACE_PHRASE
|
||||
%token BRACKET_PHRASE
|
||||
%token EXPRESSION_PHRASE
|
||||
%token STATIC_ASSERT_PHRASE
|
||||
|
||||
%token CHAR
|
||||
%token DOTS
|
||||
|
@ -130,6 +132,7 @@ declaration1:
|
|||
| function_definition
|
||||
| asm_definition
|
||||
| export_definition
|
||||
| static_assert
|
||||
| error ';' { $$ = $2; }
|
||||
| error '}' { $$ = $2; }
|
||||
;
|
||||
|
@ -493,6 +496,10 @@ export_definition:
|
|||
{ 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
|
||||
|
||||
use strict;
|
||||
|
|
|
@ -34,12 +34,14 @@ static int external_module = 0;
|
|||
static int warn_unresolved = 0;
|
||||
/* How a symbol is exported */
|
||||
static int sec_mismatch_count = 0;
|
||||
static int sec_mismatch_fatal = 0;
|
||||
static int sec_mismatch_warn_only = true;
|
||||
/* ignore missing files */
|
||||
static int ignore_missing_files;
|
||||
/* If set to 1, only warn (instead of error) about missing ns imports */
|
||||
static int allow_missing_ns_imports;
|
||||
|
||||
static bool error_occurred;
|
||||
|
||||
enum export {
|
||||
export_plain, export_unused, export_gpl,
|
||||
export_unused_gpl, export_gpl_future, export_unknown
|
||||
|
@ -78,6 +80,8 @@ modpost_log(enum loglevel loglevel, const char *fmt, ...)
|
|||
|
||||
if (loglevel == LOG_FATAL)
|
||||
exit(1);
|
||||
if (loglevel == LOG_ERROR)
|
||||
error_occurred = true;
|
||||
}
|
||||
|
||||
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.
|
||||
*/
|
||||
if (!s) {
|
||||
merror("Could not update namespace(%s) for symbol %s\n",
|
||||
namespace, symname);
|
||||
error("Could not update namespace(%s) for symbol %s\n",
|
||||
namespace, symname);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -2014,7 +2018,7 @@ static void read_symbols(const char *modname)
|
|||
if (!mod->is_vmlinux) {
|
||||
license = get_modinfo(&info, "license");
|
||||
if (!license)
|
||||
warn("missing MODULE_LICENSE() in %s\n", modname);
|
||||
error("missing MODULE_LICENSE() in %s\n", modname);
|
||||
while (license) {
|
||||
if (license_is_gpl_compatible(license))
|
||||
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) {
|
||||
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);
|
||||
break;
|
||||
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);
|
||||
break;
|
||||
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;
|
||||
int err = 0;
|
||||
|
||||
for (s = mod->unres; s; s = s->next) {
|
||||
const char *basename;
|
||||
exp = find_symbol(s->name);
|
||||
if (!exp || exp->module == mod) {
|
||||
if (have_vmlinux && !s->weak) {
|
||||
if (have_vmlinux && !s->weak)
|
||||
modpost_log(warn_unresolved ? LOG_WARN : LOG_ERROR,
|
||||
"\"%s\" [%s.ko] undefined!\n",
|
||||
s->name, mod->name);
|
||||
if (!warn_unresolved)
|
||||
err = 1;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
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,
|
||||
"module %s uses symbol %s from namespace %s, but does not import it.\n",
|
||||
basename, exp->name, exp->namespace);
|
||||
if (!allow_missing_ns_imports)
|
||||
err = 1;
|
||||
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_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;
|
||||
|
||||
|
@ -2225,12 +2221,8 @@ static int check_modname_len(struct module *mod)
|
|||
mod_name = mod->name;
|
||||
else
|
||||
mod_name++;
|
||||
if (strlen(mod_name) >= MODULE_NAME_LEN) {
|
||||
merror("module name is too long [%s.ko]\n", mod->name);
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
if (strlen(mod_name) >= MODULE_NAME_LEN)
|
||||
error("module name is too long [%s.ko]\n", mod->name);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -2289,10 +2281,9 @@ static void add_staging_flag(struct buffer *b, const char *name)
|
|||
/**
|
||||
* 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;
|
||||
int err = 0;
|
||||
|
||||
for (s = mod->unres; s; s = s->next) {
|
||||
exp = find_symbol(s->name);
|
||||
|
@ -2304,7 +2295,7 @@ static int add_versions(struct buffer *b, struct module *mod)
|
|||
}
|
||||
|
||||
if (!modversions)
|
||||
return err;
|
||||
return;
|
||||
|
||||
buf_printf(b, "\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;
|
||||
}
|
||||
if (strlen(s->name) >= MODULE_NAME_LEN) {
|
||||
merror("too long symbol \"%s\" [%s.ko]\n",
|
||||
s->name, mod->name);
|
||||
err = 1;
|
||||
error("too long symbol \"%s\" [%s.ko]\n",
|
||||
s->name, mod->name);
|
||||
break;
|
||||
}
|
||||
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");
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
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 *dump_write = NULL, *files_source = NULL;
|
||||
int opt;
|
||||
int err;
|
||||
int n;
|
||||
struct dump_list *dump_read_start = NULL;
|
||||
struct dump_list **dump_read_iter = &dump_read_start;
|
||||
|
@ -2589,7 +2576,7 @@ int main(int argc, char **argv)
|
|||
warn_unresolved = 1;
|
||||
break;
|
||||
case 'E':
|
||||
sec_mismatch_fatal = 1;
|
||||
sec_mismatch_warn_only = false;
|
||||
break;
|
||||
case 'N':
|
||||
allow_missing_ns_imports = 1;
|
||||
|
@ -2624,8 +2611,6 @@ int main(int argc, char **argv)
|
|||
if (!have_vmlinux)
|
||||
warn("Symbol info of vmlinux is missing. Unresolved symbol check will be entirely skipped.\n");
|
||||
|
||||
err = 0;
|
||||
|
||||
for (mod = modules; mod; mod = mod->next) {
|
||||
char fname[PATH_MAX];
|
||||
|
||||
|
@ -2634,14 +2619,14 @@ int main(int argc, char **argv)
|
|||
|
||||
buf.pos = 0;
|
||||
|
||||
err |= check_modname_len(mod);
|
||||
err |= check_exports(mod);
|
||||
check_modname_len(mod);
|
||||
check_exports(mod);
|
||||
|
||||
add_header(&buf, mod);
|
||||
add_intree_flag(&buf, !external_module);
|
||||
add_retpoline(&buf);
|
||||
add_staging_flag(&buf, mod->name);
|
||||
err |= add_versions(&buf, mod);
|
||||
add_versions(&buf, mod);
|
||||
add_depends(&buf, mod);
|
||||
add_moddevtable(&buf, mod);
|
||||
add_srcversion(&buf, mod);
|
||||
|
@ -2655,21 +2640,21 @@ int main(int argc, char **argv)
|
|||
|
||||
if (dump_write)
|
||||
write_dump(dump_write);
|
||||
if (sec_mismatch_count && sec_mismatch_fatal)
|
||||
fatal("Section mismatches detected.\n"
|
||||
if (sec_mismatch_count && !sec_mismatch_warn_only)
|
||||
error("Section mismatches detected.\n"
|
||||
"Set CONFIG_SECTION_MISMATCH_WARN_ONLY=y to allow them.\n");
|
||||
for (n = 0; n < SYMBOL_HASH_SIZE; n++) {
|
||||
struct symbol *s;
|
||||
|
||||
for (s = symbolhash[n]; s; s = s->next) {
|
||||
if (s->is_static)
|
||||
warn("\"%s\" [%s] is a static %s\n",
|
||||
s->name, s->module->name,
|
||||
export_str(s->export));
|
||||
error("\"%s\" [%s] is a static %s\n",
|
||||
s->name, s->module->name,
|
||||
export_str(s->export));
|
||||
}
|
||||
}
|
||||
|
||||
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, ...);
|
||||
|
||||
/*
|
||||
* 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 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)
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/python
|
||||
#!/usr/bin/env python
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
#
|
||||
# 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
|
||||
use strict;
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/perl
|
||||
#!/usr/bin/env perl
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
#
|
||||
# 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
|
||||
|
||||
"""
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#! /usr/bin/python
|
||||
#! /usr/bin/env python
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# -*- python -*-
|
||||
# -*- coding: utf-8 -*-
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#! /usr/bin/python
|
||||
#! /usr/bin/env python
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
# -*- python -*-
|
||||
# -*- coding: utf-8 -*-
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/python
|
||||
#!/usr/bin/env python
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/perl
|
||||
#!/usr/bin/env perl
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
open (IN,"ktest.pl");
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/python3
|
||||
#!/usr/bin/env python3
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
#
|
||||
# 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
|
||||
#
|
||||
# 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) 2019 Mellanox Technologies. All rights reserved
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/python
|
||||
#!/usr/bin/env python
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
import subprocess
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/perl
|
||||
#!/usr/bin/env perl
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# Prefix all lines with "# ", unbuffered. Command being piped in may need
|
||||
# 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
|
||||
|
||||
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
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/python3
|
||||
#!/usr/bin/env python3
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
"""
|
||||
tdc_multibatch.py - a thin wrapper over tdc_batch.py to generate multiple batch
|
||||
|
|
Загрузка…
Ссылка в новой задаче