2004-03-03 20:34:11

by Chris Wright

[permalink] [raw]
Subject: kbuild will remove .c files

I added a new config to my kernel, and hadn't done a bk -r get in quite
a while. Turns out the subdir relevant to the config item hits the make
builtin to get the file (since it had been missing), but then kbuild
assembles, links, links, and finally removes the .c file. This will
be done everytime, since the .c file is now gone. While a preemptive
bk -r get is the obvious solution here (or even a after the fact bk get
$missing.c), is this a possible very small buglet in kbuild?

Here's some relevant output:

get net/irda/irlan/SCCS/s.irlan_client.c
net/irda/irlan/irlan_client.c 1.8: 565 lines
CC net/irda/irlan/irlan_client.s
as -o net/irda/irlan/irlan_client.o net/irda/irlan/irlan_client.s
LD net/irda/irlan/irlan.o
LD net/irda/irlan/built-in.o
rm net/irda/irlan/irlan_client.c

And only the net/irda/irlan/.irlan_client.s.cmd is created.

thanks,
-chris
--
Linux Security Modules http://lsm.immunix.org http://lsm.bkbits.net


2004-03-03 21:06:41

by Sam Ravnborg

[permalink] [raw]
Subject: Re: kbuild will remove .c files

On Wed, Mar 03, 2004 at 12:34:06PM -0800, Chris Wright wrote:
> I added a new config to my kernel, and hadn't done a bk -r get in quite
> a while. Turns out the subdir relevant to the config item hits the make
> builtin to get the file (since it had been missing), but then kbuild
> assembles, links, links, and finally removes the .c file. This will
> be done everytime, since the .c file is now gone. While a preemptive
> bk -r get is the obvious solution here (or even a after the fact bk get
> $missing.c), is this a possible very small buglet in kbuild?
>
> Here's some relevant output:
>
> get net/irda/irlan/SCCS/s.irlan_client.c
> net/irda/irlan/irlan_client.c 1.8: 565 lines
> CC net/irda/irlan/irlan_client.s
> as -o net/irda/irlan/irlan_client.o net/irda/irlan/irlan_client.s
> LD net/irda/irlan/irlan.o
> LD net/irda/irlan/built-in.o
> rm net/irda/irlan/irlan_client.c

What happens here is that make resort to a chained rule to create the
irlan.o file.
The chain goes from SCCS/%.c -> %.c -> %.s -> %.o

The two files %.c and %.s is considered intermidiate files, and make
guarantees that intermidiate files that did not exist when
make was called, does not exists when make exists.
This is reported by make with the "rm ..." line.

See info make -> Implicit rules - > Chained rules

The reason why you see this is that there is no implicit rule from SCCS/%.c -> %.c
wich is because kbuild does not 'know' of SCCS/* - but make uses some build-in
rule for this.

Two questions pops up though.
First my make documentatin say the make would use "rm -f ...",not "rm".
What make version do you use?

Also I would expect to see irlan_client.s to be deleted also - did you miss that?
It may show up a bit later.

Sam

2004-03-03 21:38:39

by Chris Wright

[permalink] [raw]
Subject: Re: kbuild will remove .c files

* Sam Ravnborg ([email protected]) wrote:
> What happens here is that make resort to a chained rule to create the
> irlan.o file.
> The chain goes from SCCS/%.c -> %.c -> %.s -> %.o
>
> The two files %.c and %.s is considered intermidiate files, and make
> guarantees that intermidiate files that did not exist when
> make was called, does not exists when make exists.
> This is reported by make with the "rm ..." line.

Ah, I was trying to find it in kbuild.

> First my make documentatin say the make would use "rm -f ...",not "rm".
> What make version do you use?

GNU Make 3.80

> Also I would expect to see irlan_client.s to be deleted also - did you miss that?
> It may show up a bit later.

No, it is not deleted.

thanks,
-chris
--
Linux Security Modules http://lsm.immunix.org http://lsm.bkbits.net

2004-03-03 22:35:52

by Pascal Schmidt

[permalink] [raw]
Subject: Re: kbuild will remove .c files

On Wed, 03 Mar 2004 22:20:06 +0100, you wrote in linux.kernel:

> Two questions pops up though.
> First my make documentatin say the make would use "rm -f ...",not "rm".
> What make version do you use?

I can't find it in the documentation right now, but I believe GNU make
does the unlink(2) itself for intermediate files and only pretends to
be calling rm(1).

--
Ciao,
Pascal