Merge git://git.kernel.org/pub/scm/linux/kernel/git/sam/kbuild-next
* git://git.kernel.org/pub/scm/linux/kernel/git/sam/kbuild-next: (25 commits) setlocalversion: do not describe if there is nothing to describe kconfig: fix typos: "Suport" -> "Support" kconfig: make defconfig is no longer chatty kconfig: make oldconfig is now less chatty kconfig: speed up all*config + randconfig kconfig: set all new symbols automatically kconfig: add diffconfig utility kbuild: remove Module.markers during mrproper kbuild: sparse needs CF not CHECKFLAGS kernel-doc: handle/strip __init vmlinux.lds: move __attribute__((__cold__)) functions back into final .text section init: fix URL of "The GNU Accounting Utilities" kbuild: add arch/$ARCH/include to search path kbuild: asm symlink support for arch/$ARCH/include kbuild: support arch/$ARCH/include for tags, cscope kbuild: prepare headers_* for arch/$ARCH/include kbuild: install all headers when arch is changed kbuild: make clean removes *.o.* as well kbuild: optimize headers_* targets kbuild: only one call for include/ in make headers_* ...
This commit is contained in:
@@ -73,10 +73,10 @@ recompiled, or use "make C=2" to run sparse on the files whether they need to
|
|||||||
be recompiled or not. The latter is a fast way to check the whole tree if you
|
be recompiled or not. The latter is a fast way to check the whole tree if you
|
||||||
have already built it.
|
have already built it.
|
||||||
|
|
||||||
The optional make variable CHECKFLAGS can be used to pass arguments to sparse.
|
The optional make variable CF can be used to pass arguments to sparse. The
|
||||||
The build system passes -Wbitwise to sparse automatically. To perform
|
build system passes -Wbitwise to sparse automatically. To perform endianness
|
||||||
endianness checks, you may define __CHECK_ENDIAN__:
|
checks, you may define __CHECK_ENDIAN__:
|
||||||
|
|
||||||
make C=2 CHECKFLAGS="-D__CHECK_ENDIAN__"
|
make C=2 CF="-D__CHECK_ENDIAN__"
|
||||||
|
|
||||||
These checks are disabled by default as they generate a host of warnings.
|
These checks are disabled by default as they generate a host of warnings.
|
||||||
|
3
Kbuild
3
Kbuild
@@ -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-$(SRCARCH)/asm-offsets.h
|
offsets-file := include/asm/asm-offsets.h
|
||||||
|
|
||||||
always += $(offsets-file)
|
always += $(offsets-file)
|
||||||
targets += $(offsets-file)
|
targets += $(offsets-file)
|
||||||
@@ -81,7 +81,6 @@ arch/$(SRCARCH)/kernel/asm-offsets.s: arch/$(SRCARCH)/kernel/asm-offsets.c \
|
|||||||
$(call if_changed_dep,cc_s_c)
|
$(call if_changed_dep,cc_s_c)
|
||||||
|
|
||||||
$(obj)/$(offsets-file): arch/$(SRCARCH)/kernel/asm-offsets.s Kbuild
|
$(obj)/$(offsets-file): arch/$(SRCARCH)/kernel/asm-offsets.s Kbuild
|
||||||
$(Q)mkdir -p $(dir $@)
|
|
||||||
$(call cmd,offsets)
|
$(call cmd,offsets)
|
||||||
|
|
||||||
#####
|
#####
|
||||||
|
115
Makefile
115
Makefile
@@ -205,6 +205,9 @@ ifeq ($(ARCH),x86_64)
|
|||||||
SRCARCH := x86
|
SRCARCH := x86
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# Where to locate arch specific headers
|
||||||
|
hdr-arch := $(SRCARCH)
|
||||||
|
|
||||||
KCONFIG_CONFIG ?= .config
|
KCONFIG_CONFIG ?= .config
|
||||||
|
|
||||||
# SHELL used by kbuild
|
# SHELL used by kbuild
|
||||||
@@ -326,7 +329,8 @@ AFLAGS_KERNEL =
|
|||||||
# Needed to be compatible with the O= option
|
# Needed to be compatible with the O= option
|
||||||
LINUXINCLUDE := -Iinclude \
|
LINUXINCLUDE := -Iinclude \
|
||||||
$(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include) \
|
$(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include) \
|
||||||
-include include/linux/autoconf.h
|
-I$(srctree)/arch/$(hdr-arch)/include \
|
||||||
|
-include include/linux/autoconf.h
|
||||||
|
|
||||||
KBUILD_CPPFLAGS := -D__KERNEL__ $(LINUXINCLUDE)
|
KBUILD_CPPFLAGS := -D__KERNEL__ $(LINUXINCLUDE)
|
||||||
|
|
||||||
@@ -922,7 +926,9 @@ ifneq ($(KBUILD_SRC),)
|
|||||||
/bin/false; \
|
/bin/false; \
|
||||||
fi;
|
fi;
|
||||||
$(Q)if [ ! -d include2 ]; then mkdir -p include2; fi;
|
$(Q)if [ ! -d include2 ]; then mkdir -p include2; fi;
|
||||||
$(Q)ln -fsn $(srctree)/include/asm-$(SRCARCH) include2/asm
|
$(Q)if [ -e $(srctree)/include/asm-$(SRCARCH)/system.h ]; then \
|
||||||
|
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
|
||||||
@@ -948,22 +954,34 @@ export CPPFLAGS_vmlinux.lds += -P -C -U$(ARCH)
|
|||||||
|
|
||||||
# The asm symlink changes when $(ARCH) changes.
|
# The asm symlink changes when $(ARCH) changes.
|
||||||
# Detect this and ask user to run make mrproper
|
# Detect this and ask user to run make mrproper
|
||||||
|
define check-symlink
|
||||||
include/asm: FORCE
|
set -e; \
|
||||||
$(Q)set -e; asmlink=`readlink include/asm | cut -d '-' -f 2`; \
|
if [ -L include/asm ]; then \
|
||||||
if [ -L include/asm ]; then \
|
asmlink=`readlink include/asm | cut -d '-' -f 2`; \
|
||||||
if [ "$$asmlink" != "$(SRCARCH)" ]; then \
|
if [ "$$asmlink" != "$(SRCARCH)" ]; then \
|
||||||
echo "ERROR: the symlink $@ points to asm-$$asmlink but asm-$(SRCARCH) was expected"; \
|
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"; \
|
echo " set ARCH or save .config and run 'make mrproper' to fix it"; \
|
||||||
exit 1; \
|
exit 1; \
|
||||||
fi; \
|
fi; \
|
||||||
else \
|
|
||||||
echo ' SYMLINK $@ -> include/asm-$(SRCARCH)'; \
|
|
||||||
if [ ! -d include ]; then \
|
|
||||||
mkdir -p include; \
|
|
||||||
fi; \
|
|
||||||
ln -fsn asm-$(SRCARCH) $@; \
|
|
||||||
fi
|
fi
|
||||||
|
endef
|
||||||
|
|
||||||
|
# We create the target directory of the symlink if it does
|
||||||
|
# not exist so the test in chack-symlink works and we have a
|
||||||
|
# directory for generated filesas used by some architectures.
|
||||||
|
define create-symlink
|
||||||
|
if [ ! -L include/asm ]; then \
|
||||||
|
echo ' 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
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
@@ -1010,36 +1028,43 @@ firmware_install: FORCE
|
|||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
# Kernel headers
|
# Kernel headers
|
||||||
INSTALL_HDR_PATH=$(objtree)/usr
|
|
||||||
export INSTALL_HDR_PATH
|
|
||||||
|
|
||||||
HDRFILTER=generic i386 x86_64
|
#Default location for installed headers
|
||||||
HDRARCHES=$(filter-out $(HDRFILTER),$(patsubst $(srctree)/include/asm-%/Kbuild,%,$(wildcard $(srctree)/include/asm-*/Kbuild)))
|
export INSTALL_HDR_PATH = $(objtree)/usr
|
||||||
|
|
||||||
|
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)
|
||||||
|
hdr-dst = $(if $(KBUILD_HEADERS), dst=include/asm-$(hdr-arch), dst=include/asm)
|
||||||
|
|
||||||
|
PHONY += __headers
|
||||||
|
__headers: include/linux/version.h scripts_basic FORCE
|
||||||
|
$(Q)$(MAKE) $(build)=scripts scripts/unifdef
|
||||||
|
|
||||||
PHONY += headers_install_all
|
PHONY += headers_install_all
|
||||||
headers_install_all: include/linux/version.h scripts_basic FORCE
|
headers_install_all:
|
||||||
$(Q)$(MAKE) $(build)=scripts scripts/unifdef
|
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/headers.sh install
|
||||||
$(Q)for arch in $(HDRARCHES); do \
|
|
||||||
$(MAKE) ARCH=$$arch -f $(srctree)/scripts/Makefile.headersinst obj=include BIASMDIR=-bi-$$arch ;\
|
|
||||||
done
|
|
||||||
|
|
||||||
PHONY += headers_install
|
PHONY += headers_install
|
||||||
headers_install: include/linux/version.h scripts_basic FORCE
|
headers_install: __headers
|
||||||
@if [ ! -r $(srctree)/include/asm-$(SRCARCH)/Kbuild ]; then \
|
$(if $(wildcard $(srctree)/$(hdr-dir)/Kbuild),, \
|
||||||
echo '*** Error: Headers not exportable for this architecture ($(SRCARCH))'; \
|
$(error Headers not exportable for the $(SRCARCH) architecture))
|
||||||
exit 1 ; fi
|
$(Q)$(MAKE) $(hdr-inst)=include
|
||||||
$(Q)$(MAKE) $(build)=scripts scripts/unifdef
|
$(Q)$(MAKE) $(hdr-inst)=$(hdr-dir) $(hdr-dst)
|
||||||
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.headersinst ARCH=$(SRCARCH) obj=include
|
|
||||||
|
|
||||||
PHONY += headers_check_all
|
PHONY += headers_check_all
|
||||||
headers_check_all: headers_install_all
|
headers_check_all: headers_install_all
|
||||||
$(Q)for arch in $(HDRARCHES); do \
|
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/headers.sh check
|
||||||
$(MAKE) ARCH=$$arch -f $(srctree)/scripts/Makefile.headersinst obj=include BIASMDIR=-bi-$$arch HDRCHECK=1 ;\
|
|
||||||
done
|
|
||||||
|
|
||||||
PHONY += headers_check
|
PHONY += headers_check
|
||||||
headers_check: headers_install
|
headers_check: headers_install
|
||||||
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.headersinst ARCH=$(SRCARCH) obj=include HDRCHECK=1
|
$(Q)$(MAKE) $(hdr-inst)=include HDRCHECK=1
|
||||||
|
$(Q)$(MAKE) $(hdr-inst)=$(hdr-dir) $(hdr-dst) HDRCHECK=1
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
# Modules
|
# Modules
|
||||||
@@ -1131,7 +1156,7 @@ MRPROPER_FILES += .config .config.old include/asm .version .old_version \
|
|||||||
include/linux/autoconf.h include/linux/version.h \
|
include/linux/autoconf.h include/linux/version.h \
|
||||||
include/linux/utsrelease.h \
|
include/linux/utsrelease.h \
|
||||||
include/linux/bounds.h include/asm*/asm-offsets.h \
|
include/linux/bounds.h include/asm*/asm-offsets.h \
|
||||||
Module.symvers tags TAGS cscope*
|
Module.symvers Module.markers tags TAGS cscope*
|
||||||
|
|
||||||
# clean - Delete most, but leave enough to build external modules
|
# clean - Delete most, but leave enough to build external modules
|
||||||
#
|
#
|
||||||
@@ -1150,7 +1175,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 'Module.markers' -o -name '.tmp_*.o.*' \) \
|
||||||
-type f -print | xargs rm -f
|
-type f -print | xargs rm -f
|
||||||
|
|
||||||
# mrproper - Delete all generated files, including .config
|
# mrproper - Delete all generated files, including .config
|
||||||
@@ -1224,21 +1249,17 @@ help:
|
|||||||
@echo ' cscope - Generate cscope index'
|
@echo ' cscope - Generate cscope index'
|
||||||
@echo ' kernelrelease - Output the release version string'
|
@echo ' kernelrelease - Output the release version string'
|
||||||
@echo ' kernelversion - Output the version stored in Makefile'
|
@echo ' kernelversion - Output the version stored in Makefile'
|
||||||
@if [ -r $(srctree)/include/asm-$(SRCARCH)/Kbuild ]; then \
|
@echo ' headers_install - Install sanitised kernel headers to INSTALL_HDR_PATH'; \
|
||||||
echo ' headers_install - Install sanitised kernel headers to INSTALL_HDR_PATH'; \
|
|
||||||
echo ' (default: $(INSTALL_HDR_PATH))'; \
|
echo ' (default: $(INSTALL_HDR_PATH))'; \
|
||||||
fi
|
echo ''
|
||||||
@echo ''
|
|
||||||
@echo 'Static analysers'
|
@echo 'Static analysers'
|
||||||
@echo ' checkstack - Generate a list of stack hogs'
|
@echo ' checkstack - Generate a list of stack hogs'
|
||||||
@echo ' namespacecheck - Name space analysis on compiled kernel'
|
@echo ' namespacecheck - Name space analysis on compiled kernel'
|
||||||
@echo ' versioncheck - Sanity check on version.h usage'
|
@echo ' versioncheck - Sanity check on version.h usage'
|
||||||
@echo ' includecheck - Check for duplicate included header files'
|
@echo ' includecheck - Check for duplicate included header files'
|
||||||
@echo ' export_report - List the usages of all exported symbols'
|
@echo ' export_report - List the usages of all exported symbols'
|
||||||
@if [ -r $(srctree)/include/asm-$(SRCARCH)/Kbuild ]; then \
|
@echo ' headers_check - Sanity check on exported headers'; \
|
||||||
echo ' headers_check - Sanity check on exported headers'; \
|
echo ''
|
||||||
fi
|
|
||||||
@echo ''
|
|
||||||
@echo 'Kernel packaging:'
|
@echo 'Kernel packaging:'
|
||||||
@$(MAKE) $(build)=$(package-dir) help
|
@$(MAKE) $(build)=$(package-dir) help
|
||||||
@echo ''
|
@echo ''
|
||||||
@@ -1411,7 +1432,11 @@ define find-sources
|
|||||||
\( -name config -o -name 'asm-*' \) -prune \
|
\( -name config -o -name 'asm-*' \) -prune \
|
||||||
-o -name $1 -print; \
|
-o -name $1 -print; \
|
||||||
for arch in $(ALLINCLUDE_ARCHS) ; do \
|
for arch in $(ALLINCLUDE_ARCHS) ; do \
|
||||||
find $(__srctree)include/asm-$${arch} $(RCS_FIND_IGNORE) \
|
test -e $(__srctree)include/asm-$${arch} && \
|
||||||
|
find $(__srctree)include/asm-$${arch} $(RCS_FIND_IGNORE) \
|
||||||
|
-name $1 -print; \
|
||||||
|
test -e $(__srctree)arch/$${arch}/include/asm && \
|
||||||
|
find $(__srctree)arch/$${arch}/include/asm $(RCS_FIND_IGNORE) \
|
||||||
-name $1 -print; \
|
-name $1 -print; \
|
||||||
done ; \
|
done ; \
|
||||||
find $(__srctree)include/asm-generic $(RCS_FIND_IGNORE) \
|
find $(__srctree)include/asm-generic $(RCS_FIND_IGNORE) \
|
||||||
|
@@ -360,7 +360,7 @@ config THINKPAD_ACPI_VIDEO
|
|||||||
If you are not sure, say Y here.
|
If you are not sure, say Y here.
|
||||||
|
|
||||||
config THINKPAD_ACPI_HOTKEY_POLL
|
config THINKPAD_ACPI_HOTKEY_POLL
|
||||||
bool "Suport NVRAM polling for hot keys"
|
bool "Support NVRAM polling for hot keys"
|
||||||
depends on THINKPAD_ACPI
|
depends on THINKPAD_ACPI
|
||||||
default y
|
default y
|
||||||
---help---
|
---help---
|
||||||
|
@@ -1,3 +1,6 @@
|
|||||||
|
# Top-level Makefile calls into asm-$(ARCH)
|
||||||
|
# List only non-arch directories below
|
||||||
|
|
||||||
header-y += asm-generic/
|
header-y += asm-generic/
|
||||||
header-y += linux/
|
header-y += linux/
|
||||||
header-y += sound/
|
header-y += sound/
|
||||||
@@ -5,5 +8,3 @@ header-y += mtd/
|
|||||||
header-y += rdma/
|
header-y += rdma/
|
||||||
header-y += video/
|
header-y += video/
|
||||||
header-y += drm/
|
header-y += drm/
|
||||||
|
|
||||||
header-y += asm-$(ARCH)/
|
|
||||||
|
@@ -221,6 +221,7 @@
|
|||||||
* during second ld run in second ld pass when generating System.map */
|
* during second ld run in second ld pass when generating System.map */
|
||||||
#define TEXT_TEXT \
|
#define TEXT_TEXT \
|
||||||
ALIGN_FUNCTION(); \
|
ALIGN_FUNCTION(); \
|
||||||
|
*(.text.hot) \
|
||||||
*(.text) \
|
*(.text) \
|
||||||
*(.ref.text) \
|
*(.ref.text) \
|
||||||
*(.text.init.refok) \
|
*(.text.init.refok) \
|
||||||
@@ -230,7 +231,8 @@
|
|||||||
CPU_KEEP(init.text) \
|
CPU_KEEP(init.text) \
|
||||||
CPU_KEEP(exit.text) \
|
CPU_KEEP(exit.text) \
|
||||||
MEM_KEEP(init.text) \
|
MEM_KEEP(init.text) \
|
||||||
MEM_KEEP(exit.text)
|
MEM_KEEP(exit.text) \
|
||||||
|
*(.text.unlikely)
|
||||||
|
|
||||||
|
|
||||||
/* sched.text is aling to function alignment to secure we have same
|
/* sched.text is aling to function alignment to secure we have same
|
||||||
|
@@ -171,7 +171,7 @@ config BSD_PROCESS_ACCT_V3
|
|||||||
process and it's parent. Note that this file format is incompatible
|
process and it's parent. Note that this file format is incompatible
|
||||||
with previous v0/v1/v2 file formats, so you will need updated tools
|
with previous v0/v1/v2 file formats, so you will need updated tools
|
||||||
for processing it. A preliminary version of these tools is available
|
for processing it. A preliminary version of these tools is available
|
||||||
at <http://www.physik3.uni-rostock.de/tim/kernel/utils/acct/>.
|
at <http://www.gnu.org/software/acct/>.
|
||||||
|
|
||||||
config TASKSTATS
|
config TASKSTATS
|
||||||
bool "Export task/process statistics through netlink (EXPERIMENTAL)"
|
bool "Export task/process statistics through netlink (EXPERIMENTAL)"
|
||||||
@@ -486,7 +486,7 @@ config PID_NS
|
|||||||
default n
|
default n
|
||||||
depends on NAMESPACES && EXPERIMENTAL
|
depends on NAMESPACES && EXPERIMENTAL
|
||||||
help
|
help
|
||||||
Suport process id namespaces. This allows having multiple
|
Support process id namespaces. This allows having multiple
|
||||||
process with the same pid as long as they are in different
|
process with the same pid as long as they are in different
|
||||||
pid namespaces. This is a building block of containers.
|
pid namespaces. This is a building block of containers.
|
||||||
|
|
||||||
|
@@ -1,194 +1,98 @@
|
|||||||
# ==========================================================================
|
# ==========================================================================
|
||||||
# Installing headers
|
# Installing headers
|
||||||
#
|
#
|
||||||
# header-y files will be installed verbatim
|
# header-y - list files to be installed. They are preprocessed
|
||||||
# unifdef-y are the files where unifdef will be run before installing files
|
# to remove __KERNEL__ section of the file
|
||||||
# objhdr-y are generated files that will be installed verbatim
|
# unifdef-y - Same as header-y. Obsolete
|
||||||
|
# objhdr-y - Same as header-y but for generated files
|
||||||
#
|
#
|
||||||
# ==========================================================================
|
# ==========================================================================
|
||||||
|
|
||||||
UNIFDEF := scripts/unifdef -U__KERNEL__
|
# called may set destination dir (when installing to asm/)
|
||||||
|
|
||||||
# Eliminate the contents of (and inclusions of) compiler.h
|
|
||||||
HDRSED := sed -e "s/ inline / __inline__ /g" \
|
|
||||||
-e "s/[[:space:]]__user[[:space:]]\{1,\}/ /g" \
|
|
||||||
-e "s/(__user[[:space:]]\{1,\}/ (/g" \
|
|
||||||
-e "s/[[:space:]]__force[[:space:]]\{1,\}/ /g" \
|
|
||||||
-e "s/(__force[[:space:]]\{1,\}/ (/g" \
|
|
||||||
-e "s/[[:space:]]__iomem[[:space:]]\{1,\}/ /g" \
|
|
||||||
-e "s/(__iomem[[:space:]]\{1,\}/ (/g" \
|
|
||||||
-e "s/[[:space:]]__attribute_const__[[:space:]]\{1,\}/\ /g" \
|
|
||||||
-e "s/[[:space:]]__attribute_const__$$//" \
|
|
||||||
-e "/^\#include <linux\/compiler.h>/d"
|
|
||||||
|
|
||||||
_dst := $(if $(dst),$(dst),$(obj))
|
_dst := $(if $(dst),$(dst),$(obj))
|
||||||
|
|
||||||
ifeq (,$(patsubst include/asm/%,,$(obj)/))
|
kbuild-file := $(srctree)/$(obj)/Kbuild
|
||||||
# For producing the generated stuff in include/asm for biarch builds, include
|
include $(kbuild-file)
|
||||||
# both sets of Kbuild files; we'll generate anything which is mentioned in
|
|
||||||
# _either_ arch, and recurse into subdirectories which are mentioned in either
|
|
||||||
# arch. Since some directories may exist in one but not the other, we must
|
|
||||||
# use $(wildcard...).
|
|
||||||
GENASM := 1
|
|
||||||
archasm := $(subst include/asm,asm-$(ARCH),$(obj))
|
|
||||||
altarchasm := $(subst include/asm,asm-$(ALTARCH),$(obj))
|
|
||||||
KBUILDFILES := $(wildcard $(srctree)/include/$(archasm)/Kbuild $(srctree)/include/$(altarchasm)/Kbuild)
|
|
||||||
else
|
|
||||||
KBUILDFILES := $(srctree)/$(obj)/Kbuild
|
|
||||||
endif
|
|
||||||
|
|
||||||
include $(KBUILDFILES)
|
|
||||||
|
|
||||||
include scripts/Kbuild.include
|
include scripts/Kbuild.include
|
||||||
|
|
||||||
# If this is include/asm-$(ARCH) and there's no $(ALTARCH), then
|
install := $(INSTALL_HDR_PATH)/$(_dst)
|
||||||
# override $(_dst) so that we install to include/asm directly.
|
|
||||||
# Unless $(BIASMDIR) is set, in which case we're probably doing
|
|
||||||
# a 'headers_install_all' build and we should keep the -$(ARCH)
|
|
||||||
# in the directory name.
|
|
||||||
ifeq ($(obj)$(ALTARCH),include/asm-$(ARCH)$(BIASMDIR))
|
|
||||||
_dst := include/asm
|
|
||||||
endif
|
|
||||||
|
|
||||||
header-y := $(sort $(header-y))
|
header-y := $(sort $(header-y) $(unifdef-y))
|
||||||
unifdef-y := $(sort $(unifdef-y))
|
subdirs := $(patsubst %/,%,$(filter %/, $(header-y)))
|
||||||
subdir-y := $(patsubst %/,%,$(filter %/, $(header-y)))
|
header-y := $(filter-out %/, $(header-y))
|
||||||
header-y := $(filter-out %/, $(header-y))
|
|
||||||
header-y := $(filter-out $(unifdef-y),$(header-y))
|
|
||||||
|
|
||||||
# stamp files for header checks
|
# files used to track state of install/check
|
||||||
check-y := $(patsubst %,.check.%,$(header-y) $(unifdef-y) $(objhdr-y))
|
install-file := $(install)/.install
|
||||||
|
check-file := $(install)/.check
|
||||||
|
|
||||||
|
# all headers files for this dir
|
||||||
|
all-files := $(header-y) $(objhdr-y)
|
||||||
|
input-files := $(addprefix $(srctree)/$(obj)/,$(header-y)) \
|
||||||
|
$(addprefix $(objtree)/$(obj)/,$(objhdr-y))
|
||||||
|
output-files := $(addprefix $(install)/, $(all-files))
|
||||||
|
|
||||||
# Work out what needs to be removed
|
# Work out what needs to be removed
|
||||||
oldheaders := $(patsubst $(INSTALL_HDR_PATH)/$(_dst)/%,%,$(wildcard $(INSTALL_HDR_PATH)/$(_dst)/*.h))
|
oldheaders := $(patsubst $(install)/%,%,$(wildcard $(install)/*.h))
|
||||||
unwanted := $(filter-out $(header-y) $(unifdef-y) $(objhdr-y),$(oldheaders))
|
unwanted := $(filter-out $(all-files),$(oldheaders))
|
||||||
|
|
||||||
oldcheckstamps := $(patsubst $(INSTALL_HDR_PATH)/$(_dst)/%,%,$(wildcard $(INSTALL_HDR_PATH)/$(_dst)/.check.*.h))
|
# Prefix unwanted with full paths to $(INSTALL_HDR_PATH)
|
||||||
unwanted += $(filter-out $(check-y),$(oldcheckstamps))
|
unwanted-file := $(addprefix $(install)/, $(unwanted))
|
||||||
|
|
||||||
# Prefix them all with full paths to $(INSTALL_HDR_PATH)
|
printdir = $(patsubst $(INSTALL_HDR_PATH)/%/,%,$(dir $@))
|
||||||
header-y := $(patsubst %,$(INSTALL_HDR_PATH)/$(_dst)/%,$(header-y))
|
|
||||||
unifdef-y := $(patsubst %,$(INSTALL_HDR_PATH)/$(_dst)/%,$(unifdef-y))
|
|
||||||
objhdr-y := $(patsubst %,$(INSTALL_HDR_PATH)/$(_dst)/%,$(objhdr-y))
|
|
||||||
check-y := $(patsubst %,$(INSTALL_HDR_PATH)/$(_dst)/%,$(check-y))
|
|
||||||
|
|
||||||
|
quiet_cmd_install = INSTALL $(printdir) ($(words $(all-files))\
|
||||||
|
file$(if $(word 2, $(all-files)),s))
|
||||||
|
cmd_install = \
|
||||||
|
$(PERL) $< $(srctree)/$(obj) $(install) $(SRCARCH) $(header-y); \
|
||||||
|
$(PERL) $< $(objtree)/$(obj) $(install) $(SRCARCH) $(objhdr-y); \
|
||||||
|
touch $@
|
||||||
|
|
||||||
ifdef ALTARCH
|
quiet_cmd_remove = REMOVE $(unwanted)
|
||||||
ifeq ($(obj),include/asm-$(ARCH))
|
cmd_remove = rm -f $(unwanted-file)
|
||||||
altarch-y := altarch-dir
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Make the definitions visible for recursive make invocations
|
quiet_cmd_check = CHECK $(printdir) ($(words $(all-files)) files)
|
||||||
export ALTARCH
|
cmd_check = $(PERL) $< $(INSTALL_HDR_PATH)/include $(SRCARCH) \
|
||||||
export ARCHDEF
|
$(addprefix $(install)/, $(all-files)); \
|
||||||
export ALTARCHDEF
|
touch $@
|
||||||
|
|
||||||
quiet_cmd_o_hdr_install = INSTALL $(patsubst $(INSTALL_HDR_PATH)/%,%,$@)
|
PHONY += __headersinst __headerscheck
|
||||||
cmd_o_hdr_install = cp $(patsubst $(INSTALL_HDR_PATH)/$(_dst)/%,$(objtree)/$(obj)/%,$@) \
|
|
||||||
$(INSTALL_HDR_PATH)/$(_dst)
|
|
||||||
|
|
||||||
quiet_cmd_headers_install = INSTALL $(patsubst $(INSTALL_HDR_PATH)/%,%,$@)
|
ifndef HDRCHECK
|
||||||
cmd_headers_install = $(HDRSED) $(patsubst $(INSTALL_HDR_PATH)/$(_dst)/%,$(srctree)/$(obj)/%,$@) \
|
|
||||||
> $@
|
|
||||||
|
|
||||||
quiet_cmd_unifdef = UNIFDEF $(patsubst $(INSTALL_HDR_PATH)/%,%,$@)
|
|
||||||
cmd_unifdef = $(UNIFDEF) $(patsubst $(INSTALL_HDR_PATH)/$(_dst)/%,$(srctree)/$(obj)/%,$@) \
|
|
||||||
| $(HDRSED) > $@ || :
|
|
||||||
|
|
||||||
quiet_cmd_check = CHECK $(patsubst $(INSTALL_HDR_PATH)/$(_dst)/.check.%,$(_dst)/%,$@)
|
|
||||||
cmd_check = $(CONFIG_SHELL) $(srctree)/scripts/hdrcheck.sh \
|
|
||||||
$(INSTALL_HDR_PATH)/include $(subst /.check.,/,$@) $@
|
|
||||||
|
|
||||||
quiet_cmd_remove = REMOVE $(_dst)/$@
|
|
||||||
cmd_remove = rm -f $(INSTALL_HDR_PATH)/$(_dst)/$@
|
|
||||||
|
|
||||||
quiet_cmd_mkdir = MKDIR $(patsubst $(INSTALL_HDR_PATH)/%,%,$@)
|
|
||||||
cmd_mkdir = mkdir -p $@
|
|
||||||
|
|
||||||
quiet_cmd_gen = GEN $(patsubst $(INSTALL_HDR_PATH)/%,%,$@)
|
|
||||||
cmd_gen = \
|
|
||||||
FNAME=$(patsubst $(INSTALL_HDR_PATH)/$(_dst)/%,%,$@); \
|
|
||||||
STUBDEF=__ASM_STUB_`echo $$FNAME | tr a-z.- A-Z__`; \
|
|
||||||
(echo "/* File autogenerated by 'make headers_install' */" ; \
|
|
||||||
echo "\#ifndef $$STUBDEF" ; \
|
|
||||||
echo "\#define $$STUBDEF" ; \
|
|
||||||
echo "\# if $(ARCHDEF)" ; \
|
|
||||||
if [ -r $(subst /$(_dst)/,/include/$(archasm)/,$@) ]; then \
|
|
||||||
echo "\# include <$(archasm)/$$FNAME>" ; \
|
|
||||||
else \
|
|
||||||
echo "\# error $(archasm)/$$FNAME does not exist in" \
|
|
||||||
"the $(ARCH) architecture" ; \
|
|
||||||
fi ; \
|
|
||||||
echo "\# elif $(ALTARCHDEF)" ; \
|
|
||||||
if [ -r $(subst /$(_dst)/,/include/$(altarchasm)/,$@) ]; then \
|
|
||||||
echo "\# include <$(altarchasm)/$$FNAME>" ; \
|
|
||||||
else \
|
|
||||||
echo "\# error $(altarchasm)/$$FNAME does not exist in" \
|
|
||||||
"the $(ALTARCH) architecture" ; \
|
|
||||||
fi ; \
|
|
||||||
echo "\# else" ; \
|
|
||||||
echo "\# warning This machine appears to be" \
|
|
||||||
"neither $(ARCH) nor $(ALTARCH)." ; \
|
|
||||||
echo "\# endif" ; \
|
|
||||||
echo "\#endif /* $$STUBDEF */" ; \
|
|
||||||
) > $@
|
|
||||||
|
|
||||||
.PHONY: __headersinst __headerscheck
|
|
||||||
|
|
||||||
ifdef HDRCHECK
|
|
||||||
__headerscheck: $(subdir-y) $(check-y)
|
|
||||||
@true
|
|
||||||
|
|
||||||
$(check-y) : $(INSTALL_HDR_PATH)/$(_dst)/.check.%.h : $(INSTALL_HDR_PATH)/$(_dst)/%.h
|
|
||||||
$(call cmd,check)
|
|
||||||
|
|
||||||
# Other dependencies for $(check-y)
|
|
||||||
include /dev/null $(wildcard $(check-y))
|
|
||||||
|
|
||||||
# ... but leave $(check-y) as .PHONY for now until those deps are actually correct.
|
|
||||||
.PHONY: $(check-y)
|
|
||||||
|
|
||||||
else
|
|
||||||
# Rules for installing headers
|
# Rules for installing headers
|
||||||
__headersinst: $(subdir-y) $(header-y) $(unifdef-y) $(altarch-y) $(objhdr-y)
|
__headersinst: $(subdirs) $(install-file)
|
||||||
@true
|
@:
|
||||||
|
|
||||||
$(objhdr-y) $(subdir-y) $(header-y) $(unifdef-y): | $(INSTALL_HDR_PATH)/$(_dst) $(unwanted)
|
targets += $(install-file)
|
||||||
|
$(install-file): scripts/headers_install.pl $(input-files) FORCE
|
||||||
$(INSTALL_HDR_PATH)/$(_dst):
|
$(if $(unwanted),$(call cmd,remove),)
|
||||||
$(call cmd,mkdir)
|
$(if $(wildcard $(dir $@)),,$(shell mkdir -p $(dir $@)))
|
||||||
|
$(call if_changed,install)
|
||||||
.PHONY: $(unwanted)
|
|
||||||
$(unwanted):
|
|
||||||
$(call cmd,remove)
|
|
||||||
|
|
||||||
ifdef GENASM
|
|
||||||
$(objhdr-y) $(header-y) $(unifdef-y): $(KBUILDFILES)
|
|
||||||
$(call cmd,gen)
|
|
||||||
|
|
||||||
else
|
else
|
||||||
$(objhdr-y) : $(INSTALL_HDR_PATH)/$(_dst)/%.h: $(objtree)/$(obj)/%.h $(KBUILDFILES)
|
__headerscheck: $(subdirs) $(check-file)
|
||||||
$(call cmd,o_hdr_install)
|
@:
|
||||||
|
|
||||||
$(header-y) : $(INSTALL_HDR_PATH)/$(_dst)/%.h: $(srctree)/$(obj)/%.h $(KBUILDFILES)
|
targets += $(check-file)
|
||||||
$(call cmd,headers_install)
|
$(check-file): scripts/headers_check.pl $(output-files) FORCE
|
||||||
|
$(call if_changed,check)
|
||||||
|
|
||||||
$(unifdef-y) : $(INSTALL_HDR_PATH)/$(_dst)/%.h: $(srctree)/$(obj)/%.h $(KBUILDFILES)
|
|
||||||
$(call cmd,unifdef)
|
|
||||||
endif
|
endif
|
||||||
endif
|
|
||||||
|
|
||||||
hdrinst := -rR -f $(srctree)/scripts/Makefile.headersinst obj
|
|
||||||
|
|
||||||
.PHONY: altarch-dir
|
|
||||||
# All the files in the normal arch dir must be created first, since we test
|
|
||||||
# for their existence.
|
|
||||||
altarch-dir: $(subdir-y) $(header-y) $(unifdef-y) $(objhdr-y)
|
|
||||||
$(Q)$(MAKE) $(hdrinst)=include/asm-$(ALTARCH) dst=include/asm-$(ALTARCH)
|
|
||||||
$(Q)$(MAKE) $(hdrinst)=include/asm dst=include/asm$(BIASMDIR)
|
|
||||||
|
|
||||||
# Recursion
|
# Recursion
|
||||||
.PHONY: $(subdir-y)
|
hdr-inst := -rR -f $(srctree)/scripts/Makefile.headersinst obj
|
||||||
$(subdir-y):
|
.PHONY: $(subdirs)
|
||||||
$(Q)$(MAKE) $(hdrinst)=$(obj)/$@ dst=$(_dst)/$@ rel=../$(rel)
|
$(subdirs):
|
||||||
|
$(Q)$(MAKE) $(hdr-inst)=$(obj)/$@ dst=$(_dst)/$@
|
||||||
|
|
||||||
|
targets := $(wildcard $(sort $(targets)))
|
||||||
|
cmd_files := $(wildcard \
|
||||||
|
$(foreach f,$(targets),$(dir $(f)).$(notdir $(f)).cmd))
|
||||||
|
|
||||||
|
ifneq ($(cmd_files),)
|
||||||
|
include $(cmd_files)
|
||||||
|
endif
|
||||||
|
|
||||||
|
.PHONY: $(PHONY)
|
||||||
|
PHONY += FORCE
|
||||||
|
FORCE: ;
|
||||||
|
129
scripts/diffconfig
Executable file
129
scripts/diffconfig
Executable file
@@ -0,0 +1,129 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
#
|
||||||
|
# diffconfig - a tool to compare .config files.
|
||||||
|
#
|
||||||
|
# originally written in 2006 by Matt Mackall
|
||||||
|
# (at least, this was in his bloatwatch source code)
|
||||||
|
# last worked on 2008 by Tim Bird
|
||||||
|
#
|
||||||
|
|
||||||
|
import sys, os
|
||||||
|
|
||||||
|
def usage():
|
||||||
|
print """Usage: diffconfig [-h] [-m] [<config1> <config2>]
|
||||||
|
|
||||||
|
Diffconfig is a simple utility for comparing two .config files.
|
||||||
|
Using standard diff to compare .config files often includes extraneous and
|
||||||
|
distracting information. This utility produces sorted output with only the
|
||||||
|
changes in configuration values between the two files.
|
||||||
|
|
||||||
|
Added and removed items are shown with a leading plus or minus, respectively.
|
||||||
|
Changed items show the old and new values on a single line.
|
||||||
|
|
||||||
|
If -m is specified, then output will be in "merge" style, which has the
|
||||||
|
changed and new values in kernel config option format.
|
||||||
|
|
||||||
|
If no config files are specified, .config and .config.old are used.
|
||||||
|
|
||||||
|
Example usage:
|
||||||
|
$ diffconfig .config config-with-some-changes
|
||||||
|
-EXT2_FS_XATTR n
|
||||||
|
-EXT2_FS_XIP n
|
||||||
|
CRAMFS n -> y
|
||||||
|
EXT2_FS y -> n
|
||||||
|
LOG_BUF_SHIFT 14 -> 16
|
||||||
|
PRINTK_TIME n -> y
|
||||||
|
"""
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
# returns a dictionary of name/value pairs for config items in the file
|
||||||
|
def readconfig(config_file):
|
||||||
|
d = {}
|
||||||
|
for line in config_file:
|
||||||
|
line = line[:-1]
|
||||||
|
if line[:7] == "CONFIG_":
|
||||||
|
name, val = line[7:].split("=", 1)
|
||||||
|
d[name] = val
|
||||||
|
if line[-11:] == " is not set":
|
||||||
|
d[line[9:-11]] = "n"
|
||||||
|
return d
|
||||||
|
|
||||||
|
def print_config(op, config, value, new_value):
|
||||||
|
global merge_style
|
||||||
|
|
||||||
|
if merge_style:
|
||||||
|
if new_value:
|
||||||
|
if new_value=="n":
|
||||||
|
print "# CONFIG_%s is not set" % config
|
||||||
|
else:
|
||||||
|
print "CONFIG_%s=%s" % (config, new_value)
|
||||||
|
else:
|
||||||
|
if op=="-":
|
||||||
|
print "-%s %s" % (config, value)
|
||||||
|
elif op=="+":
|
||||||
|
print "+%s %s" % (config, new_value)
|
||||||
|
else:
|
||||||
|
print " %s %s -> %s" % (config, value, new_value)
|
||||||
|
|
||||||
|
def main():
|
||||||
|
global merge_style
|
||||||
|
|
||||||
|
# parse command line args
|
||||||
|
if ("-h" in sys.argv or "--help" in sys.argv):
|
||||||
|
usage()
|
||||||
|
|
||||||
|
merge_style = 0
|
||||||
|
if "-m" in sys.argv:
|
||||||
|
merge_style = 1
|
||||||
|
sys.argv.remove("-m")
|
||||||
|
|
||||||
|
argc = len(sys.argv)
|
||||||
|
if not (argc==1 or argc == 3):
|
||||||
|
print "Error: incorrect number of arguments or unrecognized option"
|
||||||
|
usage()
|
||||||
|
|
||||||
|
if argc == 1:
|
||||||
|
# if no filenames given, assume .config and .config.old
|
||||||
|
build_dir=""
|
||||||
|
if os.environ.has_key("KBUILD_OUTPUT"):
|
||||||
|
build_dir = os.environ["KBUILD_OUTPUT"]+"/"
|
||||||
|
|
||||||
|
configa_filename = build_dir + ".config.old"
|
||||||
|
configb_filename = build_dir + ".config"
|
||||||
|
else:
|
||||||
|
configa_filename = sys.argv[1]
|
||||||
|
configb_filename = sys.argv[2]
|
||||||
|
|
||||||
|
a = readconfig(file(configa_filename))
|
||||||
|
b = readconfig(file(configb_filename))
|
||||||
|
|
||||||
|
# print items in a but not b (accumulate, sort and print)
|
||||||
|
old = []
|
||||||
|
for config in a:
|
||||||
|
if config not in b:
|
||||||
|
old.append(config)
|
||||||
|
old.sort()
|
||||||
|
for config in old:
|
||||||
|
print_config("-", config, a[config], None)
|
||||||
|
del a[config]
|
||||||
|
|
||||||
|
# print items that changed (accumulate, sort, and print)
|
||||||
|
changed = []
|
||||||
|
for config in a:
|
||||||
|
if a[config] != b[config]:
|
||||||
|
changed.append(config)
|
||||||
|
else:
|
||||||
|
del b[config]
|
||||||
|
changed.sort()
|
||||||
|
for config in changed:
|
||||||
|
print_config("->", config, a[config], b[config])
|
||||||
|
del b[config]
|
||||||
|
|
||||||
|
# now print items in b but not in a
|
||||||
|
# (items from b that were in a were removed above)
|
||||||
|
new = b.keys()
|
||||||
|
new.sort()
|
||||||
|
for config in new:
|
||||||
|
print_config("+", config, None, b[config])
|
||||||
|
|
||||||
|
main()
|
@@ -1,10 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
for FILE in `grep '^[ \t]*#[ \t]*include[ \t]*<' $2 | cut -f2 -d\< | cut -f1 -d\> | egrep ^linux\|^asm` ; do
|
|
||||||
if [ ! -r $1/$FILE ]; then
|
|
||||||
echo $2 requires $FILE, which does not exist in exported headers
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
# FIXME: List dependencies into $3
|
|
||||||
touch $3
|
|
41
scripts/headers.sh
Executable file
41
scripts/headers.sh
Executable file
@@ -0,0 +1,41 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# Run headers_$1 command for all suitable architectures
|
||||||
|
|
||||||
|
# Stop on error
|
||||||
|
set -e
|
||||||
|
|
||||||
|
do_command()
|
||||||
|
{
|
||||||
|
if [ -f ${srctree}/arch/$2/include/asm/Kbuild ]; then
|
||||||
|
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
|
||||||
|
printf "Ignoring arch: %s\n" ${arch}
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Do not try this architecture
|
||||||
|
drop="generic um ppc sparc64 cris"
|
||||||
|
|
||||||
|
archs=$(ls ${srctree}/arch)
|
||||||
|
|
||||||
|
for arch in ${archs}; do
|
||||||
|
case ${arch} in
|
||||||
|
um) # no userspace export
|
||||||
|
;;
|
||||||
|
ppc) # headers exported by powerpc
|
||||||
|
;;
|
||||||
|
sparc64) # headers exported by sparc
|
||||||
|
;;
|
||||||
|
cris) # headers export are known broken
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
if [ -d ${srctree}/arch/${arch} ]; then
|
||||||
|
do_command $1 ${arch}
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
|
56
scripts/headers_check.pl
Normal file
56
scripts/headers_check.pl
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
#!/usr/bin/perl
|
||||||
|
#
|
||||||
|
# headers_check.pl execute a number of trivial consistency checks
|
||||||
|
#
|
||||||
|
# Usage: headers_check.pl dir [files...]
|
||||||
|
# dir: dir to look for included files
|
||||||
|
# arch: architecture
|
||||||
|
# files: list of files to check
|
||||||
|
#
|
||||||
|
# The script reads the supplied files line by line and:
|
||||||
|
#
|
||||||
|
# 1) for each include statement it checks if the
|
||||||
|
# included file actually exists.
|
||||||
|
# Only include files located in asm* and linux* are checked.
|
||||||
|
# The rest are assumed to be system include files.
|
||||||
|
#
|
||||||
|
# 2) TODO: check for leaked CONFIG_ symbols
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
my ($dir, $arch, @files) = @ARGV;
|
||||||
|
|
||||||
|
my $ret = 0;
|
||||||
|
my $line;
|
||||||
|
my $lineno = 0;
|
||||||
|
my $filename;
|
||||||
|
|
||||||
|
foreach my $file (@files) {
|
||||||
|
$filename = $file;
|
||||||
|
open(my $fh, '<', "$filename") or die "$filename: $!\n";
|
||||||
|
$lineno = 0;
|
||||||
|
while ($line = <$fh>) {
|
||||||
|
$lineno++;
|
||||||
|
check_include();
|
||||||
|
}
|
||||||
|
close $fh;
|
||||||
|
}
|
||||||
|
exit $ret;
|
||||||
|
|
||||||
|
sub check_include
|
||||||
|
{
|
||||||
|
if ($line =~ m/^\s*#\s*include\s+<((asm|linux).*)>/) {
|
||||||
|
my $inc = $1;
|
||||||
|
my $found;
|
||||||
|
$found = stat($dir . "/" . $inc);
|
||||||
|
if (!$found) {
|
||||||
|
$inc =~ s#asm/#asm-$arch/#;
|
||||||
|
$found = stat($dir . "/" . $inc);
|
||||||
|
}
|
||||||
|
if (!$found) {
|
||||||
|
printf STDERR "$filename:$lineno: included file '$inc' is not exported\n";
|
||||||
|
$ret = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
45
scripts/headers_install.pl
Normal file
45
scripts/headers_install.pl
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
#!/usr/bin/perl
|
||||||
|
#
|
||||||
|
# headers_install prepare the listed header files for use in
|
||||||
|
# user space and copy the files to their destination.
|
||||||
|
#
|
||||||
|
# Usage: headers_install.pl readdir installdir arch [files...]
|
||||||
|
# readdir: dir to open files
|
||||||
|
# installdir: dir to install the files
|
||||||
|
# arch: current architecture
|
||||||
|
# arch is used to force a reinstallation when the arch
|
||||||
|
# changes because kbuild then detect a command line change.
|
||||||
|
# files: list of files to check
|
||||||
|
#
|
||||||
|
# Step in preparation for users space:
|
||||||
|
# 1) Drop all use of compiler.h definitions
|
||||||
|
# 2) Drop include of compiler.h
|
||||||
|
# 3) Drop all sections defined out by __KERNEL__ (using unifdef)
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
my ($readdir, $installdir, $arch, @files) = @ARGV;
|
||||||
|
|
||||||
|
my $unifdef = "scripts/unifdef -U__KERNEL__";
|
||||||
|
|
||||||
|
foreach my $file (@files) {
|
||||||
|
my $tmpfile = "$installdir/$file.tmp";
|
||||||
|
open(my $infile, '<', "$readdir/$file")
|
||||||
|
or die "$readdir/$file: $!\n";
|
||||||
|
open(my $outfile, '>', "$tmpfile") or die "$tmpfile: $!\n";
|
||||||
|
while (my $line = <$infile>) {
|
||||||
|
$line =~ s/([\s(])__user\s/$1/g;
|
||||||
|
$line =~ s/([\s(])__force\s/$1/g;
|
||||||
|
$line =~ s/([\s(])__iomem\s/$1/g;
|
||||||
|
$line =~ s/\s__attribute_const__\s/ /g;
|
||||||
|
$line =~ s/\s__attribute_const__$//g;
|
||||||
|
$line =~ s/^#include <linux\/compiler.h>//;
|
||||||
|
printf $outfile "%s", $line;
|
||||||
|
}
|
||||||
|
close $outfile;
|
||||||
|
close $infile;
|
||||||
|
system $unifdef . " $tmpfile > $installdir/$file";
|
||||||
|
unlink $tmpfile;
|
||||||
|
}
|
||||||
|
exit 0;
|
@@ -76,7 +76,6 @@ static void check_stdin(void)
|
|||||||
static int conf_askvalue(struct symbol *sym, const char *def)
|
static int conf_askvalue(struct symbol *sym, const char *def)
|
||||||
{
|
{
|
||||||
enum symbol_type type = sym_get_type(sym);
|
enum symbol_type type = sym_get_type(sym);
|
||||||
tristate val;
|
|
||||||
|
|
||||||
if (!sym_has_value(sym))
|
if (!sym_has_value(sym))
|
||||||
printf(_("(NEW) "));
|
printf(_("(NEW) "));
|
||||||
@@ -92,15 +91,6 @@ static int conf_askvalue(struct symbol *sym, const char *def)
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch (input_mode) {
|
switch (input_mode) {
|
||||||
case set_no:
|
|
||||||
case set_mod:
|
|
||||||
case set_yes:
|
|
||||||
case set_random:
|
|
||||||
if (sym_has_value(sym)) {
|
|
||||||
printf("%s\n", def);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ask_new:
|
case ask_new:
|
||||||
case ask_silent:
|
case ask_silent:
|
||||||
if (sym_has_value(sym)) {
|
if (sym_has_value(sym)) {
|
||||||
@@ -112,9 +102,6 @@ static int conf_askvalue(struct symbol *sym, const char *def)
|
|||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
fgets(line, 128, stdin);
|
fgets(line, 128, stdin);
|
||||||
return 1;
|
return 1;
|
||||||
case set_default:
|
|
||||||
printf("%s\n", def);
|
|
||||||
return 1;
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -128,52 +115,6 @@ static int conf_askvalue(struct symbol *sym, const char *def)
|
|||||||
default:
|
default:
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
switch (input_mode) {
|
|
||||||
case set_yes:
|
|
||||||
if (sym_tristate_within_range(sym, yes)) {
|
|
||||||
line[0] = 'y';
|
|
||||||
line[1] = '\n';
|
|
||||||
line[2] = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case set_mod:
|
|
||||||
if (type == S_TRISTATE) {
|
|
||||||
if (sym_tristate_within_range(sym, mod)) {
|
|
||||||
line[0] = 'm';
|
|
||||||
line[1] = '\n';
|
|
||||||
line[2] = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (sym_tristate_within_range(sym, yes)) {
|
|
||||||
line[0] = 'y';
|
|
||||||
line[1] = '\n';
|
|
||||||
line[2] = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case set_no:
|
|
||||||
if (sym_tristate_within_range(sym, no)) {
|
|
||||||
line[0] = 'n';
|
|
||||||
line[1] = '\n';
|
|
||||||
line[2] = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case set_random:
|
|
||||||
do {
|
|
||||||
val = (tristate)(rand() % 3);
|
|
||||||
} while (!sym_tristate_within_range(sym, val));
|
|
||||||
switch (val) {
|
|
||||||
case no: line[0] = 'n'; break;
|
|
||||||
case mod: line[0] = 'm'; break;
|
|
||||||
case yes: line[0] = 'y'; break;
|
|
||||||
}
|
|
||||||
line[1] = '\n';
|
|
||||||
line[2] = 0;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
printf("%s", line);
|
printf("%s", line);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -374,15 +315,7 @@ static int conf_choice(struct menu *menu)
|
|||||||
else
|
else
|
||||||
continue;
|
continue;
|
||||||
break;
|
break;
|
||||||
case set_random:
|
default:
|
||||||
if (is_new)
|
|
||||||
def = (rand() % cnt) + 1;
|
|
||||||
case set_default:
|
|
||||||
case set_yes:
|
|
||||||
case set_mod:
|
|
||||||
case set_no:
|
|
||||||
cnt = def;
|
|
||||||
printf("%d\n", cnt);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -494,6 +427,43 @@ static void check_conf(struct menu *menu)
|
|||||||
check_conf(child);
|
check_conf(child);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void conf_do_update(void)
|
||||||
|
{
|
||||||
|
/* Update until a loop caused no more changes */
|
||||||
|
do {
|
||||||
|
conf_cnt = 0;
|
||||||
|
check_conf(&rootmenu);
|
||||||
|
} while (conf_cnt);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int conf_silent_update(void)
|
||||||
|
{
|
||||||
|
const char *name;
|
||||||
|
|
||||||
|
if (conf_get_changed()) {
|
||||||
|
name = getenv("KCONFIG_NOSILENTUPDATE");
|
||||||
|
if (name && *name) {
|
||||||
|
fprintf(stderr,
|
||||||
|
_("\n*** Kernel configuration requires explicit update.\n\n"));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
conf_do_update();
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int conf_update(void)
|
||||||
|
{
|
||||||
|
rootEntry = &rootmenu;
|
||||||
|
conf(&rootmenu);
|
||||||
|
if (input_mode == ask_all) {
|
||||||
|
input_mode = ask_silent;
|
||||||
|
valid_stdin = 1;
|
||||||
|
}
|
||||||
|
conf_do_update();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int main(int ac, char **av)
|
int main(int ac, char **av)
|
||||||
{
|
{
|
||||||
int opt;
|
int opt;
|
||||||
@@ -599,36 +569,43 @@ int main(int ac, char **av)
|
|||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
switch (input_mode) {
|
||||||
if (input_mode != ask_silent) {
|
case set_no:
|
||||||
rootEntry = &rootmenu;
|
conf_set_all_new_symbols(def_no);
|
||||||
conf(&rootmenu);
|
break;
|
||||||
if (input_mode == ask_all) {
|
case set_yes:
|
||||||
input_mode = ask_silent;
|
conf_set_all_new_symbols(def_yes);
|
||||||
valid_stdin = 1;
|
break;
|
||||||
}
|
case set_mod:
|
||||||
} else if (conf_get_changed()) {
|
conf_set_all_new_symbols(def_mod);
|
||||||
name = getenv("KCONFIG_NOSILENTUPDATE");
|
break;
|
||||||
if (name && *name) {
|
case set_random:
|
||||||
fprintf(stderr, _("\n*** Kernel configuration requires explicit update.\n\n"));
|
conf_set_all_new_symbols(def_random);
|
||||||
return 1;
|
break;
|
||||||
}
|
case set_default:
|
||||||
} else
|
conf_set_all_new_symbols(def_default);
|
||||||
goto skip_check;
|
break;
|
||||||
|
case ask_silent:
|
||||||
do {
|
case ask_new:
|
||||||
conf_cnt = 0;
|
if (conf_silent_update())
|
||||||
check_conf(&rootmenu);
|
exit(1);
|
||||||
} while (conf_cnt);
|
break;
|
||||||
if (conf_write(NULL)) {
|
case ask_all:
|
||||||
fprintf(stderr, _("\n*** Error during writing of the kernel configuration.\n\n"));
|
if (conf_update())
|
||||||
return 1;
|
exit(1);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
skip_check:
|
|
||||||
|
if (conf_get_changed() && conf_write(NULL)) {
|
||||||
|
fprintf(stderr, _("\n*** Error during writing of the kernel configuration.\n\n"));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
/* ask_silent is used during the build so we shall update autoconf.
|
||||||
|
* All other commands are only used to generate a config.
|
||||||
|
*/
|
||||||
if (input_mode == ask_silent && conf_write_autoconf()) {
|
if (input_mode == ask_silent && conf_write_autoconf()) {
|
||||||
fprintf(stderr, _("\n*** Error during writing of the kernel configuration.\n\n"));
|
fprintf(stderr, _("\n*** Error during writing of the kernel configuration.\n\n"));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@@ -812,3 +812,73 @@ void conf_set_changed_callback(void (*fn)(void))
|
|||||||
{
|
{
|
||||||
conf_changed_callback = fn;
|
conf_changed_callback = fn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void conf_set_all_new_symbols(enum conf_def_mode mode)
|
||||||
|
{
|
||||||
|
struct symbol *sym, *csym;
|
||||||
|
struct property *prop;
|
||||||
|
struct expr *e;
|
||||||
|
int i, cnt, def;
|
||||||
|
|
||||||
|
for_all_symbols(i, sym) {
|
||||||
|
if (sym_has_value(sym))
|
||||||
|
continue;
|
||||||
|
switch (sym_get_type(sym)) {
|
||||||
|
case S_BOOLEAN:
|
||||||
|
case S_TRISTATE:
|
||||||
|
switch (mode) {
|
||||||
|
case def_yes:
|
||||||
|
sym->def[S_DEF_USER].tri = yes;
|
||||||
|
break;
|
||||||
|
case def_mod:
|
||||||
|
sym->def[S_DEF_USER].tri = mod;
|
||||||
|
break;
|
||||||
|
case def_no:
|
||||||
|
sym->def[S_DEF_USER].tri = no;
|
||||||
|
break;
|
||||||
|
case def_random:
|
||||||
|
sym->def[S_DEF_USER].tri = (tristate)(rand() % 3);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!sym_is_choice(sym) || mode != def_random)
|
||||||
|
sym->flags |= SYMBOL_DEF_USER;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (modules_sym)
|
||||||
|
sym_calc_value(modules_sym);
|
||||||
|
|
||||||
|
if (mode != def_random)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for_all_symbols(i, csym) {
|
||||||
|
if (sym_has_value(csym) || !sym_is_choice(csym))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
sym_calc_value(csym);
|
||||||
|
prop = sym_get_choice_prop(csym);
|
||||||
|
def = -1;
|
||||||
|
while (1) {
|
||||||
|
cnt = 0;
|
||||||
|
expr_list_for_each_sym(prop->expr, e, sym) {
|
||||||
|
if (sym->visible == no)
|
||||||
|
continue;
|
||||||
|
if (def == cnt++) {
|
||||||
|
csym->def[S_DEF_USER].val = sym;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (def >= 0 || cnt < 2)
|
||||||
|
break;
|
||||||
|
def = (rand() % cnt) + 1;
|
||||||
|
}
|
||||||
|
csym->flags |= SYMBOL_DEF_USER;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -42,6 +42,14 @@ extern "C" {
|
|||||||
#define TF_PARAM 0x0002
|
#define TF_PARAM 0x0002
|
||||||
#define TF_OPTION 0x0004
|
#define TF_OPTION 0x0004
|
||||||
|
|
||||||
|
enum conf_def_mode {
|
||||||
|
def_default,
|
||||||
|
def_yes,
|
||||||
|
def_mod,
|
||||||
|
def_no,
|
||||||
|
def_random
|
||||||
|
};
|
||||||
|
|
||||||
#define T_OPT_MODULES 1
|
#define T_OPT_MODULES 1
|
||||||
#define T_OPT_DEFCONFIG_LIST 2
|
#define T_OPT_DEFCONFIG_LIST 2
|
||||||
#define T_OPT_ENV 3
|
#define T_OPT_ENV 3
|
||||||
@@ -69,6 +77,7 @@ const char *conf_get_configname(void);
|
|||||||
char *conf_get_default_confname(void);
|
char *conf_get_default_confname(void);
|
||||||
void sym_set_change_count(int count);
|
void sym_set_change_count(int count);
|
||||||
void sym_add_change_count(int count);
|
void sym_add_change_count(int count);
|
||||||
|
void conf_set_all_new_symbols(enum conf_def_mode mode);
|
||||||
|
|
||||||
/* kconfig_load.c */
|
/* kconfig_load.c */
|
||||||
void kconfig_load(void);
|
void kconfig_load(void);
|
||||||
|
@@ -1643,6 +1643,7 @@ sub dump_function($$) {
|
|||||||
$prototype =~ s/^__always_inline +//;
|
$prototype =~ s/^__always_inline +//;
|
||||||
$prototype =~ s/^noinline +//;
|
$prototype =~ s/^noinline +//;
|
||||||
$prototype =~ s/__devinit +//;
|
$prototype =~ s/__devinit +//;
|
||||||
|
$prototype =~ s/__init +//;
|
||||||
$prototype =~ s/^#define\s+//; #ak added
|
$prototype =~ s/^#define\s+//; #ak added
|
||||||
$prototype =~ s/__attribute__\s*\(\([a-z,]*\)\)//;
|
$prototype =~ s/__attribute__\s*\(\([a-z,]*\)\)//;
|
||||||
|
|
||||||
|
@@ -12,7 +12,9 @@ cd "${1:-.}" || usage
|
|||||||
if head=`git rev-parse --verify HEAD 2>/dev/null`; then
|
if head=`git rev-parse --verify HEAD 2>/dev/null`; then
|
||||||
# Do we have an untagged version?
|
# Do we have an untagged version?
|
||||||
if git name-rev --tags HEAD | grep -E '^HEAD[[:space:]]+(.*~[0-9]*|undefined)$' > /dev/null; then
|
if git name-rev --tags HEAD | grep -E '^HEAD[[:space:]]+(.*~[0-9]*|undefined)$' > /dev/null; then
|
||||||
git describe | awk -F- '{printf("-%05d-%s", $(NF-1),$(NF))}'
|
if tag=`git describe 2>/dev/null`; then
|
||||||
|
echo $tag | awk -F- '{printf("-%05d-%s", $(NF-1),$(NF))}'
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Are there uncommitted changes?
|
# Are there uncommitted changes?
|
||||||
|
Reference in New Issue
Block a user