Commit 6948385c authored by Linus Torvalds's avatar Linus Torvalds

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_*
  ...
parents 7a76d892 56b2f070
...@@ -73,10 +73,10 @@ recompiled, or use "make C=2" to run sparse on the files whether they need to ...@@ -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.
...@@ -43,7 +43,7 @@ $(obj)/$(bounds-file): kernel/bounds.s 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 \ ...@@ -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)
##### #####
......
...@@ -205,6 +205,9 @@ ifeq ($(ARCH),x86_64) ...@@ -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 = ...@@ -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),) ...@@ -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) ...@@ -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 ...@@ -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
PHONY += headers_install_all hdr-inst := -rR -f $(srctree)/scripts/Makefile.headersinst obj
headers_install_all: include/linux/version.h scripts_basic FORCE # 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 $(Q)$(MAKE) $(build)=scripts scripts/unifdef
$(Q)for arch in $(HDRARCHES); do \
$(MAKE) ARCH=$$arch -f $(srctree)/scripts/Makefile.headersinst obj=include BIASMDIR=-bi-$$arch ;\ PHONY += headers_install_all
done headers_install_all:
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/headers.sh install
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 \ ...@@ -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) ...@@ -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: ...@@ -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 ...@@ -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 ...@@ -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---
......
# 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/ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 ...@@ -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 ...@@ -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.
......
# ========================================================================== # ==========================================================================
# 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 install := $(INSTALL_HDR_PATH)/$(_dst)
# If this is include/asm-$(ARCH) and there's no $(ALTARCH), then header-y := $(sort $(header-y) $(unifdef-y))
# override $(_dst) so that we install to include/asm directly. subdirs := $(patsubst %/,%,$(filter %/, $(header-y)))
# Unless $(BIASMDIR) is set, in which case we're probably doing header-y := $(filter-out %/, $(header-y))
# 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)) # files used to track state of install/check
unifdef-y := $(sort $(unifdef-y)) install-file := $(install)/.install
subdir-y := $(patsubst %/,%,$(filter %/, $(header-y))) check-file := $(install)/.check
header-y := $(filter-out %/, $(header-y))
header-y := $(filter-out $(unifdef-y),$(header-y))
# stamp files for header checks # all headers files for this dir
check-y := $(patsubst %,.check.%,$(header-y) $(unifdef-y) $(objhdr-y)) 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)/%,%,$@)
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)/%,%,$@)
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 PHONY += __headersinst __headerscheck
# Rules for installing headers
__headersinst: $(subdir-y) $(header-y) $(unifdef-y) $(altarch-y) $(objhdr-y)
@true
$(objhdr-y) $(subdir-y) $(header-y) $(unifdef-y): | $(INSTALL_HDR_PATH)/$(_dst) $(unwanted) ifndef HDRCHECK
# Rules for installing headers
$(INSTALL_HDR_PATH)/$(_dst): __headersinst: $(subdirs) $(install-file)
$(call cmd,mkdir) @:
.PHONY: $(unwanted)
$(unwanted):
$(call cmd,remove)
ifdef GENASM targets += $(install-file)
$(objhdr-y) $(header-y) $(unifdef-y): $(KBUILDFILES) $(install-file): scripts/headers_install.pl $(input-files) FORCE
$(call cmd,gen) $(if $(unwanted),$(call cmd,remove),)
$(if $(wildcard $(dir $@)),,$(shell mkdir -p $(dir $@)))
$(call if_changed,install)
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 # Recursion
hdr-inst := -rR -f $(srctree)/scripts/Makefile.headersinst obj
.PHONY: $(subdirs)
$(subdirs):
$(Q)$(MAKE) $(hdr-inst)=$(obj)/$@ dst=$(_dst)/$@
.PHONY: altarch-dir targets := $(wildcard $(sort $(targets)))
# All the files in the normal arch dir must be created first, since we test cmd_files := $(wildcard \
# for their existence. $(foreach f,$(targets),$(dir $(f)).$(notdir $(f)).cmd))
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 ifneq ($(cmd_files),)
.PHONY: $(subdir-y) include $(cmd_files)
$(subdir-y): endif
$(Q)$(MAKE) $(hdrinst)=$(obj)/$@ dst=$(_dst)/$@ rel=../$(rel)
.PHONY: $(PHONY)
PHONY += FORCE
FORCE: ;
#!/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()
#!/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
#!/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
#!/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;
}
}
}
#!/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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -599,36 +569,43 @@ int main(int ac, char **av)
default: default:
break; break;
} }
switch (input_mode) {
case set_no:
conf_set_all_new_symbols(def_no);
break;
case set_yes:
conf_set_all_new_symbols(def_yes);
break;
case set_mod:
conf_set_all_new_symbols(def_mod);
break;
case set_random:
conf_set_all_new_symbols(def_random);
break;
case set_default:
conf_set_all_new_symbols(def_default);
break;
case ask_silent:
case ask_new:
if (conf_silent_update())
exit(1);
break;
case ask_all:
if (conf_update())
exit(1);
break;
}
if (input_mode != ask_silent) { if (conf_get_changed() && conf_write(NULL)) {
rootEntry = &rootmenu;
conf(&rootmenu);
if (input_mode == ask_all) {
input_mode = ask_silent;
valid_stdin = 1;
}
} else if (conf_get_changed()) {
name = getenv("KCONFIG_NOSILENTUPDATE");
if (name && *name) {
fprintf(stderr, _("\n*** Kernel configuration requires explicit update.\n\n"));
return 1;
}
} else
goto skip_check;
do {
conf_cnt = 0;
check_conf(&rootmenu);
} while (conf_cnt);
if (conf_write(NULL)) {
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; exit(1);
} }
skip_check: /* 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)) ...@@ -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" { ...@@ -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); ...@@ -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($$) { ...@@ -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 ...@@ -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?
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment