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).
|
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
|
||||||
|
|
2
Makefile
2
Makefile
|
@ -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
|
||||||
|
|
Загрузка…
Ссылка в новой задаче