2005-10-10 22:43:22

by Mark Rustad

[permalink] [raw]
Subject: KBuild problem (or difference) in 2.6.14-rc3

I have noticed a change in Kbuild behavior when going from 2.6.13.x
to 2.6.14-rc3. I build kernels with a separate objects directory. It
has been my practice since beginning with 2.6 kernels last year, to
put changed files into the objects directory structure to override an
unmodified source tree. Starting with 2.6.14, I find that Makefiles
in the objects directory structure area not used. I find that source
and Kconfig files do override as they used to, but Makefiles do not.

I don't really know if this new behavior is intended or not, but it
sure messes my kernel build methodology up. It looks to me like the
problem was introduced by changes in scripts/Makefile.build. I think
that this is the change causing me trouble:

--- a/scripts/Makefile.build
+++ b/scripts/Makefile.build
@@ -10,8 +10,11 @@ __build:
# Read .config if it exist, otherwise ignore
-include .config

-include $(if $(wildcard $(obj)/Kbuild), $(obj)/Kbuild, $(obj)/Makefile)
+# The filename Kbuild has precedence over Makefile
+kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))
+include $(if $(wildcard $(kbuild-dir)/Kbuild), $(kbuild-dir)/Kbuild,
$(kbuild-dir)/Makefile)

+include scripts/Kbuild.include
include scripts/Makefile.lib

ifdef host-progs

Does anyone know if this change in behavior was intended? I realize
that I may be doing something a little bit unusual, but I have been
doing things this way very successfully since at least 2.6.5.

--
Mark Rustad, [email protected]


2005-10-12 16:57:57

by Mark Rustad

[permalink] [raw]
Subject: Re: KBuild problem (or difference) in 2.6.14-rc3

I believe that I have found and fixed the problem that I encountered yesterday with Makefiles not being used from the objects directory. I also verified that the same problem exists in 2.6.14-rc4. I believe that the following patch fixes it.


Signed-off-by: Mark Rustad <[email protected]>

--- a/scripts/Makefile.build 2005-10-11 09:27:42.150471811 -0500
+++ b/scripts/Makefile.build 2005-10-11 11:28:10.748640516 -0500
@@ -12,7 +12,11 @@

# The filename Kbuild has precedence over Makefile
kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))
-include $(if $(wildcard $(kbuild-dir)/Kbuild), $(kbuild-dir)/Kbuild, $(kbuild-dir)/Makefile)
+kbuild-inc := $(wildcard $(obj)/Kbuild)
+kbuild-inc := $(if $(kbuild-inc),$(kbuild-inc),$(wildcard $(kbuild-dir)/Kbuild))
+kbuild-inc := $(if $(kbuild-inc),$(kbuild-inc),$(wildcard $(obj)/Makefile))
+kbuild-inc := $(if $(kbuild-inc),$(kbuild-inc),$(kbuild-dir)/Makefile)
+include $(kbuild-inc)

include scripts/Kbuild.include
include scripts/Makefile.lib
--- a/scripts/Makefile.clean 2005-10-11 09:27:42.150471811 -0500
+++ b/scripts/Makefile.clean 2005-10-11 11:28:20.622769436 -0500
@@ -14,7 +14,11 @@

# The filename Kbuild has precedence over Makefile
kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))
-include $(if $(wildcard $(kbuild-dir)/Kbuild), $(kbuild-dir)/Kbuild, $(kbuild-dir)/Makefile)
+kbuild-inc := $(wildcard $(obj)/Kbuild)
+kbuild-inc := $(if $(kbuild-inc),$(kbuild-inc),$(wildcard $(kbuild-dir)/Kbuild))
+kbuild-inc := $(if $(kbuild-inc),$(kbuild-inc),$(wildcard $(obj)/Makefile))
+kbuild-inc := $(if $(kbuild-inc),$(kbuild-inc),$(kbuild-dir)/Makefile)
+include $(kbuild-inc)

# Figure out what we need to build from the various variables
# ==========================================================================


I also encountered a build error with 2.6.14-rc4 when CONFIG_KALLSYMS is not defined. The error message in a fragment of the output was:

