aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@g5.osdl.org>2006-09-24 17:24:14 -0400
committerLinus Torvalds <torvalds@g5.osdl.org>2006-09-24 17:24:14 -0400
commit6e936d3e9a45a4307e7f4a29ee9829e7a0464af1 (patch)
tree555f9d89779e6a675b38d9703f278ecf0579531c
parenta68aa1cc6f3203b8a332683ebde67a00f39eec43 (diff)
parent5cc8d246d0ebbdf827d4bb7c3de175377d244d73 (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/sam/kbuild
* git://git.kernel.org/pub/scm/linux/kernel/git/sam/kbuild: (28 commits) kbuild: add distclean info to 'make help' and more details for 'clean' dontdiff: add utsrelease.h kbuild: fix "mkdir -p" usage in scripts/package/mkspec kbuild: correct and clarify versioning info in Makefile kbuild: fixup Documentation/kbuild/modules.txt kbuild: Extend kbuild/defconfig tags support to exuberant ctags kbuild: fix for some typos in Documentation/makefiles.txt kbuild: clarify "make C=" build option Documentaion: update Documentation/Changes with minimum versions kbuild: update help in top level Makefile kbuild: fail kernel compilation in case of unresolved module symbols kbuild: remove debug left-over from Makefile.host kbuild: create output directory for hostprogs with O=.. build kbuild: add missing return statement in modpost.c:secref_whitelist() kbuild: preperly align SYSMAP output kbuild: make -rR is now default kbuild: make V=2 tell why a target is rebuild kbuild: modpost on vmlinux regardless of CONFIG_MODULES kbuild: ignore references from ".pci_fixup" to ".init.text" kbuild: linguistic fixes for Documentation/kbuild/makefiles.txt ...
-rw-r--r--Documentation/Changes7
-rw-r--r--Documentation/dontdiff1
-rw-r--r--Documentation/kbuild/kconfig-language.txt12
-rw-r--r--Documentation/kbuild/makefiles.txt265
-rw-r--r--Documentation/kbuild/modules.txt161
-rw-r--r--Documentation/sparse.txt8
-rw-r--r--Kbuild2
-rw-r--r--Makefile134
-rw-r--r--scripts/Kbuild.include93
-rw-r--r--scripts/Makefile5
-rw-r--r--scripts/Makefile.build5
-rw-r--r--scripts/Makefile.headersinst2
-rw-r--r--scripts/Makefile.host20
-rw-r--r--scripts/Makefile.modpost13
-rw-r--r--scripts/kconfig/Makefile1
-rw-r--r--scripts/kconfig/confdata.c8
-rw-r--r--scripts/mod/modpost.c42
-rwxr-xr-xscripts/package/mkspec4
-rw-r--r--scripts/unifdef.c1005
-rw-r--r--usr/Makefile2
20 files changed, 1471 insertions, 319 deletions
diff --git a/Documentation/Changes b/Documentation/Changes
index 488272074c36..abee7f58c1ed 100644
--- a/Documentation/Changes
+++ b/Documentation/Changes
@@ -37,15 +37,14 @@ o e2fsprogs 1.29 # tune2fs
37o jfsutils 1.1.3 # fsck.jfs -V 37o jfsutils 1.1.3 # fsck.jfs -V
38o reiserfsprogs 3.6.3 # reiserfsck -V 2>&1|grep reiserfsprogs 38o reiserfsprogs 3.6.3 # reiserfsck -V 2>&1|grep reiserfsprogs
39o xfsprogs 2.6.0 # xfs_db -V 39o xfsprogs 2.6.0 # xfs_db -V
40o pcmciautils 004 40o pcmciautils 004 # pccardctl -V
41o pcmcia-cs 3.1.21 # cardmgr -V
42o quota-tools 3.09 # quota -V 41o quota-tools 3.09 # quota -V
43o PPP 2.4.0 # pppd --version 42o PPP 2.4.0 # pppd --version
44o isdn4k-utils 3.1pre1 # isdnctrl 2>&1|grep version 43o isdn4k-utils 3.1pre1 # isdnctrl 2>&1|grep version
45o nfs-utils 1.0.5 # showmount --version 44o nfs-utils 1.0.5 # showmount --version
46o procps 3.2.0 # ps --version 45o procps 3.2.0 # ps --version
47o oprofile 0.9 # oprofiled --version 46o oprofile 0.9 # oprofiled --version
48o udev 071 # udevinfo -V 47o udev 081 # udevinfo -V
49 48
50Kernel compilation 49Kernel compilation
51================== 50==================
@@ -268,7 +267,7 @@ active clients.
268 267
269To enable this new functionality, you need to: 268To enable this new functionality, you need to:
270 269
271 mount -t nfsd nfsd /proc/fs/nfs 270 mount -t nfsd nfsd /proc/fs/nfsd
272 271
273before running exportfs or mountd. It is recommended that all NFS 272before running exportfs or mountd. It is recommended that all NFS
274services be protected from the internet-at-large by a firewall where 273services be protected from the internet-at-large by a firewall where
diff --git a/Documentation/dontdiff b/Documentation/dontdiff
index 24adfe9af3ca..63c2d0c55aa2 100644
--- a/Documentation/dontdiff
+++ b/Documentation/dontdiff
@@ -135,6 +135,7 @@ tags
135times.h* 135times.h*
136tkparse 136tkparse
137trix_boot.h 137trix_boot.h
138utsrelease.h*
138version.h* 139version.h*
139vmlinux 140vmlinux
140vmlinux-* 141vmlinux-*
diff --git a/Documentation/kbuild/kconfig-language.txt b/Documentation/kbuild/kconfig-language.txt
index ca1967f36423..003fccc14d24 100644
--- a/Documentation/kbuild/kconfig-language.txt
+++ b/Documentation/kbuild/kconfig-language.txt
@@ -67,19 +67,19 @@ applicable everywhere (see syntax).
67- default value: "default" <expr> ["if" <expr>] 67- default value: "default" <expr> ["if" <expr>]
68 A config option can have any number of default values. If multiple 68 A config option can have any number of default values. If multiple
69 default values are visible, only the first defined one is active. 69 default values are visible, only the first defined one is active.
70 Default values are not limited to the menu entry, where they are 70 Default values are not limited to the menu entry where they are
71 defined, this means the default can be defined somewhere else or be 71 defined. This means the default can be defined somewhere else or be
72 overridden by an earlier definition. 72 overridden by an earlier definition.
73 The default value is only assigned to the config symbol if no other 73 The default value is only assigned to the config symbol if no other
74 value was set by the user (via the input prompt above). If an input 74 value was set by the user (via the input prompt above). If an input
75 prompt is visible the default value is presented to the user and can 75 prompt is visible the default value is presented to the user and can
76 be overridden by him. 76 be overridden by him.
77 Optionally dependencies only for this default value can be added with 77 Optionally, dependencies only for this default value can be added with
78 "if". 78 "if".
79 79
80- dependencies: "depends on"/"requires" <expr> 80- dependencies: "depends on"/"requires" <expr>
81 This defines a dependency for this menu entry. If multiple 81 This defines a dependency for this menu entry. If multiple
82 dependencies are defined they are connected with '&&'. Dependencies 82 dependencies are defined, they are connected with '&&'. Dependencies
83 are applied to all other options within this menu entry (which also 83 are applied to all other options within this menu entry (which also
84 accept an "if" expression), so these two examples are equivalent: 84 accept an "if" expression), so these two examples are equivalent:
85 85
@@ -153,7 +153,7 @@ Nonconstant symbols are the most common ones and are defined with the
153'config' statement. Nonconstant symbols consist entirely of alphanumeric 153'config' statement. Nonconstant symbols consist entirely of alphanumeric
154characters or underscores. 154characters or underscores.
155Constant symbols are only part of expressions. Constant symbols are 155Constant symbols are only part of expressions. Constant symbols are
156always surrounded by single or double quotes. Within the quote any 156always surrounded by single or double quotes. Within the quote, any
157other character is allowed and the quotes can be escaped using '\'. 157other character is allowed and the quotes can be escaped using '\'.
158 158
159Menu structure 159Menu structure
@@ -237,7 +237,7 @@ choices:
237 <choice block> 237 <choice block>
238 "endchoice" 238 "endchoice"
239 239
240This defines a choice group and accepts any of above attributes as 240This defines a choice group and accepts any of the above attributes as
241options. A choice can only be of type bool or tristate, while a boolean 241options. A choice can only be of type bool or tristate, while a boolean
242choice only allows a single config entry to be selected, a tristate 242choice only allows a single config entry to be selected, a tristate
243choice also allows any number of config entries to be set to 'm'. This 243choice also allows any number of config entries to be set to 'm'. This
diff --git a/Documentation/kbuild/makefiles.txt b/Documentation/kbuild/makefiles.txt
index 0706699c9da9..b7d6abb501a6 100644
--- a/Documentation/kbuild/makefiles.txt
+++ b/Documentation/kbuild/makefiles.txt
@@ -22,7 +22,7 @@ This document describes the Linux kernel Makefiles.
22 === 4 Host Program support 22 === 4 Host Program support
23 --- 4.1 Simple Host Program 23 --- 4.1 Simple Host Program
24 --- 4.2 Composite Host Programs 24 --- 4.2 Composite Host Programs
25 --- 4.3 Defining shared libraries 25 --- 4.3 Defining shared libraries
26 --- 4.4 Using C++ for host programs 26 --- 4.4 Using C++ for host programs
27 --- 4.5 Controlling compiler options for host programs 27 --- 4.5 Controlling compiler options for host programs
28 --- 4.6 When host programs are actually built 28 --- 4.6 When host programs are actually built
@@ -69,7 +69,7 @@ architecture-specific information to the top Makefile.
69 69
70Each subdirectory has a kbuild Makefile which carries out the commands 70Each subdirectory has a kbuild Makefile which carries out the commands
71passed down from above. The kbuild Makefile uses information from the 71passed down from above. The kbuild Makefile uses information from the
72.config file to construct various file lists used by kbuild to build 72.config file to construct various file lists used by kbuild to build
73any built-in or modular targets. 73any built-in or modular targets.
74 74
75scripts/Makefile.* contains all the definitions/rules etc. that 75scripts/Makefile.* contains all the definitions/rules etc. that
@@ -86,7 +86,7 @@ any kernel Makefiles (or any other source files).
86 86
87*Normal developers* are people who work on features such as device 87*Normal developers* are people who work on features such as device
88drivers, file systems, and network protocols. These people need to 88drivers, file systems, and network protocols. These people need to
89maintain the kbuild Makefiles for the subsystem that they are 89maintain the kbuild Makefiles for the subsystem they are
90working on. In order to do this effectively, they need some overall 90working on. In order to do this effectively, they need some overall
91knowledge about the kernel Makefiles, plus detailed knowledge about the 91knowledge about the kernel Makefiles, plus detailed knowledge about the
92public interface for kbuild. 92public interface for kbuild.
@@ -104,10 +104,10 @@ This document is aimed towards normal developers and arch developers.
104=== 3 The kbuild files 104=== 3 The kbuild files
105 105
106Most Makefiles within the kernel are kbuild Makefiles that use the 106Most Makefiles within the kernel are kbuild Makefiles that use the
107kbuild infrastructure. This chapter introduce the syntax used in the 107kbuild infrastructure. This chapter introduces the syntax used in the
108kbuild makefiles. 108kbuild makefiles.
109The preferred name for the kbuild files are 'Makefile' but 'Kbuild' can 109The preferred name for the kbuild files are 'Makefile' but 'Kbuild' can
110be used and if both a 'Makefile' and a 'Kbuild' file exists then the 'Kbuild' 110be used and if both a 'Makefile' and a 'Kbuild' file exists, then the 'Kbuild'
111file will be used. 111file will be used.
112 112
113Section 3.1 "Goal definitions" is a quick intro, further chapters provide 113Section 3.1 "Goal definitions" is a quick intro, further chapters provide
@@ -124,7 +124,7 @@ more details, with real examples.
124 Example: 124 Example:
125 obj-y += foo.o 125 obj-y += foo.o
126 126
127 This tell kbuild that there is one object in that directory named 127 This tell kbuild that there is one object in that directory, named
128 foo.o. foo.o will be built from foo.c or foo.S. 128 foo.o. foo.o will be built from foo.c or foo.S.
129 129
130 If foo.o shall be built as a module, the variable obj-m is used. 130 If foo.o shall be built as a module, the variable obj-m is used.
@@ -140,7 +140,7 @@ more details, with real examples.
140--- 3.2 Built-in object goals - obj-y 140--- 3.2 Built-in object goals - obj-y
141 141
142 The kbuild Makefile specifies object files for vmlinux 142 The kbuild Makefile specifies object files for vmlinux
143 in the lists $(obj-y). These lists depend on the kernel 143 in the $(obj-y) lists. These lists depend on the kernel
144 configuration. 144 configuration.
145 145
146 Kbuild compiles all the $(obj-y) files. It then calls 146 Kbuild compiles all the $(obj-y) files. It then calls
@@ -154,8 +154,8 @@ more details, with real examples.
154 Link order is significant, because certain functions 154 Link order is significant, because certain functions
155 (module_init() / __initcall) will be called during boot in the 155 (module_init() / __initcall) will be called during boot in the
156 order they appear. So keep in mind that changing the link 156 order they appear. So keep in mind that changing the link
157 order may e.g. change the order in which your SCSI 157 order may e.g. change the order in which your SCSI
158 controllers are detected, and thus you disks are renumbered. 158 controllers are detected, and thus your disks are renumbered.
159 159
160 Example: 160 Example:
161 #drivers/isdn/i4l/Makefile 161 #drivers/isdn/i4l/Makefile
@@ -203,11 +203,11 @@ more details, with real examples.
203 Example: 203 Example:
204 #fs/ext2/Makefile 204 #fs/ext2/Makefile
205 obj-$(CONFIG_EXT2_FS) += ext2.o 205 obj-$(CONFIG_EXT2_FS) += ext2.o
206 ext2-y := balloc.o bitmap.o 206 ext2-y := balloc.o bitmap.o
207 ext2-$(CONFIG_EXT2_FS_XATTR) += xattr.o 207 ext2-$(CONFIG_EXT2_FS_XATTR) += xattr.o
208 208
209 In this example xattr.o is only part of the composite object 209 In this example, xattr.o is only part of the composite object
210 ext2.o, if $(CONFIG_EXT2_FS_XATTR) evaluates to 'y'. 210 ext2.o if $(CONFIG_EXT2_FS_XATTR) evaluates to 'y'.
211 211
212 Note: Of course, when you are building objects into the kernel, 212 Note: Of course, when you are building objects into the kernel,
213 the syntax above will also work. So, if you have CONFIG_EXT2_FS=y, 213 the syntax above will also work. So, if you have CONFIG_EXT2_FS=y,
@@ -221,16 +221,16 @@ more details, with real examples.
221 221
222--- 3.5 Library file goals - lib-y 222--- 3.5 Library file goals - lib-y
223 223
224 Objects listed with obj-* are used for modules or 224 Objects listed with obj-* are used for modules, or
225 combined in a built-in.o for that specific directory. 225 combined in a built-in.o for that specific directory.
226 There is also the possibility to list objects that will 226 There is also the possibility to list objects that will
227 be included in a library, lib.a. 227 be included in a library, lib.a.
228 All objects listed with lib-y are combined in a single 228 All objects listed with lib-y are combined in a single
229 library for that directory. 229 library for that directory.
230 Objects that are listed in obj-y and additional listed in 230 Objects that are listed in obj-y and additionaly listed in
231 lib-y will not be included in the library, since they will anyway 231 lib-y will not be included in the library, since they will anyway
232 be accessible. 232 be accessible.
233 For consistency objects listed in lib-m will be included in lib.a. 233 For consistency, objects listed in lib-m will be included in lib.a.
234 234
235 Note that the same kbuild makefile may list files to be built-in 235 Note that the same kbuild makefile may list files to be built-in
236 and to be part of a library. Therefore the same directory 236 and to be part of a library. Therefore the same directory
@@ -241,11 +241,11 @@ more details, with real examples.
241 lib-y := checksum.o delay.o 241 lib-y := checksum.o delay.o
242 242
243 This will create a library lib.a based on checksum.o and delay.o. 243 This will create a library lib.a based on checksum.o and delay.o.
244 For kbuild to actually recognize that there is a lib.a being build 244 For kbuild to actually recognize that there is a lib.a being built,
245 the directory shall be listed in libs-y. 245 the directory shall be listed in libs-y.
246 See also "6.3 List directories to visit when descending". 246 See also "6.3 List directories to visit when descending".
247 247
248 Usage of lib-y is normally restricted to lib/ and arch/*/lib. 248 Use of lib-y is normally restricted to lib/ and arch/*/lib.
249 249
250--- 3.6 Descending down in directories 250--- 3.6 Descending down in directories
251 251
@@ -255,7 +255,7 @@ more details, with real examples.
255 invoke make recursively in subdirectories, provided you let it know of 255 invoke make recursively in subdirectories, provided you let it know of
256 them. 256 them.
257 257
258 To do so obj-y and obj-m are used. 258 To do so, obj-y and obj-m are used.
259 ext2 lives in a separate directory, and the Makefile present in fs/ 259 ext2 lives in a separate directory, and the Makefile present in fs/
260 tells kbuild to descend down using the following assignment. 260 tells kbuild to descend down using the following assignment.
261 261
@@ -353,8 +353,8 @@ more details, with real examples.
353 Special rules are used when the kbuild infrastructure does 353 Special rules are used when the kbuild infrastructure does
354 not provide the required support. A typical example is 354 not provide the required support. A typical example is
355 header files generated during the build process. 355 header files generated during the build process.
356 Another example is the architecture specific Makefiles which 356 Another example are the architecture specific Makefiles which
357 needs special rules to prepare boot images etc. 357 need special rules to prepare boot images etc.
358 358
359 Special rules are written as normal Make rules. 359 Special rules are written as normal Make rules.
360 Kbuild is not executing in the directory where the Makefile is 360 Kbuild is not executing in the directory where the Makefile is
@@ -387,28 +387,28 @@ more details, with real examples.
387 387
388--- 3.11 $(CC) support functions 388--- 3.11 $(CC) support functions
389 389
390 The kernel may be build with several different versions of 390 The kernel may be built with several different versions of
391 $(CC), each supporting a unique set of features and options. 391 $(CC), each supporting a unique set of features and options.
392 kbuild provide basic support to check for valid options for $(CC). 392 kbuild provide basic support to check for valid options for $(CC).
393 $(CC) is useally the gcc compiler, but other alternatives are 393 $(CC) is useally the gcc compiler, but other alternatives are
394 available. 394 available.
395 395
396 as-option 396 as-option
397 as-option is used to check if $(CC) when used to compile 397 as-option is used to check if $(CC) -- when used to compile
398 assembler (*.S) files supports the given option. An optional 398 assembler (*.S) files -- supports the given option. An optional
399 second option may be specified if first option are not supported. 399 second option may be specified if the first option is not supported.
400 400
401 Example: 401 Example:
402 #arch/sh/Makefile 402 #arch/sh/Makefile
403 cflags-y += $(call as-option,-Wa$(comma)-isa=$(isa-y),) 403 cflags-y += $(call as-option,-Wa$(comma)-isa=$(isa-y),)
404 404
405 In the above example cflags-y will be assinged the the option 405 In the above example, cflags-y will be assigned the option
406 -Wa$(comma)-isa=$(isa-y) if it is supported by $(CC). 406 -Wa$(comma)-isa=$(isa-y) if it is supported by $(CC).
407 The second argument is optional, and if supplied will be used 407 The second argument is optional, and if supplied will be used
408 if first argument is not supported. 408 if first argument is not supported.
409 409
410 ld-option 410 ld-option
411 ld-option is used to check if $(CC) when used to link object files 411 ld-option is used to check if $(CC) when used to link object files
412 supports the given option. An optional second option may be 412 supports the given option. An optional second option may be
413 specified if first option are not supported. 413 specified if first option are not supported.
414 414
@@ -422,7 +422,7 @@ more details, with real examples.
422 if first argument is not supported. 422 if first argument is not supported.
423 423
424 cc-option 424 cc-option
425 cc-option is used to check if $(CC) support a given option, and not 425 cc-option is used to check if $(CC) supports a given option, and not
426 supported to use an optional second option. 426 supported to use an optional second option.
427 427
428 Example: 428 Example:
@@ -430,12 +430,12 @@ more details, with real examples.
430 cflags-y += $(call cc-option,-march=pentium-mmx,-march=i586) 430 cflags-y += $(call cc-option,-march=pentium-mmx,-march=i586)
431 431
432 In the above example cflags-y will be assigned the option 432 In the above example cflags-y will be assigned the option
433 -march=pentium-mmx if supported by $(CC), otherwise -march-i586. 433 -march=pentium-mmx if supported by $(CC), otherwise -march=i586.
434 The second argument to cc-option is optional, and if omitted 434 The second argument to cc-option is optional, and if omitted,
435 cflags-y will be assigned no value if first option is not supported. 435 cflags-y will be assigned no value if first option is not supported.
436 436
437 cc-option-yn 437 cc-option-yn
438 cc-option-yn is used to check if gcc supports a given option 438 cc-option-yn is used to check if gcc supports a given option
439 and return 'y' if supported, otherwise 'n'. 439 and return 'y' if supported, otherwise 'n'.
440 440
441 Example: 441 Example:
@@ -443,32 +443,33 @@ more details, with real examples.
443 biarch := $(call cc-option-yn, -m32) 443 biarch := $(call cc-option-yn, -m32)
444 aflags-$(biarch) += -a32 444 aflags-$(biarch) += -a32
445 cflags-$(biarch) += -m32 445 cflags-$(biarch) += -m32
446 446
447 In the above example $(biarch) is set to y if $(CC) supports the -m32 447 In the above example, $(biarch) is set to y if $(CC) supports the -m32
448 option. When $(biarch) equals to y the expanded variables $(aflags-y) 448 option. When $(biarch) equals 'y', the expanded variables $(aflags-y)
449 and $(cflags-y) will be assigned the values -a32 and -m32. 449 and $(cflags-y) will be assigned the values -a32 and -m32,
450 respectively.
450 451
451 cc-option-align 452 cc-option-align
452 gcc version >= 3.0 shifted type of options used to speify 453 gcc versions >= 3.0 changed the type of options used to specify
453 alignment of functions, loops etc. $(cc-option-align) whrn used 454 alignment of functions, loops etc. $(cc-option-align), when used
454 as prefix to the align options will select the right prefix: 455 as prefix to the align options, will select the right prefix:
455 gcc < 3.00 456 gcc < 3.00
456 cc-option-align = -malign 457 cc-option-align = -malign
457 gcc >= 3.00 458 gcc >= 3.00
458 cc-option-align = -falign 459 cc-option-align = -falign
459 460
460 Example: 461 Example:
461 CFLAGS += $(cc-option-align)-functions=4 462 CFLAGS += $(cc-option-align)-functions=4
462 463
463 In the above example the option -falign-functions=4 is used for 464 In the above example, the option -falign-functions=4 is used for
464 gcc >= 3.00. For gcc < 3.00 -malign-functions=4 is used. 465 gcc >= 3.00. For gcc < 3.00, -malign-functions=4 is used.
465 466
466 cc-version 467 cc-version
467 cc-version return a numerical version of the $(CC) compiler version. 468 cc-version returns a numerical version of the $(CC) compiler version.
468 The format is <major><minor> where both are two digits. So for example 469 The format is <major><minor> where both are two digits. So for example
469 gcc 3.41 would return 0341. 470 gcc 3.41 would return 0341.
470 cc-version is useful when a specific $(CC) version is faulty in one 471 cc-version is useful when a specific $(CC) version is faulty in one
471 area, for example the -mregparm=3 were broken in some gcc version 472 area, for example -mregparm=3 was broken in some gcc versions
472 even though the option was accepted by gcc. 473 even though the option was accepted by gcc.
473 474
474 Example: 475 Example:
@@ -477,20 +478,20 @@ more details, with real examples.
477 if [ $(call cc-version) -ge 0300 ] ; then \ 478 if [ $(call cc-version) -ge 0300 ] ; then \
478 echo "-mregparm=3"; fi ;) 479 echo "-mregparm=3"; fi ;)
479 480
480 In the above example -mregparm=3 is only used for gcc version greater 481 In the above example, -mregparm=3 is only used for gcc version greater
481 than or equal to gcc 3.0. 482 than or equal to gcc 3.0.
482 483
483 cc-ifversion 484 cc-ifversion
484 cc-ifversion test the version of $(CC) and equals last argument if 485 cc-ifversion tests the version of $(CC) and equals last argument if
485 version expression is true. 486 version expression is true.
486 487
487 Example: 488 Example:
488 #fs/reiserfs/Makefile 489 #fs/reiserfs/Makefile
489 EXTRA_CFLAGS := $(call cc-ifversion, -lt, 0402, -O1) 490 EXTRA_CFLAGS := $(call cc-ifversion, -lt, 0402, -O1)
490 491
491 In this example EXTRA_CFLAGS will be assigned the value -O1 if the 492 In this example, EXTRA_CFLAGS will be assigned the value -O1 if the
492 $(CC) version is less than 4.2. 493 $(CC) version is less than 4.2.
493 cc-ifversion takes all the shell operators: 494 cc-ifversion takes all the shell operators:
494 -eq, -ne, -lt, -le, -gt, and -ge 495 -eq, -ne, -lt, -le, -gt, and -ge
495 The third parameter may be a text as in this example, but it may also 496 The third parameter may be a text as in this example, but it may also
496 be an expanded variable or a macro. 497 be an expanded variable or a macro.
@@ -506,7 +507,7 @@ The first step is to tell kbuild that a host program exists. This is
506done utilising the variable hostprogs-y. 507done utilising the variable hostprogs-y.
507 508
508The second step is to add an explicit dependency to the executable. 509The second step is to add an explicit dependency to the executable.
509This can be done in two ways. Either add the dependency in a rule, 510This can be done in two ways. Either add the dependency in a rule,
510or utilise the variable $(always). 511or utilise the variable $(always).
511Both possibilities are described in the following. 512Both possibilities are described in the following.
512 513
@@ -523,28 +524,28 @@ Both possibilities are described in the following.
523 Kbuild assumes in the above example that bin2hex is made from a single 524 Kbuild assumes in the above example that bin2hex is made from a single
524 c-source file named bin2hex.c located in the same directory as 525 c-source file named bin2hex.c located in the same directory as
525 the Makefile. 526 the Makefile.
526 527
527--- 4.2 Composite Host Programs 528--- 4.2 Composite Host Programs
528 529
529 Host programs can be made up based on composite objects. 530 Host programs can be made up based on composite objects.
530 The syntax used to define composite objects for host programs is 531 The syntax used to define composite objects for host programs is
531 similar to the syntax used for kernel objects. 532 similar to the syntax used for kernel objects.
532 $(<executeable>-objs) list all objects used to link the final 533 $(<executeable>-objs) lists all objects used to link the final
533 executable. 534 executable.
534 535
535 Example: 536 Example:
536 #scripts/lxdialog/Makefile 537 #scripts/lxdialog/Makefile
537 hostprogs-y := lxdialog 538 hostprogs-y := lxdialog
538 lxdialog-objs := checklist.o lxdialog.o 539 lxdialog-objs := checklist.o lxdialog.o
539 540
540 Objects with extension .o are compiled from the corresponding .c 541 Objects with extension .o are compiled from the corresponding .c
541 files. In the above example checklist.c is compiled to checklist.o 542 files. In the above example, checklist.c is compiled to checklist.o
542 and lxdialog.c is compiled to lxdialog.o. 543 and lxdialog.c is compiled to lxdialog.o.
543 Finally the two .o files are linked to the executable, lxdialog. 544 Finally, the two .o files are linked to the executable, lxdialog.
544 Note: The syntax <executable>-y is not permitted for host-programs. 545 Note: The syntax <executable>-y is not permitted for host-programs.
545 546
546--- 4.3 Defining shared libraries 547--- 4.3 Defining shared libraries
547 548
548 Objects with extension .so are considered shared libraries, and 549 Objects with extension .so are considered shared libraries, and
549 will be compiled as position independent objects. 550 will be compiled as position independent objects.
550 Kbuild provides support for shared libraries, but the usage 551 Kbuild provides support for shared libraries, but the usage
@@ -557,7 +558,7 @@ Both possibilities are described in the following.
557 hostprogs-y := conf 558 hostprogs-y := conf
558 conf-objs := conf.o libkconfig.so 559 conf-objs := conf.o libkconfig.so
559 libkconfig-objs := expr.o type.o 560 libkconfig-objs := expr.o type.o
560 561
561 Shared libraries always require a corresponding -objs line, and 562 Shared libraries always require a corresponding -objs line, and
562 in the example above the shared library libkconfig is composed by 563 in the example above the shared library libkconfig is composed by
563 the two objects expr.o and type.o. 564 the two objects expr.o and type.o.
@@ -578,7 +579,7 @@ Both possibilities are described in the following.
578 579
579 In the example above the executable is composed of the C++ file 580 In the example above the executable is composed of the C++ file
580 qconf.cc - identified by $(qconf-cxxobjs). 581 qconf.cc - identified by $(qconf-cxxobjs).
581 582
582 If qconf is composed by a mixture of .c and .cc files, then an 583 If qconf is composed by a mixture of .c and .cc files, then an
583 additional line can be used to identify this. 584 additional line can be used to identify this.
584 585
@@ -587,34 +588,35 @@ Both possibilities are described in the following.
587 hostprogs-y := qconf 588 hostprogs-y := qconf
588 qconf-cxxobjs := qconf.o 589 qconf-cxxobjs := qconf.o
589 qconf-objs := check.o 590 qconf-objs := check.o
590 591
591--- 4.5 Controlling compiler options for host programs 592--- 4.5 Controlling compiler options for host programs
592 593
593 When compiling host programs, it is possible to set specific flags. 594 When compiling host programs, it is possible to set specific flags.
594 The programs will always be compiled utilising $(HOSTCC) passed 595 The programs will always be compiled utilising $(HOSTCC) passed
595 the options specified in $(HOSTCFLAGS). 596 the options specified in $(HOSTCFLAGS).
596 To set flags that will take effect for all host programs created 597 To set flags that will take effect for all host programs created
597 in that Makefile use the variable HOST_EXTRACFLAGS. 598 in that Makefile, use the variable HOST_EXTRACFLAGS.
598 599
599 Example: 600 Example:
600 #scripts/lxdialog/Makefile 601 #scripts/lxdialog/Makefile
601 HOST_EXTRACFLAGS += -I/usr/include/ncurses 602 HOST_EXTRACFLAGS += -I/usr/include/ncurses
602 603
603 To set specific flags for a single file the following construction 604 To set specific flags for a single file the following construction
604 is used: 605 is used:
605 606
606 Example: 607 Example:
607 #arch/ppc64/boot/Makefile 608 #arch/ppc64/boot/Makefile
608 HOSTCFLAGS_piggyback.o := -DKERNELBASE=$(KERNELBASE) 609 HOSTCFLAGS_piggyback.o := -DKERNELBASE=$(KERNELBASE)
609 610
610 It is also possible to specify additional options to the linker. 611 It is also possible to specify additional options to the linker.
611 612
612 Example: 613 Example:
613 #scripts/kconfig/Makefile 614 #scripts/kconfig/Makefile
614 HOSTLOADLIBES_qconf := -L$(QTDIR)/lib 615 HOSTLOADLIBES_qconf := -L$(QTDIR)/lib
615 616
616 When linking qconf it will be passed the extra option "-L$(QTDIR)/lib". 617 When linking qconf, it will be passed the extra option
617 618 "-L$(QTDIR)/lib".
619
618--- 4.6 When host programs are actually built 620--- 4.6 When host programs are actually built
619 621
620 Kbuild will only build host-programs when they are referenced 622 Kbuild will only build host-programs when they are referenced
@@ -629,7 +631,7 @@ Both possibilities are described in the following.
629 $(obj)/devlist.h: $(src)/pci.ids $(obj)/gen-devlist 631 $(obj)/devlist.h: $(src)/pci.ids $(obj)/gen-devlist
630 ( cd $(obj); ./gen-devlist ) < $< 632 ( cd $(obj); ./gen-devlist ) < $<
631 633
632 The target $(obj)/devlist.h will not be built before 634 The target $(obj)/devlist.h will not be built before
633 $(obj)/gen-devlist is updated. Note that references to 635 $(obj)/gen-devlist is updated. Note that references to
634 the host programs in special rules must be prefixed with $(obj). 636 the host programs in special rules must be prefixed with $(obj).
635 637
@@ -648,7 +650,7 @@ Both possibilities are described in the following.
648 650
649--- 4.7 Using hostprogs-$(CONFIG_FOO) 651--- 4.7 Using hostprogs-$(CONFIG_FOO)
650 652
651 A typcal pattern in a Kbuild file lok like this: 653 A typical pattern in a Kbuild file looks like this:
652 654
653 Example: 655 Example:
654 #scripts/Makefile 656 #scripts/Makefile
@@ -656,13 +658,13 @@ Both possibilities are described in the following.
656 658
657 Kbuild knows about both 'y' for built-in and 'm' for module. 659 Kbuild knows about both 'y' for built-in and 'm' for module.
658 So if a config symbol evaluate to 'm', kbuild will still build 660 So if a config symbol evaluate to 'm', kbuild will still build
659 the binary. In other words Kbuild handle hostprogs-m exactly 661 the binary. In other words, Kbuild handles hostprogs-m exactly
660 like hostprogs-y. But only hostprogs-y is recommend used 662 like hostprogs-y. But only hostprogs-y is recommended to be used
661 when no CONFIG symbol are involved. 663 when no CONFIG symbols are involved.
662 664
663=== 5 Kbuild clean infrastructure 665=== 5 Kbuild clean infrastructure
664 666
665"make clean" deletes most generated files in the src tree where the kernel 667"make clean" deletes most generated files in the obj tree where the kernel
666is compiled. This includes generated files such as host programs. 668is compiled. This includes generated files such as host programs.
667Kbuild knows targets listed in $(hostprogs-y), $(hostprogs-m), $(always), 669Kbuild knows targets listed in $(hostprogs-y), $(hostprogs-m), $(always),
668$(extra-y) and $(targets). They are all deleted during "make clean". 670$(extra-y) and $(targets). They are all deleted during "make clean".
@@ -680,7 +682,8 @@ When executing "make clean", the two files "devlist.h classlist.h" will
680be deleted. Kbuild will assume files to be in same relative directory as the 682be deleted. Kbuild will assume files to be in same relative directory as the
681Makefile except if an absolute path is specified (path starting with '/'). 683Makefile except if an absolute path is specified (path starting with '/').
682 684
683To delete a directory hirachy use: 685To delete a directory hierarchy use:
686
684 Example: 687 Example:
685 #scripts/package/Makefile 688 #scripts/package/Makefile
686 clean-dirs := $(objtree)/debian/ 689 clean-dirs := $(objtree)/debian/
@@ -723,29 +726,29 @@ be visited during "make clean".
723 726
724The top level Makefile sets up the environment and does the preparation, 727The top level Makefile sets up the environment and does the preparation,
725before starting to descend down in the individual directories. 728before starting to descend down in the individual directories.
726The top level makefile contains the generic part, whereas the 729The top level makefile contains the generic part, whereas
727arch/$(ARCH)/Makefile contains what is required to set-up kbuild 730arch/$(ARCH)/Makefile contains what is required to set up kbuild
728to the said architecture. 731for said architecture.
729To do so arch/$(ARCH)/Makefile sets a number of variables, and defines 732To do so, arch/$(ARCH)/Makefile sets up a number of variables and defines
730a few targets. 733a few targets.
731 734
732When kbuild executes the following steps are followed (roughly): 735When kbuild executes, the following steps are followed (roughly):
7331) Configuration of the kernel => produced .config 7361) Configuration of the kernel => produce .config
7342) Store kernel version in include/linux/version.h 7372) Store kernel version in include/linux/version.h
7353) Symlink include/asm to include/asm-$(ARCH) 7383) Symlink include/asm to include/asm-$(ARCH)
7364) Updating all other prerequisites to the target prepare: 7394) Updating all other prerequisites to the target prepare:
737 - Additional prerequisites are specified in arch/$(ARCH)/Makefile 740 - Additional prerequisites are specified in arch/$(ARCH)/Makefile
7385) Recursively descend down in all directories listed in 7415) Recursively descend down in all directories listed in
739 init-* core* drivers-* net-* libs-* and build all targets. 742 init-* core* drivers-* net-* libs-* and build all targets.
740 - The value of the above variables are extended in arch/$(ARCH)/Makefile. 743 - The values of the above variables are expanded in arch/$(ARCH)/Makefile.
7416) All object files are then linked and the resulting file vmlinux is 7446) All object files are then linked and the resulting file vmlinux is
742 located at the root of the src tree. 745 located at the root of the obj tree.
743 The very first objects linked are listed in head-y, assigned by 746 The very first objects linked are listed in head-y, assigned by
744 arch/$(ARCH)/Makefile. 747 arch/$(ARCH)/Makefile.
7457) Finally the architecture specific part does any required post processing 7487) Finally, the architecture specific part does any required post processing
746 and builds the final bootimage. 749 and builds the final bootimage.
747 - This includes building boot records 750 - This includes building boot records
748 - Preparing initrd images and the like 751 - Preparing initrd images and thelike
749 752
750 753
751--- 6.1 Set variables to tweak the build to the architecture 754--- 6.1 Set variables to tweak the build to the architecture
@@ -760,7 +763,7 @@ When kbuild executes the following steps are followed (roughly):
760 LDFLAGS := -m elf_s390 763 LDFLAGS := -m elf_s390
761 Note: EXTRA_LDFLAGS and LDFLAGS_$@ can be used to further customise 764 Note: EXTRA_LDFLAGS and LDFLAGS_$@ can be used to further customise
762 the flags used. See chapter 7. 765 the flags used. See chapter 7.
763 766
764 LDFLAGS_MODULE Options for $(LD) when linking modules 767 LDFLAGS_MODULE Options for $(LD) when linking modules
765 768
766 LDFLAGS_MODULE is used to set specific flags for $(LD) when 769 LDFLAGS_MODULE is used to set specific flags for $(LD) when
@@ -770,7 +773,7 @@ When kbuild executes the following steps are followed (roughly):
770 LDFLAGS_vmlinux Options for $(LD) when linking vmlinux 773 LDFLAGS_vmlinux Options for $(LD) when linking vmlinux
771 774
772 LDFLAGS_vmlinux is used to specify additional flags to pass to 775 LDFLAGS_vmlinux is used to specify additional flags to pass to
773 the linker when linking the final vmlinux. 776 the linker when linking the final vmlinux image.
774 LDFLAGS_vmlinux uses the LDFLAGS_$@ support. 777 LDFLAGS_vmlinux uses the LDFLAGS_$@ support.
775 778
776 Example: 779 Example:
@@ -780,7 +783,7 @@ When kbuild executes the following steps are followed (roughly):
780 OBJCOPYFLAGS objcopy flags 783 OBJCOPYFLAGS objcopy flags
781 784
782 When $(call if_changed,objcopy) is used to translate a .o file, 785 When $(call if_changed,objcopy) is used to translate a .o file,
783 then the flags specified in OBJCOPYFLAGS will be used. 786 the flags specified in OBJCOPYFLAGS will be used.
784 $(call if_changed,objcopy) is often used to generate raw binaries on 787 $(call if_changed,objcopy) is often used to generate raw binaries on
785 vmlinux. 788 vmlinux.
786 789
@@ -792,7 +795,7 @@ When kbuild executes the following steps are followed (roughly):
792 $(obj)/image: vmlinux FORCE 795 $(obj)/image: vmlinux FORCE
793 $(call if_changed,objcopy) 796 $(call if_changed,objcopy)
794 797
795 In this example the binary $(obj)/image is a binary version of 798 In this example, the binary $(obj)/image is a binary version of
796 vmlinux. The usage of $(call if_changed,xxx) will be described later. 799 vmlinux. The usage of $(call if_changed,xxx) will be described later.
797 800
798 AFLAGS $(AS) assembler flags 801 AFLAGS $(AS) assembler flags
@@ -809,7 +812,7 @@ When kbuild executes the following steps are followed (roughly):
809 Default value - see top level Makefile 812 Default value - see top level Makefile
810 Append or modify as required per architecture. 813 Append or modify as required per architecture.
811 814
812 Often the CFLAGS variable depends on the configuration. 815 Often, the CFLAGS variable depends on the configuration.
813 816
814 Example: 817 Example:
815 #arch/i386/Makefile 818 #arch/i386/Makefile
@@ -830,7 +833,7 @@ When kbuild executes the following steps are followed (roughly):
830 ... 833 ...
831 834
832 835
833 The first examples utilises the trick that a config option expands 836 The first example utilises the trick that a config option expands
834 to 'y' when selected. 837 to 'y' when selected.
835 838
836 CFLAGS_KERNEL $(CC) options specific for built-in 839 CFLAGS_KERNEL $(CC) options specific for built-in
@@ -843,18 +846,18 @@ When kbuild executes the following steps are followed (roughly):
843 $(CFLAGS_MODULE) contains extra C compiler flags used to compile code 846 $(CFLAGS_MODULE) contains extra C compiler flags used to compile code
844 for loadable kernel modules. 847 for loadable kernel modules.
845 848
846 849
847--- 6.2 Add prerequisites to archprepare: 850--- 6.2 Add prerequisites to archprepare:
848 851
849 The archprepare: rule is used to list prerequisites that needs to be 852 The archprepare: rule is used to list prerequisites that need to be
850 built before starting to descend down in the subdirectories. 853 built before starting to descend down in the subdirectories.
851 This is usual header files containing assembler constants. 854 This is usually used for header files containing assembler constants.
852 855
853 Example: 856 Example:
854 #arch/arm/Makefile 857 #arch/arm/Makefile
855 archprepare: maketools 858 archprepare: maketools
856 859
857 In this example the file target maketools will be processed 860 In this example, the file target maketools will be processed
858 before descending down in the subdirectories. 861 before descending down in the subdirectories.
859 See also chapter XXX-TODO that describe how kbuild supports 862 See also chapter XXX-TODO that describe how kbuild supports
860 generating offset header files. 863 generating offset header files.
@@ -867,18 +870,19 @@ When kbuild executes the following steps are followed (roughly):
867 corresponding arch-specific section for modules; the module-building 870 corresponding arch-specific section for modules; the module-building
868 machinery is all architecture-independent. 871 machinery is all architecture-independent.
869 872
870 873
871 head-y, init-y, core-y, libs-y, drivers-y, net-y 874 head-y, init-y, core-y, libs-y, drivers-y, net-y
872 875
873 $(head-y) list objects to be linked first in vmlinux. 876 $(head-y) lists objects to be linked first in vmlinux.
874 $(libs-y) list directories where a lib.a archive can be located. 877 $(libs-y) lists directories where a lib.a archive can be located.
875 The rest list directories where a built-in.o object file can be located. 878 The rest lists directories where a built-in.o object file can be
879 located.
876 880
877 $(init-y) objects will be located after $(head-y). 881 $(init-y) objects will be located after $(head-y).
878 Then the rest follows in this order: 882 Then the rest follows in this order:
879 $(core-y), $(libs-y), $(drivers-y) and $(net-y). 883 $(core-y), $(libs-y), $(drivers-y) and $(net-y).
880 884
881 The top level Makefile define values for all generic directories, 885 The top level Makefile defines values for all generic directories,
882 and arch/$(ARCH)/Makefile only adds architecture specific directories. 886 and arch/$(ARCH)/Makefile only adds architecture specific directories.
883 887
884 Example: 888 Example:
@@ -915,27 +919,27 @@ When kbuild executes the following steps are followed (roughly):
915 "$(Q)$(MAKE) $(build)=<dir>" is the recommended way to invoke 919 "$(Q)$(MAKE) $(build)=<dir>" is the recommended way to invoke
916 make in a subdirectory. 920 make in a subdirectory.
917 921
918 There are no rules for naming of the architecture specific targets, 922 There are no rules for naming architecture specific targets,
919 but executing "make help" will list all relevant targets. 923 but executing "make help" will list all relevant targets.
920 To support this $(archhelp) must be defined. 924 To support this, $(archhelp) must be defined.
921 925
922 Example: 926 Example:
923 #arch/i386/Makefile 927 #arch/i386/Makefile
924 define archhelp 928 define archhelp
925 echo '* bzImage - Image (arch/$(ARCH)/boot/bzImage)' 929 echo '* bzImage - Image (arch/$(ARCH)/boot/bzImage)'
926 endef 930 endif
927 931
928 When make is executed without arguments, the first goal encountered 932 When make is executed without arguments, the first goal encountered
929 will be built. In the top level Makefile the first goal present 933 will be built. In the top level Makefile the first goal present
930 is all:. 934 is all:.
931 An architecture shall always per default build a bootable image. 935 An architecture shall always, per default, build a bootable image.
932 In "make help" the default goal is highlighted with a '*'. 936 In "make help", the default goal is highlighted with a '*'.
933 Add a new prerequisite to all: to select a default goal different 937 Add a new prerequisite to all: to select a default goal different
934 from vmlinux. 938 from vmlinux.
935 939
936 Example: 940 Example:
937 #arch/i386/Makefile 941 #arch/i386/Makefile
938 all: bzImage 942 all: bzImage
939 943
940 When "make" is executed without arguments, bzImage will be built. 944 When "make" is executed without arguments, bzImage will be built.
941 945
@@ -955,10 +959,10 @@ When kbuild executes the following steps are followed (roughly):
955 #arch/i386/kernel/Makefile 959 #arch/i386/kernel/Makefile
956 extra-y := head.o init_task.o 960 extra-y := head.o init_task.o
957 961
958 In this example extra-y is used to list object files that 962 In this example, extra-y is used to list object files that
959 shall be built, but shall not be linked as part of built-in.o. 963 shall be built, but shall not be linked as part of built-in.o.
960 964
961 965
962--- 6.6 Commands useful for building a boot image 966--- 6.6 Commands useful for building a boot image
963 967
964 Kbuild provides a few macros that are useful when building a 968 Kbuild provides a few macros that are useful when building a
@@ -972,8 +976,8 @@ When kbuild executes the following steps are followed (roughly):
972 target: source(s) FORCE 976 target: source(s) FORCE
973 $(call if_changed,ld/objcopy/gzip) 977 $(call if_changed,ld/objcopy/gzip)
974 978
975 When the rule is evaluated it is checked to see if any files 979 When the rule is evaluated, it is checked to see if any files
976 needs an update, or the commandline has changed since last 980 needs an update, or the command line has changed since the last
977 invocation. The latter will force a rebuild if any options 981 invocation. The latter will force a rebuild if any options
978 to the executable have changed. 982 to the executable have changed.
979 Any target that utilises if_changed must be listed in $(targets), 983 Any target that utilises if_changed must be listed in $(targets),
@@ -991,8 +995,8 @@ When kbuild executes the following steps are followed (roughly):
991 #WRONG!# $(call if_changed, ld/objcopy/gzip) 995 #WRONG!# $(call if_changed, ld/objcopy/gzip)
992 996
993 ld 997 ld
994 Link target. Often LDFLAGS_$@ is used to set specific options to ld. 998 Link target. Often, LDFLAGS_$@ is used to set specific options to ld.
995 999
996 objcopy 1000 objcopy
997 Copy binary. Uses OBJCOPYFLAGS usually specified in 1001 Copy binary. Uses OBJCOPYFLAGS usually specified in
998 arch/$(ARCH)/Makefile. 1002 arch/$(ARCH)/Makefile.
@@ -1010,10 +1014,10 @@ When kbuild executes the following steps are followed (roughly):
1010 $(obj)/setup $(obj)/bootsect: %: %.o FORCE 1014 $(obj)/setup $(obj)/bootsect: %: %.o FORCE
1011 $(call if_changed,ld) 1015 $(call if_changed,ld)
1012 1016
1013 In this example there are two possible targets, requiring different 1017 In this example, there are two possible targets, requiring different
1014 options to the linker. the linker options are specified using the 1018 options to the linker. The linker options are specified using the
1015 LDFLAGS_$@ syntax - one for each potential target. 1019 LDFLAGS_$@ syntax - one for each potential target.
1016 $(targets) are assinged all potential targets, herby kbuild knows 1020 $(targets) are assinged all potential targets, by which kbuild knows
1017 the targets and will: 1021 the targets and will:
1018 1) check for commandline changes 1022 1) check for commandline changes
1019 2) delete target during make clean 1023 2) delete target during make clean
@@ -1027,7 +1031,7 @@ When kbuild executes the following steps are followed (roughly):
1027 1031
1028--- 6.7 Custom kbuild commands 1032--- 6.7 Custom kbuild commands
1029 1033
1030 When kbuild is executing with KBUILD_VERBOSE=0 then only a shorthand 1034 When kbuild is executing with KBUILD_VERBOSE=0, then only a shorthand
1031 of a command is normally displayed. 1035 of a command is normally displayed.
1032 To enable this behaviour for custom commands kbuild requires 1036 To enable this behaviour for custom commands kbuild requires
1033 two variables to be set: 1037 two variables to be set:
@@ -1045,34 +1049,34 @@ When kbuild executes the following steps are followed (roughly):
1045 $(call if_changed,image) 1049 $(call if_changed,image)
1046 @echo 'Kernel: $@ is ready' 1050 @echo 'Kernel: $@ is ready'
1047 1051
1048 When updating the $(obj)/bzImage target the line: 1052 When updating the $(obj)/bzImage target, the line
1049 1053
1050 BUILD arch/i386/boot/bzImage 1054 BUILD arch/i386/boot/bzImage
1051 1055
1052 will be displayed with "make KBUILD_VERBOSE=0". 1056 will be displayed with "make KBUILD_VERBOSE=0".
1053 1057
1054 1058
1055--- 6.8 Preprocessing linker scripts 1059--- 6.8 Preprocessing linker scripts
1056 1060
1057 When the vmlinux image is build the linker script: 1061 When the vmlinux image is built, the linker script
1058 arch/$(ARCH)/kernel/vmlinux.lds is used. 1062 arch/$(ARCH)/kernel/vmlinux.lds is used.
1059 The script is a preprocessed variant of the file vmlinux.lds.S 1063 The script is a preprocessed variant of the file vmlinux.lds.S
1060 located in the same directory. 1064 located in the same directory.
1061 kbuild knows .lds file and includes a rule *lds.S -> *lds. 1065 kbuild knows .lds files and includes a rule *lds.S -> *lds.
1062 1066
1063 Example: 1067 Example:
1064 #arch/i386/kernel/Makefile 1068 #arch/i386/kernel/Makefile
1065 always := vmlinux.lds 1069 always := vmlinux.lds
1066 1070
1067 #Makefile 1071 #Makefile
1068 export CPPFLAGS_vmlinux.lds += -P -C -U$(ARCH) 1072 export CPPFLAGS_vmlinux.lds += -P -C -U$(ARCH)
1069 1073
1070 The assigment to $(always) is used to tell kbuild to build the 1074 The assignment to $(always) is used to tell kbuild to build the
1071 target: vmlinux.lds. 1075 target vmlinux.lds.
1072 The assignment to $(CPPFLAGS_vmlinux.lds) tell kbuild to use the 1076 The assignment to $(CPPFLAGS_vmlinux.lds) tells kbuild to use the
1073 specified options when building the target vmlinux.lds. 1077 specified options when building the target vmlinux.lds.
1074 1078
1075 When building the *.lds target kbuild used the variakles: 1079 When building the *.lds target, kbuild uses the variables:
1076 CPPFLAGS : Set in top-level Makefile 1080 CPPFLAGS : Set in top-level Makefile
1077 EXTRA_CPPFLAGS : May be set in the kbuild makefile 1081 EXTRA_CPPFLAGS : May be set in the kbuild makefile
1078 CPPFLAGS_$(@F) : Target specific flags. 1082 CPPFLAGS_$(@F) : Target specific flags.
@@ -1147,7 +1151,7 @@ The top Makefile exports the following variables:
1147 1151
1148=== 8 Makefile language 1152=== 8 Makefile language
1149 1153
1150The kernel Makefiles are designed to run with GNU Make. The Makefiles 1154The kernel Makefiles are designed to be run with GNU Make. The Makefiles
1151use only the documented features of GNU Make, but they do use many 1155use only the documented features of GNU Make, but they do use many
1152GNU extensions. 1156GNU extensions.
1153 1157
@@ -1169,10 +1173,13 @@ is the right choice.
1169Original version made by Michael Elizabeth Chastain, <mailto:mec@shout.net> 1173Original version made by Michael Elizabeth Chastain, <mailto:mec@shout.net>
1170Updates by Kai Germaschewski <kai@tp1.ruhr-uni-bochum.de> 1174Updates by Kai Germaschewski <kai@tp1.ruhr-uni-bochum.de>
1171Updates by Sam Ravnborg <sam@ravnborg.org> 1175Updates by Sam Ravnborg <sam@ravnborg.org>
1176Language QA by Jan Engelhardt <jengelh@gmx.de>
1172 1177
1173=== 10 TODO 1178=== 10 TODO
1174 1179
1175- Describe how kbuild support shipped files with _shipped. 1180- Describe how kbuild supports shipped files with _shipped.
1176- Generating offset header files. 1181- Generating offset header files.
1177- Add more variables to section 7? 1182- Add more variables to section 7?
1178 1183
1184
1185
diff --git a/Documentation/kbuild/modules.txt b/Documentation/kbuild/modules.txt
index 61fc079eb966..2e7702e94a78 100644
--- a/Documentation/kbuild/modules.txt
+++ b/Documentation/kbuild/modules.txt
@@ -1,7 +1,7 @@
1 1
2In this document you will find information about: 2In this document you will find information about:
3- how to build external modules 3- how to build external modules
4- how to make your module use kbuild infrastructure 4- how to make your module use the kbuild infrastructure
5- how kbuild will install a kernel 5- how kbuild will install a kernel
6- how to install modules in a non-standard location 6- how to install modules in a non-standard location
7 7
@@ -24,7 +24,7 @@ In this document you will find information about:
24 --- 6.1 INSTALL_MOD_PATH 24 --- 6.1 INSTALL_MOD_PATH
25 --- 6.2 INSTALL_MOD_DIR 25 --- 6.2 INSTALL_MOD_DIR
26 === 7. Module versioning & Module.symvers 26 === 7. Module versioning & Module.symvers
27 --- 7.1 Symbols fron the kernel (vmlinux + modules) 27 --- 7.1 Symbols from the kernel (vmlinux + modules)
28 --- 7.2 Symbols and external modules 28 --- 7.2 Symbols and external modules
29 --- 7.3 Symbols from another external module 29 --- 7.3 Symbols from another external module
30 === 8. Tips & Tricks 30 === 8. Tips & Tricks
@@ -36,13 +36,13 @@ In this document you will find information about:
36 36
37kbuild includes functionality for building modules both 37kbuild includes functionality for building modules both
38within the kernel source tree and outside the kernel source tree. 38within the kernel source tree and outside the kernel source tree.
39The latter is usually referred to as external modules and is used 39The latter is usually referred to as external or "out-of-tree"
40both during development and for modules that are not planned to be 40modules and is used both during development and for modules that
41included in the kernel tree. 41are not planned to be included in the kernel tree.
42 42
43What is covered within this file is mainly information to authors 43What is covered within this file is mainly information to authors
44of modules. The author of an external modules should supply 44of modules. The author of an external module should supply
45a makefile that hides most of the complexity so one only has to type 45a makefile that hides most of the complexity, so one only has to type
46'make' to build the module. A complete example will be present in 46'make' to build the module. A complete example will be present in
47chapter 4, "Creating a kbuild file for an external module". 47chapter 4, "Creating a kbuild file for an external module".
48 48
@@ -63,14 +63,15 @@ when building an external module.
63 For the running kernel use: 63 For the running kernel use:
64 make -C /lib/modules/`uname -r`/build M=`pwd` 64 make -C /lib/modules/`uname -r`/build M=`pwd`
65 65
66 For the above command to succeed the kernel must have been built with 66 For the above command to succeed, the kernel must have been
67 modules enabled. 67 built with modules enabled.
68 68
69 To install the modules that were just built: 69 To install the modules that were just built:
70 70
71 make -C <path-to-kernel> M=`pwd` modules_install 71 make -C <path-to-kernel> M=`pwd` modules_install
72 72
73 More complex examples later, the above should get you going. 73 More complex examples will be shown later, the above should
74 be enough to get you started.
74 75
75--- 2.2 Available targets 76--- 2.2 Available targets
76 77
@@ -89,13 +90,13 @@ when building an external module.
89 Same functionality as if no target was specified. 90 Same functionality as if no target was specified.
90 See description above. 91 See description above.
91 92
92 make -C $KDIR M=$PWD modules_install 93 make -C $KDIR M=`pwd` modules_install
93 Install the external module(s). 94 Install the external module(s).
94 Installation default is in /lib/modules/<kernel-version>/extra, 95 Installation default is in /lib/modules/<kernel-version>/extra,
95 but may be prefixed with INSTALL_MOD_PATH - see separate 96 but may be prefixed with INSTALL_MOD_PATH - see separate
96 chapter. 97 chapter.
97 98
98 make -C $KDIR M=$PWD clean 99 make -C $KDIR M=`pwd` clean
99 Remove all generated files for the module - the kernel 100 Remove all generated files for the module - the kernel
100 source directory is not modified. 101 source directory is not modified.
101 102
@@ -129,29 +130,28 @@ when building an external module.
129 130
130 To make sure the kernel contains the information required to 131 To make sure the kernel contains the information required to
131 build external modules the target 'modules_prepare' must be used. 132 build external modules the target 'modules_prepare' must be used.
132 'module_prepare' solely exists as a simple way to prepare 133 'module_prepare' exists solely as a simple way to prepare
133 a kernel for building external modules. 134 a kernel source tree for building external modules.
134 Note: modules_prepare will not build Module.symvers even if 135 Note: modules_prepare will not build Module.symvers even if
135 CONFIG_MODULEVERSIONING is set. 136 CONFIG_MODULEVERSIONING is set. Therefore a full kernel build
136 Therefore a full kernel build needs to be executed to make 137 needs to be executed to make module versioning work.
137 module versioning work.
138 138
139--- 2.5 Building separate files for a module 139--- 2.5 Building separate files for a module
140 It is possible to build single files which is part of a module. 140 It is possible to build single files which are part of a module.
141 This works equal for the kernel, a module and even for external 141 This works equally well for the kernel, a module and even for
142 modules. 142 external modules.
143 Examples (module foo.ko, consist of bar.o, baz.o): 143 Examples (module foo.ko, consist of bar.o, baz.o):
144 make -C $KDIR M=`pwd` bar.lst 144 make -C $KDIR M=`pwd` bar.lst
145 make -C $KDIR M=`pwd` bar.o 145 make -C $KDIR M=`pwd` bar.o
146 make -C $KDIR M=`pwd` foo.ko 146 make -C $KDIR M=`pwd` foo.ko
147 make -C $KDIR M=`pwd` / 147 make -C $KDIR M=`pwd` /
148 148
149 149
150=== 3. Example commands 150=== 3. Example commands
151 151
152This example shows the actual commands to be executed when building 152This example shows the actual commands to be executed when building
153an external module for the currently running kernel. 153an external module for the currently running kernel.
154In the example below the distribution is supposed to use the 154In the example below, the distribution is supposed to use the
155facility to locate output files for a kernel compile in a different 155facility to locate output files for a kernel compile in a different
156directory than the kernel source - but the examples will also work 156directory than the kernel source - but the examples will also work
157when the source and the output files are mixed in the same directory. 157when the source and the output files are mixed in the same directory.
@@ -170,14 +170,14 @@ the following commands to build the module:
170 O=/lib/modules/`uname-r`/build \ 170 O=/lib/modules/`uname-r`/build \
171 M=`pwd` 171 M=`pwd`
172 172
173Then to install the module use the following command: 173Then, to install the module use the following command:
174 174
175 make -C /usr/src/`uname -r`/source \ 175 make -C /usr/src/`uname -r`/source \
176 O=/lib/modules/`uname-r`/build \ 176 O=/lib/modules/`uname-r`/build \
177 M=`pwd` \ 177 M=`pwd` \
178 modules_install 178 modules_install
179 179
180If one looks closely you will see that this is the same commands as 180If you look closely you will see that this is the same command as
181listed before - with the directories spelled out. 181listed before - with the directories spelled out.
182 182
183The above are rather long commands, and the following chapter 183The above are rather long commands, and the following chapter
@@ -230,7 +230,7 @@ following files:
230 230
231 endif 231 endif
232 232
233 In example 1 the check for KERNELRELEASE is used to separate 233 In example 1, the check for KERNELRELEASE is used to separate
234 the two parts of the Makefile. kbuild will only see the two 234 the two parts of the Makefile. kbuild will only see the two
235 assignments whereas make will see everything except the two 235 assignments whereas make will see everything except the two
236 kbuild assignments. 236 kbuild assignments.
@@ -255,7 +255,7 @@ following files:
255 echo "X" > 8123_bin_shipped 255 echo "X" > 8123_bin_shipped
256 256
257 257
258 In example 2 we are down to two fairly simple files and for simple 258 In example 2, we are down to two fairly simple files and for simple
259 files as used in this example the split is questionable. But some 259 files as used in this example the split is questionable. But some
260 external modules use Makefiles of several hundred lines and here it 260 external modules use Makefiles of several hundred lines and here it
261 really pays off to separate the kbuild part from the rest. 261 really pays off to separate the kbuild part from the rest.
@@ -282,9 +282,9 @@ following files:
282 282
283 endif 283 endif
284 284
285 The trick here is to include the Kbuild file from Makefile so 285 The trick here is to include the Kbuild file from Makefile, so
286 if an older version of kbuild picks up the Makefile the Kbuild 286 if an older version of kbuild picks up the Makefile, the Kbuild
287 file will be included. 287 file will be included.
288 288
289--- 4.2 Binary blobs included in a module 289--- 4.2 Binary blobs included in a module
290 290
@@ -301,18 +301,19 @@ following files:
301 obj-m := 8123.o 301 obj-m := 8123.o
302 8123-y := 8123_if.o 8123_pci.o 8123_bin.o 302 8123-y := 8123_if.o 8123_pci.o 8123_bin.o
303 303
304 In example 4 there is no distinction between the ordinary .c/.h files 304 In example 4, there is no distinction between the ordinary .c/.h files
305 and the binary file. But kbuild will pick up different rules to create 305 and the binary file. But kbuild will pick up different rules to create
306 the .o file. 306 the .o file.
307 307
308 308
309=== 5. Include files 309=== 5. Include files
310 310
311Include files are a necessity when a .c file uses something from another .c 311Include files are a necessity when a .c file uses something from other .c
312files (not strictly in the sense of .c but if good programming practice is 312files (not strictly in the sense of C, but if good programming practice is
313used). Any module that consist of more than one .c file will have a .h file 313used). Any module that consists of more than one .c file will have a .h file
314for one of the .c files. 314for one of the .c files.
315- If the .h file only describes a module internal interface then the .h file 315
316- If the .h file only describes a module internal interface, then the .h file
316 shall be placed in the same directory as the .c files. 317 shall be placed in the same directory as the .c files.
317- If the .h files describe an interface used by other parts of the kernel 318- If the .h files describe an interface used by other parts of the kernel
318 located in different directories, the .h files shall be located in 319 located in different directories, the .h files shall be located in
@@ -323,11 +324,11 @@ under include/ such as include/scsi. Another exception is arch-specific
323.h files which are located under include/asm-$(ARCH)/*. 324.h files which are located under include/asm-$(ARCH)/*.
324 325
325External modules have a tendency to locate include files in a separate include/ 326External modules have a tendency to locate include files in a separate include/
326directory and therefore needs to deal with this in their kbuild file. 327directory and therefore need to deal with this in their kbuild file.
327 328
328--- 5.1 How to include files from the kernel include dir 329--- 5.1 How to include files from the kernel include dir
329 330
330 When a module needs to include a file from include/linux/ then one 331 When a module needs to include a file from include/linux/, then one
331 just uses: 332 just uses:
332 333
333 #include <linux/modules.h> 334 #include <linux/modules.h>
@@ -348,7 +349,7 @@ directory and therefore needs to deal with this in their kbuild file.
348 The trick here is to use either EXTRA_CFLAGS (take effect for all .c 349 The trick here is to use either EXTRA_CFLAGS (take effect for all .c
349 files) or CFLAGS_$F.o (take effect only for a single file). 350 files) or CFLAGS_$F.o (take effect only for a single file).
350 351
351 In our example if we move 8123_if.h to a subdirectory named include/ 352 In our example, if we move 8123_if.h to a subdirectory named include/
352 the resulting Kbuild file would look like: 353 the resulting Kbuild file would look like:
353 354
354 --> filename: Kbuild 355 --> filename: Kbuild
@@ -362,19 +363,19 @@ directory and therefore needs to deal with this in their kbuild file.
362 363
363--- 5.3 External modules using several directories 364--- 5.3 External modules using several directories
364 365
365 If an external module does not follow the usual kernel style but 366 If an external module does not follow the usual kernel style, but
366 decide to spread files over several directories then kbuild can 367 decides to spread files over several directories, then kbuild can
367 support this too. 368 handle this too.
368 369
369 Consider the following example: 370 Consider the following example:
370 371
371 | 372 |
372 +- src/complex_main.c 373 +- src/complex_main.c
373 | +- hal/hardwareif.c 374 | +- hal/hardwareif.c
374 | +- hal/include/hardwareif.h 375 | +- hal/include/hardwareif.h
375 +- include/complex.h 376 +- include/complex.h
376 377
377 To build a single module named complex.ko we then need the following 378 To build a single module named complex.ko, we then need the following
378 kbuild file: 379 kbuild file:
379 380
380 Kbuild: 381 Kbuild:
@@ -387,12 +388,12 @@ directory and therefore needs to deal with this in their kbuild file.
387 388
388 389
389 kbuild knows how to handle .o files located in another directory - 390 kbuild knows how to handle .o files located in another directory -
390 although this is NOT reccommended practice. The syntax is to specify 391 although this is NOT recommended practice. The syntax is to specify
391 the directory relative to the directory where the Kbuild file is 392 the directory relative to the directory where the Kbuild file is
392 located. 393 located.
393 394
394 To find the .h files we have to explicitly tell kbuild where to look 395 To find the .h files, we have to explicitly tell kbuild where to look
395 for the .h files. When kbuild executes current directory is always 396 for the .h files. When kbuild executes, the current directory is always
396 the root of the kernel tree (argument to -C) and therefore we have to 397 the root of the kernel tree (argument to -C) and therefore we have to
397 tell kbuild how to find the .h files using absolute paths. 398 tell kbuild how to find the .h files using absolute paths.
398 $(src) will specify the absolute path to the directory where the 399 $(src) will specify the absolute path to the directory where the
@@ -412,7 +413,7 @@ External modules are installed in the directory:
412 413
413--- 6.1 INSTALL_MOD_PATH 414--- 6.1 INSTALL_MOD_PATH
414 415
415 Above are the default directories, but as always some level of 416 Above are the default directories, but as always, some level of
416 customization is possible. One can prefix the path using the variable 417 customization is possible. One can prefix the path using the variable
417 INSTALL_MOD_PATH: 418 INSTALL_MOD_PATH:
418 419
@@ -420,17 +421,17 @@ External modules are installed in the directory:
420 => Install dir: /frodo/lib/modules/$(KERNELRELEASE)/kernel 421 => Install dir: /frodo/lib/modules/$(KERNELRELEASE)/kernel
421 422
422 INSTALL_MOD_PATH may be set as an ordinary shell variable or as in the 423 INSTALL_MOD_PATH may be set as an ordinary shell variable or as in the
423 example above be specified on the command line when calling make. 424 example above, can be specified on the command line when calling make.
424 INSTALL_MOD_PATH has effect both when installing modules included in 425 INSTALL_MOD_PATH has effect both when installing modules included in
425 the kernel as well as when installing external modules. 426 the kernel as well as when installing external modules.
426 427
427--- 6.2 INSTALL_MOD_DIR 428--- 6.2 INSTALL_MOD_DIR
428 429
429 When installing external modules they are default installed in a 430 When installing external modules they are by default installed to a
430 directory under /lib/modules/$(KERNELRELEASE)/extra, but one may wish 431 directory under /lib/modules/$(KERNELRELEASE)/extra, but one may wish
431 to locate modules for a specific functionality in a separate 432 to locate modules for a specific functionality in a separate
432 directory. For this purpose one can use INSTALL_MOD_DIR to specify an 433 directory. For this purpose, one can use INSTALL_MOD_DIR to specify an
433 alternative name than 'extra'. 434 alternative name to 'extra'.
434 435
435 $ make INSTALL_MOD_DIR=gandalf -C KERNELDIR \ 436 $ make INSTALL_MOD_DIR=gandalf -C KERNELDIR \
436 M=`pwd` modules_install 437 M=`pwd` modules_install
@@ -444,16 +445,16 @@ Module versioning is enabled by the CONFIG_MODVERSIONS tag.
444Module versioning is used as a simple ABI consistency check. The Module 445Module versioning is used as a simple ABI consistency check. The Module
445versioning creates a CRC value of the full prototype for an exported symbol and 446versioning creates a CRC value of the full prototype for an exported symbol and
446when a module is loaded/used then the CRC values contained in the kernel are 447when a module is loaded/used then the CRC values contained in the kernel are
447compared with similar values in the module. If they are not equal then the 448compared with similar values in the module. If they are not equal, then the
448kernel refuses to load the module. 449kernel refuses to load the module.
449 450
450Module.symvers contains a list of all exported symbols from a kernel build. 451Module.symvers contains a list of all exported symbols from a kernel build.
451 452
452--- 7.1 Symbols fron the kernel (vmlinux + modules) 453--- 7.1 Symbols fron the kernel (vmlinux + modules)
453 454
454 During a kernel build a file named Module.symvers will be generated. 455 During a kernel build, a file named Module.symvers will be generated.
455 Module.symvers contains all exported symbols from the kernel and 456 Module.symvers contains all exported symbols from the kernel and
456 compiled modules. For each symbols the corresponding CRC value 457 compiled modules. For each symbols, the corresponding CRC value
457 is stored too. 458 is stored too.
458 459
459 The syntax of the Module.symvers file is: 460 The syntax of the Module.symvers file is:
@@ -461,27 +462,27 @@ Module.symvers contains a list of all exported symbols from a kernel build.
461 Sample: 462 Sample:
462 0x2d036834 scsi_remove_host drivers/scsi/scsi_mod 463 0x2d036834 scsi_remove_host drivers/scsi/scsi_mod
463 464
464 For a kernel build without CONFIG_MODVERSIONING enabled the crc 465 For a kernel build without CONFIG_MODVERSIONS enabled, the crc
465 would read: 0x00000000 466 would read: 0x00000000
466 467
467 Module.symvers serve two purposes. 468 Module.symvers serves two purposes:
468 1) It list all exported symbols both from vmlinux and all modules 469 1) It lists all exported symbols both from vmlinux and all modules
469 2) It list CRC if CONFIG_MODVERSION is enabled 470 2) It lists the CRC if CONFIG_MODVERSIONS is enabled
470 471
471--- 7.2 Symbols and external modules 472--- 7.2 Symbols and external modules
472 473
473 When building an external module the build system needs access to 474 When building an external module, the build system needs access to
474 the symbols from the kernel to check if all external symbols are 475 the symbols from the kernel to check if all external symbols are
475 defined. This is done in the MODPOST step and to obtain all 476 defined. This is done in the MODPOST step and to obtain all
476 symbols modpost reads Module.symvers from the kernel. 477 symbols, modpost reads Module.symvers from the kernel.
477 If a Module.symvers file is present in the directory where 478 If a Module.symvers file is present in the directory where
478 the external module is being build this file will be read too. 479 the external module is being built, this file will be read too.
479 During the MODPOST step a new Module.symvers file will be written 480 During the MODPOST step, a new Module.symvers file will be written
480 containing all exported symbols that was not defined in the kernel. 481 containing all exported symbols that were not defined in the kernel.
481 482
482--- 7.3 Symbols from another external module 483--- 7.3 Symbols from another external module
483 484
484 Sometimes one external module uses exported symbols from another 485 Sometimes, an external module uses exported symbols from another
485 external module. Kbuild needs to have full knowledge on all symbols 486 external module. Kbuild needs to have full knowledge on all symbols
486 to avoid spitting out warnings about undefined symbols. 487 to avoid spitting out warnings about undefined symbols.
487 Two solutions exist to let kbuild know all symbols of more than 488 Two solutions exist to let kbuild know all symbols of more than
@@ -490,15 +491,15 @@ Module.symvers contains a list of all exported symbols from a kernel build.
490 impractical in certain situations. 491 impractical in certain situations.
491 492
492 Use a top-level Kbuild file 493 Use a top-level Kbuild file
493 If you have two modules: 'foo', 'bar' and 'foo' needs symbols 494 If you have two modules: 'foo' and 'bar', and 'foo' needs
494 from 'bar' then one can use a common top-level kbuild file so 495 symbols from 'bar', then one can use a common top-level kbuild
495 both modules are compiled in same build. 496 file so both modules are compiled in same build.
496 497
497 Consider following directory layout: 498 Consider following directory layout:
498 ./foo/ <= contains the foo module 499 ./foo/ <= contains the foo module
499 ./bar/ <= contains the bar module 500 ./bar/ <= contains the bar module
500 The top-level Kbuild file would then look like: 501 The top-level Kbuild file would then look like:
501 502
502 #./Kbuild: (this file may also be named Makefile) 503 #./Kbuild: (this file may also be named Makefile)
503 obj-y := foo/ bar/ 504 obj-y := foo/ bar/
504 505
@@ -509,23 +510,23 @@ Module.symvers contains a list of all exported symbols from a kernel build.
509 knowledge on symbols from both modules. 510 knowledge on symbols from both modules.
510 511
511 Use an extra Module.symvers file 512 Use an extra Module.symvers file
512 When an external module is build a Module.symvers file is 513 When an external module is built, a Module.symvers file is
513 generated containing all exported symbols which are not 514 generated containing all exported symbols which are not
514 defined in the kernel. 515 defined in the kernel.
515 To get access to symbols from module 'bar' one can copy the 516 To get access to symbols from module 'bar', one can copy the
516 Module.symvers file from the compilation of the 'bar' module 517 Module.symvers file from the compilation of the 'bar' module
517 to the directory where the 'foo' module is build. 518 to the directory where the 'foo' module is built.
518 During the module build kbuild will read the Module.symvers 519 During the module build, kbuild will read the Module.symvers
519 file in the directory of the external module and when the 520 file in the directory of the external module and when the
520 build is finished a new Module.symvers file is created 521 build is finished, a new Module.symvers file is created
521 containing the sum of all symbols defined and not part of the 522 containing the sum of all symbols defined and not part of the
522 kernel. 523 kernel.
523 524
524=== 8. Tips & Tricks 525=== 8. Tips & Tricks
525 526
526--- 8.1 Testing for CONFIG_FOO_BAR 527--- 8.1 Testing for CONFIG_FOO_BAR
527 528
528 Modules often needs to check for certain CONFIG_ options to decide if 529 Modules often need to check for certain CONFIG_ options to decide if
529 a specific feature shall be included in the module. When kbuild is used 530 a specific feature shall be included in the module. When kbuild is used
530 this is done by referencing the CONFIG_ variable directly. 531 this is done by referencing the CONFIG_ variable directly.
531 532
@@ -537,7 +538,7 @@ Module.symvers contains a list of all exported symbols from a kernel build.
537 538
538 External modules have traditionally used grep to check for specific 539 External modules have traditionally used grep to check for specific
539 CONFIG_ settings directly in .config. This usage is broken. 540 CONFIG_ settings directly in .config. This usage is broken.
540 As introduced before external modules shall use kbuild when building 541 As introduced before, external modules shall use kbuild when building
541 and therefore can use the same methods as in-kernel modules when testing 542 and therefore can use the same methods as in-kernel modules when
542 for CONFIG_ definitions. 543 testing for CONFIG_ definitions.
543 544
diff --git a/Documentation/sparse.txt b/Documentation/sparse.txt
index 5a311c38dd1a..f9c99c9a54f9 100644
--- a/Documentation/sparse.txt
+++ b/Documentation/sparse.txt
@@ -69,10 +69,10 @@ recompiled, or use "make C=2" to run sparse on the files whether they need to
69be recompiled or not. The latter is a fast way to check the whole tree if you 69be recompiled or not. The latter is a fast way to check the whole tree if you
70have already built it. 70have already built it.
71 71
72The optional make variable CF can be used to pass arguments to sparse. The 72The optional make variable CHECKFLAGS can be used to pass arguments to sparse.
73build system passes -Wbitwise to sparse automatically. To perform endianness 73The build system passes -Wbitwise to sparse automatically. To perform
74checks, you may define __CHECK_ENDIAN__: 74endianness checks, you may define __CHECK_ENDIAN__:
75 75
76 make C=2 CF="-D__CHECK_ENDIAN__" 76 make C=2 CHECKFLAGS="-D__CHECK_ENDIAN__"
77 77
78These checks are disabled by default as they generate a host of warnings. 78These checks are disabled by default as they generate a host of warnings.
diff --git a/Kbuild b/Kbuild
index 2d4f95e4b89f..0451f69353ba 100644
--- a/Kbuild
+++ b/Kbuild
@@ -28,7 +28,7 @@ define cmd_offsets
28 echo "/*"; \ 28 echo "/*"; \
29 echo " * DO NOT MODIFY."; \ 29 echo " * DO NOT MODIFY."; \
30 echo " *"; \ 30 echo " *"; \
31 echo " * This file was generated by $(srctree)/Kbuild"; \ 31 echo " * This file was generated by Kbuild"; \
32 echo " *"; \ 32 echo " *"; \
33 echo " */"; \ 33 echo " */"; \
34 echo ""; \ 34 echo ""; \
diff --git a/Makefile b/Makefile
index edfc2fdf76c9..fce530a66e33 100644
--- a/Makefile
+++ b/Makefile
@@ -41,9 +41,15 @@ ifndef KBUILD_VERBOSE
41 KBUILD_VERBOSE = 0 41 KBUILD_VERBOSE = 0
42endif 42endif
43 43
44# Call checker as part of compilation of C files 44# Call a source code checker (by default, "sparse") as part of the
45# Use 'make C=1' to enable checking (sparse, by default) 45# C compilation.
46# Override with 'make C=1 CHECK=checker_executable CHECKFLAGS=....' 46#
47# Use 'make C=1' to enable checking of only re-compiled files.
48# Use 'make C=2' to enable checking of *all* source files, regardless
49# of whether they are re-compiled or not.
50#
51# See the file "Documentation/sparse.txt" for more details, including
52# where to get the "sparse" utility.
47 53
48ifdef C 54ifdef C
49 ifeq ("$(origin C)", "command line") 55 ifeq ("$(origin C)", "command line")
@@ -639,12 +645,12 @@ define rule_vmlinux__
639 $(call cmd,vmlinux__) 645 $(call cmd,vmlinux__)
640 $(Q)echo 'cmd_$@ := $(cmd_vmlinux__)' > $(@D)/.$(@F).cmd 646 $(Q)echo 'cmd_$@ := $(cmd_vmlinux__)' > $(@D)/.$(@F).cmd
641 647
642 $(Q)$(if $($(quiet)cmd_sysmap), \ 648 $(Q)$(if $($(quiet)cmd_sysmap), \
643 echo ' $($(quiet)cmd_sysmap) System.map' &&) \ 649 echo ' $($(quiet)cmd_sysmap) System.map' &&) \
644 $(cmd_sysmap) $@ System.map; \ 650 $(cmd_sysmap) $@ System.map; \
645 if [ $$? -ne 0 ]; then \ 651 if [ $$? -ne 0 ]; then \
646 rm -f $@; \ 652 rm -f $@; \
647 /bin/false; \ 653 /bin/false; \
648 fi; 654 fi;
649 $(verify_kallsyms) 655 $(verify_kallsyms)
650endef 656endef
@@ -677,12 +683,12 @@ endif
677kallsyms.o := .tmp_kallsyms$(last_kallsyms).o 683kallsyms.o := .tmp_kallsyms$(last_kallsyms).o
678 684
679define verify_kallsyms 685define verify_kallsyms
680 $(Q)$(if $($(quiet)cmd_sysmap), \ 686 $(Q)$(if $($(quiet)cmd_sysmap), \
681 echo ' $($(quiet)cmd_sysmap) .tmp_System.map' &&) \ 687 echo ' $($(quiet)cmd_sysmap) .tmp_System.map' &&) \
682 $(cmd_sysmap) .tmp_vmlinux$(last_kallsyms) .tmp_System.map 688 $(cmd_sysmap) .tmp_vmlinux$(last_kallsyms) .tmp_System.map
683 $(Q)cmp -s System.map .tmp_System.map || \ 689 $(Q)cmp -s System.map .tmp_System.map || \
684 (echo Inconsistent kallsyms data; \ 690 (echo Inconsistent kallsyms data; \
685 echo Try setting CONFIG_KALLSYMS_EXTRA_PASS; \ 691 echo Try setting CONFIG_KALLSYMS_EXTRA_PASS; \
686 rm .tmp_kallsyms* ; /bin/false ) 692 rm .tmp_kallsyms* ; /bin/false )
687endef 693endef
688 694
@@ -736,6 +742,7 @@ endif # ifdef CONFIG_KALLSYMS
736# vmlinux image - including updated kernel symbols 742# vmlinux image - including updated kernel symbols
737vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE 743vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE
738 $(call if_changed_rule,vmlinux__) 744 $(call if_changed_rule,vmlinux__)
745 $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost $@
739 $(Q)rm -f .old_version 746 $(Q)rm -f .old_version
740 747
741# The actual objects are generated when descending, 748# The actual objects are generated when descending,
@@ -753,12 +760,34 @@ $(vmlinux-dirs): prepare scripts
753 $(Q)$(MAKE) $(build)=$@ 760 $(Q)$(MAKE) $(build)=$@
754 761
755# Build the kernel release string 762# Build the kernel release string
756# The KERNELRELEASE is stored in a file named include/config/kernel.release
757# to be used when executing for example make install or make modules_install
758# 763#
759# Take the contents of any files called localversion* and the config 764# The KERNELRELEASE value built here is stored in the file
760# variable CONFIG_LOCALVERSION and append them to KERNELRELEASE. 765# include/config/kernel.release, and is used when executing several
761# LOCALVERSION from the command line override all of this 766# make targets, such as "make install" or "make modules_install."
767#
768# The eventual kernel release string consists of the following fields,
769# shown in a hierarchical format to show how smaller parts are concatenated
770# to form the larger and final value, with values coming from places like
771# the Makefile, kernel config options, make command line options and/or
772# SCM tag information.
773#
774# $(KERNELVERSION)
775# $(VERSION) eg, 2
776# $(PATCHLEVEL) eg, 6
777# $(SUBLEVEL) eg, 18
778# $(EXTRAVERSION) eg, -rc6
779# $(localver-full)
780# $(localver)
781# localversion* (all localversion* files)
782# $(CONFIG_LOCALVERSION) (from kernel config setting)
783# $(localver-auto) (only if CONFIG_LOCALVERSION_AUTO is set)
784# ./scripts/setlocalversion (SCM tag, if one exists)
785# $(LOCALVERSION) (from make command line if provided)
786#
787# Note how the final $(localver-auto) string is included *only* if the
788# kernel config option CONFIG_LOCALVERSION_AUTO is selected. Also, at the
789# moment, only git is supported but other SCMs can edit the script
790# scripts/setlocalversion and add the appropriate checks as needed.
762 791
763nullstring := 792nullstring :=
764space := $(nullstring) # end of line 793space := $(nullstring) # end of line
@@ -893,14 +922,14 @@ INSTALL_HDR_PATH=$(objtree)/usr
893export INSTALL_HDR_PATH 922export INSTALL_HDR_PATH
894 923
895PHONY += headers_install 924PHONY += headers_install
896headers_install: include/linux/version.h 925headers_install: include/linux/version.h scripts_basic FORCE
897 $(Q)unifdef -Ux /dev/null 926 $(Q)$(MAKE) $(build)=scripts scripts/unifdef
898 $(Q)rm -rf $(INSTALL_HDR_PATH)/include 927 $(Q)rm -rf $(INSTALL_HDR_PATH)/include
899 $(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.headersinst obj=include 928 $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.headersinst obj=include
900 929
901PHONY += headers_check 930PHONY += headers_check
902headers_check: headers_install 931headers_check: headers_install
903 $(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.headersinst obj=include HDRCHECK=1 932 $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.headersinst obj=include HDRCHECK=1
904 933
905# --------------------------------------------------------------------------- 934# ---------------------------------------------------------------------------
906# Modules 935# Modules
@@ -916,7 +945,7 @@ all: modules
916PHONY += modules 945PHONY += modules
917modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux) 946modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux)
918 @echo ' Building modules, stage 2.'; 947 @echo ' Building modules, stage 2.';
919 $(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modpost 948 $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
920 949
921 950
922# Target to prepare building external modules 951# Target to prepare building external modules
@@ -942,7 +971,7 @@ _modinst_:
942 rm -f $(MODLIB)/build ; \ 971 rm -f $(MODLIB)/build ; \
943 ln -s $(objtree) $(MODLIB)/build ; \ 972 ln -s $(objtree) $(MODLIB)/build ; \
944 fi 973 fi
945 $(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modinst 974 $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modinst
946 975
947# If System.map exists, run depmod. This deliberately does not have a 976# If System.map exists, run depmod. This deliberately does not have a
948# dependency on System.map since that would run the dependency tree on 977# dependency on System.map since that would run the dependency tree on
@@ -1057,8 +1086,10 @@ boards := $(notdir $(boards))
1057 1086
1058help: 1087help:
1059 @echo 'Cleaning targets:' 1088 @echo 'Cleaning targets:'
1060 @echo ' clean - remove most generated files but keep the config' 1089 @echo ' clean - remove most generated files but keep the config and'
1090 @echo ' enough build support to build external modules'
1061 @echo ' mrproper - remove all generated files + config + various backup files' 1091 @echo ' mrproper - remove all generated files + config + various backup files'
1092 @echo ' distclean - mrproper + remove editor backup and patch files'
1062 @echo '' 1093 @echo ''
1063 @echo 'Configuration targets:' 1094 @echo 'Configuration targets:'
1064 @$(MAKE) -f $(srctree)/scripts/kconfig/Makefile help 1095 @$(MAKE) -f $(srctree)/scripts/kconfig/Makefile help
@@ -1100,6 +1131,7 @@ help:
1100 echo '') 1131 echo '')
1101 1132
1102 @echo ' make V=0|1 [targets] 0 => quiet build (default), 1 => verbose build' 1133 @echo ' make V=0|1 [targets] 0 => quiet build (default), 1 => verbose build'
1134 @echo ' make V=2 [targets] 2 => give reason for rebuild of target'
1103 @echo ' make O=dir [targets] Locate all output files in "dir", including .config' 1135 @echo ' make O=dir [targets] Locate all output files in "dir", including .config'
1104 @echo ' make C=1 [targets] Check all c source with $$CHECK (sparse by default)' 1136 @echo ' make C=1 [targets] Check all c source with $$CHECK (sparse by default)'
1105 @echo ' make C=2 [targets] Force check of all c source with $$CHECK' 1137 @echo ' make C=2 [targets] Force check of all c source with $$CHECK'
@@ -1154,7 +1186,7 @@ $(module-dirs): crmodverdir $(objtree)/Module.symvers
1154 1186
1155modules: $(module-dirs) 1187modules: $(module-dirs)
1156 @echo ' Building modules, stage 2.'; 1188 @echo ' Building modules, stage 2.';
1157 $(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modpost 1189 $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
1158 1190
1159PHONY += modules_install 1191PHONY += modules_install
1160modules_install: _emodinst_ _emodinst_post 1192modules_install: _emodinst_ _emodinst_post
@@ -1163,7 +1195,7 @@ install-dir := $(if $(INSTALL_MOD_DIR),$(INSTALL_MOD_DIR),extra)
1163PHONY += _emodinst_ 1195PHONY += _emodinst_
1164_emodinst_: 1196_emodinst_:
1165 $(Q)mkdir -p $(MODLIB)/$(install-dir) 1197 $(Q)mkdir -p $(MODLIB)/$(install-dir)
1166 $(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modinst 1198 $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modinst
1167 1199
1168# Run depmod only is we have System.map and depmod is executable 1200# Run depmod only is we have System.map and depmod is executable
1169quiet_cmd_depmod = DEPMOD $(KERNELRELEASE) 1201quiet_cmd_depmod = DEPMOD $(KERNELRELEASE)
@@ -1264,6 +1296,31 @@ define all-defconfigs
1264 $(call find-sources,'defconfig') 1296 $(call find-sources,'defconfig')
1265endef 1297endef
1266 1298
1299define xtags
1300 if $1 --version 2>&1 | grep -iq exuberant; then \
1301 $(all-sources) | xargs $1 -a \
1302 -I __initdata,__exitdata,__acquires,__releases \
1303 -I EXPORT_SYMBOL,EXPORT_SYMBOL_GPL \
1304 --extra=+f --c-kinds=+px; \
1305 $(all-kconfigs) | xargs $1 -a \
1306 --langdef=kconfig \
1307 --language-force=kconfig \
1308 --regex-kconfig='/^[[:blank:]]*config[[:blank:]]+([[:alnum:]_]+)/\1/'; \
1309 $(all-defconfigs) | xargs $1 -a \
1310 --langdef=dotconfig \
1311 --language-force=dotconfig \
1312 --regex-dotconfig='/^#?[[:blank:]]*(CONFIG_[[:alnum:]_]+)/\1/'; \
1313 elif $1 --version 2>&1 | grep -iq emacs; then \
1314 $(all-sources) | xargs $1 -a; \
1315 $(all-kconfigs) | xargs $1 -a \
1316 --regex='/^[ \t]*config[ \t]+\([a-zA-Z0-9_]+\)/\1/'; \
1317 $(all-defconfigs) | xargs $1 -a \
1318 --regex='/^#?[ \t]?\(CONFIG_[a-zA-Z0-9_]+\)/\1/'; \
1319 else \
1320 $(all-sources) | xargs $1 -a; \
1321 fi
1322endef
1323
1267quiet_cmd_cscope-file = FILELST cscope.files 1324quiet_cmd_cscope-file = FILELST cscope.files
1268 cmd_cscope-file = (echo \-k; echo \-q; $(all-sources)) > cscope.files 1325 cmd_cscope-file = (echo \-k; echo \-q; $(all-sources)) > cscope.files
1269 1326
@@ -1277,31 +1334,16 @@ cscope: FORCE
1277quiet_cmd_TAGS = MAKE $@ 1334quiet_cmd_TAGS = MAKE $@
1278define cmd_TAGS 1335define cmd_TAGS
1279 rm -f $@; \ 1336 rm -f $@; \
1280 ETAGSF=`etags --version | grep -i exuberant >/dev/null && \ 1337 $(call xtags,etags)
1281 echo "-I __initdata,__exitdata,__acquires,__releases \
1282 -I EXPORT_SYMBOL,EXPORT_SYMBOL_GPL \
1283 --extra=+f --c-kinds=+px"`; \
1284 $(all-sources) | xargs etags $$ETAGSF -a; \
1285 if test "x$$ETAGSF" = x; then \
1286 $(all-kconfigs) | xargs etags -a \
1287 --regex='/^config[ \t]+\([a-zA-Z0-9_]+\)/\1/'; \
1288 $(all-defconfigs) | xargs etags -a \
1289 --regex='/^#?[ \t]?\(CONFIG_[a-zA-Z0-9_]+\)/\1/'; \
1290 fi
1291endef 1338endef
1292 1339
1293TAGS: FORCE 1340TAGS: FORCE
1294 $(call cmd,TAGS) 1341 $(call cmd,TAGS)
1295 1342
1296
1297quiet_cmd_tags = MAKE $@ 1343quiet_cmd_tags = MAKE $@
1298define cmd_tags 1344define cmd_tags
1299 rm -f $@; \ 1345 rm -f $@; \
1300 CTAGSF=`ctags --version | grep -i exuberant >/dev/null && \ 1346 $(call xtags,ctags)
1301 echo "-I __initdata,__exitdata,__acquires,__releases \
1302 -I EXPORT_SYMBOL,EXPORT_SYMBOL_GPL \
1303 --extra=+f --c-kinds=+px"`; \
1304 $(all-sources) | xargs ctags $$CTAGSF -a
1305endef 1347endef
1306 1348
1307tags: FORCE 1349tags: FORCE
@@ -1379,7 +1421,7 @@ endif
1379%.ko: prepare scripts FORCE 1421%.ko: prepare scripts FORCE
1380 $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \ 1422 $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \
1381 $(build)=$(build-dir) $(@:.ko=.o) 1423 $(build)=$(build-dir) $(@:.ko=.o)
1382 $(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modpost 1424 $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
1383 1425
1384# FIXME Should go into a make.lib or something 1426# FIXME Should go into a make.lib or something
1385# =========================================================================== 1427# ===========================================================================
diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include
index bb19c1561f1e..3d523899fdc0 100644
--- a/scripts/Kbuild.include
+++ b/scripts/Kbuild.include
@@ -8,9 +8,13 @@ empty :=
8space := $(empty) $(empty) 8space := $(empty) $(empty)
9 9
10### 10###
11# Name of target with a '.' as filename prefix. foo/bar.o => foo/.bar.o
12dot-target = $(dir $@).$(notdir $@)
13
14###
11# The temporary file to save gcc -MD generated dependencies must not 15# The temporary file to save gcc -MD generated dependencies must not
12# contain a comma 16# contain a comma
13depfile = $(subst $(comma),_,$(@D)/.$(@F).d) 17depfile = $(subst $(comma),_,$(dot-target).d)
14 18
15### 19###
16# filename of target with directory and extension stripped 20# filename of target with directory and extension stripped
@@ -119,40 +123,83 @@ objectify = $(foreach o,$(1),$(if $(filter /%,$(o)),$(o),$(obj)/$(o)))
119ifneq ($(KBUILD_NOCMDDEP),1) 123ifneq ($(KBUILD_NOCMDDEP),1)
120# Check if both arguments has same arguments. Result in empty string if equal 124# Check if both arguments has same arguments. Result in empty string if equal
121# User may override this check using make KBUILD_NOCMDDEP=1 125# User may override this check using make KBUILD_NOCMDDEP=1
122arg-check = $(strip $(filter-out $(1), $(2)) $(filter-out $(2), $(1)) ) 126arg-check = $(strip $(filter-out $(cmd_$(1)), $(cmd_$@)) \
127 $(filter-out $(cmd_$@), $(cmd_$(1))) )
123endif 128endif
124 129
125# echo command. Short version is $(quiet) equals quiet, otherwise full command 130# echo command. Short version is $(quiet) equals quiet, otherwise full command
126echo-cmd = $(if $($(quiet)cmd_$(1)), \ 131echo-cmd = $(if $($(quiet)cmd_$(1)), \
127 echo ' $(call escsq,$($(quiet)cmd_$(1)))';) 132 echo ' $(call escsq,$($(quiet)cmd_$(1)))$(echo-why)';)
128 133
134# >'< substitution is for echo to work,
135# >$< substitution to preserve $ when reloading .cmd file
136# note: when using inline perl scripts [perl -e '...$$t=1;...']
137# in $(cmd_xxx) double $$ your perl vars
129make-cmd = $(subst \#,\\\#,$(subst $$,$$$$,$(call escsq,$(cmd_$(1))))) 138make-cmd = $(subst \#,\\\#,$(subst $$,$$$$,$(call escsq,$(cmd_$(1)))))
130 139
131# function to only execute the passed command if necessary 140# Find any prerequisites that is newer than target or that does not exist.
132# >'< substitution is for echo to work, >$< substitution to preserve $ when reloading .cmd file 141# PHONY targets skipped in both cases.
133# note: when using inline perl scripts [perl -e '...$$t=1;...'] in $(cmd_xxx) double $$ your perl vars 142any-prereq = $(filter-out $(PHONY),$?) $(filter-out $(PHONY) $(wildcard $^),$^)
143
144# Execute command if command has changed or prerequisitei(s) are updated
134# 145#
135if_changed = $(if $(strip $(filter-out $(PHONY),$?) \ 146if_changed = $(if $(strip $(any-prereq) $(arg-check)), \
136 $(call arg-check, $(cmd_$(1)), $(cmd_$@)) ), \ 147 @set -e; \
137 @set -e; \ 148 $(echo-cmd) $(cmd_$(1)); \
138 $(echo-cmd) $(cmd_$(1)); \ 149 echo 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd)
139 echo 'cmd_$@ := $(make-cmd)' > $(@D)/.$(@F).cmd)
140 150
141# execute the command and also postprocess generated .d dependencies 151# execute the command and also postprocess generated .d dependencies
142# file 152# file
143if_changed_dep = $(if $(strip $(filter-out $(PHONY),$?) \ 153if_changed_dep = $(if $(strip $(any-prereq) $(arg-check) ), \
144 $(filter-out FORCE $(wildcard $^),$^) \ 154 @set -e; \
145 $(call arg-check, $(cmd_$(1)), $(cmd_$@)) ), \ 155 $(echo-cmd) $(cmd_$(1)); \
146 @set -e; \ 156 scripts/basic/fixdep $(depfile) $@ '$(make-cmd)' > $(dot-target).tmp;\
147 $(echo-cmd) $(cmd_$(1)); \ 157 rm -f $(depfile); \
148 scripts/basic/fixdep $(depfile) $@ '$(make-cmd)' > $(@D)/.$(@F).tmp; \ 158 mv -f $(dot-target).tmp $(dot-target).cmd)
149 rm -f $(depfile); \
150 mv -f $(@D)/.$(@F).tmp $(@D)/.$(@F).cmd)
151 159
152# Usage: $(call if_changed_rule,foo) 160# Usage: $(call if_changed_rule,foo)
153# will check if $(cmd_foo) changed, or any of the prequisites changed, 161# will check if $(cmd_foo) changed, or any of the prequisites changed,
154# and if so will execute $(rule_foo) 162# and if so will execute $(rule_foo)
155if_changed_rule = $(if $(strip $(filter-out $(PHONY),$?) \ 163if_changed_rule = $(if $(strip $(any-prereq) $(arg-check) ), \
156 $(call arg-check, $(cmd_$(1)), $(cmd_$@)) ),\ 164 @set -e; \
157 @set -e; \ 165 $(rule_$(1)))
158 $(rule_$(1))) 166
167###
168# why - tell why a a target got build
169# enabled by make V=2
170# Output (listed in the order they are checked):
171# (1) - due to target is PHONY
172# (2) - due to target missing
173# (3) - due to: file1.h file2.h
174# (4) - due to command line change
175# (5) - due to missing .cmd file
176# (6) - due to target not in $(targets)
177# (1) PHONY targets are always build
178# (2) No target, so we better build it
179# (3) Prerequisite is newer than target
180# (4) The command line stored in the file named dir/.target.cmd
181# differed from actual command line. This happens when compiler
182# options changes
183# (5) No dir/.target.cmd file (used to store command line)
184# (6) No dir/.target.cmd file and target not listed in $(targets)
185# This is a good hint that there is a bug in the kbuild file
186ifeq ($(KBUILD_VERBOSE),2)
187why = \
188 $(if $(filter $@, $(PHONY)),- due to target is PHONY, \
189 $(if $(wildcard $@), \
190 $(if $(strip $(any-prereq)),- due to: $(any-prereq), \
191 $(if $(arg-check), \
192 $(if $(cmd_$@),- due to command line change, \
193 $(if $(filter $@, $(targets)), \
194 - due to missing .cmd file, \
195 - due to $(notdir $@) not in $$(targets) \
196 ) \
197 ) \
198 ) \
199 ), \
200 - due to target missing \
201 ) \
202 )
203
204echo-why = $(call escsq, $(strip $(why)))
205endif
diff --git a/scripts/Makefile b/scripts/Makefile
index 6f6b48f39f0a..ea41de8fb7f5 100644
--- a/scripts/Makefile
+++ b/scripts/Makefile
@@ -15,8 +15,11 @@ hostprogs-$(CONFIG_IKCONFIG) += bin2c
15 15
16always := $(hostprogs-y) 16always := $(hostprogs-y)
17 17
18# The following hostprogs-y programs are only build on demand
19hostprogs-y += unifdef
20
18subdir-$(CONFIG_MODVERSIONS) += genksyms 21subdir-$(CONFIG_MODVERSIONS) += genksyms
19subdir-$(CONFIG_MODULES) += mod 22subdir-y += mod
20 23
21# Let clean descend into subdirs 24# Let clean descend into subdirs
22subdir- += basic kconfig package 25subdir- += basic kconfig package
diff --git a/scripts/Makefile.build b/scripts/Makefile.build
index 3cb445cc7432..e2ad2dccccdb 100644
--- a/scripts/Makefile.build
+++ b/scripts/Makefile.build
@@ -191,9 +191,10 @@ define rule_cc_o_c
191 $(call echo-cmd,checksrc) $(cmd_checksrc) \ 191 $(call echo-cmd,checksrc) $(cmd_checksrc) \
192 $(call echo-cmd,cc_o_c) $(cmd_cc_o_c); \ 192 $(call echo-cmd,cc_o_c) $(cmd_cc_o_c); \
193 $(cmd_modversions) \ 193 $(cmd_modversions) \
194 scripts/basic/fixdep $(depfile) $@ '$(call make-cmd,cc_o_c)' > $(@D)/.$(@F).tmp; \ 194 scripts/basic/fixdep $(depfile) $@ '$(call make-cmd,cc_o_c)' > \
195 $(dot-target).tmp; \
195 rm -f $(depfile); \ 196 rm -f $(depfile); \
196 mv -f $(@D)/.$(@F).tmp $(@D)/.$(@F).cmd 197 mv -f $(dot-target).tmp $(dot-target).cmd
197endef 198endef
198 199
199# Built-in and composite module parts 200# Built-in and composite module parts
diff --git a/scripts/Makefile.headersinst b/scripts/Makefile.headersinst
index 12e1daf875c8..8c02d2df4278 100644
--- a/scripts/Makefile.headersinst
+++ b/scripts/Makefile.headersinst
@@ -7,7 +7,7 @@
7# 7#
8# ========================================================================== 8# ==========================================================================
9 9
10UNIFDEF := unifdef -U__KERNEL__ 10UNIFDEF := scripts/unifdef -U__KERNEL__
11 11
12# Eliminate the contents of (and inclusions of) compiler.h 12# Eliminate the contents of (and inclusions of) compiler.h
13HDRSED := sed -e "s/ inline / __inline__ /g" \ 13HDRSED := sed -e "s/ inline / __inline__ /g" \
diff --git a/scripts/Makefile.host b/scripts/Makefile.host
index 060f4c563a5c..575afbe5e370 100644
--- a/scripts/Makefile.host
+++ b/scripts/Makefile.host
@@ -32,11 +32,6 @@
32 32
33__hostprogs := $(sort $(hostprogs-y) $(hostprogs-m)) 33__hostprogs := $(sort $(hostprogs-y) $(hostprogs-m))
34 34
35# hostprogs-y := tools/build may have been specified. Retreive directory
36host-objdirs := $(foreach f,$(__hostprogs), $(if $(dir $(f)),$(dir $(f))))
37host-objdirs := $(strip $(sort $(filter-out ./,$(host-objdirs))))
38
39
40# C code 35# C code
41# Executables compiled from a single .c file 36# Executables compiled from a single .c file
42host-csingle := $(foreach m,$(__hostprogs),$(if $($(m)-objs),,$(m))) 37host-csingle := $(foreach m,$(__hostprogs),$(if $($(m)-objs),,$(m)))
@@ -65,6 +60,21 @@ host-cobjs := $(filter-out %.so,$(host-cobjs))
65#Object (.o) files used by the shared libaries 60#Object (.o) files used by the shared libaries
66host-cshobjs := $(sort $(foreach m,$(host-cshlib),$($(m:.so=-objs)))) 61host-cshobjs := $(sort $(foreach m,$(host-cshlib),$($(m:.so=-objs))))
67 62
63# output directory for programs/.o files
64# hostprogs-y := tools/build may have been specified. Retreive directory
65host-objdirs := $(foreach f,$(__hostprogs), $(if $(dir $(f)),$(dir $(f))))
66# directory of .o files from prog-objs notation
67host-objdirs += $(foreach f,$(host-cmulti), \
68 $(foreach m,$($(f)-objs), \
69 $(if $(dir $(m)),$(dir $(m)))))
70# directory of .o files from prog-cxxobjs notation
71host-objdirs += $(foreach f,$(host-cxxmulti), \
72 $(foreach m,$($(f)-cxxobjs), \
73 $(if $(dir $(m)),$(dir $(m)))))
74
75host-objdirs := $(strip $(sort $(filter-out ./,$(host-objdirs))))
76
77
68__hostprogs := $(addprefix $(obj)/,$(__hostprogs)) 78__hostprogs := $(addprefix $(obj)/,$(__hostprogs))
69host-csingle := $(addprefix $(obj)/,$(host-csingle)) 79host-csingle := $(addprefix $(obj)/,$(host-csingle))
70host-cmulti := $(addprefix $(obj)/,$(host-cmulti)) 80host-cmulti := $(addprefix $(obj)/,$(host-cmulti))
diff --git a/scripts/Makefile.modpost b/scripts/Makefile.modpost
index 0a64688c2b5d..4b2721ca97da 100644
--- a/scripts/Makefile.modpost
+++ b/scripts/Makefile.modpost
@@ -51,19 +51,26 @@ _modpost: $(modules)
51 51
52# Step 2), invoke modpost 52# Step 2), invoke modpost
53# Includes step 3,4 53# Includes step 3,4
54quiet_cmd_modpost = MODPOST 54quiet_cmd_modpost = MODPOST $(words $(filter-out vmlinux FORCE, $^)) modules
55 cmd_modpost = scripts/mod/modpost \ 55 cmd_modpost = scripts/mod/modpost \
56 $(if $(CONFIG_MODVERSIONS),-m) \ 56 $(if $(CONFIG_MODVERSIONS),-m) \
57 $(if $(CONFIG_MODULE_SRCVERSION_ALL),-a,) \ 57 $(if $(CONFIG_MODULE_SRCVERSION_ALL),-a,) \
58 $(if $(KBUILD_EXTMOD),-i,-o) $(kernelsymfile) \ 58 $(if $(KBUILD_EXTMOD),-i,-o) $(kernelsymfile) \
59 $(if $(KBUILD_EXTMOD),-I $(modulesymfile)) \ 59 $(if $(KBUILD_EXTMOD),-I $(modulesymfile)) \
60 $(if $(KBUILD_EXTMOD),-o $(modulesymfile)) \ 60 $(if $(KBUILD_EXTMOD),-o $(modulesymfile)) \
61 $(filter-out FORCE,$^) 61 $(if $(KBUILD_EXTMOD),-w) \
62 $(wildcard vmlinux) $(filter-out FORCE,$^)
62 63
63PHONY += __modpost 64PHONY += __modpost
64__modpost: $(wildcard vmlinux) $(modules:.ko=.o) FORCE 65__modpost: $(modules:.ko=.o) FORCE
65 $(call cmd,modpost) 66 $(call cmd,modpost)
66 67
68quiet_cmd_kernel-mod = MODPOST $@
69 cmd_kernel-mod = $(cmd_modpost)
70
71vmlinux: FORCE
72 $(call cmd,kernel-mod)
73
67# Declare generated files as targets for modpost 74# Declare generated files as targets for modpost
68$(symverfile): __modpost ; 75$(symverfile): __modpost ;
69$(modules:.ko=.mod.c): __modpost ; 76$(modules:.ko=.mod.c): __modpost ;
diff --git a/scripts/kconfig/Makefile b/scripts/kconfig/Makefile
index e6499db4c8cc..a90d3cc76bfa 100644
--- a/scripts/kconfig/Makefile
+++ b/scripts/kconfig/Makefile
@@ -74,6 +74,7 @@ help:
74 @echo ' xconfig - Update current config utilising a QT based front-end' 74 @echo ' xconfig - Update current config utilising a QT based front-end'
75 @echo ' gconfig - Update current config utilising a GTK based front-end' 75 @echo ' gconfig - Update current config utilising a GTK based front-end'
76 @echo ' oldconfig - Update current config utilising a provided .config as base' 76 @echo ' oldconfig - Update current config utilising a provided .config as base'
77 @echo ' silentoldconfig - Same as oldconfig, but quietly'
77 @echo ' randconfig - New config with random answer to all options' 78 @echo ' randconfig - New config with random answer to all options'
78 @echo ' defconfig - New config with default answer to all options' 79 @echo ' defconfig - New config with default answer to all options'
79 @echo ' allmodconfig - New config selecting modules when possible' 80 @echo ' allmodconfig - New config selecting modules when possible'
diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c
index a69d8acbf274..69f96b398c22 100644
--- a/scripts/kconfig/confdata.c
+++ b/scripts/kconfig/confdata.c
@@ -193,8 +193,11 @@ load:
193 continue; 193 continue;
194 *p++ = 0; 194 *p++ = 0;
195 p2 = strchr(p, '\n'); 195 p2 = strchr(p, '\n');
196 if (p2) 196 if (p2) {
197 *p2 = 0; 197 *p2-- = 0;
198 if (*p2 == '\r')
199 *p2 = 0;
200 }
198 if (def == S_DEF_USER) { 201 if (def == S_DEF_USER) {
199 sym = sym_find(line + 7); 202 sym = sym_find(line + 7);
200 if (!sym) { 203 if (!sym) {
@@ -266,6 +269,7 @@ load:
266 ; 269 ;
267 } 270 }
268 break; 271 break;
272 case '\r':
269 case '\n': 273 case '\n':
270 break; 274 break;
271 default: 275 default:
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
index dfde0e87a765..41277963f47a 100644
--- a/scripts/mod/modpost.c
+++ b/scripts/mod/modpost.c
@@ -23,6 +23,8 @@ int have_vmlinux = 0;
23static int all_versions = 0; 23static int all_versions = 0;
24/* If we are modposting external module set to 1 */ 24/* If we are modposting external module set to 1 */
25static int external_module = 0; 25static int external_module = 0;
26/* Only warn about unresolved symbols */
27static int warn_unresolved = 0;
26/* How a symbol is exported */ 28/* How a symbol is exported */
27enum export { 29enum export {
28 export_plain, export_unused, export_gpl, 30 export_plain, export_unused, export_gpl,
@@ -581,8 +583,8 @@ static int strrcmp(const char *s, const char *sub)
581 * fromsec = .data 583 * fromsec = .data
582 * atsym = *driver, *_template, *_sht, *_ops, *_probe, *probe_one 584 * atsym = *driver, *_template, *_sht, *_ops, *_probe, *probe_one
583 **/ 585 **/
584static int secref_whitelist(const char *tosec, const char *fromsec, 586static int secref_whitelist(const char *modname, const char *tosec,
585 const char *atsym) 587 const char *fromsec, const char *atsym)
586{ 588{
587 int f1 = 1, f2 = 1; 589 int f1 = 1, f2 = 1;
588 const char **s; 590 const char **s;
@@ -618,8 +620,16 @@ static int secref_whitelist(const char *tosec, const char *fromsec,
618 for (s = pat2sym; *s; s++) 620 for (s = pat2sym; *s; s++)
619 if (strrcmp(atsym, *s) == 0) 621 if (strrcmp(atsym, *s) == 0)
620 f1 = 1; 622 f1 = 1;
623 if (f1 && f2)
624 return 1;
621 625
622 return f1 && f2; 626 /* Whitelist all references from .pci_fixup section if vmlinux */
627 if (is_vmlinux(modname)) {
628 if ((strcmp(fromsec, ".pci_fixup") == 0) &&
629 (strcmp(tosec, ".init.text") == 0))
630 return 1;
631 }
632 return 0;
623} 633}
624 634
625/** 635/**
@@ -726,7 +736,8 @@ static void warn_sec_mismatch(const char *modname, const char *fromsec,
726 736
727 /* check whitelist - we may ignore it */ 737 /* check whitelist - we may ignore it */
728 if (before && 738 if (before &&
729 secref_whitelist(secname, fromsec, elf->strtab + before->st_name)) 739 secref_whitelist(modname, secname, fromsec,
740 elf->strtab + before->st_name))
730 return; 741 return;
731 742
732 if (before && after) { 743 if (before && after) {
@@ -1187,16 +1198,19 @@ static void add_header(struct buffer *b, struct module *mod)
1187/** 1198/**
1188 * Record CRCs for unresolved symbols 1199 * Record CRCs for unresolved symbols
1189 **/ 1200 **/
1190static void add_versions(struct buffer *b, struct module *mod) 1201static int add_versions(struct buffer *b, struct module *mod)
1191{ 1202{
1192 struct symbol *s, *exp; 1203 struct symbol *s, *exp;
1204 int err = 0;
1193 1205
1194 for (s = mod->unres; s; s = s->next) { 1206 for (s = mod->unres; s; s = s->next) {
1195 exp = find_symbol(s->name); 1207 exp = find_symbol(s->name);
1196 if (!exp || exp->module == mod) { 1208 if (!exp || exp->module == mod) {
1197 if (have_vmlinux && !s->weak) 1209 if (have_vmlinux && !s->weak) {
1198 warn("\"%s\" [%s.ko] undefined!\n", 1210 warn("\"%s\" [%s.ko] undefined!\n",
1199 s->name, mod->name); 1211 s->name, mod->name);
1212 err = warn_unresolved ? 0 : 1;
1213 }
1200 continue; 1214 continue;
1201 } 1215 }
1202 s->module = exp->module; 1216 s->module = exp->module;
@@ -1205,7 +1219,7 @@ static void add_versions(struct buffer *b, struct module *mod)
1205 } 1219 }
1206 1220
1207 if (!modversions) 1221 if (!modversions)
1208 return; 1222 return err;
1209 1223
1210 buf_printf(b, "\n"); 1224 buf_printf(b, "\n");
1211 buf_printf(b, "static const struct modversion_info ____versions[]\n"); 1225 buf_printf(b, "static const struct modversion_info ____versions[]\n");
@@ -1225,6 +1239,8 @@ static void add_versions(struct buffer *b, struct module *mod)
1225 } 1239 }
1226 1240
1227 buf_printf(b, "};\n"); 1241 buf_printf(b, "};\n");
1242
1243 return err;
1228} 1244}
1229 1245
1230static void add_depends(struct buffer *b, struct module *mod, 1246static void add_depends(struct buffer *b, struct module *mod,
@@ -1402,8 +1418,9 @@ int main(int argc, char **argv)
1402 char *kernel_read = NULL, *module_read = NULL; 1418 char *kernel_read = NULL, *module_read = NULL;
1403 char *dump_write = NULL; 1419 char *dump_write = NULL;
1404 int opt; 1420 int opt;
1421 int err;
1405 1422
1406 while ((opt = getopt(argc, argv, "i:I:mo:a")) != -1) { 1423 while ((opt = getopt(argc, argv, "i:I:mo:aw")) != -1) {
1407 switch(opt) { 1424 switch(opt) {
1408 case 'i': 1425 case 'i':
1409 kernel_read = optarg; 1426 kernel_read = optarg;
@@ -1421,6 +1438,9 @@ int main(int argc, char **argv)
1421 case 'a': 1438 case 'a':
1422 all_versions = 1; 1439 all_versions = 1;
1423 break; 1440 break;
1441 case 'w':
1442 warn_unresolved = 1;
1443 break;
1424 default: 1444 default:
1425 exit(1); 1445 exit(1);
1426 } 1446 }
@@ -1441,6 +1461,8 @@ int main(int argc, char **argv)
1441 check_exports(mod); 1461 check_exports(mod);
1442 } 1462 }
1443 1463
1464 err = 0;
1465
1444 for (mod = modules; mod; mod = mod->next) { 1466 for (mod = modules; mod; mod = mod->next) {
1445 if (mod->skip) 1467 if (mod->skip)
1446 continue; 1468 continue;
@@ -1448,7 +1470,7 @@ int main(int argc, char **argv)
1448 buf.pos = 0; 1470 buf.pos = 0;
1449 1471
1450 add_header(&buf, mod); 1472 add_header(&buf, mod);
1451 add_versions(&buf, mod); 1473 err |= add_versions(&buf, mod);
1452 add_depends(&buf, mod, modules); 1474 add_depends(&buf, mod, modules);
1453 add_moddevtable(&buf, mod); 1475 add_moddevtable(&buf, mod);
1454 add_srcversion(&buf, mod); 1476 add_srcversion(&buf, mod);
@@ -1460,5 +1482,5 @@ int main(int argc, char **argv)
1460 if (dump_write) 1482 if (dump_write)
1461 write_dump(dump_write); 1483 write_dump(dump_write);
1462 1484
1463 return 0; 1485 return err;
1464} 1486}
diff --git a/scripts/package/mkspec b/scripts/package/mkspec
index df892841b118..ffd61fe0c1ad 100755
--- a/scripts/package/mkspec
+++ b/scripts/package/mkspec
@@ -63,9 +63,9 @@ fi
63 63
64echo "%install" 64echo "%install"
65echo "%ifarch ia64" 65echo "%ifarch ia64"
66echo 'mkdir -p $RPM_BUILD_ROOT/boot/efi $RPM_BUILD_ROOT/lib $RPM_BUILD_ROOT/lib/modules' 66echo 'mkdir -p $RPM_BUILD_ROOT/boot/efi $RPM_BUILD_ROOT/lib/modules'
67echo "%else" 67echo "%else"
68echo 'mkdir -p $RPM_BUILD_ROOT/boot $RPM_BUILD_ROOT/lib $RPM_BUILD_ROOT/lib/modules' 68echo 'mkdir -p $RPM_BUILD_ROOT/boot $RPM_BUILD_ROOT/lib/modules'
69echo "%endif" 69echo "%endif"
70 70
71echo 'INSTALL_MOD_PATH=$RPM_BUILD_ROOT make %{_smp_mflags} modules_install' 71echo 'INSTALL_MOD_PATH=$RPM_BUILD_ROOT make %{_smp_mflags} modules_install'
diff --git a/scripts/unifdef.c b/scripts/unifdef.c
new file mode 100644
index 000000000000..552025e72acb
--- /dev/null
+++ b/scripts/unifdef.c
@@ -0,0 +1,1005 @@
1/*
2 * Copyright (c) 2002 - 2005 Tony Finch <dot@dotat.at>. All rights reserved.
3 *
4 * This code is derived from software contributed to Berkeley by Dave Yost.
5 * It was rewritten to support ANSI C by Tony Finch. The original version of
6 * unifdef carried the following copyright notice. None of its code remains
7 * in this version (though some of the names remain).
8 *
9 * Copyright (c) 1985, 1993
10 * The Regents of the University of California. All rights reserved.
11 *
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions
14 * are met:
15 * 1. Redistributions of source code must retain the above copyright
16 * notice, this list of conditions and the following disclaimer.
17 * 2. Redistributions in binary form must reproduce the above copyright
18 * notice, this list of conditions and the following disclaimer in the
19 * documentation and/or other materials provided with the distribution.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 */
33
34#include <sys/cdefs.h>
35
36#ifndef lint
37#if 0
38static const char copyright[] =
39"@(#) Copyright (c) 1985, 1993\n\
40 The Regents of the University of California. All rights reserved.\n";
41#endif
42#ifdef __IDSTRING
43__IDSTRING(Berkeley, "@(#)unifdef.c 8.1 (Berkeley) 6/6/93");
44__IDSTRING(NetBSD, "$NetBSD: unifdef.c,v 1.8 2000/07/03 02:51:36 matt Exp $");
45__IDSTRING(dotat, "$dotat: things/unifdef.c,v 1.171 2005/03/08 12:38:48 fanf2 Exp $");
46#endif
47#endif /* not lint */
48#ifdef __FBSDID
49__FBSDID("$FreeBSD: /repoman/r/ncvs/src/usr.bin/unifdef/unifdef.c,v 1.20 2005/05/21 09:55:09 ru Exp $");
50#endif
51
52/*
53 * unifdef - remove ifdef'ed lines
54 *
55 * Wishlist:
56 * provide an option which will append the name of the
57 * appropriate symbol after #else's and #endif's
58 * provide an option which will check symbols after
59 * #else's and #endif's to see that they match their
60 * corresponding #ifdef or #ifndef
61 *
62 * The first two items above require better buffer handling, which would
63 * also make it possible to handle all "dodgy" directives correctly.
64 */
65
66#include <ctype.h>
67#include <err.h>
68#include <stdarg.h>
69#include <stdbool.h>
70#include <stdio.h>
71#include <stdlib.h>
72#include <string.h>
73#include <unistd.h>
74
75size_t strlcpy(char *dst, const char *src, size_t siz);
76
77/* types of input lines: */
78typedef enum {
79 LT_TRUEI, /* a true #if with ignore flag */
80 LT_FALSEI, /* a false #if with ignore flag */
81 LT_IF, /* an unknown #if */
82 LT_TRUE, /* a true #if */
83 LT_FALSE, /* a false #if */
84 LT_ELIF, /* an unknown #elif */
85 LT_ELTRUE, /* a true #elif */
86 LT_ELFALSE, /* a false #elif */
87 LT_ELSE, /* #else */
88 LT_ENDIF, /* #endif */
89 LT_DODGY, /* flag: directive is not on one line */
90 LT_DODGY_LAST = LT_DODGY + LT_ENDIF,
91 LT_PLAIN, /* ordinary line */
92 LT_EOF, /* end of file */
93 LT_COUNT
94} Linetype;
95
96static char const * const linetype_name[] = {
97 "TRUEI", "FALSEI", "IF", "TRUE", "FALSE",
98 "ELIF", "ELTRUE", "ELFALSE", "ELSE", "ENDIF",
99 "DODGY TRUEI", "DODGY FALSEI",
100 "DODGY IF", "DODGY TRUE", "DODGY FALSE",
101 "DODGY ELIF", "DODGY ELTRUE", "DODGY ELFALSE",
102 "DODGY ELSE", "DODGY ENDIF",
103 "PLAIN", "EOF"
104};
105
106/* state of #if processing */
107typedef enum {
108 IS_OUTSIDE,
109 IS_FALSE_PREFIX, /* false #if followed by false #elifs */
110 IS_TRUE_PREFIX, /* first non-false #(el)if is true */
111 IS_PASS_MIDDLE, /* first non-false #(el)if is unknown */
112 IS_FALSE_MIDDLE, /* a false #elif after a pass state */
113 IS_TRUE_MIDDLE, /* a true #elif after a pass state */
114 IS_PASS_ELSE, /* an else after a pass state */
115 IS_FALSE_ELSE, /* an else after a true state */
116 IS_TRUE_ELSE, /* an else after only false states */
117 IS_FALSE_TRAILER, /* #elifs after a true are false */
118 IS_COUNT
119} Ifstate;
120
121static char const * const ifstate_name[] = {
122 "OUTSIDE", "FALSE_PREFIX", "TRUE_PREFIX",
123 "PASS_MIDDLE", "FALSE_MIDDLE", "TRUE_MIDDLE",
124 "PASS_ELSE", "FALSE_ELSE", "TRUE_ELSE",
125 "FALSE_TRAILER"
126};
127
128/* state of comment parser */
129typedef enum {
130 NO_COMMENT = false, /* outside a comment */
131 C_COMMENT, /* in a comment like this one */
132 CXX_COMMENT, /* between // and end of line */
133 STARTING_COMMENT, /* just after slash-backslash-newline */
134 FINISHING_COMMENT, /* star-backslash-newline in a C comment */
135 CHAR_LITERAL, /* inside '' */
136 STRING_LITERAL /* inside "" */
137} Comment_state;
138
139static char const * const comment_name[] = {
140 "NO", "C", "CXX", "STARTING", "FINISHING", "CHAR", "STRING"
141};
142
143/* state of preprocessor line parser */
144typedef enum {
145 LS_START, /* only space and comments on this line */
146 LS_HASH, /* only space, comments, and a hash */
147 LS_DIRTY /* this line can't be a preprocessor line */
148} Line_state;
149
150static char const * const linestate_name[] = {
151 "START", "HASH", "DIRTY"
152};
153
154/*
155 * Minimum translation limits from ISO/IEC 9899:1999 5.2.4.1
156 */
157#define MAXDEPTH 64 /* maximum #if nesting */
158#define MAXLINE 4096 /* maximum length of line */
159#define MAXSYMS 4096 /* maximum number of symbols */
160
161/*
162 * Sometimes when editing a keyword the replacement text is longer, so
163 * we leave some space at the end of the tline buffer to accommodate this.
164 */
165#define EDITSLOP 10
166
167/*
168 * Globals.
169 */
170
171static bool complement; /* -c: do the complement */
172static bool debugging; /* -d: debugging reports */
173static bool iocccok; /* -e: fewer IOCCC errors */
174static bool killconsts; /* -k: eval constant #ifs */
175static bool lnblank; /* -l: blank deleted lines */
176static bool lnnum; /* -n: add #line directives */
177static bool symlist; /* -s: output symbol list */
178static bool text; /* -t: this is a text file */
179
180static const char *symname[MAXSYMS]; /* symbol name */
181static const char *value[MAXSYMS]; /* -Dsym=value */
182static bool ignore[MAXSYMS]; /* -iDsym or -iUsym */
183static int nsyms; /* number of symbols */
184
185static FILE *input; /* input file pointer */
186static const char *filename; /* input file name */
187static int linenum; /* current line number */
188
189static char tline[MAXLINE+EDITSLOP];/* input buffer plus space */
190static char *keyword; /* used for editing #elif's */
191
192static Comment_state incomment; /* comment parser state */
193static Line_state linestate; /* #if line parser state */
194static Ifstate ifstate[MAXDEPTH]; /* #if processor state */
195static bool ignoring[MAXDEPTH]; /* ignore comments state */
196static int stifline[MAXDEPTH]; /* start of current #if */
197static int depth; /* current #if nesting */
198static int delcount; /* count of deleted lines */
199static bool keepthis; /* don't delete constant #if */
200
201static int exitstat; /* program exit status */
202
203static void addsym(bool, bool, char *);
204static void debug(const char *, ...);
205static void done(void);
206static void error(const char *);
207static int findsym(const char *);
208static void flushline(bool);
209static Linetype getline(void);
210static Linetype ifeval(const char **);
211static void ignoreoff(void);
212static void ignoreon(void);
213static void keywordedit(const char *);
214static void nest(void);
215static void process(void);
216static const char *skipcomment(const char *);
217static const char *skipsym(const char *);
218static void state(Ifstate);
219static int strlcmp(const char *, const char *, size_t);
220static void unnest(void);
221static void usage(void);
222
223#define endsym(c) (!isalpha((unsigned char)c) && !isdigit((unsigned char)c) && c != '_')
224
225/*
226 * The main program.
227 */
228int
229main(int argc, char *argv[])
230{
231 int opt;
232
233 while ((opt = getopt(argc, argv, "i:D:U:I:cdeklnst")) != -1)
234 switch (opt) {
235 case 'i': /* treat stuff controlled by these symbols as text */
236 /*
237 * For strict backwards-compatibility the U or D
238 * should be immediately after the -i but it doesn't
239 * matter much if we relax that requirement.
240 */
241 opt = *optarg++;
242 if (opt == 'D')
243 addsym(true, true, optarg);
244 else if (opt == 'U')
245 addsym(true, false, optarg);
246 else
247 usage();
248 break;
249 case 'D': /* define a symbol */
250 addsym(false, true, optarg);
251 break;
252 case 'U': /* undef a symbol */
253 addsym(false, false, optarg);
254 break;
255 case 'I':
256 /* no-op for compatibility with cpp */
257 break;
258 case 'c': /* treat -D as -U and vice versa */
259 complement = true;
260 break;
261 case 'd':
262 debugging = true;
263 break;
264 case 'e': /* fewer errors from dodgy lines */
265 iocccok = true;
266 break;
267 case 'k': /* process constant #ifs */
268 killconsts = true;
269 break;
270 case 'l': /* blank deleted lines instead of omitting them */
271 lnblank = true;
272 break;
273 case 'n': /* add #line directive after deleted lines */
274 lnnum = true;
275 break;
276 case 's': /* only output list of symbols that control #ifs */
277 symlist = true;
278 break;
279 case 't': /* don't parse C comments */
280 text = true;
281 break;
282 default:
283 usage();
284 }
285 argc -= optind;
286 argv += optind;
287 if (argc > 1) {
288 errx(2, "can only do one file");
289 } else if (argc == 1 && strcmp(*argv, "-") != 0) {
290 filename = *argv;
291 input = fopen(filename, "r");
292 if (input == NULL)
293 err(2, "can't open %s", filename);
294 } else {
295 filename = "[stdin]";
296 input = stdin;
297 }
298 process();
299 abort(); /* bug */
300}
301
302static void
303usage(void)
304{
305 fprintf(stderr, "usage: unifdef [-cdeklnst] [-Ipath]"
306 " [-Dsym[=val]] [-Usym] [-iDsym[=val]] [-iUsym] ... [file]\n");
307 exit(2);
308}
309
310/*
311 * A state transition function alters the global #if processing state
312 * in a particular way. The table below is indexed by the current
313 * processing state and the type of the current line.
314 *
315 * Nesting is handled by keeping a stack of states; some transition
316 * functions increase or decrease the depth. They also maintain the
317 * ignore state on a stack. In some complicated cases they have to
318 * alter the preprocessor directive, as follows.
319 *
320 * When we have processed a group that starts off with a known-false
321 * #if/#elif sequence (which has therefore been deleted) followed by a
322 * #elif that we don't understand and therefore must keep, we edit the
323 * latter into a #if to keep the nesting correct.
324 *
325 * When we find a true #elif in a group, the following block will
326 * always be kept and the rest of the sequence after the next #elif or
327 * #else will be discarded. We edit the #elif into a #else and the
328 * following directive to #endif since this has the desired behaviour.
329 *
330 * "Dodgy" directives are split across multiple lines, the most common
331 * example being a multi-line comment hanging off the right of the
332 * directive. We can handle them correctly only if there is no change
333 * from printing to dropping (or vice versa) caused by that directive.
334 * If the directive is the first of a group we have a choice between
335 * failing with an error, or passing it through unchanged instead of
336 * evaluating it. The latter is not the default to avoid questions from
337 * users about unifdef unexpectedly leaving behind preprocessor directives.
338 */
339typedef void state_fn(void);
340
341/* report an error */
342static void Eelif (void) { error("Inappropriate #elif"); }
343static void Eelse (void) { error("Inappropriate #else"); }
344static void Eendif(void) { error("Inappropriate #endif"); }
345static void Eeof (void) { error("Premature EOF"); }
346static void Eioccc(void) { error("Obfuscated preprocessor control line"); }
347/* plain line handling */
348static void print (void) { flushline(true); }
349static void drop (void) { flushline(false); }
350/* output lacks group's start line */
351static void Strue (void) { drop(); ignoreoff(); state(IS_TRUE_PREFIX); }
352static void Sfalse(void) { drop(); ignoreoff(); state(IS_FALSE_PREFIX); }
353static void Selse (void) { drop(); state(IS_TRUE_ELSE); }
354/* print/pass this block */
355static void Pelif (void) { print(); ignoreoff(); state(IS_PASS_MIDDLE); }
356static void Pelse (void) { print(); state(IS_PASS_ELSE); }
357static void Pendif(void) { print(); unnest(); }
358/* discard this block */
359static void Dfalse(void) { drop(); ignoreoff(); state(IS_FALSE_TRAILER); }
360static void Delif (void) { drop(); ignoreoff(); state(IS_FALSE_MIDDLE); }
361static void Delse (void) { drop(); state(IS_FALSE_ELSE); }
362static void Dendif(void) { drop(); unnest(); }
363/* first line of group */
364static void Fdrop (void) { nest(); Dfalse(); }
365static void Fpass (void) { nest(); Pelif(); }
366static void Ftrue (void) { nest(); Strue(); }
367static void Ffalse(void) { nest(); Sfalse(); }
368/* variable pedantry for obfuscated lines */
369static void Oiffy (void) { if (!iocccok) Eioccc(); Fpass(); ignoreon(); }
370static void Oif (void) { if (!iocccok) Eioccc(); Fpass(); }
371static void Oelif (void) { if (!iocccok) Eioccc(); Pelif(); }
372/* ignore comments in this block */
373static void Idrop (void) { Fdrop(); ignoreon(); }
374static void Itrue (void) { Ftrue(); ignoreon(); }
375static void Ifalse(void) { Ffalse(); ignoreon(); }
376/* edit this line */
377static void Mpass (void) { strncpy(keyword, "if ", 4); Pelif(); }
378static void Mtrue (void) { keywordedit("else\n"); state(IS_TRUE_MIDDLE); }
379static void Melif (void) { keywordedit("endif\n"); state(IS_FALSE_TRAILER); }
380static void Melse (void) { keywordedit("endif\n"); state(IS_FALSE_ELSE); }
381
382static state_fn * const trans_table[IS_COUNT][LT_COUNT] = {
383/* IS_OUTSIDE */
384{ Itrue, Ifalse,Fpass, Ftrue, Ffalse,Eelif, Eelif, Eelif, Eelse, Eendif,
385 Oiffy, Oiffy, Fpass, Oif, Oif, Eelif, Eelif, Eelif, Eelse, Eendif,
386 print, done },
387/* IS_FALSE_PREFIX */
388{ Idrop, Idrop, Fdrop, Fdrop, Fdrop, Mpass, Strue, Sfalse,Selse, Dendif,
389 Idrop, Idrop, Fdrop, Fdrop, Fdrop, Mpass, Eioccc,Eioccc,Eioccc,Eioccc,
390 drop, Eeof },
391/* IS_TRUE_PREFIX */
392{ Itrue, Ifalse,Fpass, Ftrue, Ffalse,Dfalse,Dfalse,Dfalse,Delse, Dendif,
393 Oiffy, Oiffy, Fpass, Oif, Oif, Eioccc,Eioccc,Eioccc,Eioccc,Eioccc,
394 print, Eeof },
395/* IS_PASS_MIDDLE */
396{ Itrue, Ifalse,Fpass, Ftrue, Ffalse,Pelif, Mtrue, Delif, Pelse, Pendif,
397 Oiffy, Oiffy, Fpass, Oif, Oif, Pelif, Oelif, Oelif, Pelse, Pendif,
398 print, Eeof },
399/* IS_FALSE_MIDDLE */
400{ Idrop, Idrop, Fdrop, Fdrop, Fdrop, Pelif, Mtrue, Delif, Pelse, Pendif,
401 Idrop, Idrop, Fdrop, Fdrop, Fdrop, Eioccc,Eioccc,Eioccc,Eioccc,Eioccc,
402 drop, Eeof },
403/* IS_TRUE_MIDDLE */
404{ Itrue, Ifalse,Fpass, Ftrue, Ffalse,Melif, Melif, Melif, Melse, Pendif,
405 Oiffy, Oiffy, Fpass, Oif, Oif, Eioccc,Eioccc,Eioccc,Eioccc,Pendif,
406 print, Eeof },
407/* IS_PASS_ELSE */
408{ Itrue, Ifalse,Fpass, Ftrue, Ffalse,Eelif, Eelif, Eelif, Eelse, Pendif,
409 Oiffy, Oiffy, Fpass, Oif, Oif, Eelif, Eelif, Eelif, Eelse, Pendif,
410 print, Eeof },
411/* IS_FALSE_ELSE */
412{ Idrop, Idrop, Fdrop, Fdrop, Fdrop, Eelif, Eelif, Eelif, Eelse, Dendif,
413 Idrop, Idrop, Fdrop, Fdrop, Fdrop, Eelif, Eelif, Eelif, Eelse, Eioccc,
414 drop, Eeof },
415/* IS_TRUE_ELSE */
416{ Itrue, Ifalse,Fpass, Ftrue, Ffalse,Eelif, Eelif, Eelif, Eelse, Dendif,
417 Oiffy, Oiffy, Fpass, Oif, Oif, Eelif, Eelif, Eelif, Eelse, Eioccc,
418 print, Eeof },
419/* IS_FALSE_TRAILER */
420{ Idrop, Idrop, Fdrop, Fdrop, Fdrop, Dfalse,Dfalse,Dfalse,Delse, Dendif,
421 Idrop, Idrop, Fdrop, Fdrop, Fdrop, Dfalse,Dfalse,Dfalse,Delse, Eioccc,
422 drop, Eeof }
423/*TRUEI FALSEI IF TRUE FALSE ELIF ELTRUE ELFALSE ELSE ENDIF
424 TRUEI FALSEI IF TRUE FALSE ELIF ELTRUE ELFALSE ELSE ENDIF (DODGY)
425 PLAIN EOF */
426};
427
428/*
429 * State machine utility functions
430 */
431static void
432done(void)
433{
434 if (incomment)
435 error("EOF in comment");
436 exit(exitstat);
437}
438static void
439ignoreoff(void)
440{
441 if (depth == 0)
442 abort(); /* bug */
443 ignoring[depth] = ignoring[depth-1];
444}
445static void
446ignoreon(void)
447{
448 ignoring[depth] = true;
449}
450static void
451keywordedit(const char *replacement)
452{
453 size_t size = tline + sizeof(tline) - keyword;
454 char *dst = keyword;
455 const char *src = replacement;
456 if (size != 0) {
457 while ((--size != 0) && (*src != '\0'))
458 *dst++ = *src++;
459 *dst = '\0';
460 }
461 print();
462}
463static void
464nest(void)
465{
466 depth += 1;
467 if (depth >= MAXDEPTH)
468 error("Too many levels of nesting");
469 stifline[depth] = linenum;
470}
471static void
472unnest(void)
473{
474 if (depth == 0)
475 abort(); /* bug */
476 depth -= 1;
477}
478static void
479state(Ifstate is)
480{
481 ifstate[depth] = is;
482}
483
484/*
485 * Write a line to the output or not, according to command line options.
486 */
487static void
488flushline(bool keep)
489{
490 if (symlist)
491 return;
492 if (keep ^ complement) {
493 if (lnnum && delcount > 0)
494 printf("#line %d\n", linenum);
495 fputs(tline, stdout);
496 delcount = 0;
497 } else {
498 if (lnblank)
499 putc('\n', stdout);
500 exitstat = 1;
501 delcount += 1;
502 }
503}
504
505/*
506 * The driver for the state machine.
507 */
508static void
509process(void)
510{
511 Linetype lineval;
512
513 for (;;) {
514 linenum++;
515 lineval = getline();
516 trans_table[ifstate[depth]][lineval]();
517 debug("process %s -> %s depth %d",
518 linetype_name[lineval],
519 ifstate_name[ifstate[depth]], depth);
520 }
521}
522
523/*
524 * Parse a line and determine its type. We keep the preprocessor line
525 * parser state between calls in the global variable linestate, with
526 * help from skipcomment().
527 */
528static Linetype
529getline(void)
530{
531 const char *cp;
532 int cursym;
533 int kwlen;
534 Linetype retval;
535 Comment_state wascomment;
536
537 if (fgets(tline, MAXLINE, input) == NULL)
538 return (LT_EOF);
539 retval = LT_PLAIN;
540 wascomment = incomment;
541 cp = skipcomment(tline);
542 if (linestate == LS_START) {
543 if (*cp == '#') {
544 linestate = LS_HASH;
545 cp = skipcomment(cp + 1);
546 } else if (*cp != '\0')
547 linestate = LS_DIRTY;
548 }
549 if (!incomment && linestate == LS_HASH) {
550 keyword = tline + (cp - tline);
551 cp = skipsym(cp);
552 kwlen = cp - keyword;
553 /* no way can we deal with a continuation inside a keyword */
554 if (strncmp(cp, "\\\n", 2) == 0)
555 Eioccc();
556 if (strlcmp("ifdef", keyword, kwlen) == 0 ||
557 strlcmp("ifndef", keyword, kwlen) == 0) {
558 cp = skipcomment(cp);
559 if ((cursym = findsym(cp)) < 0)
560 retval = LT_IF;
561 else {
562 retval = (keyword[2] == 'n')
563 ? LT_FALSE : LT_TRUE;
564 if (value[cursym] == NULL)
565 retval = (retval == LT_TRUE)
566 ? LT_FALSE : LT_TRUE;
567 if (ignore[cursym])
568 retval = (retval == LT_TRUE)
569 ? LT_TRUEI : LT_FALSEI;
570 }
571 cp = skipsym(cp);
572 } else if (strlcmp("if", keyword, kwlen) == 0)
573 retval = ifeval(&cp);
574 else if (strlcmp("elif", keyword, kwlen) == 0)
575 retval = ifeval(&cp) - LT_IF + LT_ELIF;
576 else if (strlcmp("else", keyword, kwlen) == 0)
577 retval = LT_ELSE;
578 else if (strlcmp("endif", keyword, kwlen) == 0)
579 retval = LT_ENDIF;
580 else {
581 linestate = LS_DIRTY;
582 retval = LT_PLAIN;
583 }
584 cp = skipcomment(cp);
585 if (*cp != '\0') {
586 linestate = LS_DIRTY;
587 if (retval == LT_TRUE || retval == LT_FALSE ||
588 retval == LT_TRUEI || retval == LT_FALSEI)
589 retval = LT_IF;
590 if (retval == LT_ELTRUE || retval == LT_ELFALSE)
591 retval = LT_ELIF;
592 }
593 if (retval != LT_PLAIN && (wascomment || incomment)) {
594 retval += LT_DODGY;
595 if (incomment)
596 linestate = LS_DIRTY;
597 }
598 /* skipcomment should have changed the state */
599 if (linestate == LS_HASH)
600 abort(); /* bug */
601 }
602 if (linestate == LS_DIRTY) {
603 while (*cp != '\0')
604 cp = skipcomment(cp + 1);
605 }
606 debug("parser %s comment %s line",
607 comment_name[incomment], linestate_name[linestate]);
608 return (retval);
609}
610
611/*
612 * These are the binary operators that are supported by the expression
613 * evaluator. Note that if support for division is added then we also
614 * need short-circuiting booleans because of divide-by-zero.
615 */
616static int op_lt(int a, int b) { return (a < b); }
617static int op_gt(int a, int b) { return (a > b); }
618static int op_le(int a, int b) { return (a <= b); }
619static int op_ge(int a, int b) { return (a >= b); }
620static int op_eq(int a, int b) { return (a == b); }
621static int op_ne(int a, int b) { return (a != b); }
622static int op_or(int a, int b) { return (a || b); }
623static int op_and(int a, int b) { return (a && b); }
624
625/*
626 * An evaluation function takes three arguments, as follows: (1) a pointer to
627 * an element of the precedence table which lists the operators at the current
628 * level of precedence; (2) a pointer to an integer which will receive the
629 * value of the expression; and (3) a pointer to a char* that points to the
630 * expression to be evaluated and that is updated to the end of the expression
631 * when evaluation is complete. The function returns LT_FALSE if the value of
632 * the expression is zero, LT_TRUE if it is non-zero, or LT_IF if the
633 * expression could not be evaluated.
634 */
635struct ops;
636
637typedef Linetype eval_fn(const struct ops *, int *, const char **);
638
639static eval_fn eval_table, eval_unary;
640
641/*
642 * The precedence table. Expressions involving binary operators are evaluated
643 * in a table-driven way by eval_table. When it evaluates a subexpression it
644 * calls the inner function with its first argument pointing to the next
645 * element of the table. Innermost expressions have special non-table-driven
646 * handling.
647 */
648static const struct ops {
649 eval_fn *inner;
650 struct op {
651 const char *str;
652 int (*fn)(int, int);
653 } op[5];
654} eval_ops[] = {
655 { eval_table, { { "||", op_or } } },
656 { eval_table, { { "&&", op_and } } },
657 { eval_table, { { "==", op_eq },
658 { "!=", op_ne } } },
659 { eval_unary, { { "<=", op_le },
660 { ">=", op_ge },
661 { "<", op_lt },
662 { ">", op_gt } } }
663};
664
665/*
666 * Function for evaluating the innermost parts of expressions,
667 * viz. !expr (expr) defined(symbol) symbol number
668 * We reset the keepthis flag when we find a non-constant subexpression.
669 */
670static Linetype
671eval_unary(const struct ops *ops, int *valp, const char **cpp)
672{
673 const char *cp;
674 char *ep;
675 int sym;
676
677 cp = skipcomment(*cpp);
678 if (*cp == '!') {
679 debug("eval%d !", ops - eval_ops);
680 cp++;
681 if (eval_unary(ops, valp, &cp) == LT_IF)
682 return (LT_IF);
683 *valp = !*valp;
684 } else if (*cp == '(') {
685 cp++;
686 debug("eval%d (", ops - eval_ops);
687 if (eval_table(eval_ops, valp, &cp) == LT_IF)
688 return (LT_IF);
689 cp = skipcomment(cp);
690 if (*cp++ != ')')
691 return (LT_IF);
692 } else if (isdigit((unsigned char)*cp)) {
693 debug("eval%d number", ops - eval_ops);
694 *valp = strtol(cp, &ep, 0);
695 cp = skipsym(cp);
696 } else if (strncmp(cp, "defined", 7) == 0 && endsym(cp[7])) {
697 cp = skipcomment(cp+7);
698 debug("eval%d defined", ops - eval_ops);
699 if (*cp++ != '(')
700 return (LT_IF);
701 cp = skipcomment(cp);
702 sym = findsym(cp);
703 if (sym < 0)
704 return (LT_IF);
705 *valp = (value[sym] != NULL);
706 cp = skipsym(cp);
707 cp = skipcomment(cp);
708 if (*cp++ != ')')
709 return (LT_IF);
710 keepthis = false;
711 } else if (!endsym(*cp)) {
712 debug("eval%d symbol", ops - eval_ops);
713 sym = findsym(cp);
714 if (sym < 0)
715 return (LT_IF);
716 if (value[sym] == NULL)
717 *valp = 0;
718 else {
719 *valp = strtol(value[sym], &ep, 0);
720 if (*ep != '\0' || ep == value[sym])
721 return (LT_IF);
722 }
723 cp = skipsym(cp);
724 keepthis = false;
725 } else {
726 debug("eval%d bad expr", ops - eval_ops);
727 return (LT_IF);
728 }
729
730 *cpp = cp;
731 debug("eval%d = %d", ops - eval_ops, *valp);
732 return (*valp ? LT_TRUE : LT_FALSE);
733}
734
735/*
736 * Table-driven evaluation of binary operators.
737 */
738static Linetype
739eval_table(const struct ops *ops, int *valp, const char **cpp)
740{
741 const struct op *op;
742 const char *cp;
743 int val;
744
745 debug("eval%d", ops - eval_ops);
746 cp = *cpp;
747 if (ops->inner(ops+1, valp, &cp) == LT_IF)
748 return (LT_IF);
749 for (;;) {
750 cp = skipcomment(cp);
751 for (op = ops->op; op->str != NULL; op++)
752 if (strncmp(cp, op->str, strlen(op->str)) == 0)
753 break;
754 if (op->str == NULL)
755 break;
756 cp += strlen(op->str);
757 debug("eval%d %s", ops - eval_ops, op->str);
758 if (ops->inner(ops+1, &val, &cp) == LT_IF)
759 return (LT_IF);
760 *valp = op->fn(*valp, val);
761 }
762
763 *cpp = cp;
764 debug("eval%d = %d", ops - eval_ops, *valp);
765 return (*valp ? LT_TRUE : LT_FALSE);
766}
767
768/*
769 * Evaluate the expression on a #if or #elif line. If we can work out
770 * the result we return LT_TRUE or LT_FALSE accordingly, otherwise we
771 * return just a generic LT_IF.
772 */
773static Linetype
774ifeval(const char **cpp)
775{
776 int ret;
777 int val;
778
779 debug("eval %s", *cpp);
780 keepthis = killconsts ? false : true;
781 ret = eval_table(eval_ops, &val, cpp);
782 debug("eval = %d", val);
783 return (keepthis ? LT_IF : ret);
784}
785
786/*
787 * Skip over comments, strings, and character literals and stop at the
788 * next character position that is not whitespace. Between calls we keep
789 * the comment state in the global variable incomment, and we also adjust
790 * the global variable linestate when we see a newline.
791 * XXX: doesn't cope with the buffer splitting inside a state transition.
792 */
793static const char *
794skipcomment(const char *cp)
795{
796 if (text || ignoring[depth]) {
797 for (; isspace((unsigned char)*cp); cp++)
798 if (*cp == '\n')
799 linestate = LS_START;
800 return (cp);
801 }
802 while (*cp != '\0')
803 /* don't reset to LS_START after a line continuation */
804 if (strncmp(cp, "\\\n", 2) == 0)
805 cp += 2;
806 else switch (incomment) {
807 case NO_COMMENT:
808 if (strncmp(cp, "/\\\n", 3) == 0) {
809 incomment = STARTING_COMMENT;
810 cp += 3;
811 } else if (strncmp(cp, "/*", 2) == 0) {
812 incomment = C_COMMENT;
813 cp += 2;
814 } else if (strncmp(cp, "//", 2) == 0) {
815 incomment = CXX_COMMENT;
816 cp += 2;
817 } else if (strncmp(cp, "\'", 1) == 0) {
818 incomment = CHAR_LITERAL;
819 linestate = LS_DIRTY;
820 cp += 1;
821 } else if (strncmp(cp, "\"", 1) == 0) {
822 incomment = STRING_LITERAL;
823 linestate = LS_DIRTY;
824 cp += 1;
825 } else if (strncmp(cp, "\n", 1) == 0) {
826 linestate = LS_START;
827 cp += 1;
828 } else if (strchr(" \t", *cp) != NULL) {
829 cp += 1;
830 } else
831 return (cp);
832 continue;
833 case CXX_COMMENT:
834 if (strncmp(cp, "\n", 1) == 0) {
835 incomment = NO_COMMENT;
836 linestate = LS_START;
837 }
838 cp += 1;
839 continue;
840 case CHAR_LITERAL:
841 case STRING_LITERAL:
842 if ((incomment == CHAR_LITERAL && cp[0] == '\'') ||
843 (incomment == STRING_LITERAL && cp[0] == '\"')) {
844 incomment = NO_COMMENT;
845 cp += 1;
846 } else if (cp[0] == '\\') {
847 if (cp[1] == '\0')
848 cp += 1;
849 else
850 cp += 2;
851 } else if (strncmp(cp, "\n", 1) == 0) {
852 if (incomment == CHAR_LITERAL)
853 error("unterminated char literal");
854 else
855 error("unterminated string literal");
856 } else
857 cp += 1;
858 continue;
859 case C_COMMENT:
860 if (strncmp(cp, "*\\\n", 3) == 0) {
861 incomment = FINISHING_COMMENT;
862 cp += 3;
863 } else if (strncmp(cp, "*/", 2) == 0) {
864 incomment = NO_COMMENT;
865 cp += 2;
866 } else
867 cp += 1;
868 continue;
869 case STARTING_COMMENT:
870 if (*cp == '*') {
871 incomment = C_COMMENT;
872 cp += 1;
873 } else if (*cp == '/') {
874 incomment = CXX_COMMENT;
875 cp += 1;
876 } else {
877 incomment = NO_COMMENT;
878 linestate = LS_DIRTY;
879 }
880 continue;
881 case FINISHING_COMMENT:
882 if (*cp == '/') {
883 incomment = NO_COMMENT;
884 cp += 1;
885 } else
886 incomment = C_COMMENT;
887 continue;
888 default:
889 abort(); /* bug */
890 }
891 return (cp);
892}
893
894/*
895 * Skip over an identifier.
896 */
897static const char *
898skipsym(const char *cp)
899{
900 while (!endsym(*cp))
901 ++cp;
902 return (cp);
903}
904
905/*
906 * Look for the symbol in the symbol table. If is is found, we return
907 * the symbol table index, else we return -1.
908 */
909static int
910findsym(const char *str)
911{
912 const char *cp;
913 int symind;
914
915 cp = skipsym(str);
916 if (cp == str)
917 return (-1);
918 if (symlist) {
919 printf("%.*s\n", (int)(cp-str), str);
920 /* we don't care about the value of the symbol */
921 return (0);
922 }
923 for (symind = 0; symind < nsyms; ++symind) {
924 if (strlcmp(symname[symind], str, cp-str) == 0) {
925 debug("findsym %s %s", symname[symind],
926 value[symind] ? value[symind] : "");
927 return (symind);
928 }
929 }
930 return (-1);
931}
932
933/*
934 * Add a symbol to the symbol table.
935 */
936static void
937addsym(bool ignorethis, bool definethis, char *sym)
938{
939 int symind;
940 char *val;
941
942 symind = findsym(sym);
943 if (symind < 0) {
944 if (nsyms >= MAXSYMS)
945 errx(2, "too many symbols");
946 symind = nsyms++;
947 }
948 symname[symind] = sym;
949 ignore[symind] = ignorethis;
950 val = sym + (skipsym(sym) - sym);
951 if (definethis) {
952 if (*val == '=') {
953 value[symind] = val+1;
954 *val = '\0';
955 } else if (*val == '\0')
956 value[symind] = "";
957 else
958 usage();
959 } else {
960 if (*val != '\0')
961 usage();
962 value[symind] = NULL;
963 }
964}
965
966/*
967 * Compare s with n characters of t.
968 * The same as strncmp() except that it checks that s[n] == '\0'.
969 */
970static int
971strlcmp(const char *s, const char *t, size_t n)
972{
973 while (n-- && *t != '\0')
974 if (*s != *t)
975 return ((unsigned char)*s - (unsigned char)*t);
976 else
977 ++s, ++t;
978 return ((unsigned char)*s);
979}
980
981/*
982 * Diagnostics.
983 */
984static void
985debug(const char *msg, ...)
986{
987 va_list ap;
988
989 if (debugging) {
990 va_start(ap, msg);
991 vwarnx(msg, ap);
992 va_end(ap);
993 }
994}
995
996static void
997error(const char *msg)
998{
999 if (depth == 0)
1000 warnx("%s: %d: %s", filename, linenum, msg);
1001 else
1002 warnx("%s: %d: %s (#if line %d depth %d)",
1003 filename, linenum, msg, stifline[depth], depth);
1004 errx(2, "output may be truncated");
1005}
diff --git a/usr/Makefile b/usr/Makefile
index 5b31c0b61c76..e338e7bedb29 100644
--- a/usr/Makefile
+++ b/usr/Makefile
@@ -3,6 +3,8 @@
3# 3#
4 4
5klibcdirs:; 5klibcdirs:;
6PHONY += klibcdirs
7
6 8
7# Generate builtin.o based on initramfs_data.o 9# Generate builtin.o based on initramfs_data.o
8obj-y := initramfs_data.o 10obj-y := initramfs_data.o