forked from mirrors/linux
		
	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
	
	 Masahiro Yamada
						Masahiro Yamada