Commit c0ff68f1611d6855a06d672989ad5cfea160a4eb

Authored by Nicolas Dichtel
Committed by Michal Marek
1 parent f722406faa

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>

Showing 2 changed files with 19 additions and 8 deletions Side-by-side Diff

scripts/Makefile.headersinst
... ... @@ -47,18 +47,24 @@
47 47 all-files := $(header-y) $(genhdr-y) $(wrapper-files)
48 48 output-files := $(addprefix $(installdir)/, $(all-files))
49 49  
50   -input-files := $(foreach hdr, $(header-y), \
  50 +input-files1 := $(foreach hdr, $(header-y), \
51 51 $(if $(wildcard $(srcdir)/$(hdr)), \
52   - $(wildcard $(srcdir)/$(hdr)), \
  52 + $(wildcard $(srcdir)/$(hdr))) \
  53 + )
  54 +input-files1-name := $(notdir $(input-files1))
  55 +input-files2 := $(foreach hdr, $(header-y), \
  56 + $(if $(wildcard $(srcdir)/$(hdr)),, \
53 57 $(if $(wildcard $(oldsrcdir)/$(hdr)), \
54 58 $(wildcard $(oldsrcdir)/$(hdr)), \
55 59 $(error Missing UAPI file $(srcdir)/$(hdr))) \
56   - )) \
57   - $(foreach hdr, $(genhdr-y), \
  60 + ))
  61 +input-files2-name := $(notdir $(input-files2))
  62 +input-files3 := $(foreach hdr, $(genhdr-y), \
58 63 $(if $(wildcard $(gendir)/$(hdr)), \
59 64 $(wildcard $(gendir)/$(hdr)), \
60 65 $(error Missing generated UAPI file $(gendir)/$(hdr)) \
61 66 ))
  67 +input-files3-name := $(notdir $(input-files3))
62 68  
63 69 # Work out what needs to be removed
64 70 oldheaders := $(patsubst $(installdir)/%,%,$(wildcard $(installdir)/*.h))
... ... @@ -72,7 +78,9 @@
72 78 quiet_cmd_install = INSTALL $(printdir) ($(words $(all-files))\
73 79 file$(if $(word 2, $(all-files)),s))
74 80 cmd_install = \
75   - $(CONFIG_SHELL) $< $(installdir) $(input-files); \
  81 + $(CONFIG_SHELL) $< $(installdir) $(srcdir) $(input-files1-name); \
  82 + $(CONFIG_SHELL) $< $(installdir) $(oldsrcdir) $(input-files2-name); \
  83 + $(CONFIG_SHELL) $< $(installdir) $(gendir) $(input-files3-name); \
76 84 for F in $(wrapper-files); do \
77 85 echo "\#include <asm-generic/$$F>" > $(installdir)/$$F; \
78 86 done; \
... ... @@ -98,7 +106,7 @@
98 106 @:
99 107  
100 108 targets += $(install-file)
101   -$(install-file): scripts/headers_install.sh $(input-files) FORCE
  109 +$(install-file): scripts/headers_install.sh $(input-files1) $(input-files2) $(input-files3) FORCE
102 110 $(if $(unwanted),$(call cmd,remove),)
103 111 $(if $(wildcard $(dir $@)),,$(shell mkdir -p $(dir $@)))
104 112 $(call if_changed,install)
scripts/headers_install.sh
... ... @@ -2,7 +2,7 @@
2 2  
3 3 if [ $# -lt 1 ]
4 4 then
5   - echo "Usage: headers_install.sh OUTDIR [FILES...]
  5 + echo "Usage: headers_install.sh OUTDIR SRCDIR [FILES...]
6 6 echo
7 7 echo "Prepares kernel header files for use by user space, by removing"
8 8 echo "all compiler.h definitions and #includes, removing any"
... ... @@ -10,6 +10,7 @@
10 10 echo "asm/inline/volatile keywords."
11 11 echo
12 12 echo "OUTDIR: directory to write each userspace header FILE to."
  13 + echo "SRCDIR: source directory where files are picked."
13 14 echo "FILES: list of header files to operate on."
14 15  
15 16 exit 1
... ... @@ -19,6 +20,8 @@
19 20  
20 21 OUTDIR="$1"
21 22 shift
  23 +SRCDIR="$1"
  24 +shift
22 25  
23 26 # Iterate through files listed on command line
24 27  
... ... @@ -34,7 +37,7 @@
34 37 -e 's/(^|[^a-zA-Z0-9])__packed([^a-zA-Z0-9_]|$)/\1__attribute__((packed))\2/g' \
35 38 -e 's/(^|[ \t(])(inline|asm|volatile)([ \t(]|$)/\1__\2__\3/g' \
36 39 -e 's@#(ifndef|define|endif[ \t]*/[*])[ \t]*_UAPI@#\1 @' \
37   - "$i" > "$OUTDIR/$FILE.sed" || exit 1
  40 + "$SRCDIR/$i" > "$OUTDIR/$FILE.sed" || exit 1
38 41 scripts/unifdef -U__KERNEL__ -D__EXPORTED_HEADERS__ "$OUTDIR/$FILE.sed" \
39 42 > "$OUTDIR/$FILE"
40 43 [ $? -gt 1 ] && exit 1