mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	kbuild: doc: clarify the difference between extra-y and always-y
The difference between extra-y and always-y is obscure.
Basically, Kbuild builds targets listed in extra-y and always-y in
visited Makefiles without relying on any dependency.
The difference is that extra-y is used to list the targets needed for
vmlinux whereas always-y is used to list the targets that must be always
built irrespective of final targets.
Kbuild skips extra-y when it is building only modules (i.e.
'make modules'). This is the long-standing behavior since extra-y was
introduced in 2003, and it is explained in that commit log [1].
For clarification, this is the extra-y vs always-y table:
                  extra-y    always-y
  'make'             y          y
  'make vmlinux'     y          y
  'make modules'     n          y
Kbuild skips extra-y also when building external modules since obviously
it never builds vmlinux.
Unfortunately, extra-y is wrongly used in many places of upstream code,
and even in external modules.
Using extra-y in external module Makefiles is wrong. What you should
use is probably always-y or 'targets'.
The current documentation for extra-y is misleading. I rewrote it, and
moved it to the section 3.7.
always-y is not documented anywhere. I added.
[1]: https://git.kernel.org/pub/scm/linux/kernel/git/history/history.git/commit/?id=f94e5fd7e5d09a56a60670a9bb211a791654bba8
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
Reviewed-by: Randy Dunlap <rdunlap@infradead.org>
			
			
This commit is contained in:
		
							parent
							
								
									39bb232ae6
								
							
						
					
					
						commit
						d0e628cd81
					
				
					 1 changed files with 71 additions and 39 deletions
				
			
		| 
						 | 
					@ -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 Dependency tracking
 | 
						   --- 3.8 Always built goals - always-y
 | 
				
			||||||
	   --- 3.9 Custom Rules
 | 
						   --- 3.9 Compilation flags
 | 
				
			||||||
	   --- 3.10 Command change detection
 | 
						   --- 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
 | 
				
			||||||
| 
						 | 
					@ -321,7 +323,60 @@ more details, with real examples.
 | 
				
			||||||
	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 +465,8 @@ more details, with real examples.
 | 
				
			||||||
		AFLAGS_iwmmxt.o      := -Wa,-mcpu=iwmmxt
 | 
							AFLAGS_iwmmxt.o      := -Wa,-mcpu=iwmmxt
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
3.8 Dependency tracking
 | 
					3.10 Dependency tracking
 | 
				
			||||||
-----------------------
 | 
					------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Kbuild tracks dependencies on the following:
 | 
						Kbuild tracks dependencies on the following:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -422,8 +477,8 @@ 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.9 Custom Rules
 | 
					3.11 Custom Rules
 | 
				
			||||||
----------------
 | 
					-----------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Custom 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
 | 
				
			||||||
| 
						 | 
					@ -499,7 +554,7 @@ more details, with real examples.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	will be displayed with "make KBUILD_VERBOSE=0".
 | 
						will be displayed with "make KBUILD_VERBOSE=0".
 | 
				
			||||||
 | 
					
 | 
				
			||||||
3.10 Command change detection
 | 
					3.12 Command change detection
 | 
				
			||||||
-----------------------------
 | 
					-----------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	When the rule is evaluated, timestamps are compared between the target
 | 
						When the rule is evaluated, timestamps are compared between the target
 | 
				
			||||||
| 
						 | 
					@ -545,7 +600,7 @@ more details, with real examples.
 | 
				
			||||||
		unwanted results when the target is up to date and only the
 | 
							unwanted results when the target is up to date and only the
 | 
				
			||||||
		tests on changed commands trigger execution of commands.
 | 
							tests on changed commands trigger execution of commands.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
3.11 $(CC) support functions
 | 
					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
 | 
				
			||||||
| 
						 | 
					@ -660,7 +715,7 @@ more details, with real examples.
 | 
				
			||||||
			endif
 | 
								endif
 | 
				
			||||||
		endif
 | 
							endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
3.12 $(LD) support functions
 | 
					3.14 $(LD) support functions
 | 
				
			||||||
----------------------------
 | 
					----------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ld-option
 | 
					    ld-option
 | 
				
			||||||
| 
						 | 
					@ -674,7 +729,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
 | 
				
			||||||
| 
						 | 
					@ -1304,29 +1359,6 @@ 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
 | 
				
			||||||
---------------------------------------------
 | 
					---------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue