瀏覽代碼

Merge branch 'for-33' of git://repo.or.cz/linux-kbuild

* 'for-33' of git://repo.or.cz/linux-kbuild: (29 commits)
  net: fix for utsrelease.h moving to generated
  gen_init_cpio: fixed fwrite warning
  kbuild: fix make clean after mismerge
  kbuild: generate modules.builtin
  genksyms: properly consider  EXPORT_UNUSED_SYMBOL{,_GPL}()
  score: add asm/asm-offsets.h wrapper
  unifdef: update to upstream revision 1.190
  kbuild: specify absolute paths for cscope
  kbuild: create include/generated in silentoldconfig
  scripts/package: deb-pkg: use fakeroot if available
  scripts/package: add KBUILD_PKG_ROOTCMD variable
  scripts/package: tar-pkg: use tar --owner=root
  Kbuild: clean up marker
  net: add net_tstamp.h to headers_install
  kbuild: move utsrelease.h to include/generated
  kbuild: move autoconf.h to include/generated
  drop explicit include of autoconf.h
  kbuild: move compile.h to include/generated
  kbuild: drop include/asm
  kbuild: do not check for include/asm-$ARCH
  ...

Fixed non-conflicting clean merge of modpost.c as per comments from
Stephen Rothwell (modpost.c had grown an include of linux/autoconf.h
that needed to be changed to generated/autoconf.h)
Linus Torvalds 15 年之前
父節點
當前提交
5a865c0606
共有 90 個文件被更改,包括 556 次插入401 次删除
  1. 1 6
      .gitignore
  2. 1 0
      Documentation/dontdiff
  3. 14 0
      Documentation/kbuild/kbuild.txt
  4. 7 1
      Documentation/kbuild/kconfig.txt
  5. 2 2
      Kbuild
  6. 6 0
      MAINTAINERS
  7. 26 70
      Makefile
  8. 1 1
      arch/alpha/boot/bootp.c
  9. 1 1
      arch/alpha/boot/bootpz.c
  10. 1 1
      arch/alpha/boot/main.c
  11. 1 0
      arch/alpha/include/asm/asm-offsets.h
  12. 2 12
      arch/arm/Makefile
  13. 1 0
      arch/arm/include/asm/asm-offsets.h
  14. 1 0
      arch/arm/include/asm/mach-types.h
  15. 1 1
      arch/arm/tools/Makefile
  16. 1 1
      arch/arm/tools/gen-mach-types
  17. 1 0
      arch/avr32/include/asm/asm-offsets.h
  18. 1 0
      arch/blackfin/include/asm/asm-offsets.h
  19. 0 1
      arch/cris/arch-v32/kernel/head.S
  20. 1 0
      arch/cris/include/asm/asm-offsets.h
  21. 0 1
      arch/cris/kernel/asm-offsets.c
  22. 0 1
      arch/cris/kernel/vmlinux.lds.S
  23. 1 0
      arch/frv/include/asm/asm-offsets.h
  24. 1 1
      arch/frv/kernel/setup.c
  25. 1 0
      arch/h8300/include/asm/asm-offsets.h
  26. 1 1
      arch/ia64/Makefile
  27. 1 0
      arch/ia64/include/asm/asm-offsets.h
  28. 1 1
      arch/ia64/include/asm/irq.h
  29. 2 5
      arch/ia64/kernel/Makefile
  30. 0 1
      arch/ia64/kvm/asm-offsets.c
  31. 1 0
      arch/m68k/include/asm/asm-offsets.h
  32. 1 1
      arch/m68k/kernel/head.S
  33. 1 0
      arch/microblaze/include/asm/asm-offsets.h
  34. 1 0
      arch/mips/include/asm/asm-offsets.h
  35. 1 0
      arch/mn10300/include/asm/asm-offsets.h
  36. 1 0
      arch/parisc/include/asm/asm-offsets.h
  37. 1 0
      arch/powerpc/include/asm/asm-offsets.h
  38. 1 1
      arch/powerpc/platforms/52xx/efika.c
  39. 1 1
      arch/powerpc/platforms/amigaone/setup.c
  40. 2 4
      arch/powerpc/platforms/cell/spufs/Makefile
  41. 1 1
      arch/powerpc/platforms/chrp/setup.c
  42. 1 1
      arch/powerpc/platforms/powermac/bootx_init.c
  43. 1 0
      arch/s390/include/asm/asm-offsets.h
  44. 1 0
      arch/score/include/asm/asm-offsets.h
  45. 3 7
      arch/sh/Makefile
  46. 1 1
      arch/sh/drivers/pci/fixups-rts7751r2d.c
  47. 0 1
      arch/sh/include/asm/.gitignore
  48. 1 0
      arch/sh/include/asm/asm-offsets.h
  49. 1 1
      arch/sh/include/asm/machvec.h
  50. 2 2
      arch/sh/tools/Makefile
  51. 1 1
      arch/sh/tools/gen-mach-types
  52. 1 0
      arch/sparc/include/asm/asm-offsets.h
  53. 1 1
      arch/um/Makefile
  54. 1 0
      arch/um/include/asm/asm-offsets.h
  55. 1 1
      arch/x86/boot/header.S
  56. 2 2
      arch/x86/boot/version.c
  57. 1 0
      arch/x86/include/asm/asm-offsets.h
  58. 1 0
      arch/xtensa/include/asm/asm-offsets.h
  59. 0 1
      drivers/accessibility/braille/braille_console.c
  60. 0 2
      drivers/hid/hid-lg.h
  61. 1 1
      drivers/net/wireless/iwlwifi/iwl-core.h
  62. 0 1
      drivers/platform/x86/compal-laptop.c
  63. 0 1
      drivers/staging/iio/ring_sw.h
  64. 1 1
      drivers/staging/panel/panel.c
  65. 1 0
      include/linux/Kbuild
  66. 0 2
      include/linux/mmdebug.h
  67. 1 1
      include/linux/mmzone.h
  68. 1 1
      include/linux/page-flags.h
  69. 1 1
      include/linux/vermagic.h
  70. 2 6
      init/Makefile
  71. 2 2
      init/version.c
  72. 1 1
      kernel/bounds.c
  73. 1 1
      kernel/kexec.c
  74. 1 1
      kernel/trace/trace.c
  75. 6 0
      scripts/Kbuild.include
  76. 1 1
      scripts/Makefile.lib
  77. 55 0
      scripts/Makefile.modbuiltin
  78. 5 5
      scripts/basic/fixdep.c
  79. 97 94
      scripts/genksyms/keywords.c_shipped
  80. 2 0
      scripts/genksyms/keywords.gperf
  81. 0 2
      scripts/headers.sh
  82. 1 0
      scripts/kconfig/Makefile
  83. 22 2
      scripts/kconfig/confdata.c
  84. 1 1
      scripts/mkcompile_h
  85. 1 1
      scripts/mod/modpost.c
  86. 19 1
      scripts/package/Makefile
  87. 5 1
      scripts/package/buildtar
  88. 7 1
      scripts/tags.sh
  89. 207 134
      scripts/unifdef.c
  90. 4 1
      usr/gen_init_cpio.c

+ 1 - 6
.gitignore

@@ -22,6 +22,7 @@
 *.lst
 *.lst
 *.symtypes
 *.symtypes
 *.order
 *.order
+modules.builtin
 *.elf
 *.elf
 *.bin
 *.bin
 *.gz
 *.gz
@@ -45,14 +46,8 @@ Module.symvers
 #
 #
 # Generated include files
 # Generated include files
 #
 #
-include/asm
-include/asm-*/asm-offsets.h
 include/config
 include/config
-include/linux/autoconf.h
-include/linux/compile.h
 include/linux/version.h
 include/linux/version.h
-include/linux/utsrelease.h
-include/linux/bounds.h
 include/generated
 include/generated
 
 
 # stgit generated dirs
 # stgit generated dirs

+ 1 - 0
Documentation/dontdiff

@@ -103,6 +103,7 @@ gconf
 gen-devlist
 gen-devlist
 gen_crc32table
 gen_crc32table
 gen_init_cpio
 gen_init_cpio
+generated
 genheaders
 genheaders
 genksyms
 genksyms
 *_gray256.c
 *_gray256.c

+ 14 - 0
Documentation/kbuild/kbuild.txt

@@ -1,3 +1,17 @@
+Output files
+
+modules.order
+--------------------------------------------------
+This file records the order in which modules appear in Makefiles. This
+is used by modprobe to deterministically resolve aliases that match
+multiple modules.
+
+modules.builtin
+--------------------------------------------------
+This file lists all modules that are built into the kernel. This is used
+by modprobe to not fail when trying to load something builtin.
+
+
 Environment variables
 Environment variables
 
 
 KCPPFLAGS
 KCPPFLAGS

+ 7 - 1
Documentation/kbuild/kconfig.txt

@@ -103,10 +103,16 @@ KCONFIG_AUTOCONFIG
 This environment variable can be set to specify the path & name of the
 This environment variable can be set to specify the path & name of the
 "auto.conf" file.  Its default value is "include/config/auto.conf".
 "auto.conf" file.  Its default value is "include/config/auto.conf".
 
 
+KCONFIG_TRISTATE
+--------------------------------------------------
+This environment variable can be set to specify the path & name of the
+"tristate.conf" file.  Its default value is "include/config/tristate.conf".
+
 KCONFIG_AUTOHEADER
 KCONFIG_AUTOHEADER
 --------------------------------------------------
 --------------------------------------------------
 This environment variable can be set to specify the path & name of the
 This environment variable can be set to specify the path & name of the
-"autoconf.h" (header) file.  Its default value is "include/linux/autoconf.h".
+"autoconf.h" (header) file.
+Its default value is "include/generated/autoconf.h".
 
 
 
 
 ======================================================================
 ======================================================================

+ 2 - 2
Kbuild

@@ -8,7 +8,7 @@
 #####
 #####
 # 1) Generate bounds.h
 # 1) Generate bounds.h
 
 
-bounds-file := include/linux/bounds.h
+bounds-file := include/generated/bounds.h
 
 
 always  := $(bounds-file)
 always  := $(bounds-file)
 targets := $(bounds-file) kernel/bounds.s
 targets := $(bounds-file) kernel/bounds.s
@@ -43,7 +43,7 @@ $(obj)/$(bounds-file): kernel/bounds.s Kbuild
 # 2) Generate asm-offsets.h
 # 2) Generate asm-offsets.h
 #
 #
 
 
-offsets-file := include/asm/asm-offsets.h
+offsets-file := include/generated/asm-offsets.h
 
 
 always  += $(offsets-file)
 always  += $(offsets-file)
 targets += $(offsets-file)
 targets += $(offsets-file)

+ 6 - 0
MAINTAINERS

@@ -5434,6 +5434,12 @@ F:	drivers/uwb/*
 F:	include/linux/uwb.h
 F:	include/linux/uwb.h
 F:	include/linux/uwb/
 F:	include/linux/uwb/
 
 
+UNIFDEF
+M:	Tony Finch <dot@dotat.at>
+W:	http://dotat.at/prog/unifdef
+S:	Maintained
+F:	scripts/unifdef.c
+
 UNIFORM CDROM DRIVER
 UNIFORM CDROM DRIVER
 M:	Jens Axboe <axboe@kernel.dk>
 M:	Jens Axboe <axboe@kernel.dk>
 W:	http://www.kernel.dk
 W:	http://www.kernel.dk

+ 26 - 70
Makefile

@@ -334,10 +334,9 @@ CFLAGS_GCOV	= -fprofile-arcs -ftest-coverage
 
 
 # Use LINUXINCLUDE when you must reference the include/ directory.
 # Use LINUXINCLUDE when you must reference the include/ directory.
 # Needed to be compatible with the O= option
 # Needed to be compatible with the O= option
-LINUXINCLUDE    := -Iinclude \
-                   $(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include) \
-                   -I$(srctree)/arch/$(hdr-arch)/include               \
-                   -include include/linux/autoconf.h
+LINUXINCLUDE    := -I$(srctree)/arch/$(hdr-arch)/include -Iinclude \
+                   $(if $(KBUILD_SRC), -I$(srctree)/include) \
+                   -include include/generated/autoconf.h
 
 
 KBUILD_CPPFLAGS := -D__KERNEL__
 KBUILD_CPPFLAGS := -D__KERNEL__
 
 
@@ -465,7 +464,7 @@ ifeq ($(KBUILD_EXTMOD),)
 # Carefully list dependencies so we do not try to build scripts twice
 # Carefully list dependencies so we do not try to build scripts twice
 # in parallel
 # in parallel
 PHONY += scripts
 PHONY += scripts
-scripts: scripts_basic include/config/auto.conf
+scripts: scripts_basic include/config/auto.conf include/config/tristate.conf
 	$(Q)$(MAKE) $(build)=$(@)
 	$(Q)$(MAKE) $(build)=$(@)
 
 
 # Objects we will link into vmlinux / subdirs we need to visit
 # Objects we will link into vmlinux / subdirs we need to visit
@@ -492,18 +491,18 @@ $(KCONFIG_CONFIG) include/config/auto.conf.cmd: ;
 # with it and forgot to run make oldconfig.
 # with it and forgot to run make oldconfig.
 # if auto.conf.cmd is missing then we are probably in a cleaned tree so
 # if auto.conf.cmd is missing then we are probably in a cleaned tree so
 # we execute the config step to be sure to catch updated Kconfig files
 # we execute the config step to be sure to catch updated Kconfig files
-include/config/auto.conf: $(KCONFIG_CONFIG) include/config/auto.conf.cmd
+include/config/%.conf: $(KCONFIG_CONFIG) include/config/auto.conf.cmd
 	$(Q)$(MAKE) -f $(srctree)/Makefile silentoldconfig
 	$(Q)$(MAKE) -f $(srctree)/Makefile silentoldconfig
 else
 else
-# external modules needs include/linux/autoconf.h and include/config/auto.conf
+# external modules needs include/generated/autoconf.h and include/config/auto.conf
 # but do not care if they are up-to-date. Use auto.conf to trigger the test
 # but do not care if they are up-to-date. Use auto.conf to trigger the test
 PHONY += include/config/auto.conf
 PHONY += include/config/auto.conf
 
 
 include/config/auto.conf:
 include/config/auto.conf:
-	$(Q)test -e include/linux/autoconf.h -a -e $@ || (		\
+	$(Q)test -e include/generated/autoconf.h -a -e $@ || (		\
 	echo;								\
 	echo;								\
 	echo "  ERROR: Kernel configuration is invalid.";		\
 	echo "  ERROR: Kernel configuration is invalid.";		\
-	echo "         include/linux/autoconf.h or $@ are missing.";	\
+	echo "         include/generated/autoconf.h or $@ are missing.";\
 	echo "         Run 'make oldconfig && make prepare' on kernel src to fix it.";	\
 	echo "         Run 'make oldconfig && make prepare' on kernel src to fix it.";	\
 	echo;								\
 	echo;								\
 	/bin/false)
 	/bin/false)
@@ -877,6 +876,9 @@ $(sort $(vmlinux-init) $(vmlinux-main)) $(vmlinux-lds): $(vmlinux-dirs) ;
 PHONY += $(vmlinux-dirs)
 PHONY += $(vmlinux-dirs)
 $(vmlinux-dirs): prepare scripts
 $(vmlinux-dirs): prepare scripts
 	$(Q)$(MAKE) $(build)=$@
 	$(Q)$(MAKE) $(build)=$@
+ifdef CONFIG_MODULES
+	$(Q)$(MAKE) $(modbuiltin)=$@
+endif
 
 
 # Build the kernel release string
 # Build the kernel release string
 #
 #
@@ -955,7 +957,6 @@ PHONY += prepare archprepare prepare0 prepare1 prepare2 prepare3
 # prepare3 is used to check if we are building in a separate output directory,
 # prepare3 is used to check if we are building in a separate output directory,
 # and if so do:
 # and if so do:
 # 1) Check that make has not been executed in the kernel src $(srctree)
 # 1) Check that make has not been executed in the kernel src $(srctree)
-# 2) Create the include2 directory, used for the second asm symlink
 prepare3: include/config/kernel.release
 prepare3: include/config/kernel.release
 ifneq ($(KBUILD_SRC),)
 ifneq ($(KBUILD_SRC),)
 	@$(kecho) '  Using $(srctree) as source for kernel'
 	@$(kecho) '  Using $(srctree) as source for kernel'
@@ -964,17 +965,13 @@ ifneq ($(KBUILD_SRC),)
 		echo "  in the '$(srctree)' directory.";\
 		echo "  in the '$(srctree)' directory.";\
 		/bin/false; \
 		/bin/false; \
 	fi;
 	fi;
-	$(Q)if [ ! -d include2 ]; then                                  \
-	    mkdir -p include2;                                          \
-	    ln -fsn $(srctree)/include/asm-$(SRCARCH) include2/asm;     \
-	fi
 endif
 endif
 
 
 # prepare2 creates a makefile if using a separate output directory
 # prepare2 creates a makefile if using a separate output directory
 prepare2: prepare3 outputmakefile
 prepare2: prepare3 outputmakefile
 
 
-prepare1: prepare2 include/linux/version.h include/linux/utsrelease.h \
-                   include/asm include/config/auto.conf
+prepare1: prepare2 include/linux/version.h include/generated/utsrelease.h \
+                   include/config/auto.conf
 	$(cmd_crmodverdir)
 	$(cmd_crmodverdir)
 
 
 archprepare: prepare1 scripts_basic
 archprepare: prepare1 scripts_basic
@@ -986,42 +983,6 @@ prepare0: archprepare FORCE
 # All the preparing..
 # All the preparing..
 prepare: prepare0
 prepare: prepare0
 
 
-# The asm symlink changes when $(ARCH) changes.
-# Detect this and ask user to run make mrproper
-# If asm is a stale symlink (point to dir that does not exist) remove it
-define check-symlink
-	set -e;                                                            \
-	if [ -L include/asm ]; then                                        \
-		asmlink=`readlink include/asm | cut -d '-' -f 2`;          \
-		if [ "$$asmlink" != "$(SRCARCH)" ]; then                   \
-			echo "ERROR: the symlink $@ points to asm-$$asmlink but asm-$(SRCARCH) was expected"; \
-			echo "       set ARCH or save .config and run 'make mrproper' to fix it";             \
-			exit 1;                                            \
-		fi;                                                        \
-		test -e $$asmlink || rm include/asm;                       \
-	elif [ -d include/asm ]; then                                      \
-		echo "ERROR: $@ is a directory but a symlink was expected";\
-		exit 1;                                                    \
-	fi
-endef
-
-# We create the target directory of the symlink if it does
-# not exist so the test in check-symlink works and we have a
-# directory for generated filesas used by some architectures.
-define create-symlink
-	if [ ! -L include/asm ]; then                                      \
-			$(kecho) '  SYMLINK $@ -> include/asm-$(SRCARCH)'; \
-			if [ ! -d include/asm-$(SRCARCH) ]; then           \
-				mkdir -p include/asm-$(SRCARCH);           \
-			fi;                                                \
-			ln -fsn asm-$(SRCARCH) $@;                         \
-	fi
-endef
-
-include/asm: FORCE
-	$(Q)$(check-symlink)
-	$(Q)$(create-symlink)
-
 # Generate some files
 # Generate some files
 # ---------------------------------------------------------------------------
 # ---------------------------------------------------------------------------
 
 
@@ -1046,7 +1007,7 @@ endef
 include/linux/version.h: $(srctree)/Makefile FORCE
 include/linux/version.h: $(srctree)/Makefile FORCE
 	$(call filechk,version.h)
 	$(call filechk,version.h)
 
 
-include/linux/utsrelease.h: include/config/kernel.release FORCE
+include/generated/utsrelease.h: include/config/kernel.release FORCE
 	$(call filechk,utsrelease.h)
 	$(call filechk,utsrelease.h)
 
 
 PHONY += headerdep
 PHONY += headerdep
@@ -1076,11 +1037,6 @@ firmware_install: FORCE
 export INSTALL_HDR_PATH = $(objtree)/usr
 export INSTALL_HDR_PATH = $(objtree)/usr
 
 
 hdr-inst := -rR -f $(srctree)/scripts/Makefile.headersinst obj
 hdr-inst := -rR -f $(srctree)/scripts/Makefile.headersinst obj
-# Find out where the Kbuild file is located to support
-# arch/$(ARCH)/include/asm
-hdr-dir = $(strip                                                         \
-          $(if $(wildcard $(srctree)/arch/$(hdr-arch)/include/asm/Kbuild), \
-               arch/$(hdr-arch)/include/asm, include/asm-$(hdr-arch)))
 
 
 # If we do an all arch process set dst to asm-$(hdr-arch)
 # If we do an all arch process set dst to asm-$(hdr-arch)
 hdr-dst = $(if $(KBUILD_HEADERS), dst=include/asm-$(hdr-arch), dst=include/asm)
 hdr-dst = $(if $(KBUILD_HEADERS), dst=include/asm-$(hdr-arch), dst=include/asm)
@@ -1095,10 +1051,10 @@ headers_install_all:
 
 
 PHONY += headers_install
 PHONY += headers_install
 headers_install: __headers
 headers_install: __headers
-	$(if $(wildcard $(srctree)/$(hdr-dir)/Kbuild),, \
+	$(if $(wildcard $(srctree)/arch/$(hdr-arch)/include/asm/Kbuild),, \
 	$(error Headers not exportable for the $(SRCARCH) architecture))
 	$(error Headers not exportable for the $(SRCARCH) architecture))
 	$(Q)$(MAKE) $(hdr-inst)=include
 	$(Q)$(MAKE) $(hdr-inst)=include
-	$(Q)$(MAKE) $(hdr-inst)=$(hdr-dir) $(hdr-dst)
+	$(Q)$(MAKE) $(hdr-inst)=arch/$(hdr-arch)/include/asm $(hdr-dst)
 
 
 PHONY += headers_check_all
 PHONY += headers_check_all
 headers_check_all: headers_install_all
 headers_check_all: headers_install_all
@@ -1107,7 +1063,7 @@ headers_check_all: headers_install_all
 PHONY += headers_check
 PHONY += headers_check
 headers_check: headers_install
 headers_check: headers_install
 	$(Q)$(MAKE) $(hdr-inst)=include HDRCHECK=1
 	$(Q)$(MAKE) $(hdr-inst)=include HDRCHECK=1
-	$(Q)$(MAKE) $(hdr-inst)=$(hdr-dir) $(hdr-dst) HDRCHECK=1
+	$(Q)$(MAKE) $(hdr-inst)=arch/$(hdr-arch)/include/asm $(hdr-dst) HDRCHECK=1
 
 
 # ---------------------------------------------------------------------------
 # ---------------------------------------------------------------------------
 # Modules
 # Modules
@@ -1127,6 +1083,7 @@ all: modules
 PHONY += modules
 PHONY += modules
 modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux)
 modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux)
 	$(Q)$(AWK) '!x[$$0]++' $(vmlinux-dirs:%=$(objtree)/%/modules.order) > $(objtree)/modules.order
 	$(Q)$(AWK) '!x[$$0]++' $(vmlinux-dirs:%=$(objtree)/%/modules.order) > $(objtree)/modules.order
+	$(Q)$(AWK) '!x[$$0]++' $(vmlinux-dirs:%=$(objtree)/%/modules.builtin) > $(objtree)/modules.builtin
 	@$(kecho) '  Building modules, stage 2.';
 	@$(kecho) '  Building modules, stage 2.';
 	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
 	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
 	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.fwinst obj=firmware __fw_modbuild
 	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.fwinst obj=firmware __fw_modbuild
@@ -1156,6 +1113,7 @@ _modinst_:
 		ln -s $(objtree) $(MODLIB)/build ; \
 		ln -s $(objtree) $(MODLIB)/build ; \
 	fi
 	fi
 	@cp -f $(objtree)/modules.order $(MODLIB)/
 	@cp -f $(objtree)/modules.order $(MODLIB)/
+	@cp -f $(objtree)/modules.builtin $(MODLIB)/
 	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modinst
 	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modinst
 
 
 # This depmod is only for convenience to give the initial
 # This depmod is only for convenience to give the initial
@@ -1194,12 +1152,10 @@ CLEAN_FILES +=	vmlinux System.map \
                 .tmp_kallsyms* .tmp_version .tmp_vmlinux* .tmp_System.map
                 .tmp_kallsyms* .tmp_version .tmp_vmlinux* .tmp_System.map
 
 
 # Directories & files removed with 'make mrproper'
 # Directories & files removed with 'make mrproper'
-MRPROPER_DIRS  += include/config include2 usr/include include/generated
-MRPROPER_FILES += .config .config.old include/asm .version .old_version \
-                  include/linux/autoconf.h include/linux/version.h      \
-                  include/linux/utsrelease.h                            \
-                  include/linux/bounds.h include/asm*/asm-offsets.h     \
-		  Module.symvers Module.markers tags TAGS cscope*
+MRPROPER_DIRS  += include/config usr/include include/generated
+MRPROPER_FILES += .config .config.old .version .old_version             \
+                  include/linux/version.h                               \
+		  Module.symvers tags TAGS cscope*
 
 
 # clean - Delete most, but leave enough to build external modules
 # clean - Delete most, but leave enough to build external modules
 #
 #
@@ -1218,7 +1174,7 @@ clean: archclean $(clean-dirs)
 		\( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' \
 		\( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' \
 		-o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \
 		-o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \
 		-o -name '*.symtypes' -o -name 'modules.order' \
 		-o -name '*.symtypes' -o -name 'modules.order' \
-		-o -name 'Module.markers' -o -name '.tmp_*.o.*' \
+		-o -name modules.builtin -o -name '.tmp_*.o.*' \
 		-o -name '*.gcno' \) -type f -print | xargs rm -f
 		-o -name '*.gcno' \) -type f -print | xargs rm -f
 
 
 # mrproper - Delete all generated files, including .config
 # mrproper - Delete all generated files, including .config
@@ -1416,8 +1372,8 @@ $(clean-dirs):
 
 
 clean:	rm-dirs := $(MODVERDIR)
 clean:	rm-dirs := $(MODVERDIR)
 clean: rm-files := $(KBUILD_EXTMOD)/Module.symvers \
 clean: rm-files := $(KBUILD_EXTMOD)/Module.symvers \
-                   $(KBUILD_EXTMOD)/Module.markers \
-                   $(KBUILD_EXTMOD)/modules.order
+                   $(KBUILD_EXTMOD)/modules.order \
+                   $(KBUILD_EXTMOD)/modules.builtin
 clean: $(clean-dirs)
 clean: $(clean-dirs)
 	$(call cmd,rmdirs)
 	$(call cmd,rmdirs)
 	$(call cmd,rmfiles)
 	$(call cmd,rmfiles)

+ 1 - 1
arch/alpha/boot/bootp.c

@@ -9,7 +9,7 @@
  */
  */
 #include <linux/kernel.h>
 #include <linux/kernel.h>
 #include <linux/string.h>
 #include <linux/string.h>
-#include <linux/utsrelease.h>
+#include <generated/utsrelease.h>
 #include <linux/mm.h>
 #include <linux/mm.h>
 
 
 #include <asm/system.h>
 #include <asm/system.h>

+ 1 - 1
arch/alpha/boot/bootpz.c

@@ -11,7 +11,7 @@
  */
  */
 #include <linux/kernel.h>
 #include <linux/kernel.h>
 #include <linux/string.h>
 #include <linux/string.h>
-#include <linux/utsrelease.h>
+#include <generated/utsrelease.h>
 #include <linux/mm.h>
 #include <linux/mm.h>
 
 
 #include <asm/system.h>
 #include <asm/system.h>

+ 1 - 1
arch/alpha/boot/main.c

@@ -7,7 +7,7 @@
  */
  */
 #include <linux/kernel.h>
 #include <linux/kernel.h>
 #include <linux/string.h>
 #include <linux/string.h>
-#include <linux/utsrelease.h>
+#include <generated/utsrelease.h>
 #include <linux/mm.h>
 #include <linux/mm.h>
 
 
 #include <asm/system.h>
 #include <asm/system.h>

+ 1 - 0
arch/alpha/include/asm/asm-offsets.h

@@ -0,0 +1 @@
+#include <generated/asm-offsets.h>

+ 2 - 12
arch/arm/Makefile

@@ -242,15 +242,8 @@ all:	$(KBUILD_IMAGE)
 
 
 boot := arch/arm/boot
 boot := arch/arm/boot
 
 
-#	Update machine arch and proc symlinks if something which affects
-#	them changed.  We use .arch to indicate when they were updated
-#	last, otherwise make uses the target directory mtime.
-
-archprepare: maketools
-
-PHONY += maketools FORCE
-maketools: include/linux/version.h FORCE
-	$(Q)$(MAKE) $(build)=arch/arm/tools include/asm-arm/mach-types.h
+archprepare:
+	$(Q)$(MAKE) $(build)=arch/arm/tools include/generated/mach-types.h
 
 
 # Convert bzImage to zImage
 # Convert bzImage to zImage
 bzImage: zImage
 bzImage: zImage
