2006-10-24 19:44:31

by Oleg Verych

[permalink] [raw]
Subject: Re: [patch, rfc] kbuild: implement checksrc without building Cources (was Re: CHECK without C compile?)

On 2006-10-24, Oleg Verych wrote:
> On 2006-10-23, Randy Dunlap wrote:
>> Hi Sam,
>
* It seems*
>
> + $(call if_changed_rule,cc_o_c) || \
> + { echo $(@:.o=.ko); echo $@; } > $(MODVERDIR)/$(@F:.o=.mod)

This doesn't work, use ifs instead. Updated.
I have no idea what to do with generated sources and headers.
One may be: check target `if_changed' to be %.c or %.h and let it be
built.
____
From: Oleg Verych <[email protected]>
Subject: [patch, rfc] kbuild: implement checksrc without building Cources

Implementation of configured source chacking without actual building.

Cc: Randy Dunlap <[email protected]>
Cc: Sam Ravnborg <[email protected]>
Signed-off-by: Oleg Verych <[email protected]>
---

Configured sources means, some config target must be run already.
After that
,-<shell>
| make prepare
| make C=something_not_0,1,2 _target_
`--
should run _target_ with checking and without building.

-o--=O`C /. .\
#oo'L O o
<___=E M ^--

scripts/Kbuild.include | 6 +++---
scripts/Makefile.build | 25 ++++++++++++++++---------
2 files changed, 19 insertions(+), 12 deletions(-)

Index: linux-2.6.19-rc3/scripts/Kbuild.include
===================================================================
--- linux-2.6.19-rc3.orig/scripts/Kbuild.include 2006-10-24 18:45:36.708292246 +0000
+++ linux-2.6.19-rc3/scripts/Kbuild.include 2006-10-24 19:11:29.552783811 +0000
@@ -153,7 +153,7 @@
if_changed = $(if $(strip $(any-prereq) $(arg-check)), \
@set -e; \
$(echo-cmd) $(cmd_$(1)); \
- echo 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd)
+ echo 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd ;)

# execute the command and also postprocess generated .d dependencies
# file
@@ -162,14 +162,14 @@
$(echo-cmd) $(cmd_$(1)); \
scripts/basic/fixdep $(depfile) $@ '$(make-cmd)' > $(dot-target).tmp;\
rm -f $(depfile); \
- mv -f $(dot-target).tmp $(dot-target).cmd)
+ mv -f $(dot-target).tmp $(dot-target).cmd ;)

# Usage: $(call if_changed_rule,foo)
# will check if $(cmd_foo) changed, or any of the prequisites changed,
# and if so will execute $(rule_foo)
if_changed_rule = $(if $(strip $(any-prereq) $(arg-check) ), \
@set -e; \
- $(rule_$(1)))
+ $(rule_$(1)) ;)

###
# why - tell why a a target got build
Index: linux-2.6.19-rc3/scripts/Makefile.build
===================================================================
--- linux-2.6.19-rc3.orig/scripts/Makefile.build 2006-10-24 18:45:36.720292930 +0000
+++ linux-2.6.19-rc3/scripts/Makefile.build 2006-10-24 19:25:50.977873629 +0000
@@ -87,12 +87,17 @@

# Linus' kernel sanity checking tool
ifneq ($(KBUILD_CHECKSRC),0)
- ifeq ($(KBUILD_CHECKSRC),2)
- quiet_cmd_force_checksrc = CHECK $<
- cmd_force_checksrc = $(CHECK) $(CHECKFLAGS) $(c_flags) $< ;
- else
+ ifeq ($(KBUILD_CHECKSRC),1)
quiet_cmd_checksrc = CHECK $<
cmd_checksrc = $(CHECK) $(CHECKFLAGS) $(c_flags) $< ;
+ else
+ quiet_cmd_force_checksrc = CHECK $<
+ cmd_force_checksrc = $(CHECK) $(CHECKFLAGS) $(c_flags) $< ;
+ ifneq ($(KBUILD_CHECKSRC),2)
+ if_changed =#
+ if_changed_dep =#
+ if_changed_rule =#
+ endif
endif
endif

@@ -204,11 +209,11 @@
$(call if_changed_rule,cc_o_c)

# Single-part modules are special since we need to mark them in $(MODVERDIR)
-
$(single-used-m): %.o: %.c FORCE
$(call cmd,force_checksrc)
- $(call if_changed_rule,cc_o_c)
- @{ echo $(@:.o=.ko); echo $@; } > $(MODVERDIR)/$(@F:.o=.mod)
+ $(if $(if_changed_rule), \
+ $(call if_changed_rule,cc_o_c) \
+ { echo $(@:.o=.ko); echo $@; } > $(MODVERDIR)/$(@F:.o=.mod))

quiet_cmd_cc_lst_c = MKLST $@
cmd_cc_lst_c = $(CC) $(c_flags) -g -c -o $*.o $< && \
@@ -310,8 +315,10 @@
$(call if_changed,link_multi-y)

$(multi-used-m) : %.o: $(multi-objs-m) FORCE
- $(call if_changed,link_multi-m)
- @{ echo $(@:.o=.ko); echo $(link_multi_deps); } > $(MODVERDIR)/$(@F:.o=.mod)
+ $(if $(if_changed), \
+ $(call if_changed,link_multi-m) \
+ { echo $(@:.o=.ko); \
+ echo $(link_multi_deps); } > $(MODVERDIR)/$(@F:.o=.mod))

targets += $(multi-used-y) $(multi-used-m)



2006-10-24 20:43:29

by Randy Dunlap

[permalink] [raw]
Subject: Re: [patch, rfc] kbuild: implement checksrc without building Cources (was Re: CHECK without C compile?)

On Tue, 24 Oct 2006 19:43:40 +0000 (UTC) Oleg Verych wrote:

> On 2006-10-24, Oleg Verych wrote:
> > On 2006-10-23, Randy Dunlap wrote:
> >> Hi Sam,
> >
> * It seems*
> >
> > + $(call if_changed_rule,cc_o_c) || \
> > + { echo $(@:.o=.ko); echo $@; } > $(MODVERDIR)/$(@F:.o=.mod)
>
> This doesn't work, use ifs instead. Updated.
> I have no idea what to do with generated sources and headers.
> One may be: check target `if_changed' to be %.c or %.h and let it be
> built.

