Commit c0ff68f1 authored by Nicolas Dichtel's avatar Nicolas Dichtel Committed by Michal Marek

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: default avatarNicolas Dichtel <nicolas.dichtel@6wind.com>
Tested-by: default avatarBruce Ashfield <bruce.ashfield@windriver.com>
Signed-off-by: default avatarMichal Marek <mmarek@suse.cz>
parent f722406f
...@@ -47,18 +47,24 @@ header-y := $(filter-out $(generic-y), $(header-y)) ...@@ -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 $@)) ...@@ -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) ...@@ -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)
......
...@@ -2,7 +2,7 @@ ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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
......
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