diff options
| -rw-r--r-- | Documentation/Changes | 7 | ||||
| -rw-r--r-- | Documentation/dontdiff | 1 | ||||
| -rw-r--r-- | Documentation/kbuild/kconfig-language.txt | 12 | ||||
| -rw-r--r-- | Documentation/kbuild/makefiles.txt | 265 | ||||
| -rw-r--r-- | Documentation/kbuild/modules.txt | 161 | ||||
| -rw-r--r-- | Documentation/sparse.txt | 8 | ||||
| -rw-r--r-- | Kbuild | 2 | ||||
| -rw-r--r-- | Makefile | 134 | ||||
| -rw-r--r-- | scripts/Kbuild.include | 93 | ||||
| -rw-r--r-- | scripts/Makefile | 5 | ||||
| -rw-r--r-- | scripts/Makefile.build | 5 | ||||
| -rw-r--r-- | scripts/Makefile.headersinst | 2 | ||||
| -rw-r--r-- | scripts/Makefile.host | 20 | ||||
| -rw-r--r-- | scripts/Makefile.modpost | 13 | ||||
| -rw-r--r-- | scripts/kconfig/Makefile | 1 | ||||
| -rw-r--r-- | scripts/kconfig/confdata.c | 8 | ||||
| -rw-r--r-- | scripts/mod/modpost.c | 42 | ||||
| -rwxr-xr-x | scripts/package/mkspec | 4 | ||||
| -rw-r--r-- | scripts/unifdef.c | 1005 | ||||
| -rw-r--r-- | usr/Makefile | 2 |
20 files changed, 1471 insertions, 319 deletions
diff --git a/Documentation/Changes b/Documentation/Changes index 488272074c3..abee7f58c1e 100644 --- a/Documentation/Changes +++ b/Documentation/Changes | |||
| @@ -37,15 +37,14 @@ o e2fsprogs 1.29 # tune2fs | |||
| 37 | o jfsutils 1.1.3 # fsck.jfs -V | 37 | o jfsutils 1.1.3 # fsck.jfs -V |
| 38 | o reiserfsprogs 3.6.3 # reiserfsck -V 2>&1|grep reiserfsprogs | 38 | o reiserfsprogs 3.6.3 # reiserfsck -V 2>&1|grep reiserfsprogs |
| 39 | o xfsprogs 2.6.0 # xfs_db -V | 39 | o xfsprogs 2.6.0 # xfs_db -V |
| 40 | o pcmciautils 004 | 40 | o pcmciautils 004 # pccardctl -V |
| 41 | o pcmcia-cs 3.1.21 # cardmgr -V | ||
| 42 | o quota-tools 3.09 # quota -V | 41 | o quota-tools 3.09 # quota -V |
| 43 | o PPP 2.4.0 # pppd --version | 42 | o PPP 2.4.0 # pppd --version |
| 44 | o isdn4k-utils 3.1pre1 # isdnctrl 2>&1|grep version | 43 | o isdn4k-utils 3.1pre1 # isdnctrl 2>&1|grep version |
| 45 | o nfs-utils 1.0.5 # showmount --version | 44 | o nfs-utils 1.0.5 # showmount --version |
| 46 | o procps 3.2.0 # ps --version | 45 | o procps 3.2.0 # ps --version |
| 47 | o oprofile 0.9 # oprofiled --version | 46 | o oprofile 0.9 # oprofiled --version |
| 48 | o udev 071 # udevinfo -V | 47 | o udev 081 # udevinfo -V |
| 49 | 48 | ||
| 50 | Kernel compilation | 49 | Kernel compilation |
| 51 | ================== | 50 | ================== |
| @@ -268,7 +267,7 @@ active clients. | |||
| 268 | 267 | ||
| 269 | To enable this new functionality, you need to: | 268 | To 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 | ||
| 273 | before running exportfs or mountd. It is recommended that all NFS | 272 | before running exportfs or mountd. It is recommended that all NFS |
| 274 | services be protected from the internet-at-large by a firewall where | 273 | services be protected from the internet-at-large by a firewall where |
diff --git a/Documentation/dontdiff b/Documentation/dontdiff index 24adfe9af3c..63c2d0c55aa 100644 --- a/Documentation/dontdiff +++ b/Documentation/dontdiff | |||
| @@ -135,6 +135,7 @@ tags | |||
| 135 | times.h* | 135 | times.h* |
| 136 | tkparse | 136 | tkparse |
| 137 | trix_boot.h | 137 | trix_boot.h |
| 138 | utsrelease.h* | ||
| 138 | version.h* | 139 | version.h* |
| 139 | vmlinux | 140 | vmlinux |
| 140 | vmlinux-* | 141 | vmlinux-* |
diff --git a/Documentation/kbuild/kconfig-language.txt b/Documentation/kbuild/kconfig-language.txt index ca1967f3642..003fccc14d2 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 |
| 154 | characters or underscores. | 154 | characters or underscores. |
| 155 | Constant symbols are only part of expressions. Constant symbols are | 155 | Constant symbols are only part of expressions. Constant symbols are |
| 156 | always surrounded by single or double quotes. Within the quote any | 156 | always surrounded by single or double quotes. Within the quote, any |
| 157 | other character is allowed and the quotes can be escaped using '\'. | 157 | other character is allowed and the quotes can be escaped using '\'. |
| 158 | 158 | ||
| 159 | Menu structure | 159 | Menu structure |
| @@ -237,7 +237,7 @@ choices: | |||
| 237 | <choice block> | 237 | <choice block> |
| 238 | "endchoice" | 238 | "endchoice" |
| 239 | 239 | ||
| 240 | This defines a choice group and accepts any of above attributes as | 240 | This defines a choice group and accepts any of the above attributes as |
| 241 | options. A choice can only be of type bool or tristate, while a boolean | 241 | options. A choice can only be of type bool or tristate, while a boolean |
| 242 | choice only allows a single config entry to be selected, a tristate | 242 | choice only allows a single config entry to be selected, a tristate |
| 243 | choice also allows any number of config entries to be set to 'm'. This | 243 | choice 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 0706699c9da..b7d6abb501a 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 | ||
| 70 | Each subdirectory has a kbuild Makefile which carries out the commands | 70 | Each subdirectory has a kbuild Makefile which carries out the commands |
| 71 | passed down from above. The kbuild Makefile uses information from the | 71 | passed 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 |
| 73 | any built-in or modular targets. | 73 | any built-in or modular targets. |
| 74 | 74 | ||
| 75 | scripts/Makefile.* contains all the definitions/rules etc. that | 75 | scripts/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 |
| 88 | drivers, file systems, and network protocols. These people need to | 88 | drivers, file systems, and network protocols. These people need to |
| 89 | maintain the kbuild Makefiles for the subsystem that they are | 89 | maintain the kbuild Makefiles for the subsystem they are |
| 90 | working on. In order to do this effectively, they need some overall | 90 | working on. In order to do this effectively, they need some overall |
| 91 | knowledge about the kernel Makefiles, plus detailed knowledge about the | 91 | knowledge about the kernel Makefiles, plus detailed knowledge about the |
| 92 | public interface for kbuild. | 92 | public 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 | ||
| 106 | Most Makefiles within the kernel are kbuild Makefiles that use the | 106 | Most Makefiles within the kernel are kbuild Makefiles that use the |
| 107 | kbuild infrastructure. This chapter introduce the syntax used in the | 107 | kbuild infrastructure. This chapter introduces the syntax used in the |
| 108 | kbuild makefiles. | 108 | kbuild makefiles. |
| 109 | The preferred name for the kbuild files are 'Makefile' but 'Kbuild' can | 109 | The preferred name for the kbuild files are 'Makefile' but 'Kbuild' can |
| 110 | be used and if both a 'Makefile' and a 'Kbuild' file exists then the 'Kbuild' | 110 | be used and if both a 'Makefile' and a 'Kbuild' file exists, then the 'Kbuild' |
| 111 | file will be used. | 111 | file will be used. |
| 112 | 112 | ||
| 113 | Section 3.1 "Goal definitions" is a quick intro, further chapters provide | 113 | Section 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 | |||
| 506 | done utilising the variable hostprogs-y. | 507 | done utilising the variable hostprogs-y. |
| 507 | 508 | ||
| 508 | The second step is to add an explicit dependency to the executable. | 509 | The second step is to add an explicit dependency to the executable. |
| 509 | This can be done in two ways. Either add the dependency in a rule, | 510 | This can be done in two ways. Either add the dependency in a rule, |
| 510 | or utilise the variable $(always). | 511 | or utilise the variable $(always). |
| 511 | Both possibilities are described in the following. | 512 | Both 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 |
| 666 | is compiled. This includes generated files such as host programs. | 668 | is compiled. This includes generated files such as host programs. |
| 667 | Kbuild knows targets listed in $(hostprogs-y), $(hostprogs-m), $(always), | 669 | Kbuild 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 | |||
| 680 | be deleted. Kbuild will assume files to be in same relative directory as the | 682 | be deleted. Kbuild will assume files to be in same relative directory as the |
| 681 | Makefile except if an absolute path is specified (path starting with '/'). | 683 | Makefile except if an absolute path is specified (path starting with '/'). |
| 682 | 684 | ||
| 683 | To delete a directory hirachy use: | 685 | To 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 | ||
| 724 | The top level Makefile sets up the environment and does the preparation, | 727 | The top level Makefile sets up the environment and does the preparation, |
| 725 | before starting to descend down in the individual directories. | 728 | before starting to descend down in the individual directories. |
| 726 | The top level makefile contains the generic part, whereas the | 729 | The top level makefile contains the generic part, whereas |
| 727 | arch/$(ARCH)/Makefile contains what is required to set-up kbuild | 730 | arch/$(ARCH)/Makefile contains what is required to set up kbuild |
| 728 | to the said architecture. | 731 | for said architecture. |
| 729 | To do so arch/$(ARCH)/Makefile sets a number of variables, and defines | 732 | To do so, arch/$(ARCH)/Makefile sets up a number of variables and defines |
| 730 | a few targets. | 733 | a few targets. |
| 731 | 734 | ||
| 732 | When kbuild executes the following steps are followed (roughly): | 735 | When kbuild executes, the following steps are followed (roughly): |
| 733 | 1) Configuration of the kernel => produced .config | 736 | 1) Configuration of the kernel => produce .config |
| 734 | 2) Store kernel version in include/linux/version.h | 737 | 2) Store kernel version in include/linux/version.h |
| 735 | 3) Symlink include/asm to include/asm-$(ARCH) | 738 | 3) Symlink include/asm to include/asm-$(ARCH) |
| 736 | 4) Updating all other prerequisites to the target prepare: | 739 | 4) 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 |
| 738 | 5) Recursively descend down in all directories listed in | 741 | 5) 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. |
| 741 | 6) All object files are then linked and the resulting file vmlinux is | 744 | 6) 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. |
| 745 | 7) Finally the architecture specific part does any required post processing | 748 | 7) 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 | ||
| 1150 | The kernel Makefiles are designed to run with GNU Make. The Makefiles | 1154 | The kernel Makefiles are designed to be run with GNU Make. The Makefiles |
| 1151 | use only the documented features of GNU Make, but they do use many | 1155 | use only the documented features of GNU Make, but they do use many |
| 1152 | GNU extensions. | 1156 | GNU extensions. |
| 1153 | 1157 | ||
| @@ -1169,10 +1173,13 @@ is the right choice. | |||
| 1169 | Original version made by Michael Elizabeth Chastain, <mailto:mec@shout.net> | 1173 | Original version made by Michael Elizabeth Chastain, <mailto:mec@shout.net> |
| 1170 | Updates by Kai Germaschewski <kai@tp1.ruhr-uni-bochum.de> | 1174 | Updates by Kai Germaschewski <kai@tp1.ruhr-uni-bochum.de> |
| 1171 | Updates by Sam Ravnborg <sam@ravnborg.org> | 1175 | Updates by Sam Ravnborg <sam@ravnborg.org> |
| 1176 | Language 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 61fc079eb96..2e7702e94a7 100644 --- a/Documentation/kbuild/modules.txt +++ b/Documentation/kbuild/modules.txt | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | 1 | ||
| 2 | In this document you will find information about: | 2 | In 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 | ||
| 37 | kbuild includes functionality for building modules both | 37 | kbuild includes functionality for building modules both |
| 38 | within the kernel source tree and outside the kernel source tree. | 38 | within the kernel source tree and outside the kernel source tree. |
| 39 | The latter is usually referred to as external modules and is used | 39 | The latter is usually referred to as external or "out-of-tree" |
| 40 | both during development and for modules that are not planned to be | 40 | modules and is used both during development and for modules that |
| 41 | included in the kernel tree. | 41 | are not planned to be included in the kernel tree. |
| 42 | 42 | ||
| 43 | What is covered within this file is mainly information to authors | 43 | What is covered within this file is mainly information to authors |
| 44 | of modules. The author of an external modules should supply | 44 | of modules. The author of an external module should supply |
| 45 | a makefile that hides most of the complexity so one only has to type | 45 | a 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 |
| 47 | chapter 4, "Creating a kbuild file for an external module". | 47 | chapter 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 | ||
| 152 | This example shows the actual commands to be executed when building | 152 | This example shows the actual commands to be executed when building |
| 153 | an external module for the currently running kernel. | 153 | an external module for the currently running kernel. |
| 154 | In the example below the distribution is supposed to use the | 154 | In the example below, the distribution is supposed to use the |
| 155 | facility to locate output files for a kernel compile in a different | 155 | facility to locate output files for a kernel compile in a different |
| 156 | directory than the kernel source - but the examples will also work | 156 | directory than the kernel source - but the examples will also work |
| 157 | when the source and the output files are mixed in the same directory. | 157 | when 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 | ||
| 173 | Then to install the module use the following command: | 173 | Then, 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 | ||
| 180 | If one looks closely you will see that this is the same commands as | 180 | If you look closely you will see that this is the same command as |
| 181 | listed before - with the directories spelled out. | 181 | listed before - with the directories spelled out. |
| 182 | 182 | ||
| 183 | The above are rather long commands, and the following chapter | 183 | The 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 | ||
| 311 | Include files are a necessity when a .c file uses something from another .c | 311 | Include files are a necessity when a .c file uses something from other .c |
| 312 | files (not strictly in the sense of .c but if good programming practice is | 312 | files (not strictly in the sense of C, but if good programming practice is |
| 313 | used). Any module that consist of more than one .c file will have a .h file | 313 | used). Any module that consists of more than one .c file will have a .h file |
| 314 | for one of the .c files. | 314 | for 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 | ||
| 325 | External modules have a tendency to locate include files in a separate include/ | 326 | External modules have a tendency to locate include files in a separate include/ |
| 326 | directory and therefore needs to deal with this in their kbuild file. | 327 | directory 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. | |||
| 444 | Module versioning is used as a simple ABI consistency check. The Module | 445 | Module versioning is used as a simple ABI consistency check. The Module |
| 445 | versioning creates a CRC value of the full prototype for an exported symbol and | 446 | versioning creates a CRC value of the full prototype for an exported symbol and |
| 446 | when a module is loaded/used then the CRC values contained in the kernel are | 447 | when a module is loaded/used then the CRC values contained in the kernel are |
| 447 | compared with similar values in the module. If they are not equal then the | 448 | compared with similar values in the module. If they are not equal, then the |
| 448 | kernel refuses to load the module. | 449 | kernel refuses to load the module. |
| 449 | 450 | ||
| 450 | Module.symvers contains a list of all exported symbols from a kernel build. | 451 | Module.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 5a311c38dd1..f9c99c9a54f 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 | |||
| 69 | be recompiled or not. The latter is a fast way to check the whole tree if you | 69 | be recompiled or not. The latter is a fast way to check the whole tree if you |
| 70 | have already built it. | 70 | have already built it. |
| 71 | 71 | ||
| 72 | The optional make variable CF can be used to pass arguments to sparse. The | 72 | The optional make variable CHECKFLAGS can be used to pass arguments to sparse. |
| 73 | build system passes -Wbitwise to sparse automatically. To perform endianness | 73 | The build system passes -Wbitwise to sparse automatically. To perform |
| 74 | checks, you may define __CHECK_ENDIAN__: | 74 | endianness 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 | ||
| 78 | These checks are disabled by default as they generate a host of warnings. | 78 | These checks are disabled by default as they generate a host of warnings. |
| @@ -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 ""; \ |
| @@ -41,9 +41,15 @@ ifndef KBUILD_VERBOSE | |||
| 41 | KBUILD_VERBOSE = 0 | 41 | KBUILD_VERBOSE = 0 |
| 42 | endif | 42 | endif |
| 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 | ||
| 48 | ifdef C | 54 | ifdef 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) |
| 650 | endef | 656 | endef |
| @@ -677,12 +683,12 @@ endif | |||
| 677 | kallsyms.o := .tmp_kallsyms$(last_kallsyms).o | 683 | kallsyms.o := .tmp_kallsyms$(last_kallsyms).o |
| 678 | 684 | ||
| 679 | define verify_kallsyms | 685 | define 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 ) |
| 687 | endef | 693 | endef |
| 688 | 694 | ||
| @@ -736,6 +742,7 @@ endif # ifdef CONFIG_KALLSYMS | |||
| 736 | # vmlinux image - including updated kernel symbols | 742 | # vmlinux image - including updated kernel symbols |
| 737 | vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE | 743 | vmlinux: $(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 | ||
| 763 | nullstring := | 792 | nullstring := |
| 764 | space := $(nullstring) # end of line | 793 | space := $(nullstring) # end of line |
| @@ -893,14 +922,14 @@ INSTALL_HDR_PATH=$(objtree)/usr | |||
| 893 | export INSTALL_HDR_PATH | 922 | export INSTALL_HDR_PATH |
| 894 | 923 | ||
| 895 | PHONY += headers_install | 924 | PHONY += headers_install |
| 896 | headers_install: include/linux/version.h | 925 | headers_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 | ||
| 901 | PHONY += headers_check | 930 | PHONY += headers_check |
| 902 | headers_check: headers_install | 931 | headers_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 | |||
| 916 | PHONY += modules | 945 | PHONY += modules |
| 917 | modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux) | 946 | modules: $(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 | ||
| 1058 | help: | 1087 | help: |
| 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 | ||
| 1155 | modules: $(module-dirs) | 1187 | modules: $(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 | ||
| 1159 | PHONY += modules_install | 1191 | PHONY += modules_install |
| 1160 | modules_install: _emodinst_ _emodinst_post | 1192 | modules_install: _emodinst_ _emodinst_post |
| @@ -1163,7 +1195,7 @@ install-dir := $(if $(INSTALL_MOD_DIR),$(INSTALL_MOD_DIR),extra) | |||
| 1163 | PHONY += _emodinst_ | 1195 | PHONY += _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 |
| 1169 | quiet_cmd_depmod = DEPMOD $(KERNELRELEASE) | 1201 | quiet_cmd_depmod = DEPMOD $(KERNELRELEASE) |
| @@ -1264,6 +1296,31 @@ define all-defconfigs | |||
| 1264 | $(call find-sources,'defconfig') | 1296 | $(call find-sources,'defconfig') |
| 1265 | endef | 1297 | endef |
| 1266 | 1298 | ||
| 1299 | define 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 | ||
| 1322 | endef | ||
| 1323 | |||
| 1267 | quiet_cmd_cscope-file = FILELST cscope.files | 1324 | quiet_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 | |||
| 1277 | quiet_cmd_TAGS = MAKE $@ | 1334 | quiet_cmd_TAGS = MAKE $@ |
| 1278 | define cmd_TAGS | 1335 | define 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 | ||
| 1291 | endef | 1338 | endef |
| 1292 | 1339 | ||
| 1293 | TAGS: FORCE | 1340 | TAGS: FORCE |
| 1294 | $(call cmd,TAGS) | 1341 | $(call cmd,TAGS) |
| 1295 | 1342 | ||
| 1296 | |||
| 1297 | quiet_cmd_tags = MAKE $@ | 1343 | quiet_cmd_tags = MAKE $@ |
| 1298 | define cmd_tags | 1344 | define 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 | ||
| 1305 | endef | 1347 | endef |
| 1306 | 1348 | ||
| 1307 | tags: FORCE | 1349 | tags: 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 bb19c1561f1..3d523899fdc 100644 --- a/scripts/Kbuild.include +++ b/scripts/Kbuild.include | |||
| @@ -8,9 +8,13 @@ empty := | |||
| 8 | space := $(empty) $(empty) | 8 | space := $(empty) $(empty) |
| 9 | 9 | ||
| 10 | ### | 10 | ### |
| 11 | # Name of target with a '.' as filename prefix. foo/bar.o => foo/.bar.o | ||
| 12 | dot-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 |
| 13 | depfile = $(subst $(comma),_,$(@D)/.$(@F).d) | 17 | depfile = $(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))) | |||
| 119 | ifneq ($(KBUILD_NOCMDDEP),1) | 123 | ifneq ($(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 |
| 122 | arg-check = $(strip $(filter-out $(1), $(2)) $(filter-out $(2), $(1)) ) | 126 | arg-check = $(strip $(filter-out $(cmd_$(1)), $(cmd_$@)) \ |
| 127 | $(filter-out $(cmd_$@), $(cmd_$(1))) ) | ||
| 123 | endif | 128 | endif |
| 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 |
| 126 | echo-cmd = $(if $($(quiet)cmd_$(1)), \ | 131 | echo-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 | ||
| 129 | make-cmd = $(subst \#,\\\#,$(subst $$,$$$$,$(call escsq,$(cmd_$(1))))) | 138 | make-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 | 142 | any-prereq = $(filter-out $(PHONY),$?) $(filter-out $(PHONY) $(wildcard $^),$^) |
| 143 | |||
| 144 | # Execute command if command has changed or prerequisitei(s) are updated | ||
| 134 | # | 145 | # |
| 135 | if_changed = $(if $(strip $(filter-out $(PHONY),$?) \ | 146 | if_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 |
| 143 | if_changed_dep = $(if $(strip $(filter-out $(PHONY),$?) \ | 153 | if_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) |
| 155 | if_changed_rule = $(if $(strip $(filter-out $(PHONY),$?) \ | 163 | if_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 | ||
| 186 | ifeq ($(KBUILD_VERBOSE),2) | ||
| 187 | why = \ | ||
| 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 | |||
| 204 | echo-why = $(call escsq, $(strip $(why))) | ||
| 205 | endif | ||
diff --git a/scripts/Makefile b/scripts/Makefile index 6f6b48f39f0..ea41de8fb7f 100644 --- a/scripts/Makefile +++ b/scripts/Makefile | |||
| @@ -15,8 +15,11 @@ hostprogs-$(CONFIG_IKCONFIG) += bin2c | |||
| 15 | 15 | ||
| 16 | always := $(hostprogs-y) | 16 | always := $(hostprogs-y) |
| 17 | 17 | ||
| 18 | # The following hostprogs-y programs are only build on demand | ||
| 19 | hostprogs-y += unifdef | ||
| 20 | |||
| 18 | subdir-$(CONFIG_MODVERSIONS) += genksyms | 21 | subdir-$(CONFIG_MODVERSIONS) += genksyms |
| 19 | subdir-$(CONFIG_MODULES) += mod | 22 | subdir-y += mod |
| 20 | 23 | ||
| 21 | # Let clean descend into subdirs | 24 | # Let clean descend into subdirs |
| 22 | subdir- += basic kconfig package | 25 | subdir- += basic kconfig package |
diff --git a/scripts/Makefile.build b/scripts/Makefile.build index 3cb445cc743..e2ad2dccccd 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 |
| 197 | endef | 198 | endef |
| 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 12e1daf875c..8c02d2df427 100644 --- a/scripts/Makefile.headersinst +++ b/scripts/Makefile.headersinst | |||
| @@ -7,7 +7,7 @@ | |||
| 7 | # | 7 | # |
| 8 | # ========================================================================== | 8 | # ========================================================================== |
| 9 | 9 | ||
| 10 | UNIFDEF := unifdef -U__KERNEL__ | 10 | UNIFDEF := 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 |
| 13 | HDRSED := sed -e "s/ inline / __inline__ /g" \ | 13 | HDRSED := sed -e "s/ inline / __inline__ /g" \ |
diff --git a/scripts/Makefile.host b/scripts/Makefile.host index 060f4c563a5..575afbe5e37 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 | ||
| 36 | host-objdirs := $(foreach f,$(__hostprogs), $(if $(dir $(f)),$(dir $(f)))) | ||
| 37 | host-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 |
| 42 | host-csingle := $(foreach m,$(__hostprogs),$(if $($(m)-objs),,$(m))) | 37 | host-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 |
| 66 | host-cshobjs := $(sort $(foreach m,$(host-cshlib),$($(m:.so=-objs)))) | 61 | host-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 | ||
| 65 | host-objdirs := $(foreach f,$(__hostprogs), $(if $(dir $(f)),$(dir $(f)))) | ||
| 66 | # directory of .o files from prog-objs notation | ||
| 67 | host-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 | ||
| 71 | host-objdirs += $(foreach f,$(host-cxxmulti), \ | ||
| 72 | $(foreach m,$($(f)-cxxobjs), \ | ||
| 73 | $(if $(dir $(m)),$(dir $(m))))) | ||
| 74 | |||
| 75 | host-objdirs := $(strip $(sort $(filter-out ./,$(host-objdirs)))) | ||
| 76 | |||
| 77 | |||
| 68 | __hostprogs := $(addprefix $(obj)/,$(__hostprogs)) | 78 | __hostprogs := $(addprefix $(obj)/,$(__hostprogs)) |
| 69 | host-csingle := $(addprefix $(obj)/,$(host-csingle)) | 79 | host-csingle := $(addprefix $(obj)/,$(host-csingle)) |
| 70 | host-cmulti := $(addprefix $(obj)/,$(host-cmulti)) | 80 | host-cmulti := $(addprefix $(obj)/,$(host-cmulti)) |
diff --git a/scripts/Makefile.modpost b/scripts/Makefile.modpost index 0a64688c2b5..4b2721ca97d 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 |
| 54 | quiet_cmd_modpost = MODPOST | 54 | quiet_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 | ||
| 63 | PHONY += __modpost | 64 | PHONY += __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 | ||
| 68 | quiet_cmd_kernel-mod = MODPOST $@ | ||
| 69 | cmd_kernel-mod = $(cmd_modpost) | ||
| 70 | |||
| 71 | vmlinux: 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 e6499db4c8c..a90d3cc76bf 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 a69d8acbf27..69f96b398c2 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 dfde0e87a76..41277963f47 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c | |||
| @@ -23,6 +23,8 @@ int have_vmlinux = 0; | |||
| 23 | static int all_versions = 0; | 23 | static int all_versions = 0; |
| 24 | /* If we are modposting external module set to 1 */ | 24 | /* If we are modposting external module set to 1 */ |
| 25 | static int external_module = 0; | 25 | static int external_module = 0; |
| 26 | /* Only warn about unresolved symbols */ | ||
| 27 | static int warn_unresolved = 0; | ||
| 26 | /* How a symbol is exported */ | 28 | /* How a symbol is exported */ |
| 27 | enum export { | 29 | enum 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 | **/ |
| 584 | static int secref_whitelist(const char *tosec, const char *fromsec, | 586 | static 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 | **/ |
| 1190 | static void add_versions(struct buffer *b, struct module *mod) | 1201 | static 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 | ||
| 1230 | static void add_depends(struct buffer *b, struct module *mod, | 1246 | static 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 df892841b11..ffd61fe0c1a 100755 --- a/scripts/package/mkspec +++ b/scripts/package/mkspec | |||
| @@ -63,9 +63,9 @@ fi | |||
| 63 | 63 | ||
| 64 | echo "%install" | 64 | echo "%install" |
| 65 | echo "%ifarch ia64" | 65 | echo "%ifarch ia64" |
| 66 | echo 'mkdir -p $RPM_BUILD_ROOT/boot/efi $RPM_BUILD_ROOT/lib $RPM_BUILD_ROOT/lib/modules' | 66 | echo 'mkdir -p $RPM_BUILD_ROOT/boot/efi $RPM_BUILD_ROOT/lib/modules' |
| 67 | echo "%else" | 67 | echo "%else" |
| 68 | echo 'mkdir -p $RPM_BUILD_ROOT/boot $RPM_BUILD_ROOT/lib $RPM_BUILD_ROOT/lib/modules' | 68 | echo 'mkdir -p $RPM_BUILD_ROOT/boot $RPM_BUILD_ROOT/lib/modules' |
| 69 | echo "%endif" | 69 | echo "%endif" |
| 70 | 70 | ||
| 71 | echo 'INSTALL_MOD_PATH=$RPM_BUILD_ROOT make %{_smp_mflags} modules_install' | 71 | echo '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 00000000000..552025e72ac --- /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 | ||
| 38 | static 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 | |||
| 75 | size_t strlcpy(char *dst, const char *src, size_t siz); | ||
| 76 | |||
| 77 | /* types of input lines: */ | ||
| 78 | typedef 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 | |||
| 96 | static 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 */ | ||
| 107 | typedef 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 | |||
| 121 | static 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 */ | ||
| 129 | typedef 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 | |||
| 139 | static char const * const comment_name[] = { | ||
| 140 | "NO", "C", "CXX", "STARTING", "FINISHING", "CHAR", "STRING" | ||
| 141 | }; | ||
| 142 | |||
| 143 | /* state of preprocessor line parser */ | ||
| 144 | typedef 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 | |||
| 150 | static 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 | |||
| 171 | static bool complement; /* -c: do the complement */ | ||
| 172 | static bool debugging; /* -d: debugging reports */ | ||
| 173 | static bool iocccok; /* -e: fewer IOCCC errors */ | ||
| 174 | static bool killconsts; /* -k: eval constant #ifs */ | ||
| 175 | static bool lnblank; /* -l: blank deleted lines */ | ||
| 176 | static bool lnnum; /* -n: add #line directives */ | ||
| 177 | static bool symlist; /* -s: output symbol list */ | ||
| 178 | static bool text; /* -t: this is a text file */ | ||
| 179 | |||
| 180 | static const char *symname[MAXSYMS]; /* symbol name */ | ||
| 181 | static const char *value[MAXSYMS]; /* -Dsym=value */ | ||
| 182 | static bool ignore[MAXSYMS]; /* -iDsym or -iUsym */ | ||
| 183 | static int nsyms; /* number of symbols */ | ||
| 184 | |||
| 185 | static FILE *input; /* input file pointer */ | ||
| 186 | static const char *filename; /* input file name */ | ||
| 187 | static int linenum; /* current line number */ | ||
| 188 | |||
| 189 | static char tline[MAXLINE+EDITSLOP];/* input buffer plus space */ | ||
| 190 | static char *keyword; /* used for editing #elif's */ | ||
| 191 | |||
| 192 | static Comment_state incomment; /* comment parser state */ | ||
| 193 | static Line_state linestate; /* #if line parser state */ | ||
| 194 | static Ifstate ifstate[MAXDEPTH]; /* #if processor state */ | ||
| 195 | static bool ignoring[MAXDEPTH]; /* ignore comments state */ | ||
| 196 | static int stifline[MAXDEPTH]; /* start of current #if */ | ||
| 197 | static int depth; /* current #if nesting */ | ||
| 198 | static int delcount; /* count of deleted lines */ | ||
| 199 | static bool keepthis; /* don't delete constant #if */ | ||
| 200 | |||
| 201 | static int exitstat; /* program exit status */ | ||
| 202 | |||
| 203 | static void addsym(bool, bool, char *); | ||
| 204 | static void debug(const char *, ...); | ||
| 205 | static void done(void); | ||
| 206 | static void error(const char *); | ||
| 207 | static int findsym(const char *); | ||
| 208 | static void flushline(bool); | ||
| 209 | static Linetype getline(void); | ||
| 210 | static Linetype ifeval(const char **); | ||
| 211 | static void ignoreoff(void); | ||
| 212 | static void ignoreon(void); | ||
| 213 | static void keywordedit(const char *); | ||
| 214 | static void nest(void); | ||
| 215 | static void process(void); | ||
| 216 | static const char *skipcomment(const char *); | ||
| 217 | static const char *skipsym(const char *); | ||
| 218 | static void state(Ifstate); | ||
| 219 | static int strlcmp(const char *, const char *, size_t); | ||
| 220 | static void unnest(void); | ||
| 221 | static void usage(void); | ||
| 222 | |||
| 223 | #define endsym(c) (!isalpha((unsigned char)c) && !isdigit((unsigned char)c) && c != '_') | ||
| 224 | |||
| 225 | /* | ||
| 226 | * The main program. | ||
| 227 | */ | ||
| 228 | int | ||
| 229 | main(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 | |||
| 302 | static void | ||
| 303 | usage(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 | */ | ||
| 339 | typedef void state_fn(void); | ||
| 340 | |||
| 341 | /* report an error */ | ||
| 342 | static void Eelif (void) { error("Inappropriate #elif"); } | ||
| 343 | static void Eelse (void) { error("Inappropriate #else"); } | ||
| 344 | static void Eendif(void) { error("Inappropriate #endif"); } | ||
| 345 | static void Eeof (void) { error("Premature EOF"); } | ||
| 346 | static void Eioccc(void) { error("Obfuscated preprocessor control line"); } | ||
| 347 | /* plain line handling */ | ||
| 348 | static void print (void) { flushline(true); } | ||
| 349 | static void drop (void) { flushline(false); } | ||
| 350 | /* output lacks group's start line */ | ||
| 351 | static void Strue (void) { drop(); ignoreoff(); state(IS_TRUE_PREFIX); } | ||
| 352 | static void Sfalse(void) { drop(); ignoreoff(); state(IS_FALSE_PREFIX); } | ||
| 353 | static void Selse (void) { drop(); state(IS_TRUE_ELSE); } | ||
| 354 | /* print/pass this block */ | ||
| 355 | static void Pelif (void) { print(); ignoreoff(); state(IS_PASS_MIDDLE); } | ||
| 356 | static void Pelse (void) { print(); state(IS_PASS_ELSE); } | ||
| 357 | static void Pendif(void) { print(); unnest(); } | ||
| 358 | /* discard this block */ | ||
| 359 | static void Dfalse(void) { drop(); ignoreoff(); state(IS_FALSE_TRAILER); } | ||
| 360 | static void Delif (void) { drop(); ignoreoff(); state(IS_FALSE_MIDDLE); } | ||
| 361 | static void Delse (void) { drop(); state(IS_FALSE_ELSE); } | ||
| 362 | static void Dendif(void) { drop(); unnest(); } | ||
| 363 | /* first line of group */ | ||
| 364 | static void Fdrop (void) { nest(); Dfalse(); } | ||
| 365 | static void Fpass (void) { nest(); Pelif(); } | ||
| 366 | static void Ftrue (void) { nest(); Strue(); } | ||
| 367 | static void Ffalse(void) { nest(); Sfalse(); } | ||
| 368 | /* variable pedantry for obfuscated lines */ | ||
| 369 | static void Oiffy (void) { if (!iocccok) Eioccc(); Fpass(); ignoreon(); } | ||
| 370 | static void Oif (void) { if (!iocccok) Eioccc(); Fpass(); } | ||
| 371 | static void Oelif (void) { if (!iocccok) Eioccc(); Pelif(); } | ||
| 372 | /* ignore comments in this block */ | ||
| 373 | static void Idrop (void) { Fdrop(); ignoreon(); } | ||
| 374 | static void Itrue (void) { Ftrue(); ignoreon(); } | ||
| 375 | static void Ifalse(void) { Ffalse(); ignoreon(); } | ||
| 376 | /* edit this line */ | ||
| 377 | static void Mpass (void) { strncpy(keyword, "if ", 4); Pelif(); } | ||
| 378 | static void Mtrue (void) { keywordedit("else\n"); state(IS_TRUE_MIDDLE); } | ||
| 379 | static void Melif (void) { keywordedit("endif\n"); state(IS_FALSE_TRAILER); } | ||
| 380 | static void Melse (void) { keywordedit("endif\n"); state(IS_FALSE_ELSE); } | ||
| 381 | |||
| 382 | static 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 | */ | ||
| 431 | static void | ||
| 432 | done(void) | ||
| 433 | { | ||
| 434 | if (incomment) | ||
| 435 | error("EOF in comment"); | ||
| 436 | exit(exitstat); | ||
| 437 | } | ||
| 438 | static void | ||
| 439 | ignoreoff(void) | ||
| 440 | { | ||
| 441 | if (depth == 0) | ||
| 442 | abort(); /* bug */ | ||
| 443 | ignoring[depth] = ignoring[depth-1]; | ||
| 444 | } | ||
| 445 | static void | ||
| 446 | ignoreon(void) | ||
| 447 | { | ||
| 448 | ignoring[depth] = true; | ||
| 449 | } | ||
| 450 | static void | ||
| 451 | keywordedit(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 | } | ||
| 463 | static void | ||
| 464 | nest(void) | ||
| 465 | { | ||
| 466 | depth += 1; | ||
| 467 | if (depth >= MAXDEPTH) | ||
| 468 | error("Too many levels of nesting"); | ||
| 469 | stifline[depth] = linenum; | ||
| 470 | } | ||
| 471 | static void | ||
| 472 | unnest(void) | ||
| 473 | { | ||
| 474 | if (depth == 0) | ||
| 475 | abort(); /* bug */ | ||
| 476 | depth -= 1; | ||
| 477 | } | ||
| 478 | static void | ||
| 479 | state(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 | */ | ||
| 487 | static void | ||
| 488 | flushline(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 | */ | ||
| 508 | static void | ||
| 509 | process(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 | */ | ||
| 528 | static Linetype | ||
| 529 | getline(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 | */ | ||
| 616 | static int op_lt(int a, int b) { return (a < b); } | ||
| 617 | static int op_gt(int a, int b) { return (a > b); } | ||
| 618 | static int op_le(int a, int b) { return (a <= b); } | ||
| 619 | static int op_ge(int a, int b) { return (a >= b); } | ||
| 620 | static int op_eq(int a, int b) { return (a == b); } | ||
| 621 | static int op_ne(int a, int b) { return (a != b); } | ||
| 622 | static int op_or(int a, int b) { return (a || b); } | ||
| 623 | static 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 | */ | ||
| 635 | struct ops; | ||
| 636 | |||
| 637 | typedef Linetype eval_fn(const struct ops *, int *, const char **); | ||
| 638 | |||
| 639 | static 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 | */ | ||
| 648 | static 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 | */ | ||
| 670 | static Linetype | ||
| 671 | eval_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 | */ | ||
| 738 | static Linetype | ||
| 739 | eval_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 | */ | ||
| 773 | static Linetype | ||
| 774 | ifeval(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 | */ | ||
| 793 | static const char * | ||
| 794 | skipcomment(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 | */ | ||
| 897 | static const char * | ||
| 898 | skipsym(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 | */ | ||
| 909 | static int | ||
| 910 | findsym(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 | */ | ||
| 936 | static void | ||
| 937 | addsym(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 | */ | ||
| 970 | static int | ||
| 971 | strlcmp(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 | */ | ||
| 984 | static void | ||
| 985 | debug(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 | |||
| 996 | static void | ||
| 997 | error(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 5b31c0b61c7..e338e7bedb2 100644 --- a/usr/Makefile +++ b/usr/Makefile | |||
| @@ -3,6 +3,8 @@ | |||
| 3 | # | 3 | # |
| 4 | 4 | ||
| 5 | klibcdirs:; | 5 | klibcdirs:; |
| 6 | PHONY += klibcdirs | ||
| 7 | |||
| 6 | 8 | ||
| 7 | # Generate builtin.o based on initramfs_data.o | 9 | # Generate builtin.o based on initramfs_data.o |
| 8 | obj-y := initramfs_data.o | 10 | obj-y := initramfs_data.o |
