2011-04-22 15:53:53

by Sam Ravnborg

[permalink] [raw]
Subject: [PATCH v3] kbuild: asm-generic support

>From 34d0b72a343dd63c1c1b049e4ba6931f0dbcbc3f Mon Sep 17 00:00:00 2001
From: Sam Ravnborg <[email protected]>
Date: Fri, 22 Apr 2011 14:45:13 +0200
Subject: [PATCH] kbuild: asm-generic support

There is an increasing amount of header files
shared between individual architectures in asm-generic.
To avoid a lot of dummy wrapper files that just
include the corresponding file in asm-generic provide
some basic support in kbuild for this.

With the following patch an architecture can maintain
a list of files in the file arch/$(ARCH)/include/asm/Kbuild

To use a generic file just add:

generic-y += <name-of-header-file.h>

For each file listed kbuild will generate the necessary
wrapper in arch/$(ARCH)/include/generated/asm.

When installing userspace headers a wrapper is likewise created.

The original inspiration for this came from the unicore32
patchset - although a different method is used.

The patch includes several improvements from Arnd Bergmann.
Michael Marek contributed Makefile.asm-generic.

Signed-off-by: Sam Ravnborg <[email protected]>
Cc: Guan Xuetao <[email protected]>
Cc: Arnd Bergmann <[email protected]>
---

Hi Mikael.

It took me a while to get back to this.
I used your Makefile.asm-generic almost verbatim.

Only change was that we always need to create the output directory.

Sam

.gitignore | 1 +
Documentation/kbuild/makefiles.txt | 36 ++++++++++++++++++++++++++++++++++++
Makefile | 15 +++++++++++----
scripts/Makefile.asm-generic | 23 +++++++++++++++++++++++
scripts/Makefile.headersinst | 18 +++++++++++++++---
5 files changed, 86 insertions(+), 7 deletions(-)
create mode 100644 scripts/Makefile.asm-generic

diff --git a/.gitignore b/.gitignore
index 5d56a3f..9dacde0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -57,6 +57,7 @@ modules.builtin
include/config
include/linux/version.h
include/generated
+arch/*/include/generated

# stgit generated dirs
patches-*
diff --git a/Documentation/kbuild/makefiles.txt b/Documentation/kbuild/makefiles.txt
index 5d145bb..7f2b8e7 100644
--- a/Documentation/kbuild/makefiles.txt
+++ b/Documentation/kbuild/makefiles.txt
@@ -40,11 +40,13 @@ This document describes the Linux kernel Makefiles.
--- 6.6 Commands useful for building a boot image
--- 6.7 Custom kbuild commands
--- 6.8 Preprocessing linker scripts
+ --- 6.9 Generic header files

=== 7 Kbuild syntax for exported headers
--- 7.1 header-y
--- 7.2 objhdr-y
--- 7.3 destination-y
+ --- 7.4 generic-y

=== 8 Kbuild Variables
=== 9 Makefile language
@@ -1209,6 +1211,14 @@ When kbuild executes, the following steps are followed (roughly):
The kbuild infrastructure for *lds file are used in several
architecture-specific files.

+--- 6.9 Generic header files
+
+ The directory include/asm-generic contains the header files
+ that may be shared between individual architectures.
+ The recommended approach how to use a generic header file is
+ to list the file in the Kbuild file.
+ See "7.4 generic-y" for further info on syntax etc.
+
=== 7 Kbuild syntax for exported headers

The kernel include a set of headers that is exported to userspace.
@@ -1265,6 +1275,32 @@ See subsequent chapter for the syntax of the Kbuild file.
In the example above all exported headers in the Kbuild file
will be located in the directory "include/linux" when exported.

+ --- 7.4 generic-y
+
+ If an architecture uses a verbatim copy of a header from
+ include/asm-generic then this is listed in the file
+ arch/$(ARCH)/include/asm/Kbuild like this:
+
+ Example:
+ #arch/x86/include/asm/Kbuild
+ generic-y += termios.h
+ generic-y += rtc.h
+
+ During the prepare phase of the build a wrapper include
+ file is generated in the directory:
+
+ arch/$(ARCH)/include/generated/asm
+
+ When a header is exported where the architecture uses
+ the generic header a similar wrapper is generated as part
+ of the set of exported headers in the directory:
+
+ usr/include/asm
+
+ The generated wrapper will in both cases look like the following:
+
+ Example: termios.h
+ #include <asm-generic/termios.h>

=== 8 Kbuild Variables

diff --git a/Makefile b/Makefile
index b967b96..30b3852 100644
--- a/Makefile
+++ b/Makefile
@@ -349,7 +349,8 @@ CFLAGS_GCOV = -fprofile-arcs -ftest-coverage

# Use LINUXINCLUDE when you must reference the include/ directory.
# Needed to be compatible with the O= option
-LINUXINCLUDE := -I$(srctree)/arch/$(hdr-arch)/include -Iinclude \
+LINUXINCLUDE := -I$(srctree)/arch/$(hdr-arch)/include \
+ -Iarch/$(hdr-arch)/include/generated -Iinclude \
$(if $(KBUILD_SRC), -I$(srctree)/include) \
-include include/generated/autoconf.h

@@ -416,6 +417,11 @@ ifneq ($(KBUILD_SRC),)
$(srctree) $(objtree) $(VERSION) $(PATCHLEVEL)
endif

+# Support for using generic headers in asm-generic
+PHONY += asm-generic
+asm-generic:
+ $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.asm-generic obj=arch/$(SRCARCH)/include/generated/asm
+
# To make sure we do not include .config for any of the *config targets
# catch them early, and hand them over to scripts/kconfig/Makefile
# It is allowed to specify more targets when calling make, including
@@ -947,7 +953,7 @@ ifneq ($(KBUILD_SRC),)
endif

# prepare2 creates a makefile if using a separate output directory
-prepare2: prepare3 outputmakefile
+prepare2: prepare3 outputmakefile asm-generic

prepare1: prepare2 include/linux/version.h include/generated/utsrelease.h \
include/config/auto.conf
@@ -1021,7 +1027,7 @@ hdr-inst := -rR -f $(srctree)/scripts/Makefile.headersinst obj
hdr-dst = $(if $(KBUILD_HEADERS), dst=include/asm-$(hdr-arch), dst=include/asm)

PHONY += __headers
-__headers: include/linux/version.h scripts_basic FORCE
+__headers: include/linux/version.h scripts_basic asm-generic FORCE
$(Q)$(MAKE) $(build)=scripts build_unifdef

PHONY += headers_install_all
@@ -1136,7 +1142,8 @@ CLEAN_FILES += vmlinux System.map \
.tmp_kallsyms* .tmp_version .tmp_vmlinux* .tmp_System.map

# Directories & files removed with 'make mrproper'
-MRPROPER_DIRS += include/config usr/include include/generated
+MRPROPER_DIRS += include/config usr/include include/generated \
+ arch/*/include/generated
MRPROPER_FILES += .config .config.old .version .old_version \
include/linux/version.h \
Module.symvers tags TAGS cscope* GPATH GTAGS GRTAGS GSYMS
diff --git a/scripts/Makefile.asm-generic b/scripts/Makefile.asm-generic
new file mode 100644
index 0000000..a687cb6
--- /dev/null
+++ b/scripts/Makefile.asm-generic
@@ -0,0 +1,23 @@
+# include/asm-generic contains a lot of files that are used
+# verbatim by several architectures.
+#
+# This Makefile reads the file arch/$(SRCARCH)/include/asm/Kbuild
+# and for each file listed in this file with generic-y creates
+# a small wrapper file in $(obj) (arch/$(SRCARCH)/include/generated/asm)
+
+kbuild-file := $(srctree)/arch/$(SRCARCH)/include/asm/Kbuild
+include $(kbuild-file)
+
+include scripts/Kbuild.include
+
+# Create output directory if not already present
+_dummy := $(shell [ -d $(obj) ] || mkdir -p $(obj))
+
+quiet_cmd_wrap = WRAP $@
+cmd_wrap = echo "\#include <asm-generic/$*.h>" >$@
+
+all: $(patsubst %, $(obj)/%, $(generic-y))
+
+$(obj)/%.h:
+ $(call cmd,wrap)
+
diff --git a/scripts/Makefile.headersinst b/scripts/Makefile.headersinst
index f89cb87..7960b19 100644
--- a/scripts/Makefile.headersinst
+++ b/scripts/Makefile.headersinst
@@ -14,6 +14,7 @@ kbuild-file := $(srctree)/$(obj)/Kbuild
include $(kbuild-file)