CC arch/i386/lib/usercopy.o
AR arch/i386/lib/lib.a
/bin/sh: line 1: +@: command not found
make[3]: warning: jobserver unavailable: using -j1. Add `+' to parent make rule.
CHK include/linux/compile.h

The following patch seems to fix it.


Signed-off-by: Mark Rustad <[email protected]>

--- a/Makefile 2005-10-12 10:42:37.787722969 -0500
+++ b/Makefile 2005-10-12 10:42:58.396913248 -0500
@@ -662,6 +662,7 @@
# Generate System.map and verify that the content is consistent

define rule_vmlinux__
+ :
$(if $(CONFIG_KALLSYMS),,+$(call cmd,vmlinux_version))

$(call cmd,vmlinux__)

--
Mark Rustad, [email protected]

2005-10-14 14:23:39

by Mark Rustad

[permalink] [raw]
Subject: [PATCH 2.6.14-rc4] kbuild: once again use Makefiles in obj tree

I believe that I have found and fixed the problem that I encountered earlier this week
with Makefiles not being used from the objects tree as they had been in every 2.6 kernel
I have worked with since 2.6.5. I I view this as a regression in 2.6.14-rc4. I believe
that the following patch fixes it.


--- a/scripts/Makefile.build 2005-10-11 09:27:42.150471811 -0500
+++ b/scripts/Makefile.build 2005-10-11 11:28:10.748640516 -0500
@@ -12,7 +12,11 @@

# The filename Kbuild has precedence over Makefile
kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))
-include $(if $(wildcard $(kbuild-dir)/Kbuild), $(kbuild-dir)/Kbuild, $(kbuild-dir)/Makefile)
+kbuild-inc := $(wildcard $(obj)/Kbuild)
+kbuild-inc := $(if $(kbuild-inc),$(kbuild-inc),$(wildcard $(kbuild-dir)/Kbuild))
+kbuild-inc := $(if $(kbuild-inc),$(kbuild-inc),$(wildcard $(obj)/Makefile))
+kbuild-inc := $(if $(kbuild-inc),$(kbuild-inc),$(kbuild-dir)/Makefile)
+include $(kbuild-inc)

include scripts/Kbuild.include
include scripts/Makefile.lib
--- a/scripts/Makefile.clean 2005-10-11 09:27:42.150471811 -0500
+++ b/scripts/Makefile.clean 2005-10-11 11:28:20.622769436 -0500
@@ -14,7 +14,11 @@

# The filename Kbuild has precedence over Makefile
kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))
-include $(if $(wildcard $(kbuild-dir)/Kbuild), $(kbuild-dir)/Kbuild, $(kbuild-dir)/Makefile)
+kbuild-inc := $(wildcard $(obj)/Kbuild)
+kbuild-inc := $(if $(kbuild-inc),$(kbuild-inc),$(wildcard $(kbuild-dir)/Kbuild))
+kbuild-inc := $(if $(kbuild-inc),$(kbuild-inc),$(wildcard $(obj)/Makefile))
+kbuild-inc := $(if $(kbuild-inc),$(kbuild-inc),$(kbuild-dir)/Makefile)
+include $(kbuild-inc)

# Figure out what we need to build from the various variables
# ==========================================================================


Signed-off-by: Mark Rustad <[email protected]>

2005-10-14 14:28:17

by Mark Rustad

[permalink] [raw]
Subject: [PATCH 2.6.14-rc4] kbuild: Eliminate build error when KALLSYMS not defined

I encountered a build error with 2.6.14-rc4 when CONFIG_KALLSYMS is not defined. The error
message in a fragment of the output was:

CC arch/i386/lib/usercopy.o
AR arch/i386/lib/lib.a
/bin/sh: line 1: +@: command not found
make[3]: warning: jobserver unavailable: using -j1. Add `+' to parent make rule.
CHK include/linux/compile.h

The following patch seems to fix it. I can't say that I really know why, but noticed this
construct elsewhere in the Makefile and it seems to work.


--- a/Makefile 2005-10-12 10:42:37.787722969 -0500
+++ b/Makefile 2005-10-12 10:42:58.396913248 -0500
@@ -662,6 +662,7 @@
# Generate System.map and verify that the content is consistent

define rule_vmlinux__
+ :
$(if $(CONFIG_KALLSYMS),,+$(call cmd,vmlinux_version))

$(call cmd,vmlinux__)

Signed-off-by: Mark Rustad <[email protected]>

2005-10-16 21:14:45

by Sam Ravnborg

[permalink] [raw]
Subject: Re: [PATCH 2.6.14-rc4] kbuild: once again use Makefiles in obj tree

On Fri, Oct 14, 2005 at 09:23:28AM -0500, Mark Rustad wrote:
> I believe that I have found and fixed the problem that I encountered earlier this week
> with Makefiles not being used from the objects tree as they had been in every 2.6 kernel
> I have worked with since 2.6.5. I I view this as a regression in 2.6.14-rc4. I believe
> that the following patch fixes it.

Hi Mark.
kbuild will not guarantee you way of working in all cases. Therefore no
special implementation will be accepted to try to support it for
specific files.

The changes you point out that breaks your working methodology was added
to fix broken support for external modules.

Sam