@@ -261,9 +254,6 @@ zImage Image xipImage bootpImage uImage: vmlinux
 zinstall install: vmlinux
 zinstall install: vmlinux
 	$(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $@
 	$(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $@
 
 
-CLEAN_FILES += include/asm-arm/mach-types.h \
-	       include/asm-arm/arch include/asm-arm/.arch
-
 # We use MRPROPER_FILES and CLEAN_FILES now
 # We use MRPROPER_FILES and CLEAN_FILES now
 archclean:
 archclean:
 	$(Q)$(MAKE) $(clean)=$(boot)
 	$(Q)$(MAKE) $(clean)=$(boot)

+ 1 - 0
arch/arm/include/asm/asm-offsets.h

@@ -0,0 +1 @@
+#include <generated/asm-offsets.h>

+ 1 - 0
arch/arm/include/asm/mach-types.h

@@ -0,0 +1 @@
+#include <generated/mach-types.h>

+ 1 - 1
arch/arm/tools/Makefile

@@ -4,7 +4,7 @@
 # Copyright (C) 2001 Russell King
 # Copyright (C) 2001 Russell King
 #
 #
 
 
-include/asm-arm/mach-types.h: $(src)/gen-mach-types $(src)/mach-types
+include/generated/mach-types.h: $(src)/gen-mach-types $(src)/mach-types
 	@echo '  Generating $@'
 	@echo '  Generating $@'
 	@mkdir -p $(dir $@)
 	@mkdir -p $(dir $@)
 	$(Q)$(AWK) -f $^ > $@ || { rm -f $@; /bin/false; }
 	$(Q)$(AWK) -f $^ > $@ || { rm -f $@; /bin/false; }

+ 1 - 1
arch/arm/tools/gen-mach-types

@@ -1,6 +1,6 @@
 #!/bin/awk
 #!/bin/awk
 #
 #
-# Awk script to generate include/asm-arm/mach-types.h
+# Awk script to generate include/generated/mach-types.h
 #
 #
 BEGIN	{ nr = 0 }
 BEGIN	{ nr = 0 }
 /^#/	{ next }
 /^#/	{ next }

+ 1 - 0
arch/avr32/include/asm/asm-offsets.h

@@ -0,0 +1 @@
+#include <generated/asm-offsets.h>

+ 1 - 0
arch/blackfin/include/asm/asm-offsets.h

@@ -0,0 +1 @@
+#include <generated/asm-offsets.h>

+ 0 - 1
arch/cris/arch-v32/kernel/head.S

@@ -10,7 +10,6 @@
  * The macros found in mmu_defs_asm.h uses the ## concatenation operator, so
  * The macros found in mmu_defs_asm.h uses the ## concatenation operator, so
  * -traditional must not be used when assembling this file.
  * -traditional must not be used when assembling this file.
  */
  */
-#include <linux/autoconf.h>
 #include <arch/memmap.h>
 #include <arch/memmap.h>
 #include <hwregs/reg_rdwr.h>
 #include <hwregs/reg_rdwr.h>
 #include <hwregs/intr_vect.h>
 #include <hwregs/intr_vect.h>

+ 1 - 0
arch/cris/include/asm/asm-offsets.h

@@ -0,0 +1 @@
+#include <generated/asm-offsets.h>

+ 0 - 1
arch/cris/kernel/asm-offsets.c

@@ -1,6 +1,5 @@
 #include <linux/sched.h>
 #include <linux/sched.h>
 #include <asm/thread_info.h>
 #include <asm/thread_info.h>
-#include <linux/autoconf.h>
 
 
 /*
 /*
  * Generate definitions needed by assembly language modules.
  * Generate definitions needed by assembly language modules.

+ 0 - 1
arch/cris/kernel/vmlinux.lds.S

@@ -8,7 +8,6 @@
  * the kernel has booted.
  * the kernel has booted.
  */
  */
 
 
-#include <linux/autoconf.h>
 #include <asm-generic/vmlinux.lds.h>
 #include <asm-generic/vmlinux.lds.h>
 #include <asm/page.h>
 #include <asm/page.h>
 
 

+ 1 - 0
arch/frv/include/asm/asm-offsets.h

@@ -0,0 +1 @@
+#include <generated/asm-offsets.h>

+ 1 - 1
arch/frv/kernel/setup.c

@@ -10,7 +10,7 @@
  * 2 of the License, or (at your option) any later version.
  * 2 of the License, or (at your option) any later version.
  */
  */
 
 
-#include <linux/utsrelease.h>
+#include <generated/utsrelease.h>
 #include <linux/kernel.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
 #include <linux/sched.h>
 #include <linux/delay.h>
 #include <linux/delay.h>

+ 1 - 0
arch/h8300/include/asm/asm-offsets.h

@@ -0,0 +1 @@
+#include <generated/asm-offsets.h>

+ 1 - 1
arch/ia64/Makefile

@@ -103,4 +103,4 @@ archprepare: make_nr_irqs_h FORCE
 PHONY += make_nr_irqs_h FORCE
 PHONY += make_nr_irqs_h FORCE
 
 
 make_nr_irqs_h: FORCE
 make_nr_irqs_h: FORCE
-	$(Q)$(MAKE) $(build)=arch/ia64/kernel include/asm-ia64/nr-irqs.h
+	$(Q)$(MAKE) $(build)=arch/ia64/kernel include/generated/nr-irqs.h

+ 1 - 0
arch/ia64/include/asm/asm-offsets.h

@@ -0,0 +1 @@
+#include <generated/asm-offsets.h>

+ 1 - 1
arch/ia64/include/asm/irq.h

@@ -13,7 +13,7 @@
 
 
 #include <linux/types.h>
 #include <linux/types.h>
 #include <linux/cpumask.h>
 #include <linux/cpumask.h>
-#include <asm-ia64/nr-irqs.h>
+#include <generated/nr-irqs.h>
 
 
 static __inline__ int
 static __inline__ int
 irq_canonicalize (int irq)
 irq_canonicalize (int irq)

+ 2 - 5
arch/ia64/kernel/Makefile

@@ -81,17 +81,14 @@ define cmd_nr_irqs
 endef
 endef
 
 
 # We use internal kbuild rules to avoid the "is up to date" message from make
 # We use internal kbuild rules to avoid the "is up to date" message from make
-arch/$(SRCARCH)/kernel/nr-irqs.s: $(srctree)/arch/$(SRCARCH)/kernel/nr-irqs.c \
-				$(wildcard $(srctree)/include/asm-ia64/*/irq.h)
+arch/$(SRCARCH)/kernel/nr-irqs.s: arch/$(SRCARCH)/kernel/nr-irqs.c
 	$(Q)mkdir -p $(dir $@)
 	$(Q)mkdir -p $(dir $@)
 	$(call if_changed_dep,cc_s_c)
 	$(call if_changed_dep,cc_s_c)
 
 
-include/asm-ia64/nr-irqs.h: arch/$(SRCARCH)/kernel/nr-irqs.s
+include/generated/nr-irqs.h: arch/$(SRCARCH)/kernel/nr-irqs.s
 	$(Q)mkdir -p $(dir $@)
 	$(Q)mkdir -p $(dir $@)
 	$(call cmd,nr_irqs)
 	$(call cmd,nr_irqs)
 
 
-clean-files += $(objtree)/include/asm-ia64/nr-irqs.h
-
 #
 #
 # native ivt.S, entry.S and fsys.S
 # native ivt.S, entry.S and fsys.S
 #
 #

+ 0 - 1
arch/ia64/kvm/asm-offsets.c

@@ -22,7 +22,6 @@
  *
  *
  */
  */
 
 
-#include <linux/autoconf.h>
 #include <linux/kvm_host.h>
 #include <linux/kvm_host.h>
 #include <linux/kbuild.h>
 #include <linux/kbuild.h>
 
 

+ 1 - 0
arch/m68k/include/asm/asm-offsets.h

@@ -0,0 +1 @@
+#include <generated/asm-offsets.h>

+ 1 - 1
arch/m68k/kernel/head.S

@@ -196,7 +196,7 @@
  * for them and trying to understand what they mean.
  * for them and trying to understand what they mean.
  *
  *
  * CONFIG_xxx:	These are the obvious machine configuration defines created
  * CONFIG_xxx:	These are the obvious machine configuration defines created
- * during configuration.  These are defined in include/linux/autoconf.h.
+ * during configuration.  These are defined in autoconf.h.
  *
  *
  * CONSOLE:	There is support for head.S console in this file.  This
  * CONSOLE:	There is support for head.S console in this file.  This
  * console can talk to a Mac frame buffer, but could easily be extrapolated
  * console can talk to a Mac frame buffer, but could easily be extrapolated

+ 1 - 0
arch/microblaze/include/asm/asm-offsets.h

@@ -0,0 +1 @@
+#include <generated/asm-offsets.h>

+ 1 - 0
arch/mips/include/asm/asm-offsets.h

@@ -0,0 +1 @@
+#include <generated/asm-offsets.h>

+ 1 - 0
arch/mn10300/include/asm/asm-offsets.h

@@ -0,0 +1 @@
+#include <generated/asm-offsets.h>

+ 1 - 0
arch/parisc/include/asm/asm-offsets.h

@@ -0,0 +1 @@
+#include <generated/asm-offsets.h>

+ 1 - 0
arch/powerpc/include/asm/asm-offsets.h

@@ -0,0 +1 @@
+#include <generated/asm-offsets.h>

+ 1 - 1
arch/powerpc/platforms/52xx/efika.c

@@ -10,7 +10,7 @@
  */
  */
 
 
 #include <linux/init.h>
 #include <linux/init.h>
-#include <linux/utsrelease.h>
+#include <generated/utsrelease.h>
 #include <linux/pci.h>
 #include <linux/pci.h>
 #include <linux/of.h>
 #include <linux/of.h>
 #include <asm/prom.h>
 #include <asm/prom.h>

+ 1 - 1
arch/powerpc/platforms/amigaone/setup.c

@@ -14,7 +14,7 @@
 
 
 #include <linux/kernel.h>
 #include <linux/kernel.h>
 #include <linux/seq_file.h>
 #include <linux/seq_file.h>
-#include <linux/utsrelease.h>
+#include <generated/utsrelease.h>
 
 
 #include <asm/machdep.h>
 #include <asm/machdep.h>
 #include <asm/cputable.h>
 #include <asm/cputable.h>

+ 2 - 4
arch/powerpc/platforms/cell/spufs/Makefile

@@ -13,10 +13,8 @@ SPU_CC		:= $(SPU_CROSS)gcc
 SPU_AS		:= $(SPU_CROSS)gcc
 SPU_AS		:= $(SPU_CROSS)gcc
 SPU_LD		:= $(SPU_CROSS)ld
 SPU_LD		:= $(SPU_CROSS)ld
 SPU_OBJCOPY	:= $(SPU_CROSS)objcopy
 SPU_OBJCOPY	:= $(SPU_CROSS)objcopy
-SPU_CFLAGS	:= -O2 -Wall -I$(srctree)/include \
-		   -I$(objtree)/include2 -D__KERNEL__
-SPU_AFLAGS	:= -c -D__ASSEMBLY__ -I$(srctree)/include \
-		   -I$(objtree)/include2 -D__KERNEL__
+SPU_CFLAGS	:= -O2 -Wall -I$(srctree)/include -D__KERNEL__
+SPU_AFLAGS	:= -c -D__ASSEMBLY__ -I$(srctree)/include -D__KERNEL__
 SPU_LDFLAGS	:= -N -Ttext=0x0
 SPU_LDFLAGS	:= -N -Ttext=0x0
 
 
 $(obj)/switch.o: $(obj)/spu_save_dump.h $(obj)/spu_restore_dump.h
 $(obj)/switch.o: $(obj)/spu_save_dump.h $(obj)/spu_restore_dump.h

+ 1 - 1
arch/powerpc/platforms/chrp/setup.c

@@ -23,7 +23,7 @@
 #include <linux/reboot.h>
 #include <linux/reboot.h>
 #include <linux/init.h>
 #include <linux/init.h>
 #include <linux/pci.h>
 #include <linux/pci.h>
-#include <linux/utsrelease.h>
+#include <generated/utsrelease.h>
 #include <linux/adb.h>
 #include <linux/adb.h>
 #include <linux/module.h>
 #include <linux/module.h>
 #include <linux/delay.h>
 #include <linux/delay.h>

+ 1 - 1
arch/powerpc/platforms/powermac/bootx_init.c

@@ -12,7 +12,7 @@
 #include <linux/kernel.h>
 #include <linux/kernel.h>
 #include <linux/string.h>
 #include <linux/string.h>
 #include <linux/init.h>
 #include <linux/init.h>
-#include <linux/utsrelease.h>
+#include <generated/utsrelease.h>
 #include <asm/sections.h>
 #include <asm/sections.h>
 #include <asm/prom.h>
 #include <asm/prom.h>
 #include <asm/page.h>
 #include <asm/page.h>

+ 1 - 0
arch/s390/include/asm/asm-offsets.h

@@ -0,0 +1 @@
+#include <generated/asm-offsets.h>

+ 1 - 0
arch/score/include/asm/asm-offsets.h

@@ -0,0 +1 @@
+#include <generated/asm-offsets.h>

+ 3 - 7
arch/sh/Makefile

@@ -205,10 +205,7 @@ libs-$(CONFIG_SUPERH64)		:= arch/sh/lib64/ $(libs-y)
 
 
 BOOT_TARGETS = uImage uImage.bz2 uImage.gz uImage.lzma uImage.srec uImage.bin \
 BOOT_TARGETS = uImage uImage.bz2 uImage.gz uImage.lzma uImage.srec uImage.bin \
 	       zImage vmlinux.srec romImage
 	       zImage vmlinux.srec romImage
-PHONY += maketools $(BOOT_TARGETS) FORCE
-
-maketools:  include/linux/version.h FORCE
-	$(Q)$(MAKE) $(build)=arch/sh/tools include/asm-sh/machtypes.h
+PHONY += $(BOOT_TARGETS)
 
 
 all: $(KBUILD_IMAGE)
 all: $(KBUILD_IMAGE)
 
 
@@ -217,7 +214,8 @@ $(BOOT_TARGETS): vmlinux
 
 
 compressed: zImage
 compressed: zImage
 
 
-archprepare: maketools
+archprepare:
+	$(Q)$(MAKE) $(build)=arch/sh/tools include/generated/machtypes.h
 
 
 archclean:
 archclean:
 	$(Q)$(MAKE) $(clean)=$(boot)
 	$(Q)$(MAKE) $(clean)=$(boot)
@@ -234,5 +232,3 @@ define archhelp
 	@echo '  uImage.bz2	           - Kernel-only image for U-Boot (bzip2)'
 	@echo '  uImage.bz2	           - Kernel-only image for U-Boot (bzip2)'
 	@echo '  uImage.lzma	           - Kernel-only image for U-Boot (lzma)'
 	@echo '  uImage.lzma	           - Kernel-only image for U-Boot (lzma)'
 endef
 endef
-
-CLEAN_FILES += include/asm-sh/machtypes.h

+ 1 - 1
arch/sh/drivers/pci/fixups-rts7751r2d.c

@@ -15,7 +15,7 @@
 #include <mach/lboxre2.h>
 #include <mach/lboxre2.h>
 #include <mach/r2d.h>
 #include <mach/r2d.h>
 #include "pci-sh4.h"
 #include "pci-sh4.h"
-#include <asm/machtypes.h>
+#include <generated/machtypes.h>
 
 
 #define PCIMCR_MRSET_OFF	0xBFFFFFFF
 #define PCIMCR_MRSET_OFF	0xBFFFFFFF
 #define PCIMCR_RFSH_OFF		0xFFFFFFFB
 #define PCIMCR_RFSH_OFF		0xFFFFFFFB

+ 0 - 1
arch/sh/include/asm/.gitignore

@@ -1 +0,0 @@
-machtypes.h

+ 1 - 0
arch/sh/include/asm/asm-offsets.h

@@ -0,0 +1 @@
+#include <generated/asm-offsets.h>

+ 1 - 1
arch/sh/include/asm/machvec.h

@@ -12,7 +12,7 @@
 
 
 #include <linux/types.h>
 #include <linux/types.h>
 #include <linux/time.h>
 #include <linux/time.h>
-#include <asm/machtypes.h>
+#include <generated/machtypes.h>
 
 
 struct sh_machine_vector {
 struct sh_machine_vector {
 	void (*mv_setup)(char **cmdline_p);
 	void (*mv_setup)(char **cmdline_p);

+ 2 - 2
arch/sh/tools/Makefile

@@ -10,7 +10,7 @@
 # Shamelessly cloned from ARM.
 # Shamelessly cloned from ARM.
 #
 #
 
 
-include/asm-sh/machtypes.h: $(src)/gen-mach-types $(src)/mach-types
+include/generated/machtypes.h: $(src)/gen-mach-types $(src)/mach-types
 	@echo '  Generating $@'
 	@echo '  Generating $@'
-	$(Q)if [ ! -d include/asm-sh ]; then mkdir -p include/asm-sh; fi
+	$(Q)mkdir -p $(dir $@)
 	$(Q)$(AWK) -f $^ > $@ || { rm -f $@; /bin/false; }
 	$(Q)$(AWK) -f $^ > $@ || { rm -f $@; /bin/false; }

+ 1 - 1
arch/sh/tools/gen-mach-types

@@ -1,6 +1,6 @@
 #!/bin/awk
 #!/bin/awk
 #
 #
-# Awk script to generate include/asm-sh/machtypes.h
+# Awk script to generate include/generated/machtypes.h
 # Heavily based on arch/arm/tools/gen-mach-types
 # Heavily based on arch/arm/tools/gen-mach-types
 #
 #
 BEGIN	{ nr = 0 }
 BEGIN	{ nr = 0 }

+ 1 - 0
arch/sparc/include/asm/asm-offsets.h

@@ -0,0 +1 @@
+#include <generated/asm-offsets.h>

+ 1 - 1
arch/um/Makefile

@@ -149,6 +149,6 @@ $(SHARED_HEADERS)/user_constants.h: $(ARCH_DIR)/sys-$(SUBARCH)/user-offsets.s
 
 
 $(SHARED_HEADERS)/kern_constants.h:
 $(SHARED_HEADERS)/kern_constants.h:
 	$(Q)mkdir -p $(dir $@)
 	$(Q)mkdir -p $(dir $@)
-	$(Q)echo '#include "../../../../include/asm/asm-offsets.h"' >$@
+	$(Q)echo '#include "../../../../include/generated/asm-offsets.h"' >$@
 
 
 export SUBARCH USER_CFLAGS CFLAGS_NO_HARDENING OS HEADER_ARCH DEV_NULL_PATH
 export SUBARCH USER_CFLAGS CFLAGS_NO_HARDENING OS HEADER_ARCH DEV_NULL_PATH

+ 1 - 0
arch/um/include/asm/asm-offsets.h

@@ -0,0 +1 @@
+#include <generated/asm-offsets.h>

+ 1 - 1
arch/x86/boot/header.S

@@ -16,7 +16,7 @@
  */
  */
 
 
 #include <asm/segment.h>
 #include <asm/segment.h>
-#include <linux/utsrelease.h>
+#include <generated/utsrelease.h>
 #include <asm/boot.h>
 #include <asm/boot.h>
 #include <asm/e820.h>
 #include <asm/e820.h>
 #include <asm/page_types.h>
 #include <asm/page_types.h>

+ 2 - 2
arch/x86/boot/version.c

@@ -13,8 +13,8 @@
  */
  */
 
 
 #include "boot.h"
 #include "boot.h"
-#include <linux/utsrelease.h>
-#include <linux/compile.h>
+#include <generated/utsrelease.h>
+#include <generated/compile.h>
 
 
 const char kernel_version[] =
 const char kernel_version[] =
 	UTS_RELEASE " (" LINUX_COMPILE_BY "@" LINUX_COMPILE_HOST ") "
 	UTS_RELEASE " (" LINUX_COMPILE_BY "@" LINUX_COMPILE_HOST ") "

+ 1 - 0
arch/x86/include/asm/asm-offsets.h

@@ -0,0 +1 @@
+#include <generated/asm-offsets.h>

+ 1 - 0
arch/xtensa/include/asm/asm-offsets.h

@@ -0,0 +1 @@
+#include <generated/asm-offsets.h>

+ 0 - 1
drivers/accessibility/braille/braille_console.c

@@ -21,7 +21,6 @@
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
  */
 
 
-#include <linux/autoconf.h>
 #include <linux/kernel.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/module.h>
 #include <linux/moduleparam.h>
 #include <linux/moduleparam.h>

+ 0 - 2
drivers/hid/hid-lg.h

@@ -1,8 +1,6 @@
 #ifndef __HID_LG_H
 #ifndef __HID_LG_H
 #define __HID_LG_H
 #define __HID_LG_H
 
 
-#include <linux/autoconf.h>
-
 #ifdef CONFIG_LOGITECH_FF
 #ifdef CONFIG_LOGITECH_FF
 int lgff_init(struct hid_device *hdev);
 int lgff_init(struct hid_device *hdev);
 #else
 #else

+ 1 - 1
drivers/net/wireless/iwlwifi/iwl-core.h

@@ -63,7 +63,7 @@
 #ifndef __iwl_core_h__
 #ifndef __iwl_core_h__
 #define __iwl_core_h__
 #define __iwl_core_h__
 
 
-#include <linux/utsrelease.h>
+#include <generated/utsrelease.h>
 
 
 /************************
 /************************
  * forward declarations *
  * forward declarations *

+ 0 - 1
drivers/platform/x86/compal-laptop.c

@@ -51,7 +51,6 @@
 #include <linux/dmi.h>
 #include <linux/dmi.h>
 #include <linux/backlight.h>
 #include <linux/backlight.h>
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>
-#include <linux/autoconf.h>
 
 
 #define COMPAL_DRIVER_VERSION "0.2.6"
 #define COMPAL_DRIVER_VERSION "0.2.6"
 
 

+ 0 - 1
drivers/staging/iio/ring_sw.h

@@ -29,7 +29,6 @@
  * driver requests - some may support multiple options */
  * driver requests - some may support multiple options */
 
 
 
 
-#include <linux/autoconf.h>
 #include "iio.h"
 #include "iio.h"
 #include "ring_generic.h"
 #include "ring_generic.h"
 
 

+ 1 - 1
drivers/staging/panel/panel.c

@@ -55,7 +55,7 @@
 #include <linux/list.h>
 #include <linux/list.h>
 #include <linux/notifier.h>
 #include <linux/notifier.h>
 #include <linux/reboot.h>
 #include <linux/reboot.h>
-#include <linux/utsrelease.h>
+#include <generated/utsrelease.h>
 
 
 #include <linux/io.h>
 #include <linux/io.h>
 #include <asm/uaccess.h>
 #include <asm/uaccess.h>

+ 1 - 0
include/linux/Kbuild

@@ -118,6 +118,7 @@ header-y += mtio.h
 header-y += ncp_no.h
 header-y += ncp_no.h
 header-y += neighbour.h
 header-y += neighbour.h
 header-y += net_dropmon.h
 header-y += net_dropmon.h
+header-y += net_tstamp.h
 header-y += netfilter_arp.h
 header-y += netfilter_arp.h
 header-y += netrom.h
 header-y += netrom.h
 header-y += nfs2.h
 header-y += nfs2.h

+ 0 - 2
include/linux/mmdebug.h

@@ -1,8 +1,6 @@
 #ifndef LINUX_MM_DEBUG_H
 #ifndef LINUX_MM_DEBUG_H
 #define LINUX_MM_DEBUG_H 1
 #define LINUX_MM_DEBUG_H 1
 
 
-#include <linux/autoconf.h>
-
 #ifdef CONFIG_DEBUG_VM
 #ifdef CONFIG_DEBUG_VM
 #define VM_BUG_ON(cond) BUG_ON(cond)
 #define VM_BUG_ON(cond) BUG_ON(cond)
 #else
 #else

+ 1 - 1
include/linux/mmzone.h

@@ -15,7 +15,7 @@
 #include <linux/seqlock.h>
 #include <linux/seqlock.h>
 #include <linux/nodemask.h>
 #include <linux/nodemask.h>
 #include <linux/pageblock-flags.h>
 #include <linux/pageblock-flags.h>
-#include <linux/bounds.h>
+#include <generated/bounds.h>
 #include <asm/atomic.h>
 #include <asm/atomic.h>
 #include <asm/page.h>
 #include <asm/page.h>
 
 

+ 1 - 1
include/linux/page-flags.h

@@ -8,7 +8,7 @@
 #include <linux/types.h>
 #include <linux/types.h>
 #ifndef __GENERATING_BOUNDS_H
 #ifndef __GENERATING_BOUNDS_H
 #include <linux/mm_types.h>
 #include <linux/mm_types.h>
-#include <linux/bounds.h>
+#include <generated/bounds.h>
 #endif /* !__GENERATING_BOUNDS_H */
 #endif /* !__GENERATING_BOUNDS_H */
 
 
 /*
 /*

+ 1 - 1
include/linux/vermagic.h

@@ -1,4 +1,4 @@
-#include <linux/utsrelease.h>
+#include <generated/utsrelease.h>
 #include <linux/module.h>
 #include <linux/module.h>
 
 
 /* Simply sanity version stamp for modules. */
 /* Simply sanity version stamp for modules. */

+ 2 - 6
init/Makefile

@@ -15,12 +15,8 @@ mounts-$(CONFIG_BLK_DEV_RAM)	+= do_mounts_rd.o
 mounts-$(CONFIG_BLK_DEV_INITRD)	+= do_mounts_initrd.o
 mounts-$(CONFIG_BLK_DEV_INITRD)	+= do_mounts_initrd.o
 mounts-$(CONFIG_BLK_DEV_MD)	+= do_mounts_md.o
 mounts-$(CONFIG_BLK_DEV_MD)	+= do_mounts_md.o
 
 
-# files to be removed upon make clean
-clean-files := ../include/linux/compile.h
-
 # dependencies on generated files need to be listed explicitly
 # dependencies on generated files need to be listed explicitly
-
-$(obj)/version.o: include/linux/compile.h
+$(obj)/version.o: include/generated/compile.h
 
 
 # compile.h changes depending on hostname, generation number, etc,
 # compile.h changes depending on hostname, generation number, etc,
 # so we regenerate it always.
 # so we regenerate it always.
@@ -30,7 +26,7 @@ $(obj)/version.o: include/linux/compile.h
        chk_compile.h = :
        chk_compile.h = :
  quiet_chk_compile.h = echo '  CHK     $@'
  quiet_chk_compile.h = echo '  CHK     $@'
 silent_chk_compile.h = :
 silent_chk_compile.h = :
-include/linux/compile.h: FORCE
+include/generated/compile.h: FORCE
 	@$($(quiet)chk_compile.h)
 	@$($(quiet)chk_compile.h)
 	$(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkcompile_h $@ \
 	$(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkcompile_h $@ \
 	"$(UTS_MACHINE)" "$(CONFIG_SMP)" "$(CONFIG_PREEMPT)" "$(CC) $(KBUILD_CFLAGS)"
 	"$(UTS_MACHINE)" "$(CONFIG_SMP)" "$(CONFIG_PREEMPT)" "$(CC) $(KBUILD_CFLAGS)"

+ 2 - 2
init/version.c

@@ -6,11 +6,11 @@
  *  May be freely distributed as part of Linux.
  *  May be freely distributed as part of Linux.
  */
  */
 
 
-#include <linux/compile.h>
+#include <generated/compile.h>
 #include <linux/module.h>
 #include <linux/module.h>
 #include <linux/uts.h>
 #include <linux/uts.h>
 #include <linux/utsname.h>
 #include <linux/utsname.h>
-#include <linux/utsrelease.h>
+#include <generated/utsrelease.h>
 #include <linux/version.h>
 #include <linux/version.h>
 
 
 #ifndef CONFIG_KALLSYMS
 #ifndef CONFIG_KALLSYMS

+ 1 - 1
kernel/bounds.c

@@ -12,7 +12,7 @@
 
 
 void foo(void)
 void foo(void)
 {
 {
-	/* The enum constants to put into include/linux/bounds.h */
+	/* The enum constants to put into include/generated/bounds.h */
 	DEFINE(NR_PAGEFLAGS, __NR_PAGEFLAGS);
 	DEFINE(NR_PAGEFLAGS, __NR_PAGEFLAGS);
 	DEFINE(MAX_NR_ZONES, __MAX_NR_ZONES);
 	DEFINE(MAX_NR_ZONES, __MAX_NR_ZONES);
 	/* End of constants */
 	/* End of constants */

+ 1 - 1
kernel/kexec.c

@@ -21,7 +21,7 @@
 #include <linux/hardirq.h>
 #include <linux/hardirq.h>
 #include <linux/elf.h>
 #include <linux/elf.h>
 #include <linux/elfcore.h>
 #include <linux/elfcore.h>
-#include <linux/utsrelease.h>
+#include <generated/utsrelease.h>
 #include <linux/utsname.h>
 #include <linux/utsname.h>
 #include <linux/numa.h>
 #include <linux/numa.h>
 #include <linux/suspend.h>
 #include <linux/suspend.h>

+ 1 - 1
kernel/trace/trace.c

@@ -12,7 +12,7 @@
  *  Copyright (C) 2004 William Lee Irwin III
  *  Copyright (C) 2004 William Lee Irwin III
  */
  */
 #include <linux/ring_buffer.h>
 #include <linux/ring_buffer.h>
-#include <linux/utsrelease.h>
+#include <generated/utsrelease.h>
 #include <linux/stacktrace.h>
 #include <linux/stacktrace.h>
 #include <linux/writeback.h>
 #include <linux/writeback.h>
 #include <linux/kallsyms.h>
 #include <linux/kallsyms.h>

+ 6 - 0
scripts/Kbuild.include

@@ -149,6 +149,12 @@ ld-option = $(call try-run,\
 # $(Q)$(MAKE) $(build)=dir
 # $(Q)$(MAKE) $(build)=dir
 build := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj
 build := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj
 
 
+###
+# Shorthand for $(Q)$(MAKE) -f scripts/Makefile.modbuiltin obj=
+# Usage:
+# $(Q)$(MAKE) $(modbuiltin)=dir
+modbuiltin := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.modbuiltin obj
+
 # Prefix -I with $(srctree) if it is not an absolute path.
 # Prefix -I with $(srctree) if it is not an absolute path.
 # skip if -I has no parameter
 # skip if -I has no parameter
 addtree = $(if $(patsubst -I%,%,$(1)), \
 addtree = $(if $(patsubst -I%,%,$(1)), \

+ 1 - 1
scripts/Makefile.lib

@@ -213,7 +213,7 @@ cmd_gzip = (cat $(filter-out FORCE,$^) | gzip -f -9 > $@) || \
 
 
 # Bzip2 and LZMA do not include size in file... so we have to fake that;
 # Bzip2 and LZMA do not include size in file... so we have to fake that;
 # append the size as a 32-bit littleendian number as gzip does.
 # append the size as a 32-bit littleendian number as gzip does.
-size_append = /bin/echo -ne $(shell					\
+size_append = printf $(shell						\
 dec_size=0;								\
 dec_size=0;								\
 for F in $1; do								\
 for F in $1; do								\
 	fsize=$$(stat -c "%s" $$F);					\
 	fsize=$$(stat -c "%s" $$F);					\

+ 55 - 0
scripts/Makefile.modbuiltin

@@ -0,0 +1,55 @@
+# ==========================================================================
+# Generating modules.builtin
+# ==========================================================================
+
+src := $(obj)
+
+PHONY := __modbuiltin
+__modbuiltin:
+
+-include include/config/auto.conf
+# tristate.conf sets tristate variables to uppercase 'Y' or 'M'
+# That way, we get the list of built-in modules in obj-Y
+-include include/config/tristate.conf
+
+include scripts/Kbuild.include
+
+# The filename Kbuild has precedence over Makefile
+kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))
+kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile)
+include $(kbuild-file)
+
+include scripts/Makefile.lib
+__subdir-Y     := $(patsubst %/,%,$(filter %/, $(obj-Y)))
+subdir-Y       += $(__subdir-Y)
+subdir-ym      := $(sort $(subdir-y) $(subdir-Y) $(subdir-m))
+subdir-ym      := $(addprefix $(obj)/,$(subdir-ym))
+obj-Y          := $(addprefix $(obj)/,$(obj-Y))
+
+modbuiltin-subdirs := $(patsubst %,%/modules.builtin, $(subdir-ym))
+modbuiltin-mods    := $(filter %.ko, $(obj-Y:.o=.ko))
+modbuiltin-target  := $(obj)/modules.builtin
+
+__modbuiltin: $(modbuiltin-target) $(subdir-ym)
+	@:
+
+$(modbuiltin-target): $(subdir-ym) FORCE
+	$(Q)(for m in $(modbuiltin-mods); do echo kernel/$$m; done;	\
+	cat /dev/null $(modbuiltin-subdirs)) > $@
+
+PHONY += FORCE
+
+FORCE:
+
+# Descending
+# ---------------------------------------------------------------------------
+
+PHONY += $(subdir-ym)
+$(subdir-ym):
+	$(Q)$(MAKE) $(modbuiltin)=$@
+
+
+# Declare the contents of the .PHONY variable as phony.  We keep that
+# information in a variable se we can use it in if_changed and friends.
+
+.PHONY: $(PHONY)

+ 5 - 5
scripts/basic/fixdep.c

@@ -16,15 +16,15 @@
  * tells make when to remake a file.
  * tells make when to remake a file.
  *
  *
  * To use this list as-is however has the drawback that virtually
  * To use this list as-is however has the drawback that virtually
- * every file in the kernel includes <linux/autoconf.h>.
+ * every file in the kernel includes autoconf.h.
  *
  *
- * If the user re-runs make *config, linux/autoconf.h will be
+ * If the user re-runs make *config, autoconf.h will be
  * regenerated.  make notices that and will rebuild every file which
  * regenerated.  make notices that and will rebuild every file which
  * includes autoconf.h, i.e. basically all files. This is extremely
  * includes autoconf.h, i.e. basically all files. This is extremely
  * annoying if the user just changed CONFIG_HIS_DRIVER from n to m.
  * annoying if the user just changed CONFIG_HIS_DRIVER from n to m.
  *
  *
  * So we play the same trick that "mkdep" played before. We replace
  * So we play the same trick that "mkdep" played before. We replace
- * the dependency on linux/autoconf.h by a dependency on every config
+ * the dependency on autoconf.h by a dependency on every config
  * option which is mentioned in any of the listed prequisites.
  * option which is mentioned in any of the listed prequisites.
  *
  *
  * kconfig populates a tree in include/config/ with an empty file
  * kconfig populates a tree in include/config/ with an empty file
@@ -73,7 +73,7 @@
  *   cmd_<target> = <cmdline>
  *   cmd_<target> = <cmdline>
  *
  *
  * and then basically copies the .<target>.d file to stdout, in the
  * and then basically copies the .<target>.d file to stdout, in the
- * process filtering out the dependency on linux/autoconf.h and adding
+ * process filtering out the dependency on autoconf.h and adding
  * dependencies on include/config/my/option.h for every
  * dependencies on include/config/my/option.h for every
  * CONFIG_MY_OPTION encountered in any of the prequisites.
  * CONFIG_MY_OPTION encountered in any of the prequisites.
  *
  *
@@ -324,7 +324,7 @@ static void parse_dep_file(void *map, size_t len)
 			p++;
 			p++;
 		}
 		}
 		memcpy(s, m, p-m); s[p-m] = 0;
 		memcpy(s, m, p-m); s[p-m] = 0;
-		if (strrcmp(s, "include/linux/autoconf.h") &&
+		if (strrcmp(s, "include/generated/autoconf.h") &&
 		    strrcmp(s, "arch/um/include/uml-config.h") &&
 		    strrcmp(s, "arch/um/include/uml-config.h") &&
 		    strrcmp(s, ".ver")) {
 		    strrcmp(s, ".ver")) {
 			printf("  %s \\\n", s);
 			printf("  %s \\\n", s);

+ 97 - 94
scripts/genksyms/keywords.c_shipped

@@ -1,4 +1,4 @@
-/* ANSI-C code produced by gperf version 3.0.3 */
+/* ANSI-C code produced by gperf version 3.0.4 */
 /* Command-line: gperf -L ANSI-C -a -C -E -g -H is_reserved_hash -k '1,3,$' -N is_reserved_word -p -t scripts/genksyms/keywords.gperf  */
 /* Command-line: gperf -L ANSI-C -a -C -E -g -H is_reserved_hash -k '1,3,$' -N is_reserved_word -p -t scripts/genksyms/keywords.gperf  */
 
 
 #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
 #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
@@ -34,7 +34,7 @@ struct resword;
 static const struct resword *is_reserved_word(register const char *str, register unsigned int len);
 static const struct resword *is_reserved_word(register const char *str, register unsigned int len);
 #line 5 "scripts/genksyms/keywords.gperf"
 #line 5 "scripts/genksyms/keywords.gperf"
 struct resword { const char *name; int token; };
 struct resword { const char *name; int token; };
-/* maximum key range = 62, duplicates = 0 */
+/* maximum key range = 64, duplicates = 0 */
 
 
 #ifdef __GNUC__
 #ifdef __GNUC__
 __inline
 __inline
@@ -48,39 +48,39 @@ is_reserved_hash (register const char *str, register unsigned int len)
 {
 {
   static const unsigned char asso_values[] =
   static const unsigned char asso_values[] =
     {
     {
-      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
-      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
-      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
-      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
-      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
-      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
-      65, 65, 65, 65, 65, 65, 65, 65, 65,  5,
-      65, 65, 65, 65, 65, 65, 35, 65, 65, 65,
-       0, 65, 65, 65, 65, 65, 65, 65, 65, 65,
-      65, 65, 65, 65, 65,  0, 65,  0, 65,  5,
-      20, 15, 10, 30, 65, 15, 65, 65, 20,  0,
-      10, 35, 20, 65, 10,  5,  0, 10,  5, 65,
-      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
-      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
-      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
-      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
-      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
-      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
-      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
-      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
-      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
-      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
-      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
-      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
-      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
-      65, 65, 65, 65, 65, 65
+      67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
+      67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
+      67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
+      67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
+      67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
+      67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
+      67, 67, 67, 67, 67, 67, 67, 67, 67,  0,
+      67, 67, 67, 67, 67, 67, 15, 67, 67, 67,
+       0, 67, 67, 67, 67, 67, 67, 67, 67, 67,
+      67, 67, 67, 67, 67,  0, 67,  0, 67,  5,
+      25, 20, 15, 30, 67, 15, 67, 67, 10,  0,
+      10, 40, 20, 67, 10,  5,  0, 10, 15, 67,
+      67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
+      67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
+      67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
+      67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
+      67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
+      67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
+      67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
+      67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
+      67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
+      67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
+      67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
+      67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
+      67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
+      67, 67, 67, 67, 67, 67
     };
     };
   return len + asso_values[(unsigned char)str[2]] + asso_values[(unsigned char)str[0]] + asso_values[(unsigned char)str[len - 1]];
   return len + asso_values[(unsigned char)str[2]] + asso_values[(unsigned char)str[0]] + asso_values[(unsigned char)str[len - 1]];
 }
 }
 
 
 #ifdef __GNUC__
 #ifdef __GNUC__
 __inline
 __inline
-#ifdef __GNUC_STDC_INLINE__
+#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
 __attribute__ ((__gnu_inline__))
 __attribute__ ((__gnu_inline__))
 #endif
 #endif
 #endif
 #endif
@@ -89,116 +89,119 @@ is_reserved_word (register const char *str, register unsigned int len)
 {
 {
   enum
   enum
     {
     {
-      TOTAL_KEYWORDS = 43,
+      TOTAL_KEYWORDS = 45,
       MIN_WORD_LENGTH = 3,
       MIN_WORD_LENGTH = 3,
       MAX_WORD_LENGTH = 24,
       MAX_WORD_LENGTH = 24,
       MIN_HASH_VALUE = 3,
       MIN_HASH_VALUE = 3,
-      MAX_HASH_VALUE = 64
+      MAX_HASH_VALUE = 66
     };
     };
 
 
   static const struct resword wordlist[] =
   static const struct resword wordlist[] =
     {
     {
       {""}, {""}, {""},
       {""}, {""}, {""},
-#line 28 "scripts/genksyms/keywords.gperf"
+#line 30 "scripts/genksyms/keywords.gperf"
       {"asm", ASM_KEYW},
       {"asm", ASM_KEYW},
       {""},
       {""},
-#line 10 "scripts/genksyms/keywords.gperf"
+#line 12 "scripts/genksyms/keywords.gperf"
       {"__asm", ASM_KEYW},
       {"__asm", ASM_KEYW},
       {""},
       {""},
-#line 11 "scripts/genksyms/keywords.gperf"
+#line 13 "scripts/genksyms/keywords.gperf"
       {"__asm__", ASM_KEYW},
       {"__asm__", ASM_KEYW},
       {""}, {""},
       {""}, {""},
-#line 54 "scripts/genksyms/keywords.gperf"
+#line 56 "scripts/genksyms/keywords.gperf"
       {"__typeof__", TYPEOF_KEYW},
       {"__typeof__", TYPEOF_KEYW},
       {""},
       {""},
-#line 14 "scripts/genksyms/keywords.gperf"
+#line 16 "scripts/genksyms/keywords.gperf"
       {"__const", CONST_KEYW},
       {"__const", CONST_KEYW},
-#line 13 "scripts/genksyms/keywords.gperf"
-      {"__attribute__", ATTRIBUTE_KEYW},
 #line 15 "scripts/genksyms/keywords.gperf"
 #line 15 "scripts/genksyms/keywords.gperf"
+      {"__attribute__", ATTRIBUTE_KEYW},
+#line 17 "scripts/genksyms/keywords.gperf"
       {"__const__", CONST_KEYW},
       {"__const__", CONST_KEYW},
-#line 20 "scripts/genksyms/keywords.gperf"
+#line 22 "scripts/genksyms/keywords.gperf"
       {"__signed__", SIGNED_KEYW},
       {"__signed__", SIGNED_KEYW},
-#line 46 "scripts/genksyms/keywords.gperf"
+#line 48 "scripts/genksyms/keywords.gperf"
       {"static", STATIC_KEYW},
       {"static", STATIC_KEYW},
-#line 22 "scripts/genksyms/keywords.gperf"
-      {"__volatile__", VOLATILE_KEYW},
-#line 41 "scripts/genksyms/keywords.gperf"
+      {""},
+#line 43 "scripts/genksyms/keywords.gperf"
       {"int", INT_KEYW},
       {"int", INT_KEYW},
-#line 34 "scripts/genksyms/keywords.gperf"
+#line 36 "scripts/genksyms/keywords.gperf"
       {"char", CHAR_KEYW},
       {"char", CHAR_KEYW},
-#line 35 "scripts/genksyms/keywords.gperf"
+#line 37 "scripts/genksyms/keywords.gperf"
       {"const", CONST_KEYW},
       {"const", CONST_KEYW},
-#line 47 "scripts/genksyms/keywords.gperf"
+#line 49 "scripts/genksyms/keywords.gperf"
       {"struct", STRUCT_KEYW},
       {"struct", STRUCT_KEYW},
-#line 26 "scripts/genksyms/keywords.gperf"
+#line 28 "scripts/genksyms/keywords.gperf"
       {"__restrict__", RESTRICT_KEYW},
       {"__restrict__", RESTRICT_KEYW},
-#line 27 "scripts/genksyms/keywords.gperf"
+#line 29 "scripts/genksyms/keywords.gperf"
       {"restrict", RESTRICT_KEYW},
       {"restrict", RESTRICT_KEYW},
-#line 25 "scripts/genksyms/keywords.gperf"
-      {"_restrict", RESTRICT_KEYW},
-#line 18 "scripts/genksyms/keywords.gperf"
+#line 9 "scripts/genksyms/keywords.gperf"
+      {"EXPORT_SYMBOL_GPL_FUTURE", EXPORT_SYMBOL_KEYW},
+#line 20 "scripts/genksyms/keywords.gperf"
       {"__inline__", INLINE_KEYW},
       {"__inline__", INLINE_KEYW},
-#line 12 "scripts/genksyms/keywords.gperf"
-      {"__attribute", ATTRIBUTE_KEYW},
       {""},
       {""},
-#line 16 "scripts/genksyms/keywords.gperf"
+#line 24 "scripts/genksyms/keywords.gperf"
+      {"__volatile__", VOLATILE_KEYW},
+#line 7 "scripts/genksyms/keywords.gperf"
+      {"EXPORT_SYMBOL", EXPORT_SYMBOL_KEYW},
+#line 27 "scripts/genksyms/keywords.gperf"
+      {"_restrict", RESTRICT_KEYW},
+      {""},
+#line 14 "scripts/genksyms/keywords.gperf"
+      {"__attribute", ATTRIBUTE_KEYW},
+#line 8 "scripts/genksyms/keywords.gperf"
+      {"EXPORT_SYMBOL_GPL", EXPORT_SYMBOL_KEYW},
+#line 18 "scripts/genksyms/keywords.gperf"
       {"__extension__", EXTENSION_KEYW},
       {"__extension__", EXTENSION_KEYW},
-#line 37 "scripts/genksyms/keywords.gperf"
+#line 39 "scripts/genksyms/keywords.gperf"
       {"enum", ENUM_KEYW},
       {"enum", ENUM_KEYW},
-#line 21 "scripts/genksyms/keywords.gperf"
-      {"__volatile", VOLATILE_KEYW},
-#line 38 "scripts/genksyms/keywords.gperf"
+#line 10 "scripts/genksyms/keywords.gperf"
+      {"EXPORT_UNUSED_SYMBOL", EXPORT_SYMBOL_KEYW},
+#line 40 "scripts/genksyms/keywords.gperf"
       {"extern", EXTERN_KEYW},
       {"extern", EXTERN_KEYW},
       {""},
       {""},
-#line 19 "scripts/genksyms/keywords.gperf"
+#line 21 "scripts/genksyms/keywords.gperf"
       {"__signed", SIGNED_KEYW},
       {"__signed", SIGNED_KEYW},
-#line 9 "scripts/genksyms/keywords.gperf"
-      {"EXPORT_SYMBOL_GPL_FUTURE", EXPORT_SYMBOL_KEYW},
-      {""},
-#line 53 "scripts/genksyms/keywords.gperf"
+#line 11 "scripts/genksyms/keywords.gperf"
+      {"EXPORT_UNUSED_SYMBOL_GPL", EXPORT_SYMBOL_KEYW},
+#line 51 "scripts/genksyms/keywords.gperf"
+      {"union", UNION_KEYW},
+#line 55 "scripts/genksyms/keywords.gperf"
       {"typeof", TYPEOF_KEYW},
       {"typeof", TYPEOF_KEYW},
-#line 48 "scripts/genksyms/keywords.gperf"
+#line 50 "scripts/genksyms/keywords.gperf"
       {"typedef", TYPEDEF_KEYW},
       {"typedef", TYPEDEF_KEYW},
-#line 17 "scripts/genksyms/keywords.gperf"
+#line 19 "scripts/genksyms/keywords.gperf"
       {"__inline", INLINE_KEYW},
       {"__inline", INLINE_KEYW},
-#line 33 "scripts/genksyms/keywords.gperf"
+#line 35 "scripts/genksyms/keywords.gperf"
       {"auto", AUTO_KEYW},
       {"auto", AUTO_KEYW},
-#line 49 "scripts/genksyms/keywords.gperf"
-      {"union", UNION_KEYW},
-      {""}, {""},
-#line 50 "scripts/genksyms/keywords.gperf"
-      {"unsigned", UNSIGNED_KEYW},
-#line 51 "scripts/genksyms/keywords.gperf"
-      {"void", VOID_KEYW},
-#line 44 "scripts/genksyms/keywords.gperf"
-      {"short", SHORT_KEYW},
+#line 23 "scripts/genksyms/keywords.gperf"
+      {"__volatile", VOLATILE_KEYW},
       {""}, {""},
       {""}, {""},
 #line 52 "scripts/genksyms/keywords.gperf"
 #line 52 "scripts/genksyms/keywords.gperf"
-      {"volatile", VOLATILE_KEYW},
-      {""},
-#line 39 "scripts/genksyms/keywords.gperf"
-      {"float", FLOAT_KEYW},
-#line 36 "scripts/genksyms/keywords.gperf"
-      {"double", DOUBLE_KEYW},
+      {"unsigned", UNSIGNED_KEYW},
       {""},
       {""},
-#line 7 "scripts/genksyms/keywords.gperf"
-      {"EXPORT_SYMBOL", EXPORT_SYMBOL_KEYW},
-      {""}, {""},
-#line 40 "scripts/genksyms/keywords.gperf"
+#line 46 "scripts/genksyms/keywords.gperf"
+      {"short", SHORT_KEYW},
+#line 42 "scripts/genksyms/keywords.gperf"
       {"inline", INLINE_KEYW},
       {"inline", INLINE_KEYW},
-#line 8 "scripts/genksyms/keywords.gperf"
-      {"EXPORT_SYMBOL_GPL", EXPORT_SYMBOL_KEYW},
-#line 43 "scripts/genksyms/keywords.gperf"
-      {"register", REGISTER_KEYW},
       {""},
       {""},
-#line 24 "scripts/genksyms/keywords.gperf"
+#line 54 "scripts/genksyms/keywords.gperf"
+      {"volatile", VOLATILE_KEYW},
+#line 44 "scripts/genksyms/keywords.gperf"
+      {"long", LONG_KEYW},
+#line 26 "scripts/genksyms/keywords.gperf"
       {"_Bool", BOOL_KEYW},
       {"_Bool", BOOL_KEYW},
-#line 45 "scripts/genksyms/keywords.gperf"
-      {"signed", SIGNED_KEYW},
       {""}, {""},
       {""}, {""},
-#line 42 "scripts/genksyms/keywords.gperf"
-      {"long", LONG_KEYW}
+#line 45 "scripts/genksyms/keywords.gperf"
+      {"register", REGISTER_KEYW},
+#line 53 "scripts/genksyms/keywords.gperf"
+      {"void", VOID_KEYW},
+#line 41 "scripts/genksyms/keywords.gperf"
+      {"float", FLOAT_KEYW},
+#line 38 "scripts/genksyms/keywords.gperf"
+      {"double", DOUBLE_KEYW},
+      {""}, {""}, {""}, {""},
+#line 47 "scripts/genksyms/keywords.gperf"
+      {"signed", SIGNED_KEYW}
     };
     };
 
 
   if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
   if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)

+ 2 - 0
scripts/genksyms/keywords.gperf

@@ -7,6 +7,8 @@ struct resword { const char *name; int token; }
 EXPORT_SYMBOL, EXPORT_SYMBOL_KEYW
 EXPORT_SYMBOL, EXPORT_SYMBOL_KEYW
 EXPORT_SYMBOL_GPL, EXPORT_SYMBOL_KEYW
 EXPORT_SYMBOL_GPL, EXPORT_SYMBOL_KEYW
 EXPORT_SYMBOL_GPL_FUTURE, EXPORT_SYMBOL_KEYW
 EXPORT_SYMBOL_GPL_FUTURE, EXPORT_SYMBOL_KEYW
+EXPORT_UNUSED_SYMBOL, EXPORT_SYMBOL_KEYW
+EXPORT_UNUSED_SYMBOL_GPL, EXPORT_SYMBOL_KEYW
 __asm, ASM_KEYW
 __asm, ASM_KEYW
 __asm__, ASM_KEYW
 __asm__, ASM_KEYW
 __attribute, ATTRIBUTE_KEYW
 __attribute, ATTRIBUTE_KEYW

+ 0 - 2
scripts/headers.sh

@@ -8,8 +8,6 @@ do_command()
 {
 {
 	if [ -f ${srctree}/arch/$2/include/asm/Kbuild ]; then
 	if [ -f ${srctree}/arch/$2/include/asm/Kbuild ]; then
 		make ARCH=$2 KBUILD_HEADERS=$1 headers_$1
 		make ARCH=$2 KBUILD_HEADERS=$1 headers_$1
-	elif [ -f ${srctree}/include/asm-$2/Kbuild ]; then
-		make ARCH=$2 KBUILD_HEADERS=$1 headers_$1
 	else
 	else
 		printf "Ignoring arch: %s\n" ${arch}
 		printf "Ignoring arch: %s\n" ${arch}
 	fi
 	fi

+ 1 - 0
scripts/kconfig/Makefile

@@ -27,6 +27,7 @@ oldconfig: $(obj)/conf
 	$< -o $(Kconfig)
 	$< -o $(Kconfig)
 
 
 silentoldconfig: $(obj)/conf
 silentoldconfig: $(obj)/conf
+	$(Q)mkdir -p include/generated
 	$< -s $(Kconfig)
 	$< -s $(Kconfig)
 
 
 localmodconfig: $(obj)/streamline_config.pl $(obj)/conf
 localmodconfig: $(obj)/streamline_config.pl $(obj)/conf

+ 22 - 2
scripts/kconfig/confdata.c

@@ -677,7 +677,7 @@ int conf_write_autoconf(void)
 	struct symbol *sym;
 	struct symbol *sym;
 	const char *str;
 	const char *str;
 	const char *name;
 	const char *name;
-	FILE *out, *out_h;
+	FILE *out, *tristate, *out_h;
 	time_t now;
 	time_t now;
 	int i, l;
 	int i, l;
 
 
@@ -692,9 +692,16 @@ int conf_write_autoconf(void)
 	if (!out)
 	if (!out)
 		return 1;
 		return 1;
 
 
+	tristate = fopen(".tmpconfig_tristate", "w");
+	if (!tristate) {
+		fclose(out);
+		return 1;
+	}
+
 	out_h = fopen(".tmpconfig.h", "w");
 	out_h = fopen(".tmpconfig.h", "w");
 	if (!out_h) {
 	if (!out_h) {
 		fclose(out);
 		fclose(out);
+		fclose(tristate);
 		return 1;
 		return 1;
 	}
 	}
 
 
@@ -707,6 +714,9 @@ int conf_write_autoconf(void)
 		     "# %s"
 		     "# %s"
 		     "#\n",
 		     "#\n",
 		     sym_get_string_value(sym), ctime(&now));
 		     sym_get_string_value(sym), ctime(&now));
+	fprintf(tristate, "#\n"
+			  "# Automatically generated - do not edit\n"
+			  "\n");
 	fprintf(out_h, "/*\n"
 	fprintf(out_h, "/*\n"
 		       " * Automatically generated C config: don't edit\n"
 		       " * Automatically generated C config: don't edit\n"
 		       " * Linux kernel version: %s\n"
 		       " * Linux kernel version: %s\n"
@@ -727,10 +737,14 @@ int conf_write_autoconf(void)
 				break;
 				break;
 			case mod:
 			case mod:
 				fprintf(out, "CONFIG_%s=m\n", sym->name);
 				fprintf(out, "CONFIG_%s=m\n", sym->name);
+				fprintf(tristate, "CONFIG_%s=M\n", sym->name);
 				fprintf(out_h, "#define CONFIG_%s_MODULE 1\n", sym->name);
 				fprintf(out_h, "#define CONFIG_%s_MODULE 1\n", sym->name);
 				break;
 				break;
 			case yes:
 			case yes:
 				fprintf(out, "CONFIG_%s=y\n", sym->name);
 				fprintf(out, "CONFIG_%s=y\n", sym->name);
+				if (sym->type == S_TRISTATE)
+					fprintf(tristate, "CONFIG_%s=Y\n",
+							sym->name);
 				fprintf(out_h, "#define CONFIG_%s 1\n", sym->name);
 				fprintf(out_h, "#define CONFIG_%s 1\n", sym->name);
 				break;
 				break;
 			}
 			}
@@ -772,13 +786,19 @@ int conf_write_autoconf(void)
 		}
 		}
 	}
 	}
 	fclose(out);
 	fclose(out);
+	fclose(tristate);
 	fclose(out_h);
 	fclose(out_h);
 
 
 	name = getenv("KCONFIG_AUTOHEADER");
 	name = getenv("KCONFIG_AUTOHEADER");
 	if (!name)
 	if (!name)
-		name = "include/linux/autoconf.h";
+		name = "include/generated/autoconf.h";
 	if (rename(".tmpconfig.h", name))
 	if (rename(".tmpconfig.h", name))
 		return 1;
 		return 1;
+	name = getenv("KCONFIG_TRISTATE");
+	if (!name)
+		name = "include/config/tristate.conf";
+	if (rename(".tmpconfig_tristate", name))
+		return 1;
 	name = conf_get_autoconfig_name();
 	name = conf_get_autoconfig_name();
 	/*
 	/*
 	 * This must be the last step, kbuild has a dependency on auto.conf
 	 * This must be the last step, kbuild has a dependency on auto.conf

+ 1 - 1
scripts/mkcompile_h

@@ -14,7 +14,7 @@ vecho() { [ "${quiet}" = "silent_" ] || echo "$@" ; }
 # So "sudo make install" won't change the "compiled by <user>"
 # So "sudo make install" won't change the "compiled by <user>"
 # do "compiled by root"
 # do "compiled by root"
 
 
-if [ -r $TARGET -a ! -O include/linux/autoconf.h ]; then
+if [ -r $TARGET -a ! -O include/generated/autoconf.h ]; then
   vecho "  SKIPPED $TARGET"
   vecho "  SKIPPED $TARGET"
   exit 0
   exit 0
 fi
 fi

+ 1 - 1
scripts/mod/modpost.c

@@ -15,7 +15,7 @@
 #include <stdio.h>
 #include <stdio.h>
 #include <ctype.h>
 #include <ctype.h>
 #include "modpost.h"
 #include "modpost.h"
-#include "../../include/linux/autoconf.h"
+#include "../../include/generated/autoconf.h"
 #include "../../include/linux/license.h"
 #include "../../include/linux/license.h"
 
 
 /* Some toolchains use a `_' prefix for all user symbols. */
 /* Some toolchains use a `_' prefix for all user symbols. */

+ 19 - 1
scripts/package/Makefile

@@ -77,9 +77,27 @@ clean-files += $(objtree)/binkernel.spec
 
 
 # Deb target
 # Deb target
 # ---------------------------------------------------------------------------
 # ---------------------------------------------------------------------------
+quiet_cmd_builddeb = BUILDDEB
+      cmd_builddeb = set -e; \
+	test `id -u` = 0 || \
+	test -n "$(KBUILD_PKG_ROOTCMD)" || { \
+		which fakeroot >/dev/null 2>&1 && \
+		KBUILD_PKG_ROOTCMD="fakeroot -u"; \
+	} || { \
+		echo; \
+		echo "builddeb must be run as root (or using fakeroot)."; \
+		echo "KBUILD_PKG_ROOTCMD is unset and fakeroot not found."; \
+		echo "Try setting KBUILD_PKG_ROOTCMD to a command to acquire"; \
+		echo "root privileges (e.g., 'fakeroot -u' or 'sudo')."; \
+		false; \
+	} && \
+	\
+	$$KBUILD_PKG_ROOTCMD $(CONFIG_SHELL) \
+		$(srctree)/scripts/package/builddeb
+
 deb-pkg: FORCE
 deb-pkg: FORCE
 	$(MAKE) KBUILD_SRC=
 	$(MAKE) KBUILD_SRC=
-	$(CONFIG_SHELL) $(srctree)/scripts/package/builddeb
+	$(call cmd,builddeb)
 
 
 clean-dirs += $(objtree)/debian/
 clean-dirs += $(objtree)/debian/
 
 

+ 5 - 1
scripts/package/buildtar

@@ -101,7 +101,11 @@ esac
 #
 #
 (
 (
 	cd "${tmpdir}"
 	cd "${tmpdir}"
-	tar cf - . | ${compress} > "${tarball}${file_ext}"
+	opts=
+	if tar --owner=root --group=root --help >/dev/null 2>&1; then
+		opts="--owner=root --group=root"
+	fi
+	tar cf - . $opts | ${compress} > "${tarball}${file_ext}"
 )
 )
 
 
 echo "Tarball successfully created in ${tarball}${file_ext}"
 echo "Tarball successfully created in ${tarball}${file_ext}"

+ 7 - 1
scripts/tags.sh

@@ -89,7 +89,13 @@ all_defconfigs()
 
 
 docscope()
 docscope()
 {
 {
-	(echo \-k; echo \-q; all_sources) > cscope.files
+	# always use absolute paths for cscope, as recommended by cscope
+	# upstream
+	case "$tree" in
+		/*) ;;
+		*) tree=$PWD/$tree ;;
+	esac
+	(cd /; echo \-k; echo \-q; all_sources) > cscope.files
 	cscope -b -f cscope.out
 	cscope -b -f cscope.out
 }
 }
 
 

+ 207 - 134
scripts/unifdef.c

@@ -1,13 +1,5 @@
 /*
 /*
- * Copyright (c) 2002 - 2005 Tony Finch <dot@dotat.at>.  All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by Dave Yost.
- * It was rewritten to support ANSI C by Tony Finch. The original version of
- * unifdef carried the following copyright notice. None of its code remains
- * in this version (though some of the names remain).
- *
- * Copyright (c) 1985, 1993
- *	The Regents of the University of California.  All rights reserved.
+ * Copyright (c) 2002 - 2009 Tony Finch <dot@dotat.at>
  *
  *
  * Redistribution and use in source and binary forms, with or without
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * modification, are permitted provided that the following conditions
@@ -31,23 +23,20 @@
  * SUCH DAMAGE.
  * SUCH DAMAGE.
  */
  */
 
 
-#include <sys/cdefs.h>
+/*
+ * This code was derived from software contributed to Berkeley by Dave Yost.
+ * It was rewritten to support ANSI C by Tony Finch. The original version
+ * of unifdef carried the 4-clause BSD copyright licence. None of its code
+ * remains in this version (though some of the names remain) so it now
+ * carries a more liberal licence.
+ *
+ * The latest version is available from http://dotat.at/prog/unifdef
+ */
 
 
-#ifndef lint
-#if 0
-static const char copyright[] =
-"@(#) Copyright (c) 1985, 1993\n\
-	The Regents of the University of California.  All rights reserved.\n";
-#endif
-#ifdef __IDSTRING
-__IDSTRING(Berkeley, "@(#)unifdef.c	8.1 (Berkeley) 6/6/93");
-__IDSTRING(NetBSD, "$NetBSD: unifdef.c,v 1.8 2000/07/03 02:51:36 matt Exp $");
-__IDSTRING(dotat, "$dotat: things/unifdef.c,v 1.171 2005/03/08 12:38:48 fanf2 Exp $");
-#endif
-#endif /* not lint */
-#ifdef __FBSDID
-__FBSDID("$FreeBSD: /repoman/r/ncvs/src/usr.bin/unifdef/unifdef.c,v 1.20 2005/05/21 09:55:09 ru Exp $");
-#endif
+static const char * const copyright[] = {
+    "@(#) Copyright (c) 2002 - 2009 Tony Finch <dot@dotat.at>\n",
+    "$dotat: unifdef/unifdef.c,v 1.190 2009/11/27 17:21:26 fanf2 Exp $",
+};
 
 
 /*
 /*
  * unifdef - remove ifdef'ed lines
  * unifdef - remove ifdef'ed lines
@@ -72,8 +61,6 @@ __FBSDID("$FreeBSD: /repoman/r/ncvs/src/usr.bin/unifdef/unifdef.c,v 1.20 2005/05
 #include <string.h>
 #include <string.h>
 #include <unistd.h>
 #include <unistd.h>
 
 
-size_t strlcpy(char *dst, const char *src, size_t siz);
-
 /* types of input lines: */
 /* types of input lines: */
 typedef enum {
 typedef enum {
 	LT_TRUEI,		/* a true #if with ignore flag */
 	LT_TRUEI,		/* a true #if with ignore flag */
@@ -90,6 +77,7 @@ typedef enum {
 	LT_DODGY_LAST = LT_DODGY + LT_ENDIF,
 	LT_DODGY_LAST = LT_DODGY + LT_ENDIF,
 	LT_PLAIN,		/* ordinary line */
 	LT_PLAIN,		/* ordinary line */
 	LT_EOF,			/* end of file */
 	LT_EOF,			/* end of file */
+	LT_ERROR,		/* unevaluable #if */
 	LT_COUNT
 	LT_COUNT
 } Linetype;
 } Linetype;
 
 
@@ -100,7 +88,7 @@ static char const * const linetype_name[] = {
 	"DODGY IF", "DODGY TRUE", "DODGY FALSE",
 	"DODGY IF", "DODGY TRUE", "DODGY FALSE",
 	"DODGY ELIF", "DODGY ELTRUE", "DODGY ELFALSE",
 	"DODGY ELIF", "DODGY ELTRUE", "DODGY ELFALSE",
 	"DODGY ELSE", "DODGY ENDIF",
 	"DODGY ELSE", "DODGY ENDIF",
-	"PLAIN", "EOF"
+	"PLAIN", "EOF", "ERROR"
 };
 };
 
 
 /* state of #if processing */
 /* state of #if processing */
@@ -168,11 +156,13 @@ static char const * const linestate_name[] = {
  * Globals.
  * Globals.
  */
  */
 
 
+static bool             compblank;		/* -B: compress blank lines */
+static bool             lnblank;		/* -b: blank deleted lines */
 static bool             complement;		/* -c: do the complement */
 static bool             complement;		/* -c: do the complement */
 static bool             debugging;		/* -d: debugging reports */
 static bool             debugging;		/* -d: debugging reports */
 static bool             iocccok;		/* -e: fewer IOCCC errors */
 static bool             iocccok;		/* -e: fewer IOCCC errors */
+static bool             strictlogic;		/* -K: keep ambiguous #ifs */
 static bool             killconsts;		/* -k: eval constant #ifs */
 static bool             killconsts;		/* -k: eval constant #ifs */
-static bool             lnblank;		/* -l: blank deleted lines */
 static bool             lnnum;			/* -n: add #line directives */
 static bool             lnnum;			/* -n: add #line directives */
 static bool             symlist;		/* -s: output symbol list */
 static bool             symlist;		/* -s: output symbol list */
 static bool             text;			/* -t: this is a text file */
 static bool             text;			/* -t: this is a text file */
@@ -196,7 +186,9 @@ static bool             ignoring[MAXDEPTH];	/* ignore comments state */
 static int              stifline[MAXDEPTH];	/* start of current #if */
 static int              stifline[MAXDEPTH];	/* start of current #if */
 static int              depth;			/* current #if nesting */
 static int              depth;			/* current #if nesting */
 static int              delcount;		/* count of deleted lines */
 static int              delcount;		/* count of deleted lines */
-static bool             keepthis;		/* don't delete constant #if */
+static unsigned         blankcount;		/* count of blank lines */
+static unsigned         blankmax;		/* maximum recent blankcount */
+static bool             constexpr;		/* constant #if expression */
 
 
 static int              exitstat;		/* program exit status */
 static int              exitstat;		/* program exit status */
 
 
@@ -206,13 +198,14 @@ static void             done(void);
 static void             error(const char *);
 static void             error(const char *);
 static int              findsym(const char *);
 static int              findsym(const char *);
 static void             flushline(bool);
 static void             flushline(bool);
-static Linetype         get_line(void);
+static Linetype         parseline(void);
 static Linetype         ifeval(const char **);
 static Linetype         ifeval(const char **);
 static void             ignoreoff(void);
 static void             ignoreoff(void);
 static void             ignoreon(void);
 static void             ignoreon(void);
 static void             keywordedit(const char *);
 static void             keywordedit(const char *);
 static void             nest(void);
 static void             nest(void);
 static void             process(void);
 static void             process(void);
+static const char      *skipargs(const char *);
 static const char      *skipcomment(const char *);
 static const char      *skipcomment(const char *);
 static const char      *skipsym(const char *);
 static const char      *skipsym(const char *);
 static void             state(Ifstate);
 static void             state(Ifstate);
@@ -220,7 +213,7 @@ static int              strlcmp(const char *, const char *, size_t);
 static void             unnest(void);
 static void             unnest(void);
 static void             usage(void);
 static void             usage(void);
 
 
-#define endsym(c) (!isalpha((unsigned char)c) && !isdigit((unsigned char)c) && c != '_')
+#define endsym(c) (!isalnum((unsigned char)c) && c != '_')
 
 
 /*
 /*
  * The main program.
  * The main program.
@@ -230,7 +223,7 @@ main(int argc, char *argv[])
 {
 {
 	int opt;
 	int opt;
 
 
-	while ((opt = getopt(argc, argv, "i:D:U:I:cdeklnst")) != -1)
+	while ((opt = getopt(argc, argv, "i:D:U:I:BbcdeKklnst")) != -1)
 		switch (opt) {
 		switch (opt) {
 		case 'i': /* treat stuff controlled by these symbols as text */
 		case 'i': /* treat stuff controlled by these symbols as text */
 			/*
 			/*
@@ -255,6 +248,13 @@ main(int argc, char *argv[])
 		case 'I':
 		case 'I':
 			/* no-op for compatibility with cpp */
 			/* no-op for compatibility with cpp */
 			break;
 			break;
+		case 'B': /* compress blank lines around removed section */
+			compblank = true;
+			break;
+		case 'b': /* blank deleted lines instead of omitting them */
+		case 'l': /* backwards compatibility */
+			lnblank = true;
+			break;
 		case 'c': /* treat -D as -U and vice versa */
 		case 'c': /* treat -D as -U and vice versa */
 			complement = true;
 			complement = true;
 			break;
 			break;
@@ -264,12 +264,12 @@ main(int argc, char *argv[])
 		case 'e': /* fewer errors from dodgy lines */
 		case 'e': /* fewer errors from dodgy lines */
 			iocccok = true;
 			iocccok = true;
 			break;
 			break;
+		case 'K': /* keep ambiguous #ifs */
+			strictlogic = true;
+			break;
 		case 'k': /* process constant #ifs */
 		case 'k': /* process constant #ifs */
 			killconsts = true;
 			killconsts = true;
 			break;
 			break;
-		case 'l': /* blank deleted lines instead of omitting them */
-			lnblank = true;
-			break;
 		case 'n': /* add #line directive after deleted lines */
 		case 'n': /* add #line directive after deleted lines */
 			lnnum = true;
 			lnnum = true;
 			break;
 			break;
@@ -284,6 +284,8 @@ main(int argc, char *argv[])
 		}
 		}
 	argc -= optind;
 	argc -= optind;
 	argv += optind;
 	argv += optind;
+	if (compblank && lnblank)
+		errx(2, "-B and -b are mutually exclusive");
 	if (argc > 1) {
 	if (argc > 1) {
 		errx(2, "can only do one file");
 		errx(2, "can only do one file");
 	} else if (argc == 1 && strcmp(*argv, "-") != 0) {
 	} else if (argc == 1 && strcmp(*argv, "-") != 0) {
@@ -302,7 +304,7 @@ main(int argc, char *argv[])
 static void
 static void
 usage(void)
 usage(void)
 {
 {
-	fprintf(stderr, "usage: unifdef [-cdeklnst] [-Ipath]"
+	fprintf(stderr, "usage: unifdef [-BbcdeKknst] [-Ipath]"
 	    " [-Dsym[=val]] [-Usym] [-iDsym[=val]] [-iUsym] ... [file]\n");
 	    " [-Dsym[=val]] [-Usym] [-iDsym[=val]] [-iUsym] ... [file]\n");
 	exit(2);
 	exit(2);
 }
 }
@@ -383,46 +385,46 @@ static state_fn * const trans_table[IS_COUNT][LT_COUNT] = {
 /* IS_OUTSIDE */
 /* IS_OUTSIDE */
 { Itrue, Ifalse,Fpass, Ftrue, Ffalse,Eelif, Eelif, Eelif, Eelse, Eendif,
 { Itrue, Ifalse,Fpass, Ftrue, Ffalse,Eelif, Eelif, Eelif, Eelse, Eendif,
   Oiffy, Oiffy, Fpass, Oif,   Oif,   Eelif, Eelif, Eelif, Eelse, Eendif,
   Oiffy, Oiffy, Fpass, Oif,   Oif,   Eelif, Eelif, Eelif, Eelse, Eendif,
-  print, done },
+  print, done,  abort },
 /* IS_FALSE_PREFIX */
 /* IS_FALSE_PREFIX */
 { Idrop, Idrop, Fdrop, Fdrop, Fdrop, Mpass, Strue, Sfalse,Selse, Dendif,
 { Idrop, Idrop, Fdrop, Fdrop, Fdrop, Mpass, Strue, Sfalse,Selse, Dendif,
   Idrop, Idrop, Fdrop, Fdrop, Fdrop, Mpass, Eioccc,Eioccc,Eioccc,Eioccc,
   Idrop, Idrop, Fdrop, Fdrop, Fdrop, Mpass, Eioccc,Eioccc,Eioccc,Eioccc,
-  drop,  Eeof },
+  drop,  Eeof,  abort },
 /* IS_TRUE_PREFIX */
 /* IS_TRUE_PREFIX */
 { Itrue, Ifalse,Fpass, Ftrue, Ffalse,Dfalse,Dfalse,Dfalse,Delse, Dendif,
 { Itrue, Ifalse,Fpass, Ftrue, Ffalse,Dfalse,Dfalse,Dfalse,Delse, Dendif,
   Oiffy, Oiffy, Fpass, Oif,   Oif,   Eioccc,Eioccc,Eioccc,Eioccc,Eioccc,
   Oiffy, Oiffy, Fpass, Oif,   Oif,   Eioccc,Eioccc,Eioccc,Eioccc,Eioccc,
-  print, Eeof },
+  print, Eeof,  abort },
 /* IS_PASS_MIDDLE */
 /* IS_PASS_MIDDLE */
 { Itrue, Ifalse,Fpass, Ftrue, Ffalse,Pelif, Mtrue, Delif, Pelse, Pendif,
 { Itrue, Ifalse,Fpass, Ftrue, Ffalse,Pelif, Mtrue, Delif, Pelse, Pendif,
   Oiffy, Oiffy, Fpass, Oif,   Oif,   Pelif, Oelif, Oelif, Pelse, Pendif,
   Oiffy, Oiffy, Fpass, Oif,   Oif,   Pelif, Oelif, Oelif, Pelse, Pendif,
-  print, Eeof },
+  print, Eeof,  abort },
 /* IS_FALSE_MIDDLE */
 /* IS_FALSE_MIDDLE */
 { Idrop, Idrop, Fdrop, Fdrop, Fdrop, Pelif, Mtrue, Delif, Pelse, Pendif,
 { Idrop, Idrop, Fdrop, Fdrop, Fdrop, Pelif, Mtrue, Delif, Pelse, Pendif,
   Idrop, Idrop, Fdrop, Fdrop, Fdrop, Eioccc,Eioccc,Eioccc,Eioccc,Eioccc,
   Idrop, Idrop, Fdrop, Fdrop, Fdrop, Eioccc,Eioccc,Eioccc,Eioccc,Eioccc,
-  drop,  Eeof },
+  drop,  Eeof,  abort },
 /* IS_TRUE_MIDDLE */
 /* IS_TRUE_MIDDLE */
 { Itrue, Ifalse,Fpass, Ftrue, Ffalse,Melif, Melif, Melif, Melse, Pendif,
 { Itrue, Ifalse,Fpass, Ftrue, Ffalse,Melif, Melif, Melif, Melse, Pendif,
   Oiffy, Oiffy, Fpass, Oif,   Oif,   Eioccc,Eioccc,Eioccc,Eioccc,Pendif,
   Oiffy, Oiffy, Fpass, Oif,   Oif,   Eioccc,Eioccc,Eioccc,Eioccc,Pendif,
-  print, Eeof },
+  print, Eeof,  abort },
 /* IS_PASS_ELSE */
 /* IS_PASS_ELSE */
 { Itrue, Ifalse,Fpass, Ftrue, Ffalse,Eelif, Eelif, Eelif, Eelse, Pendif,
 { Itrue, Ifalse,Fpass, Ftrue, Ffalse,Eelif, Eelif, Eelif, Eelse, Pendif,
   Oiffy, Oiffy, Fpass, Oif,   Oif,   Eelif, Eelif, Eelif, Eelse, Pendif,
   Oiffy, Oiffy, Fpass, Oif,   Oif,   Eelif, Eelif, Eelif, Eelse, Pendif,
-  print, Eeof },
+  print, Eeof,  abort },
 /* IS_FALSE_ELSE */
 /* IS_FALSE_ELSE */
 { Idrop, Idrop, Fdrop, Fdrop, Fdrop, Eelif, Eelif, Eelif, Eelse, Dendif,
 { Idrop, Idrop, Fdrop, Fdrop, Fdrop, Eelif, Eelif, Eelif, Eelse, Dendif,
   Idrop, Idrop, Fdrop, Fdrop, Fdrop, Eelif, Eelif, Eelif, Eelse, Eioccc,
   Idrop, Idrop, Fdrop, Fdrop, Fdrop, Eelif, Eelif, Eelif, Eelse, Eioccc,
-  drop,  Eeof },
+  drop,  Eeof,  abort },
 /* IS_TRUE_ELSE */
 /* IS_TRUE_ELSE */
 { Itrue, Ifalse,Fpass, Ftrue, Ffalse,Eelif, Eelif, Eelif, Eelse, Dendif,
 { Itrue, Ifalse,Fpass, Ftrue, Ffalse,Eelif, Eelif, Eelif, Eelse, Dendif,
   Oiffy, Oiffy, Fpass, Oif,   Oif,   Eelif, Eelif, Eelif, Eelse, Eioccc,
   Oiffy, Oiffy, Fpass, Oif,   Oif,   Eelif, Eelif, Eelif, Eelse, Eioccc,
-  print, Eeof },
+  print, Eeof,  abort },
 /* IS_FALSE_TRAILER */
 /* IS_FALSE_TRAILER */
 { Idrop, Idrop, Fdrop, Fdrop, Fdrop, Dfalse,Dfalse,Dfalse,Delse, Dendif,
 { Idrop, Idrop, Fdrop, Fdrop, Fdrop, Dfalse,Dfalse,Dfalse,Delse, Dendif,
   Idrop, Idrop, Fdrop, Fdrop, Fdrop, Dfalse,Dfalse,Dfalse,Delse, Eioccc,
   Idrop, Idrop, Fdrop, Fdrop, Fdrop, Dfalse,Dfalse,Dfalse,Delse, Eioccc,
-  drop,  Eeof }
+  drop,  Eeof,  abort }
 /*TRUEI  FALSEI IF     TRUE   FALSE  ELIF   ELTRUE ELFALSE ELSE  ENDIF
 /*TRUEI  FALSEI IF     TRUE   FALSE  ELIF   ELTRUE ELFALSE ELSE  ENDIF
   TRUEI  FALSEI IF     TRUE   FALSE  ELIF   ELTRUE ELFALSE ELSE  ENDIF (DODGY)
   TRUEI  FALSEI IF     TRUE   FALSE  ELIF   ELTRUE ELFALSE ELSE  ENDIF (DODGY)
-  PLAIN  EOF */
+  PLAIN  EOF    ERROR */
 };
 };
 
 
 /*
 /*
@@ -463,9 +465,11 @@ keywordedit(const char *replacement)
 static void
 static void
 nest(void)
 nest(void)
 {
 {
-	depth += 1;
-	if (depth >= MAXDEPTH)
+	if (depth > MAXDEPTH-1)
+		abort(); /* bug */
+	if (depth == MAXDEPTH-1)
 		error("Too many levels of nesting");
 		error("Too many levels of nesting");
+	depth += 1;
 	stifline[depth] = linenum;
 	stifline[depth] = linenum;
 }
 }
 static void
 static void
@@ -490,15 +494,23 @@ flushline(bool keep)
 	if (symlist)
 	if (symlist)
 		return;
 		return;
 	if (keep ^ complement) {
 	if (keep ^ complement) {
-		if (lnnum && delcount > 0)
-			printf("#line %d\n", linenum);
-		fputs(tline, stdout);
-		delcount = 0;
+		bool blankline = tline[strspn(tline, " \t\n")] == '\0';
+		if (blankline && compblank && blankcount != blankmax) {
+			delcount += 1;
+			blankcount += 1;
+		} else {
+			if (lnnum && delcount > 0)
+				printf("#line %d\n", linenum);
+			fputs(tline, stdout);
+			delcount = 0;
+			blankmax = blankcount = blankline ? blankcount + 1 : 0;
+		}
 	} else {
 	} else {
 		if (lnblank)
 		if (lnblank)
 			putc('\n', stdout);
 			putc('\n', stdout);
 		exitstat = 1;
 		exitstat = 1;
 		delcount += 1;
 		delcount += 1;
+		blankcount = 0;
 	}
 	}
 }
 }
 
 
@@ -510,9 +522,12 @@ process(void)
 {
 {
 	Linetype lineval;
 	Linetype lineval;
 
 
+	/* When compressing blank lines, act as if the file
+	   is preceded by a large number of blank lines. */
+	blankmax = blankcount = 1000;
 	for (;;) {
 	for (;;) {
 		linenum++;
 		linenum++;
-		lineval = get_line();
+		lineval = parseline();
 		trans_table[ifstate[depth]][lineval]();
 		trans_table[ifstate[depth]][lineval]();
 		debug("process %s -> %s depth %d",
 		debug("process %s -> %s depth %d",
 		    linetype_name[lineval],
 		    linetype_name[lineval],
@@ -526,7 +541,7 @@ process(void)
  * help from skipcomment().
  * help from skipcomment().
  */
  */
 static Linetype
 static Linetype
-get_line(void)
+parseline(void)
 {
 {
 	const char *cp;
 	const char *cp;
 	int cursym;
 	int cursym;
@@ -595,9 +610,21 @@ get_line(void)
 			if (incomment)
 			if (incomment)
 				linestate = LS_DIRTY;
 				linestate = LS_DIRTY;
 		}
 		}
-		/* skipcomment should have changed the state */
-		if (linestate == LS_HASH)
-			abort(); /* bug */
+		/* skipcomment normally changes the state, except
+		   if the last line of the file lacks a newline, or
+		   if there is too much whitespace in a directive */
+		if (linestate == LS_HASH) {
+			size_t len = cp - tline;
+			if (fgets(tline + len, MAXLINE - len, input) == NULL) {
+				/* append the missing newline */
+				tline[len+0] = '\n';
+				tline[len+1] = '\0';
+				cp++;
+				linestate = LS_START;
+			} else {
+				linestate = LS_DIRTY;
+			}
+		}
 	}
 	}
 	if (linestate == LS_DIRTY) {
 	if (linestate == LS_DIRTY) {
 		while (*cp != '\0')
 		while (*cp != '\0')
@@ -610,17 +637,40 @@ get_line(void)
 
 
 /*
 /*
  * These are the binary operators that are supported by the expression
  * These are the binary operators that are supported by the expression
- * evaluator. Note that if support for division is added then we also
- * need short-circuiting booleans because of divide-by-zero.
+ * evaluator.
  */
  */
-static int op_lt(int a, int b) { return (a < b); }
-static int op_gt(int a, int b) { return (a > b); }
-static int op_le(int a, int b) { return (a <= b); }
-static int op_ge(int a, int b) { return (a >= b); }
-static int op_eq(int a, int b) { return (a == b); }
-static int op_ne(int a, int b) { return (a != b); }
-static int op_or(int a, int b) { return (a || b); }
-static int op_and(int a, int b) { return (a && b); }
+static Linetype op_strict(int *p, int v, Linetype at, Linetype bt) {
+	if(at == LT_IF || bt == LT_IF) return (LT_IF);
+	return (*p = v, v ? LT_TRUE : LT_FALSE);
+}
+static Linetype op_lt(int *p, Linetype at, int a, Linetype bt, int b) {
+	return op_strict(p, a < b, at, bt);
+}
+static Linetype op_gt(int *p, Linetype at, int a, Linetype bt, int b) {
+	return op_strict(p, a > b, at, bt);
+}
+static Linetype op_le(int *p, Linetype at, int a, Linetype bt, int b) {
+	return op_strict(p, a <= b, at, bt);
+}
+static Linetype op_ge(int *p, Linetype at, int a, Linetype bt, int b) {
+	return op_strict(p, a >= b, at, bt);
+}
+static Linetype op_eq(int *p, Linetype at, int a, Linetype bt, int b) {
+	return op_strict(p, a == b, at, bt);
+}
+static Linetype op_ne(int *p, Linetype at, int a, Linetype bt, int b) {
+	return op_strict(p, a != b, at, bt);
+}
+static Linetype op_or(int *p, Linetype at, int a, Linetype bt, int b) {
+	if (!strictlogic && (at == LT_TRUE || bt == LT_TRUE))
+		return (*p = 1, LT_TRUE);
+	return op_strict(p, a || b, at, bt);
+}
+static Linetype op_and(int *p, Linetype at, int a, Linetype bt, int b) {
+	if (!strictlogic && (at == LT_FALSE || bt == LT_FALSE))
+		return (*p = 0, LT_FALSE);
+	return op_strict(p, a && b, at, bt);
+}
 
 
 /*
 /*
  * An evaluation function takes three arguments, as follows: (1) a pointer to
  * An evaluation function takes three arguments, as follows: (1) a pointer to
@@ -629,8 +679,8 @@ static int op_and(int a, int b) { return (a && b); }
  * value of the expression; and (3) a pointer to a char* that points to the
  * value of the expression; and (3) a pointer to a char* that points to the
  * expression to be evaluated and that is updated to the end of the expression
  * expression to be evaluated and that is updated to the end of the expression
  * when evaluation is complete. The function returns LT_FALSE if the value of
  * when evaluation is complete. The function returns LT_FALSE if the value of
- * the expression is zero, LT_TRUE if it is non-zero, or LT_IF if the
- * expression could not be evaluated.
+ * the expression is zero, LT_TRUE if it is non-zero, LT_IF if the expression
+ * depends on an unknown symbol, or LT_ERROR if there is a parse failure.
  */
  */
 struct ops;
 struct ops;
 
 
@@ -649,7 +699,7 @@ static const struct ops {
 	eval_fn *inner;
 	eval_fn *inner;
 	struct op {
 	struct op {
 		const char *str;
 		const char *str;
-		int (*fn)(int, int);
+		Linetype (*fn)(int *, Linetype, int, Linetype, int);
 	} op[5];
 	} op[5];
 } eval_ops[] = {
 } eval_ops[] = {
 	{ eval_table, { { "||", op_or } } },
 	{ eval_table, { { "||", op_or } } },
@@ -664,8 +714,8 @@ static const struct ops {
 
 
 /*
 /*
  * Function for evaluating the innermost parts of expressions,
  * Function for evaluating the innermost parts of expressions,
- * viz. !expr (expr) defined(symbol) symbol number
- * We reset the keepthis flag when we find a non-constant subexpression.
+ * viz. !expr (expr) number defined(symbol) symbol
+ * We reset the constexpr flag in the last two cases.
  */
  */
 static Linetype
 static Linetype
 eval_unary(const struct ops *ops, int *valp, const char **cpp)
 eval_unary(const struct ops *ops, int *valp, const char **cpp)
@@ -673,68 +723,83 @@ eval_unary(const struct ops *ops, int *valp, const char **cpp)
 	const char *cp;
 	const char *cp;
 	char *ep;
 	char *ep;
 	int sym;
 	int sym;
+	bool defparen;
+	Linetype lt;
 
 
 	cp = skipcomment(*cpp);
 	cp = skipcomment(*cpp);
 	if (*cp == '!') {
 	if (*cp == '!') {
 		debug("eval%d !", ops - eval_ops);
 		debug("eval%d !", ops - eval_ops);
 		cp++;
 		cp++;
-		if (eval_unary(ops, valp, &cp) == LT_IF) {
-			*cpp = cp;
-			return (LT_IF);
+		lt = eval_unary(ops, valp, &cp);
+		if (lt == LT_ERROR)
+			return (LT_ERROR);
+		if (lt != LT_IF) {
+			*valp = !*valp;
+			lt = *valp ? LT_TRUE : LT_FALSE;
 		}
 		}
-		*valp = !*valp;
 	} else if (*cp == '(') {
 	} else if (*cp == '(') {
 		cp++;
 		cp++;
 		debug("eval%d (", ops - eval_ops);
 		debug("eval%d (", ops - eval_ops);
-		if (eval_table(eval_ops, valp, &cp) == LT_IF)
-			return (LT_IF);
+		lt = eval_table(eval_ops, valp, &cp);
+		if (lt == LT_ERROR)
+			return (LT_ERROR);
 		cp = skipcomment(cp);
 		cp = skipcomment(cp);
 		if (*cp++ != ')')
 		if (*cp++ != ')')
-			return (LT_IF);
+			return (LT_ERROR);
 	} else if (isdigit((unsigned char)*cp)) {
 	} else if (isdigit((unsigned char)*cp)) {
 		debug("eval%d number", ops - eval_ops);
 		debug("eval%d number", ops - eval_ops);
 		*valp = strtol(cp, &ep, 0);
 		*valp = strtol(cp, &ep, 0);
+		if (ep == cp)
+			return (LT_ERROR);
+		lt = *valp ? LT_TRUE : LT_FALSE;
 		cp = skipsym(cp);
 		cp = skipsym(cp);
 	} else if (strncmp(cp, "defined", 7) == 0 && endsym(cp[7])) {
 	} else if (strncmp(cp, "defined", 7) == 0 && endsym(cp[7])) {
 		cp = skipcomment(cp+7);
 		cp = skipcomment(cp+7);
 		debug("eval%d defined", ops - eval_ops);
 		debug("eval%d defined", ops - eval_ops);
-		if (*cp++ != '(')
-			return (LT_IF);
-		cp = skipcomment(cp);
+		if (*cp == '(') {
+			cp = skipcomment(cp+1);
+			defparen = true;
+		} else {
+			defparen = false;
+		}
 		sym = findsym(cp);
 		sym = findsym(cp);
-		cp = skipsym(cp);
-		cp = skipcomment(cp);
-		if (*cp++ != ')')
-			return (LT_IF);
-		if (sym >= 0)
+		if (sym < 0) {
+			lt = LT_IF;
+		} else {
 			*valp = (value[sym] != NULL);
 			*valp = (value[sym] != NULL);
-		else {
-			*cpp = cp;
-			return (LT_IF);
+			lt = *valp ? LT_TRUE : LT_FALSE;
 		}
 		}
-		keepthis = false;
+		cp = skipsym(cp);
+		cp = skipcomment(cp);
+		if (defparen && *cp++ != ')')
+			return (LT_ERROR);
+		constexpr = false;
 	} else if (!endsym(*cp)) {
 	} else if (!endsym(*cp)) {
 		debug("eval%d symbol", ops - eval_ops);
 		debug("eval%d symbol", ops - eval_ops);
 		sym = findsym(cp);
 		sym = findsym(cp);
-		if (sym < 0)
-			return (LT_IF);
-		if (value[sym] == NULL)
+		cp = skipsym(cp);
+		if (sym < 0) {
+			lt = LT_IF;
+			cp = skipargs(cp);
+		} else if (value[sym] == NULL) {
 			*valp = 0;
 			*valp = 0;
-		else {
+			lt = LT_FALSE;
+		} else {
 			*valp = strtol(value[sym], &ep, 0);
 			*valp = strtol(value[sym], &ep, 0);
 			if (*ep != '\0' || ep == value[sym])
 			if (*ep != '\0' || ep == value[sym])
-				return (LT_IF);
+				return (LT_ERROR);
+			lt = *valp ? LT_TRUE : LT_FALSE;
+			cp = skipargs(cp);
 		}
 		}
-		cp = skipsym(cp);
-		keepthis = false;
+		constexpr = false;
 	} else {
 	} else {
 		debug("eval%d bad expr", ops - eval_ops);
 		debug("eval%d bad expr", ops - eval_ops);
-		return (LT_IF);
+		return (LT_ERROR);
 	}
 	}
 
 
 	*cpp = cp;
 	*cpp = cp;
 	debug("eval%d = %d", ops - eval_ops, *valp);
 	debug("eval%d = %d", ops - eval_ops, *valp);
-	return (*valp ? LT_TRUE : LT_FALSE);
+	return (lt);
 }
 }
 
 
 /*
 /*
@@ -746,11 +811,13 @@ eval_table(const struct ops *ops, int *valp, const char **cpp)
 	const struct op *op;
 	const struct op *op;
 	const char *cp;
 	const char *cp;
 	int val;
 	int val;
-	Linetype lhs, rhs;
+	Linetype lt, rt;
 
 
 	debug("eval%d", ops - eval_ops);
 	debug("eval%d", ops - eval_ops);
 	cp = *cpp;
 	cp = *cpp;
-	lhs = ops->inner(ops+1, valp, &cp);
+	lt = ops->inner(ops+1, valp, &cp);
+	if (lt == LT_ERROR)
+		return (LT_ERROR);
 	for (;;) {
 	for (;;) {
 		cp = skipcomment(cp);
 		cp = skipcomment(cp);
 		for (op = ops->op; op->str != NULL; op++)
 		for (op = ops->op; op->str != NULL; op++)
@@ -760,32 +827,16 @@ eval_table(const struct ops *ops, int *valp, const char **cpp)
 			break;
 			break;
 		cp += strlen(op->str);
 		cp += strlen(op->str);
 		debug("eval%d %s", ops - eval_ops, op->str);
 		debug("eval%d %s", ops - eval_ops, op->str);
-		rhs = ops->inner(ops+1, &val, &cp);
-		if (op->fn == op_and && (lhs == LT_FALSE || rhs == LT_FALSE)) {
-			debug("eval%d: and always false", ops - eval_ops);
-			if (lhs == LT_IF)
-				*valp = val;
-			lhs = LT_FALSE;
-			continue;
-		}
-		if (op->fn == op_or && (lhs == LT_TRUE || rhs == LT_TRUE)) {
-			debug("eval%d: or always true", ops - eval_ops);
-			if (lhs == LT_IF)
-				*valp = val;
-			lhs = LT_TRUE;
-			continue;
-		}
-		if (rhs == LT_IF)
-			lhs = LT_IF;
-		if (lhs != LT_IF)
-			*valp = op->fn(*valp, val);
+		rt = ops->inner(ops+1, &val, &cp);
+		if (rt == LT_ERROR)
+			return (LT_ERROR);
+		lt = op->fn(valp, lt, *valp, rt, val);
 	}
 	}
 
 
 	*cpp = cp;
 	*cpp = cp;
 	debug("eval%d = %d", ops - eval_ops, *valp);
 	debug("eval%d = %d", ops - eval_ops, *valp);
-	if (lhs != LT_IF)
-		lhs = (*valp ? LT_TRUE : LT_FALSE);
-	return lhs;
+	debug("eval%d lt = %s", ops - eval_ops, linetype_name[lt]);
+	return (lt);
 }
 }
 
 
 /*
 /*
@@ -796,17 +847,14 @@ eval_table(const struct ops *ops, int *valp, const char **cpp)
 static Linetype
 static Linetype
 ifeval(const char **cpp)
 ifeval(const char **cpp)
 {
 {
-	const char *cp = *cpp;
 	int ret;
 	int ret;
-	int val;
+	int val = 0;
 
 
 	debug("eval %s", *cpp);
 	debug("eval %s", *cpp);
-	keepthis = killconsts ? false : true;
-	ret = eval_table(eval_ops, &val, &cp);
-	if (ret != LT_IF)
-		*cpp = cp;
+	constexpr = killconsts ? false : true;
+	ret = eval_table(eval_ops, &val, cpp);
 	debug("eval = %d", val);
 	debug("eval = %d", val);
-	return (keepthis ? LT_IF : ret);
+	return (constexpr ? LT_IF : ret == LT_ERROR ? LT_IF : ret);
 }
 }
 
 
 /*
 /*
@@ -917,6 +965,31 @@ skipcomment(const char *cp)
 	return (cp);
 	return (cp);
 }
 }
 
 
+/*
+ * Skip macro arguments.
+ */
+static const char *
+skipargs(const char *cp)
+{
+	const char *ocp = cp;
+	int level = 0;
+	cp = skipcomment(cp);
+	if (*cp != '(')
+		return (cp);
+	do {
+		if (*cp == '(')
+			level++;
+		if (*cp == ')')
+			level--;
+		cp = skipcomment(cp+1);
+	} while (level != 0 && *cp != '\0');
+	if (level == 0)
+		return (cp);
+	else
+	/* Rewind and re-detect the syntax error later. */
+		return (ocp);
+}
+
 /*
 /*
  * Skip over an identifier.
  * Skip over an identifier.
  */
  */
@@ -929,7 +1002,7 @@ skipsym(const char *cp)
 }
 }
 
 
 /*
 /*
- * Look for the symbol in the symbol table. If is is found, we return
+ * Look for the symbol in the symbol table. If it is found, we return
  * the symbol table index, else we return -1.
  * the symbol table index, else we return -1.
  */
  */
 static int
 static int

+ 4 - 1
usr/gen_init_cpio.c

@@ -354,7 +354,10 @@ static int cpio_mkfile(const char *name, const char *location,
 		push_pad();
 		push_pad();
 
 
 		if (size) {
 		if (size) {
-			fwrite(filebuf, size, 1, stdout);
+			if (fwrite(filebuf, size, 1, stdout) != 1) {
+				fprintf(stderr, "writing filebuf failed\n");
+				goto error;
+			}
 			offset += size;
 			offset += size;
 			push_pad();
 			push_pad();
 		}
 		}