_dst := $(if $(destination-y),$(destination-y),$(_dst))
+_src := $(srctree)/$(obj)

include scripts/Kbuild.include

@@ -27,10 +28,16 @@ header-y := $(filter-out %/, $(header-y))
install-file := $(install)/.install
check-file := $(install)/.check

+# generic-y list all files an architecture uses from asm-generic
+# Use this to build a list of headers which require a wrapper
+wrapper-files := $(filter $(header-y), $(generic-y))
+
# all headers files for this dir
-all-files := $(header-y) $(objhdr-y)
-input-files := $(addprefix $(srctree)/$(obj)/,$(header-y)) \
+header-y := $(filter-out $(generic-y), $(header-y))
+all-files := $(header-y) $(objhdr-y) $(wrapper-files)
+input-files := $(addprefix $(_src)/,$(header-y)) \
$(addprefix $(objtree)/$(obj)/,$(objhdr-y))
+
output-files := $(addprefix $(install)/, $(all-files))

# Work out what needs to be removed
@@ -47,8 +54,12 @@ quiet_cmd_install = INSTALL $(printdir) ($(words $(all-files))\
cmd_install = \
$(PERL) $< $(srctree)/$(obj) $(install) $(SRCARCH) $(header-y); \
$(PERL) $< $(objtree)/$(obj) $(install) $(SRCARCH) $(objhdr-y); \
+ for F in $(wrapper-files); do \
+ echo "\#include <asm-generic/$$F>" > $(install)/$$F; \
+ done; \
touch $@

+
quiet_cmd_remove = REMOVE $(unwanted)
cmd_remove = rm -f $(unwanted-file)

@@ -69,7 +80,8 @@ __headersinst: $(subdirs) $(install-file)
@:

targets += $(install-file)
-$(install-file): scripts/headers_install.pl $(input-files) FORCE
+$(install-file): scripts/headers_install.pl \
+ $(input-files) FORCE
$(if $(unwanted),$(call cmd,remove),)
$(if $(wildcard $(dir $@)),,$(shell mkdir -p $(dir $@)))
$(call if_changed,install)
--
1.6.0.6


2011-04-25 01:30:16

by Xuetao Guan

[permalink] [raw]
Subject: RE: [PATCH v3] kbuild: asm-generic support



> -----Original Message-----
> From: Sam Ravnborg [mailto:[email protected]]
> Sent: Friday, April 22, 2011 11:54 PM
> To: Michal Marek
> Cc: lkml; linux-kbuild; linux arch; Arnd Bergmann; Guan Xuetao
> Subject: [PATCH v3] kbuild: asm-generic support
>
> >From 34d0b72a343dd63c1c1b049e4ba6931f0dbcbc3f Mon Sep 17 00:00:00 2001
> From: Sam Ravnborg <[email protected]>
> Date: Fri, 22 Apr 2011 14:45:13 +0200
> Subject: [PATCH] kbuild: asm-generic support
>
> There is an increasing amount of header files
> shared between individual architectures in asm-generic.
> To avoid a lot of dummy wrapper files that just
> include the corresponding file in asm-generic provide
> some basic support in kbuild for this.
>
> With the following patch an architecture can maintain
> a list of files in the file arch/$(ARCH)/include/asm/Kbuild
>
> To use a generic file just add:
>
> generic-y += <name-of-header-file.h>
>
> For each file listed kbuild will generate the necessary
> wrapper in arch/$(ARCH)/include/generated/asm.
>
> When installing userspace headers a wrapper is likewise created.
>
> The original inspiration for this came from the unicore32
> patchset - although a different method is used.
>
> The patch includes several improvements from Arnd Bergmann.
> Michael Marek contributed Makefile.asm-generic.
>
> Signed-off-by: Sam Ravnborg <[email protected]>
> Cc: Guan Xuetao <[email protected]>
> Cc: Arnd Bergmann <[email protected]>
> ---
>
> Hi Mikael.
>
> It took me a while to get back to this.
> I used your Makefile.asm-generic almost verbatim.
>
> Only change was that we always need to create the output directory.
>
> Sam
>
> .gitignore | 1 +
> Documentation/kbuild/makefiles.txt | 36 ++++++++++++++++++++++++++++++++++++
> Makefile | 15 +++++++++++----
> scripts/Makefile.asm-generic | 23 +++++++++++++++++++++++
> scripts/Makefile.headersinst | 18 +++++++++++++++---
> 5 files changed, 86 insertions(+), 7 deletions(-)
> create mode 100644 scripts/Makefile.asm-generic
>
> diff --git a/.gitignore b/.gitignore
> index 5d56a3f..9dacde0 100644
> --- a/.gitignore
> +++ b/.gitignore
> @@ -57,6 +57,7 @@ modules.builtin
> include/config
> include/linux/version.h
> include/generated
> +arch/*/include/generated
>
> # stgit generated dirs
> patches-*
> diff --git a/Documentation/kbuild/makefiles.txt b/Documentation/kbuild/makefiles.txt
> index 5d145bb..7f2b8e7 100644
> --- a/Documentation/kbuild/makefiles.txt
> +++ b/Documentation/kbuild/makefiles.txt
> @@ -40,11 +40,13 @@ This document describes the Linux kernel Makefiles.
> --- 6.6 Commands useful for building a boot image
> --- 6.7 Custom kbuild commands
> --- 6.8 Preprocessing linker scripts
> + --- 6.9 Generic header files
>
> === 7 Kbuild syntax for exported headers
> --- 7.1 header-y
> --- 7.2 objhdr-y
> --- 7.3 destination-y
> + --- 7.4 generic-y
>
> === 8 Kbuild Variables
> === 9 Makefile language
> @@ -1209,6 +1211,14 @@ When kbuild executes, the following steps are followed (roughly):
> The kbuild infrastructure for *lds file are used in several
> architecture-specific files.
>
> +--- 6.9 Generic header files
> +
> + The directory include/asm-generic contains the header files
> + that may be shared between individual architectures.
> + The recommended approach how to use a generic header file is
> + to list the file in the Kbuild file.
> + See "7.4 generic-y" for further info on syntax etc.
> +
> === 7 Kbuild syntax for exported headers
>
> The kernel include a set of headers that is exported to userspace.
> @@ -1265,6 +1275,32 @@ See subsequent chapter for the syntax of the Kbuild file.
> In the example above all exported headers in the Kbuild file
> will be located in the directory "include/linux" when exported.
>
> + --- 7.4 generic-y
> +
> + If an architecture uses a verbatim copy of a header from
> + include/asm-generic then this is listed in the file
> + arch/$(ARCH)/include/asm/Kbuild like this:
> +
> + Example:
> + #arch/x86/include/asm/Kbuild
> + generic-y += termios.h
> + generic-y += rtc.h
> +
> + During the prepare phase of the build a wrapper include
> + file is generated in the directory:
> +
> + arch/$(ARCH)/include/generated/asm
> +
> + When a header is exported where the architecture uses
> + the generic header a similar wrapper is generated as part
> + of the set of exported headers in the directory:
> +
> + usr/include/asm
> +
> + The generated wrapper will in both cases look like the following:
> +
> + Example: termios.h
> + #include <asm-generic/termios.h>
>
> === 8 Kbuild Variables
>
> diff --git a/Makefile b/Makefile
> index b967b96..30b3852 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -349,7 +349,8 @@ CFLAGS_GCOV = -fprofile-arcs -ftest-coverage
>
> # Use LINUXINCLUDE when you must reference the include/ directory.
> # Needed to be compatible with the O= option
> -LINUXINCLUDE := -I$(srctree)/arch/$(hdr-arch)/include -Iinclude \
> +LINUXINCLUDE := -I$(srctree)/arch/$(hdr-arch)/include \
> + -Iarch/$(hdr-arch)/include/generated -Iinclude \
I think $(srctree) is necessary before new include-dir.

> $(if $(KBUILD_SRC), -I$(srctree)/include) \
> -include include/generated/autoconf.h
>
> @@ -416,6 +417,11 @@ ifneq ($(KBUILD_SRC),)
> $(srctree) $(objtree) $(VERSION) $(PATCHLEVEL)
> endif
>
> +# Support for using generic headers in asm-generic
> +PHONY += asm-generic
> +asm-generic:
> + $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.asm-generic obj=arch/$(SRCARCH)/include/generated/asm
Too long

> +
> # To make sure we do not include .config for any of the *config targets
> # catch them early, and hand them over to scripts/kconfig/Makefile
> # It is allowed to specify more targets when calling make, including
> @@ -947,7 +953,7 @@ ifneq ($(KBUILD_SRC),)
> endif
>
> # prepare2 creates a makefile if using a separate output directory
> -prepare2: prepare3 outputmakefile
> +prepare2: prepare3 outputmakefile asm-generic
>
> prepare1: prepare2 include/linux/version.h include/generated/utsrelease.h \
> include/config/auto.conf
> @@ -1021,7 +1027,7 @@ hdr-inst := -rR -f $(srctree)/scripts/Makefile.headersinst obj
> hdr-dst = $(if $(KBUILD_HEADERS), dst=include/asm-$(hdr-arch), dst=include/asm)
>
> PHONY += __headers
> -__headers: include/linux/version.h scripts_basic FORCE
> +__headers: include/linux/version.h scripts_basic asm-generic FORCE
> $(Q)$(MAKE) $(build)=scripts build_unifdef
>
> PHONY += headers_install_all
> @@ -1136,7 +1142,8 @@ CLEAN_FILES += vmlinux System.map \
> .tmp_kallsyms* .tmp_version .tmp_vmlinux* .tmp_System.map
>
> # Directories & files removed with 'make mrproper'
> -MRPROPER_DIRS += include/config usr/include include/generated
> +MRPROPER_DIRS += include/config usr/include include/generated \
> + arch/*/include/generated
> MRPROPER_FILES += .config .config.old .version .old_version \
> include/linux/version.h \
> Module.symvers tags TAGS cscope* GPATH GTAGS GRTAGS GSYMS
> diff --git a/scripts/Makefile.asm-generic b/scripts/Makefile.asm-generic
> new file mode 100644
> index 0000000..a687cb6
> --- /dev/null
> +++ b/scripts/Makefile.asm-generic
> @@ -0,0 +1,23 @@
> +# include/asm-generic contains a lot of files that are used
> +# verbatim by several architectures.
> +#
> +# This Makefile reads the file arch/$(SRCARCH)/include/asm/Kbuild
> +# and for each file listed in this file with generic-y creates
> +# a small wrapper file in $(obj) (arch/$(SRCARCH)/include/generated/asm)
> +
> +kbuild-file := $(srctree)/arch/$(SRCARCH)/include/asm/Kbuild
> +include $(kbuild-file)
> +
> +include scripts/Kbuild.include
> +
> +# Create output directory if not already present
> +_dummy := $(shell [ -d $(obj) ] || mkdir -p $(obj))
> +
> +quiet_cmd_wrap = WRAP $@
> +cmd_wrap = echo "\#include <asm-generic/$*.h>" >$@
> +
> +all: $(patsubst %, $(obj)/%, $(generic-y))
> +
> +$(obj)/%.h:
> + $(call cmd,wrap)
> +
> diff --git a/scripts/Makefile.headersinst b/scripts/Makefile.headersinst
> index f89cb87..7960b19 100644
> --- a/scripts/Makefile.headersinst
> +++ b/scripts/Makefile.headersinst
> @@ -14,6 +14,7 @@ kbuild-file := $(srctree)/$(obj)/Kbuild
> include $(kbuild-file)
>
> _dst := $(if $(destination-y),$(destination-y),$(_dst))
> +_src := $(srctree)/$(obj)
_src is only used one time

>
> include scripts/Kbuild.include
>
> @@ -27,10 +28,16 @@ header-y := $(filter-out %/, $(header-y))
> install-file := $(install)/.install
> check-file := $(install)/.check
>
> +# generic-y list all files an architecture uses from asm-generic
> +# Use this to build a list of headers which require a wrapper
> +wrapper-files := $(filter $(header-y), $(generic-y))
> +
> # all headers files for this dir
> -all-files := $(header-y) $(objhdr-y)
> -input-files := $(addprefix $(srctree)/$(obj)/,$(header-y)) \
> +header-y := $(filter-out $(generic-y), $(header-y))
> +all-files := $(header-y) $(objhdr-y) $(wrapper-files)
> +input-files := $(addprefix $(_src)/,$(header-y)) \
> $(addprefix $(objtree)/$(obj)/,$(objhdr-y))
> +
Additional empty line

> output-files := $(addprefix $(install)/, $(all-files))
>
> # Work out what needs to be removed
> @@ -47,8 +54,12 @@ quiet_cmd_install = INSTALL $(printdir) ($(words $(all-files))\
> cmd_install = \
> $(PERL) $< $(srctree)/$(obj) $(install) $(SRCARCH) $(header-y); \
> $(PERL) $< $(objtree)/$(obj) $(install) $(SRCARCH) $(objhdr-y); \
> + for F in $(wrapper-files); do \
> + echo "\#include <asm-generic/$$F>" > $(install)/$$F; \
> + done; \
> touch $@
>
> +
Additional empty line

> quiet_cmd_remove = REMOVE $(unwanted)
> cmd_remove = rm -f $(unwanted-file)
>
> @@ -69,7 +80,8 @@ __headersinst: $(subdirs) $(install-file)
> @:
>
> targets += $(install-file)
> -$(install-file): scripts/headers_install.pl $(input-files) FORCE
> +$(install-file): scripts/headers_install.pl \
> + $(input-files) FORCE
The same content

> $(if $(unwanted),$(call cmd,remove),)
> $(if $(wildcard $(dir $@)),,$(shell mkdir -p $(dir $@)))
> $(call if_changed,install)
> --
> 1.6.0.6

I have tested on UniCore32, and it works well.

Thanks Sam.

Guan Xuetao

2011-04-27 19:42:29

by Sam Ravnborg

[permalink] [raw]
Subject: Re: [PATCH v3] kbuild: asm-generic support

> > @@ -349,7 +349,8 @@ CFLAGS_GCOV = -fprofile-arcs -ftest-coverage
> >
> > # Use LINUXINCLUDE when you must reference the include/ directory.
> > # Needed to be compatible with the O= option
> > -LINUXINCLUDE := -I$(srctree)/arch/$(hdr-arch)/include -Iinclude \
> > +LINUXINCLUDE := -I$(srctree)/arch/$(hdr-arch)/include \
> > + -Iarch/$(hdr-arch)/include/generated -Iinclude \
> I think $(srctree) is necessary before new include-dir.
>

The generated files are located in objtree - because they
are generated. So $(srctree) would be wrong here.

> > +PHONY += asm-generic
> > +asm-generic:
> > + $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.asm-generic obj=arch/$(SRCARCH)/include/generated/asm
> Too long
fixed

> > _dst := $(if $(destination-y),$(destination-y),$(_dst))
> > +_src := $(srctree)/$(obj)
> _src is only used one time
fixed

> > +
> Additional empty line
fixed

> > + done; \
> > touch $@
> >
> > +
> Additional empty line
fixed

> > targets += $(install-file)
> > -$(install-file): scripts/headers_install.pl $(input-files) FORCE
> > +$(install-file): scripts/headers_install.pl \
> > + $(input-files) FORCE
> The same content
fixed

> I have tested on UniCore32, and it works well.
I take this as "Acked-by" and "Tested-by".

Thanks for feedback - new version to be posted shortly.

Sam

2011-04-27 19:46:52

by Sam Ravnborg

[permalink] [raw]
Subject: [PATCH v4] kbuild: asm-generic support

>From 8546953f0c87d6b1c37c25df73511780c86ad89d Mon Sep 17 00:00:00 2001
From: Sam Ravnborg <[email protected]>
Date: Fri, 22 Apr 2011 14:45:13 +0200
Subject: [PATCH] kbuild: asm-generic support

There is an increasing amount of header files
shared between individual architectures in asm-generic.
To avoid a lot of dummy wrapper files that just
include the corresponding file in asm-generic provide
some basic support in kbuild for this.

With the following patch an architecture can maintain
a list of files in the file arch/$(ARCH)/include/asm/Kbuild

To use a generic file just add:

generic-y += <name-of-header-file.h>

For each file listed kbuild will generate the necessary
wrapper in arch/$(ARCH)/include/generated/asm.

When installing userspace headers a wrapper is likewise created.

The original inspiration for this came from the unicore32
patchset - although a different method is used.

The patch includes several improvements from Arnd Bergmann.
Michael Marek contributed Makefile.asm-generic.

Signed-off-by: Sam Ravnborg <[email protected]>
Acked-by: Guan Xuetao <[email protected]>
Tested-by: Guan Xuetao <[email protected]>
Cc: Arnd Bergmann <[email protected]>
---

Changes v3 => v4
Addressed feedback from Guan:
- drop empty lines
- fix line-too-long
- add his Tested-by, Acked-by tags

Sam


.gitignore | 1 +
Documentation/kbuild/makefiles.txt | 36 ++++++++++++++++++++++++++++++++++++
Makefile | 16 ++++++++++++----
scripts/Makefile.asm-generic | 23 +++++++++++++++++++++++
scripts/Makefile.headersinst | 10 +++++++++-
5 files changed, 81 insertions(+), 5 deletions(-)
create mode 100644 scripts/Makefile.asm-generic

diff --git a/.gitignore b/.gitignore
index 5d56a3f..9dacde0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -57,6 +57,7 @@ modules.builtin
include/config
include/linux/version.h
include/generated
+arch/*/include/generated

# stgit generated dirs
patches-*
diff --git a/Documentation/kbuild/makefiles.txt b/Documentation/kbuild/makefiles.txt
index 5d145bb..7f2b8e7 100644
--- a/Documentation/kbuild/makefiles.txt
+++ b/Documentation/kbuild/makefiles.txt
@@ -40,11 +40,13 @@ This document describes the Linux kernel Makefiles.
--- 6.6 Commands useful for building a boot image
--- 6.7 Custom kbuild commands
--- 6.8 Preprocessing linker scripts
+ --- 6.9 Generic header files

=== 7 Kbuild syntax for exported headers
--- 7.1 header-y
--- 7.2 objhdr-y
--- 7.3 destination-y
+ --- 7.4 generic-y

=== 8 Kbuild Variables
=== 9 Makefile language
@@ -1209,6 +1211,14 @@ When kbuild executes, the following steps are followed (roughly):
The kbuild infrastructure for *lds file are used in several
architecture-specific files.

+--- 6.9 Generic header files
+
+ The directory include/asm-generic contains the header files
+ that may be shared between individual architectures.
+ The recommended approach how to use a generic header file is
+ to list the file in the Kbuild file.
+ See "7.4 generic-y" for further info on syntax etc.
+
=== 7 Kbuild syntax for exported headers

The kernel include a set of headers that is exported to userspace.
@@ -1265,6 +1275,32 @@ See subsequent chapter for the syntax of the Kbuild file.
In the example above all exported headers in the Kbuild file
will be located in the directory "include/linux" when exported.

+ --- 7.4 generic-y
+
+ If an architecture uses a verbatim copy of a header from
+ include/asm-generic then this is listed in the file
+ arch/$(ARCH)/include/asm/Kbuild like this:
+
+ Example:
+ #arch/x86/include/asm/Kbuild
+ generic-y += termios.h
+ generic-y += rtc.h
+
+ During the prepare phase of the build a wrapper include
+ file is generated in the directory:
+
+ arch/$(ARCH)/include/generated/asm
+
+ When a header is exported where the architecture uses
+ the generic header a similar wrapper is generated as part
+ of the set of exported headers in the directory:
+
+ usr/include/asm
+
+ The generated wrapper will in both cases look like the following:
+
+ Example: termios.h
+ #include <asm-generic/termios.h>

=== 8 Kbuild Variables

diff --git a/Makefile b/Makefile
index b967b96..9c67453 100644
--- a/Makefile
+++ b/Makefile
@@ -349,7 +349,8 @@ CFLAGS_GCOV = -fprofile-arcs -ftest-coverage

# Use LINUXINCLUDE when you must reference the include/ directory.
# Needed to be compatible with the O= option
-LINUXINCLUDE := -I$(srctree)/arch/$(hdr-arch)/include -Iinclude \
+LINUXINCLUDE := -I$(srctree)/arch/$(hdr-arch)/include \
+ -Iarch/$(hdr-arch)/include/generated -Iinclude \
$(if $(KBUILD_SRC), -I$(srctree)/include) \
-include include/generated/autoconf.h

@@ -416,6 +417,12 @@ ifneq ($(KBUILD_SRC),)
$(srctree) $(objtree) $(VERSION) $(PATCHLEVEL)
endif

+# Support for using generic headers in asm-generic
+PHONY += asm-generic
+asm-generic:
+ $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.asm-generic \
+ obj=arch/$(SRCARCH)/include/generated/asm
+
# To make sure we do not include .config for any of the *config targets
# catch them early, and hand them over to scripts/kconfig/Makefile
# It is allowed to specify more targets when calling make, including
@@ -947,7 +954,7 @@ ifneq ($(KBUILD_SRC),)
endif

# prepare2 creates a makefile if using a separate output directory
-prepare2: prepare3 outputmakefile
+prepare2: prepare3 outputmakefile asm-generic

prepare1: prepare2 include/linux/version.h include/generated/utsrelease.h \
include/config/auto.conf
@@ -1021,7 +1028,7 @@ hdr-inst := -rR -f $(srctree)/scripts/Makefile.headersinst obj
hdr-dst = $(if $(KBUILD_HEADERS), dst=include/asm-$(hdr-arch), dst=include/asm)

PHONY += __headers
-__headers: include/linux/version.h scripts_basic FORCE
+__headers: include/linux/version.h scripts_basic asm-generic FORCE
$(Q)$(MAKE) $(build)=scripts build_unifdef

PHONY += headers_install_all
@@ -1136,7 +1143,8 @@ CLEAN_FILES += vmlinux System.map \
.tmp_kallsyms* .tmp_version .tmp_vmlinux* .tmp_System.map

# Directories & files removed with 'make mrproper'
-MRPROPER_DIRS += include/config usr/include include/generated
+MRPROPER_DIRS += include/config usr/include include/generated \
+ arch/*/include/generated
MRPROPER_FILES += .config .config.old .version .old_version \
include/linux/version.h \
Module.symvers tags TAGS cscope* GPATH GTAGS GRTAGS GSYMS
diff --git a/scripts/Makefile.asm-generic b/scripts/Makefile.asm-generic
new file mode 100644
index 0000000..a687cb6
--- /dev/null
+++ b/scripts/Makefile.asm-generic
@@ -0,0 +1,23 @@
+# include/asm-generic contains a lot of files that are used
+# verbatim by several architectures.
+#
+# This Makefile reads the file arch/$(SRCARCH)/include/asm/Kbuild
+# and for each file listed in this file with generic-y creates
+# a small wrapper file in $(obj) (arch/$(SRCARCH)/include/generated/asm)
+
+kbuild-file := $(srctree)/arch/$(SRCARCH)/include/asm/Kbuild
+include $(kbuild-file)
+
+include scripts/Kbuild.include
+
+# Create output directory if not already present
+_dummy := $(shell [ -d $(obj) ] || mkdir -p $(obj))
+
+quiet_cmd_wrap = WRAP $@
+cmd_wrap = echo "\#include <asm-generic/$*.h>" >$@
+
+all: $(patsubst %, $(obj)/%, $(generic-y))
+
+$(obj)/%.h:
+ $(call cmd,wrap)
+
diff --git a/scripts/Makefile.headersinst b/scripts/Makefile.headersinst
index f89cb87..a57f5bd 100644
--- a/scripts/Makefile.headersinst
+++ b/scripts/Makefile.headersinst
@@ -27,8 +27,13 @@ header-y := $(filter-out %/, $(header-y))
install-file := $(install)/.install
check-file := $(install)/.check

+# generic-y list all files an architecture uses from asm-generic
+# Use this to build a list of headers which require a wrapper
+wrapper-files := $(filter $(header-y), $(generic-y))
+
# all headers files for this dir
-all-files := $(header-y) $(objhdr-y)
+header-y := $(filter-out $(generic-y), $(header-y))
+all-files := $(header-y) $(objhdr-y) $(wrapper-files)
input-files := $(addprefix $(srctree)/$(obj)/,$(header-y)) \
$(addprefix $(objtree)/$(obj)/,$(objhdr-y))
output-files := $(addprefix $(install)/, $(all-files))
@@ -47,6 +52,9 @@ quiet_cmd_install = INSTALL $(printdir) ($(words $(all-files))\
cmd_install = \
$(PERL) $< $(srctree)/$(obj) $(install) $(SRCARCH) $(header-y); \
$(PERL) $< $(objtree)/$(obj) $(install) $(SRCARCH) $(objhdr-y); \
+ for F in $(wrapper-files); do \
+ echo "\#include <asm-generic/$$F>" > $(install)/$$F; \
+ done; \
touch $@

quiet_cmd_remove = REMOVE $(unwanted)
--
1.6.0.6

2011-04-27 19:52:48

by Arnd Bergmann

[permalink] [raw]
Subject: Re: [PATCH v4] kbuild: asm-generic support

On Wednesday 27 April 2011 21:46:47 Sam Ravnborg wrote:
> From 8546953f0c87d6b1c37c25df73511780c86ad89d Mon Sep 17 00:00:00 2001
> From: Sam Ravnborg <[email protected]>
> Date: Fri, 22 Apr 2011 14:45:13 +0200
> Subject: [PATCH] kbuild: asm-generic support
>
> There is an increasing amount of header files
> shared between individual architectures in asm-generic.
> To avoid a lot of dummy wrapper files that just
> include the corresponding file in asm-generic provide
> some basic support in kbuild for this.
>
> With the following patch an architecture can maintain
> a list of files in the file arch/$(ARCH)/include/asm/Kbuild
>
> To use a generic file just add:
>
> generic-y += <name-of-header-file.h>
>
> For each file listed kbuild will generate the necessary
> wrapper in arch/$(ARCH)/include/generated/asm.
>
> When installing userspace headers a wrapper is likewise created.
>
> The original inspiration for this came from the unicore32
> patchset - although a different method is used.
>
> The patch includes several improvements from Arnd Bergmann.
> Michael Marek contributed Makefile.asm-generic.
>
> Signed-off-by: Sam Ravnborg <[email protected]>
> Acked-by: Guan Xuetao <[email protected]>
> Tested-by: Guan Xuetao <[email protected]>
> Cc: Arnd Bergmann <[email protected]>

Acked-by: Arnd Bergmann <[email protected]>

I'm glad to see this finally happen.

Maybe you can mention Remis Baima in the changelog as well,
he did an earlier implementation back in the days when some
architectures were still using include/asm-${ARCH}, which IIRC
did not get merged because of the complexity associated with
that.

Arnd

2011-04-27 20:29:54

by Sam Ravnborg

[permalink] [raw]
Subject: [PATCH v5] kbuild: asm-generic support

>From 1b46234aa99f235b48dce0068fb5fb56ddf6ddab Mon Sep 17 00:00:00 2001
From: Sam Ravnborg <[email protected]>
Date: Fri, 22 Apr 2011 14:45:13 +0200
Subject: [PATCH] kbuild: asm-generic support

There is an increasing amount of header files
shared between individual architectures in asm-generic.
To avoid a lot of dummy wrapper files that just
include the corresponding file in asm-generic provide
some basic support in kbuild for this.

With the following patch an architecture can maintain
a list of files in the file arch/$(ARCH)/include/asm/Kbuild

To use a generic file just add:

generic-y += <name-of-header-file.h>

For each file listed kbuild will generate the necessary
wrapper in arch/$(ARCH)/include/generated/asm.

When installing userspace headers a wrapper is likewise created.

The original inspiration for this came from the unicore32
patchset - although a different method is used.

The patch includes several improvements from Arnd Bergmann.
Michael Marek contributed Makefile.asm-generic.

Remis Baima did an intial implementation along to achive
the same - see https://patchwork.kernel.org/patch/13352/

Signed-off-by: Sam Ravnborg <[email protected]>
Acked-by: Guan Xuetao <[email protected]>
Tested-by: Guan Xuetao <[email protected]>
Acked-by: Arnd Bergmann <[email protected]>
Cc: Remis Lima Baima <[email protected]>
---

Changes from v4 => v5
- Mentioned Remis in changelog (thanks to Arnd)
- Added "Acked-by" from Arnd

Sam

.gitignore | 1 +
Documentation/kbuild/makefiles.txt | 36 ++++++++++++++++++++++++++++++++++++
Makefile | 16 ++++++++++++----
scripts/Makefile.asm-generic | 23 +++++++++++++++++++++++
scripts/Makefile.headersinst | 10 +++++++++-
5 files changed, 81 insertions(+), 5 deletions(-)
create mode 100644 scripts/Makefile.asm-generic

diff --git a/.gitignore b/.gitignore
index 5d56a3f..9dacde0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -57,6 +57,7 @@ modules.builtin
include/config
include/linux/version.h
include/generated
+arch/*/include/generated

# stgit generated dirs
patches-*
diff --git a/Documentation/kbuild/makefiles.txt b/Documentation/kbuild/makefiles.txt
index 5d145bb..7f2b8e7 100644
--- a/Documentation/kbuild/makefiles.txt
+++ b/Documentation/kbuild/makefiles.txt
@@ -40,11 +40,13 @@ This document describes the Linux kernel Makefiles.
--- 6.6 Commands useful for building a boot image
--- 6.7 Custom kbuild commands
--- 6.8 Preprocessing linker scripts
+ --- 6.9 Generic header files

=== 7 Kbuild syntax for exported headers
--- 7.1 header-y
--- 7.2 objhdr-y
--- 7.3 destination-y
+ --- 7.4 generic-y

=== 8 Kbuild Variables
=== 9 Makefile language
@@ -1209,6 +1211,14 @@ When kbuild executes, the following steps are followed (roughly):
The kbuild infrastructure for *lds file are used in several
architecture-specific files.

+--- 6.9 Generic header files
+
+ The directory include/asm-generic contains the header files
+ that may be shared between individual architectures.
+ The recommended approach how to use a generic header file is
+ to list the file in the Kbuild file.
+ See "7.4 generic-y" for further info on syntax etc.
+
=== 7 Kbuild syntax for exported headers

The kernel include a set of headers that is exported to userspace.
@@ -1265,6 +1275,32 @@ See subsequent chapter for the syntax of the Kbuild file.
In the example above all exported headers in the Kbuild file
will be located in the directory "include/linux" when exported.

+ --- 7.4 generic-y
+
+ If an architecture uses a verbatim copy of a header from
+ include/asm-generic then this is listed in the file
+ arch/$(ARCH)/include/asm/Kbuild like this:
+
+ Example:
+ #arch/x86/include/asm/Kbuild
+ generic-y += termios.h
+ generic-y += rtc.h
+
+ During the prepare phase of the build a wrapper include
+ file is generated in the directory:
+
+ arch/$(ARCH)/include/generated/asm
+
+ When a header is exported where the architecture uses
+ the generic header a similar wrapper is generated as part
+ of the set of exported headers in the directory:
+
+ usr/include/asm
+
+ The generated wrapper will in both cases look like the following:
+
+ Example: termios.h
+ #include <asm-generic/termios.h>

=== 8 Kbuild Variables

diff --git a/Makefile b/Makefile
index b967b96..9c67453 100644
--- a/Makefile
+++ b/Makefile
@@ -349,7 +349,8 @@ CFLAGS_GCOV = -fprofile-arcs -ftest-coverage

# Use LINUXINCLUDE when you must reference the include/ directory.
# Needed to be compatible with the O= option
-LINUXINCLUDE := -I$(srctree)/arch/$(hdr-arch)/include -Iinclude \
+LINUXINCLUDE := -I$(srctree)/arch/$(hdr-arch)/include \
+ -Iarch/$(hdr-arch)/include/generated -Iinclude \
$(if $(KBUILD_SRC), -I$(srctree)/include) \
-include include/generated/autoconf.h

@@ -416,6 +417,12 @@ ifneq ($(KBUILD_SRC),)
$(srctree) $(objtree) $(VERSION) $(PATCHLEVEL)
endif

+# Support for using generic headers in asm-generic
+PHONY += asm-generic
+asm-generic:
+ $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.asm-generic \
+ obj=arch/$(SRCARCH)/include/generated/asm
+
# To make sure we do not include .config for any of the *config targets
# catch them early, and hand them over to scripts/kconfig/Makefile
# It is allowed to specify more targets when calling make, including
@@ -947,7 +954,7 @@ ifneq ($(KBUILD_SRC),)
endif

# prepare2 creates a makefile if using a separate output directory
-prepare2: prepare3 outputmakefile
+prepare2: prepare3 outputmakefile asm-generic

prepare1: prepare2 include/linux/version.h include/generated/utsrelease.h \
include/config/auto.conf
@@ -1021,7 +1028,7 @@ hdr-inst := -rR -f $(srctree)/scripts/Makefile.headersinst obj
hdr-dst = $(if $(KBUILD_HEADERS), dst=include/asm-$(hdr-arch), dst=include/asm)

PHONY += __headers
-__headers: include/linux/version.h scripts_basic FORCE
+__headers: include/linux/version.h scripts_basic asm-generic FORCE
$(Q)$(MAKE) $(build)=scripts build_unifdef

PHONY += headers_install_all
@@ -1136,7 +1143,8 @@ CLEAN_FILES += vmlinux System.map \
.tmp_kallsyms* .tmp_version .tmp_vmlinux* .tmp_System.map

# Directories & files removed with 'make mrproper'
-MRPROPER_DIRS += include/config usr/include include/generated
+MRPROPER_DIRS += include/config usr/include include/generated \
+ arch/*/include/generated
MRPROPER_FILES += .config .config.old .version .old_version \
include/linux/version.h \
Module.symvers tags TAGS cscope* GPATH GTAGS GRTAGS GSYMS
diff --git a/scripts/Makefile.asm-generic b/scripts/Makefile.asm-generic
new file mode 100644
index 0000000..a687cb6
--- /dev/null
+++ b/scripts/Makefile.asm-generic
@@ -0,0 +1,23 @@
+# include/asm-generic contains a lot of files that are used
+# verbatim by several architectures.
+#
+# This Makefile reads the file arch/$(SRCARCH)/include/asm/Kbuild
+# and for each file listed in this file with generic-y creates
+# a small wrapper file in $(obj) (arch/$(SRCARCH)/include/generated/asm)
+
+kbuild-file := $(srctree)/arch/$(SRCARCH)/include/asm/Kbuild
+include $(kbuild-file)
+
+include scripts/Kbuild.include
+
+# Create output directory if not already present
+_dummy := $(shell [ -d $(obj) ] || mkdir -p $(obj))
+
+quiet_cmd_wrap = WRAP $@
+cmd_wrap = echo "\#include <asm-generic/$*.h>" >$@
+
+all: $(patsubst %, $(obj)/%, $(generic-y))
+
+$(obj)/%.h:
+ $(call cmd,wrap)
+
diff --git a/scripts/Makefile.headersinst b/scripts/Makefile.headersinst
index f89cb87..a57f5bd 100644
--- a/scripts/Makefile.headersinst
+++ b/scripts/Makefile.headersinst
@@ -27,8 +27,13 @@ header-y := $(filter-out %/, $(header-y))
install-file := $(install)/.install
check-file := $(install)/.check

+# generic-y list all files an architecture uses from asm-generic
+# Use this to build a list of headers which require a wrapper
+wrapper-files := $(filter $(header-y), $(generic-y))
+
# all headers files for this dir
-all-files := $(header-y) $(objhdr-y)
+header-y := $(filter-out $(generic-y), $(header-y))
+all-files := $(header-y) $(objhdr-y) $(wrapper-files)
input-files := $(addprefix $(srctree)/$(obj)/,$(header-y)) \
$(addprefix $(objtree)/$(obj)/,$(objhdr-y))
output-files := $(addprefix $(install)/, $(all-files))
@@ -47,6 +52,9 @@ quiet_cmd_install = INSTALL $(printdir) ($(words $(all-files))\
cmd_install = \
$(PERL) $< $(srctree)/$(obj) $(install) $(SRCARCH) $(header-y); \
$(PERL) $< $(objtree)/$(obj) $(install) $(SRCARCH) $(objhdr-y); \
+ for F in $(wrapper-files); do \
+ echo "\#include <asm-generic/$$F>" > $(install)/$$F; \
+ done; \
touch $@

quiet_cmd_remove = REMOVE $(unwanted)
--
1.6.0.6

2011-04-28 16:17:03

by Michal Marek

[permalink] [raw]
Subject: Re: [PATCH v5] kbuild: asm-generic support

On Wed, Apr 27, 2011 at 10:29:49PM +0200, Sam Ravnborg wrote:
> From 1b46234aa99f235b48dce0068fb5fb56ddf6ddab Mon Sep 17 00:00:00 2001
> From: Sam Ravnborg <[email protected]>
> Date: Fri, 22 Apr 2011 14:45:13 +0200
> Subject: [PATCH] kbuild: asm-generic support
>
> There is an increasing amount of header files
> shared between individual architectures in asm-generic.
> To avoid a lot of dummy wrapper files that just
> include the corresponding file in asm-generic provide
> some basic support in kbuild for this.
>
> With the following patch an architecture can maintain
> a list of files in the file arch/$(ARCH)/include/asm/Kbuild
>
> To use a generic file just add:
>
> generic-y += <name-of-header-file.h>
>
> For each file listed kbuild will generate the necessary
> wrapper in arch/$(ARCH)/include/generated/asm.
>
> When installing userspace headers a wrapper is likewise created.
>
> The original inspiration for this came from the unicore32
> patchset - although a different method is used.
>
> The patch includes several improvements from Arnd Bergmann.
> Michael Marek contributed Makefile.asm-generic.
>
> Remis Baima did an intial implementation along to achive
> the same - see https://patchwork.kernel.org/patch/13352/
>
> Signed-off-by: Sam Ravnborg <[email protected]>
> Acked-by: Guan Xuetao <[email protected]>
> Tested-by: Guan Xuetao <[email protected]>
> Acked-by: Arnd Bergmann <[email protected]>
> Cc: Remis Lima Baima <[email protected]>
> ---
>
> Changes from v4 => v5
> - Mentioned Remis in changelog (thanks to Arnd)
> - Added "Acked-by" from Arnd

Applied to kbuild-2.6.git#kbuild, thanks a lot!

Michal