Hi Oleg,

Yes, it works for me, with the exception of host-generated
files, as you mentioned. I ran into those with:
IKCONFIG (the one that you mentioned), ATM_FORE200E firmware,
IEEE 1394 OUI database (which I sent a patch for -- it should
not be generated when the config option is not enabled),
RAID456 tables, VIDEO_LOGO files, and CRC32 table.

Thanks for your time and effort. Maybe Sam will have some ideas.

> ____
> From: Oleg Verych <[email protected]>
> Subject: [patch, rfc] kbuild: implement checksrc without building Cources
>
> Implementation of configured source chacking without actual building.
>
> Cc: Randy Dunlap <[email protected]>
> Cc: Sam Ravnborg <[email protected]>
> Signed-off-by: Oleg Verych <[email protected]>
> ---
>
> Configured sources means, some config target must be run already.
> After that
> ,-<shell>
> | make prepare
> | make C=something_not_0,1,2 _target_
> `--
> should run _target_ with checking and without building.
>
> -o--=O`C /. .\
> #oo'L O o
> <___=E M ^--
>
> scripts/Kbuild.include | 6 +++---
> scripts/Makefile.build | 25 ++++++++++++++++---------
> 2 files changed, 19 insertions(+), 12 deletions(-)


---
~Randy

2006-10-26 13:01:23

by Oleg Verych

[permalink] [raw]
Subject: Re:[patch, rfc] kbuild: implement checksrc without building Cources...

On Tue, Oct 24, 2006 at 01:45:08PM -0700, Randy Dunlap wrote:
> On Tue, 24 Oct 2006 19:43:40 +0000 (UTC) Oleg Verych wrote:
> > This doesn't work, use ifs instead. Updated.
> > I have no idea what to do with generated sources and headers.
> > One may be: check target `if_changed' to be %.c or %.h and let it be
> > built.
>
> Hi Oleg,
>
> Yes, it works for me, with the exception of host-generated
> files, as you mentioned. I ran into those with:
> IKCONFIG (the one that you mentioned), ATM_FORE200E firmware,
> IEEE 1394 OUI database (which I sent a patch for -- it should
> not be generated when the config option is not enabled),
> RAID456 tables, VIDEO_LOGO files, and CRC32 table.

I'm glad, that semi-working thing was helpful. But it's ugly hack.

Idea is to substitute objects (*.o) with sparse output, thus targets
like
,--
|%.o : %.c
+--
will be updated and new check will pass them (force check may be applied).
Also having results in files (even in so messy called *.o) is good for
collecting and sorting errors. Headers will be generated as needed.

Finally short statistics maybe printed in the end of the check:
[(stat -c %s *.o > 0 | wc -l) / find --name *.o]
^ with error file size > 0 / overall error files

But implementing all this in non-hack way isn't easy. Maybe Sam will
came back and will do it magically quickly. Until that, i'll try to
fight with current makefiles myself.

> Thanks for your time and effort. Maybe Sam will have some ideas.

I've found "sparse" and read some philosophy from README. Nice.
Thanks you also !
____