kbuild: fix make headers_install when path is too long

If headers_install is executed from a deep/long directory structure, the
shell's maximum argument length can be execeeded, which breaks the operation
with:

| make[2]: execvp: /bin/sh: Argument list too long
| make[2]: ***

Instead of passing each files name with the entire path, I give only the file
name without the source path and give this path as a new argument to
headers_install.pl.

Because there is three possible paths, I have tree input-files list, one per
path.

Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
Tested-by: Bruce Ashfield <bruce.ashfield@windriver.com>
Signed-off-by: Michal Marek <mmarek@suse.cz>
This commit is contained in:
Nicolas Dichtel 2013-04-29 14:15:51 +02:00 committed by Michal Marek
parent f722406faa
commit c0ff68f161
2 changed files with 19 additions and 8 deletions

View File

@ -47,18 +47,24 @@ header-y := $(filter-out $(generic-y), $(header-y))
all-files := $(header-y) $(genhdr-y) $(wrapper-files) all-files := $(header-y) $(genhdr-y) $(wrapper-files)
output-files := $(addprefix $(installdir)/, $(all-files)) output-files := $(addprefix $(installdir)/, $(all-files))
input-files := $(foreach hdr, $(header-y), \ input-files1 := $(foreach hdr, $(header-y), \
$(if $(wildcard $(srcdir)/$(hdr)), \ $(if $(wildcard $(srcdir)/$(hdr)), \
$(wildcard $(srcdir)/$(hdr)), \ $(wildcard $(srcdir)/$(hdr))) \
)
input-files1-name := $(notdir $(input-files1))
input-files2 := $(foreach hdr, $(header-y), \
$(if $(wildcard $(srcdir)/$(hdr)),, \
$(if $(wildcard $(oldsrcdir)/$(hdr)), \ $(if $(wildcard $(oldsrcdir)/$(hdr)), \
$(wildcard $(oldsrcdir)/$(hdr)), \ $(wildcard $(oldsrcdir)/$(hdr)), \
$(error Missing UAPI file $(srcdir)/$(hdr))) \ $(error Missing UAPI file $(srcdir)/$(hdr))) \
)) \ ))
$(foreach hdr, $(genhdr-y), \ input-files2-name := $(notdir $(input-files2))
input-files3 := $(foreach hdr, $(genhdr-y), \
$(if $(wildcard $(gendir)/$(hdr)), \ $(if $(wildcard $(gendir)/$(hdr)), \
$(wildcard $(gendir)/$(hdr)), \ $(wildcard $(gendir)/$(hdr)), \
$(error Missing generated UAPI file $(gendir)/$(hdr)) \ $(error Missing generated UAPI file $(gendir)/$(hdr)) \
)) ))
input-files3-name := $(notdir $(input-files3))
# Work out what needs to be removed # Work out what needs to be removed
oldheaders := $(patsubst $(installdir)/%,%,$(wildcard $(installdir)/*.h)) oldheaders := $(patsubst $(installdir)/%,%,$(wildcard $(installdir)/*.h))
@ -72,7 +78,9 @@ printdir = $(patsubst $(INSTALL_HDR_PATH)/%/,%,$(dir $@))
quiet_cmd_install = INSTALL $(printdir) ($(words $(all-files))\ quiet_cmd_install = INSTALL $(printdir) ($(words $(all-files))\
file$(if $(word 2, $(all-files)),s)) file$(if $(word 2, $(all-files)),s))
cmd_install = \ cmd_install = \
$(CONFIG_SHELL) $< $(installdir) $(input-files); \ $(CONFIG_SHELL) $< $(installdir) $(srcdir) $(input-files1-name); \
$(CONFIG_SHELL) $< $(installdir) $(oldsrcdir) $(input-files2-name); \
$(CONFIG_SHELL) $< $(installdir) $(gendir) $(input-files3-name); \
for F in $(wrapper-files); do \ for F in $(wrapper-files); do \
echo "\#include <asm-generic/$$F>" > $(installdir)/$$F; \ echo "\#include <asm-generic/$$F>" > $(installdir)/$$F; \
done; \ done; \
@ -98,7 +106,7 @@ __headersinst: $(subdirs) $(install-file)
@: @:
targets += $(install-file) targets += $(install-file)
$(install-file): scripts/headers_install.sh $(input-files) FORCE $(install-file): scripts/headers_install.sh $(input-files1) $(input-files2) $(input-files3) FORCE
$(if $(unwanted),$(call cmd,remove),) $(if $(unwanted),$(call cmd,remove),)
$(if $(wildcard $(dir $@)),,$(shell mkdir -p $(dir $@))) $(if $(wildcard $(dir $@)),,$(shell mkdir -p $(dir $@)))
$(call if_changed,install) $(call if_changed,install)

View File

@ -2,7 +2,7 @@
if [ $# -lt 1 ] if [ $# -lt 1 ]
then then
echo "Usage: headers_install.sh OUTDIR [FILES...] echo "Usage: headers_install.sh OUTDIR SRCDIR [FILES...]
echo echo
echo "Prepares kernel header files for use by user space, by removing" echo "Prepares kernel header files for use by user space, by removing"
echo "all compiler.h definitions and #includes, removing any" echo "all compiler.h definitions and #includes, removing any"
@ -10,6 +10,7 @@ then
echo "asm/inline/volatile keywords." echo "asm/inline/volatile keywords."
echo echo
echo "OUTDIR: directory to write each userspace header FILE to." echo "OUTDIR: directory to write each userspace header FILE to."
echo "SRCDIR: source directory where files are picked."
echo "FILES: list of header files to operate on." echo "FILES: list of header files to operate on."
exit 1 exit 1
@ -19,6 +20,8 @@ fi
OUTDIR="$1" OUTDIR="$1"
shift shift
SRCDIR="$1"
shift
# Iterate through files listed on command line # Iterate through files listed on command line
@ -34,7 +37,7 @@ do
-e 's/(^|[^a-zA-Z0-9])__packed([^a-zA-Z0-9_]|$)/\1__attribute__((packed))\2/g' \ -e 's/(^|[^a-zA-Z0-9])__packed([^a-zA-Z0-9_]|$)/\1__attribute__((packed))\2/g' \
-e 's/(^|[ \t(])(inline|asm|volatile)([ \t(]|$)/\1__\2__\3/g' \ -e 's/(^|[ \t(])(inline|asm|volatile)([ \t(]|$)/\1__\2__\3/g' \
-e 's@#(ifndef|define|endif[ \t]*/[*])[ \t]*_UAPI@#\1 @' \ -e 's@#(ifndef|define|endif[ \t]*/[*])[ \t]*_UAPI@#\1 @' \
"$i" > "$OUTDIR/$FILE.sed" || exit 1 "$SRCDIR/$i" > "$OUTDIR/$FILE.sed" || exit 1
scripts/unifdef -U__KERNEL__ -D__EXPORTED_HEADERS__ "$OUTDIR/$FILE.sed" \ scripts/unifdef -U__KERNEL__ -D__EXPORTED_HEADERS__ "$OUTDIR/$FILE.sed" \
> "$OUTDIR/$FILE" > "$OUTDIR/$FILE"
[ $? -gt 1 ] && exit 1 [ $? -gt 1 ] && exit 1