Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1356566 > unrolled thread
| Started by | Masahiro Yamada <yamada.masahiro@socionext.com> |
|---|---|
| First post | 2016-03-13 01:20 +0100 |
| Last post | 2016-03-17 05:00 +0100 |
| Articles | 11 — 3 participants |
Back to article view | Back to linux.kernel
[PATCH] kbuild: drop FORCE from PHONY targets Masahiro Yamada <yamada.masahiro@socionext.com> - 2016-03-13 01:20 +0100
Re: [PATCH] kbuild: drop FORCE from PHONY targets Andy Lutomirski <luto@amacapital.net> - 2016-03-14 01:50 +0100
Re: [PATCH] kbuild: drop FORCE from PHONY targets Masahiro Yamada <yamada.masahiro@socionext.com> - 2016-03-14 05:10 +0100
Re: [PATCH] kbuild: drop FORCE from PHONY targets Andy Lutomirski <luto@amacapital.net> - 2016-03-14 05:30 +0100
Re: [PATCH] kbuild: drop FORCE from PHONY targets Masahiro Yamada <yamada.masahiro@socionext.com> - 2016-03-14 05:40 +0100
Re: [PATCH] kbuild: drop FORCE from PHONY targets Andy Lutomirski <luto@amacapital.net> - 2016-03-14 05:50 +0100
Re: [PATCH] kbuild: drop FORCE from PHONY targets Masahiro Yamada <yamada.masahiro@socionext.com> - 2016-03-14 07:30 +0100
Re: [PATCH] kbuild: drop FORCE from PHONY targets Andy Lutomirski <luto@amacapital.net> - 2016-03-15 19:30 +0100
Re: [PATCH] kbuild: drop FORCE from PHONY targets Michal Marek <mmarek@suse.com> - 2016-03-15 21:50 +0100
Re: [PATCH] kbuild: drop FORCE from PHONY targets Andy Lutomirski <luto@amacapital.net> - 2016-03-15 21:50 +0100
Re: [PATCH] kbuild: drop FORCE from PHONY targets Masahiro Yamada <yamada.masahiro@socionext.com> - 2016-03-17 05:00 +0100
| From | Masahiro Yamada <yamada.masahiro@socionext.com> |
|---|---|
| Date | 2016-03-13 01:20 +0100 |
| Subject | [PATCH] kbuild: drop FORCE from PHONY targets |
| Message-ID | <rc1Vg-5VI-7@gated-at.bofh.it> |
These targets are marked as PHONY. No need to add FORCE to their dependency. Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> --- Makefile | 8 ++++---- arch/arm/vdso/Makefile | 2 +- arch/ia64/Makefile | 4 ++-- arch/x86/entry/vdso/Makefile | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index 2d519d2..e3ef6b6 100644 --- a/Makefile +++ b/Makefile @@ -142,7 +142,7 @@ PHONY += $(MAKECMDGOALS) sub-make $(filter-out _all sub-make $(CURDIR)/Makefile, $(MAKECMDGOALS)) _all: sub-make @: -sub-make: FORCE +sub-make: $(Q)$(MAKE) -C $(KBUILD_OUTPUT) KBUILD_SRC=$(CURDIR) \ -f $(CURDIR)/Makefile $(filter-out _all sub-make,$(MAKECMDGOALS)) @@ -989,7 +989,7 @@ prepare1: prepare2 $(version_h) include/generated/utsrelease.h \ archprepare: archheaders archscripts prepare1 scripts_basic -prepare0: archprepare FORCE +prepare0: archprepare $(Q)$(MAKE) $(build)=. # All the preparing.. @@ -1034,7 +1034,7 @@ INSTALL_FW_PATH=$(INSTALL_MOD_PATH)/lib/firmware export INSTALL_FW_PATH PHONY += firmware_install -firmware_install: FORCE +firmware_install: @mkdir -p $(objtree)/firmware $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.fwinst obj=firmware __fw_install @@ -1054,7 +1054,7 @@ PHONY += archscripts archscripts: PHONY += __headers -__headers: $(version_h) scripts_basic asm-generic archheaders archscripts FORCE +__headers: $(version_h) scripts_basic asm-generic archheaders archscripts $(Q)$(MAKE) $(build)=scripts build_unifdef PHONY += headers_install_all diff --git a/arch/arm/vdso/Makefile b/arch/arm/vdso/Makefile index 1160434..59a8fa7 100644 --- a/arch/arm/vdso/Makefile +++ b/arch/arm/vdso/Makefile @@ -74,5 +74,5 @@ $(MODLIB)/vdso: FORCE @mkdir -p $(MODLIB)/vdso PHONY += vdso_install -vdso_install: $(obj)/vdso.so.dbg $(MODLIB)/vdso FORCE +vdso_install: $(obj)/vdso.so.dbg $(MODLIB)/vdso $(call cmd,vdso_install) diff --git a/arch/ia64/Makefile b/arch/ia64/Makefile index 970d0bd..648f1ce 100644 --- a/arch/ia64/Makefile +++ b/arch/ia64/Makefile @@ -95,8 +95,8 @@ define archhelp echo '* unwcheck - Check vmlinux for invalid unwind info' endef -archprepare: make_nr_irqs_h FORCE +archprepare: make_nr_irqs_h PHONY += make_nr_irqs_h FORCE -make_nr_irqs_h: FORCE +make_nr_irqs_h: $(Q)$(MAKE) $(build)=arch/ia64/kernel include/generated/nr-irqs.h diff --git a/arch/x86/entry/vdso/Makefile b/arch/x86/entry/vdso/Makefile index c854541..a81b539 100644 --- a/arch/x86/entry/vdso/Makefile +++ b/arch/x86/entry/vdso/Makefile @@ -188,10 +188,10 @@ vdso_img_insttargets := $(vdso_img_sodbg:%.dbg=install_%) $(MODLIB)/vdso: FORCE @mkdir -p $(MODLIB)/vdso -$(vdso_img_insttargets): install_%: $(obj)/%.dbg $(MODLIB)/vdso FORCE +$(vdso_img_insttargets): install_%: $(obj)/%.dbg $(MODLIB)/vdso $(call cmd,vdso_install) PHONY += vdso_install $(vdso_img_insttargets) -vdso_install: $(vdso_img_insttargets) FORCE +vdso_install: $(vdso_img_insttargets) clean-files := vdso32.so vdso32.so.dbg vdso64* vdso-image-*.c vdsox32.so* -- 1.9.1
[toc] | [next] | [standalone]
| From | Andy Lutomirski <luto@amacapital.net> |
|---|---|
| Date | 2016-03-14 01:50 +0100 |
| Message-ID | <rcoRQ-4Fc-19@gated-at.bofh.it> |
| In reply to | #1356566 |
On Mar 12, 2016 4:14 PM, "Masahiro Yamada" <yamada.masahiro@socionext.com> wrote: > > These targets are marked as PHONY. No need to add FORCE to their > dependency. If this is, in fact, correct, can you update Documentation/kbuild/makefiles.txt as well? Thanks, Andy
[toc] | [prev] | [next] | [standalone]
| From | Masahiro Yamada <yamada.masahiro@socionext.com> |
|---|---|
| Date | 2016-03-14 05:10 +0100 |
| Message-ID | <rcrZn-73B-1@gated-at.bofh.it> |
| In reply to | #1356790 |
Hi Andy 2016-03-14 9:39 GMT+09:00 Andy Lutomirski <luto@amacapital.net>: > On Mar 12, 2016 4:14 PM, "Masahiro Yamada" > <yamada.masahiro@socionext.com> wrote: >> >> These targets are marked as PHONY. No need to add FORCE to their >> dependency. > > If this is, in fact, correct, can you update > Documentation/kbuild/makefiles.txt as well? Which line do you want me to update? -- Best Regards Masahiro Yamada
[toc] | [prev] | [next] | [standalone]
| From | Andy Lutomirski <luto@amacapital.net> |
|---|---|
| Date | 2016-03-14 05:30 +0100 |
| Message-ID | <rcsiJ-7as-3@gated-at.bofh.it> |
| In reply to | #1356881 |
On Sun, Mar 13, 2016 at 9:08 PM, Masahiro Yamada <yamada.masahiro@socionext.com> wrote: > > Hi Andy > > 2016-03-14 9:39 GMT+09:00 Andy Lutomirski <luto@amacapital.net>: > > On Mar 12, 2016 4:14 PM, "Masahiro Yamada" > > <yamada.masahiro@socionext.com> wrote: > >> > >> These targets are marked as PHONY. No need to add FORCE to their > >> dependency. > > > > If this is, in fact, correct, can you update > > Documentation/kbuild/makefiles.txt as well? > > Which line do you want me to update? > All the references to FORCE should probably mention .PHONY as an alternative. --Andy > > > > > -- > Best Regards > Masahiro Yamada -- Andy Lutomirski AMA Capital Management, LLC
[toc] | [prev] | [next] | [standalone]
| From | Masahiro Yamada <yamada.masahiro@socionext.com> |
|---|---|
| Date | 2016-03-14 05:40 +0100 |
| Message-ID | <rcssq-7f5-7@gated-at.bofh.it> |
| In reply to | #1356885 |
2016-03-14 13:28 GMT+09:00 Andy Lutomirski <luto@amacapital.net>: > On Sun, Mar 13, 2016 at 9:08 PM, Masahiro Yamada > <yamada.masahiro@socionext.com> wrote: >> >> Hi Andy >> >> 2016-03-14 9:39 GMT+09:00 Andy Lutomirski <luto@amacapital.net>: >> > On Mar 12, 2016 4:14 PM, "Masahiro Yamada" >> > <yamada.masahiro@socionext.com> wrote: >> >> >> >> These targets are marked as PHONY. No need to add FORCE to their >> >> dependency. >> > >> > If this is, in fact, correct, can you update >> > Documentation/kbuild/makefiles.txt as well? >> >> Which line do you want me to update? >> > > All the references to FORCE should probably mention .PHONY as an alternative. I do not get your point. All the examples in the makefile.txt correctly reference to FORCE. They are not PHONY targets. No need to update. -- Best Regards Masahiro Yamada
[toc] | [prev] | [next] | [standalone]
| From | Andy Lutomirski <luto@amacapital.net> |
|---|---|
| Date | 2016-03-14 05:50 +0100 |
| Message-ID | <rcsC6-7iI-29@gated-at.bofh.it> |
| In reply to | #1356893 |
On Sun, Mar 13, 2016 at 9:36 PM, Masahiro Yamada
<yamada.masahiro@socionext.com> wrote:
> 2016-03-14 13:28 GMT+09:00 Andy Lutomirski <luto@amacapital.net>:
>> On Sun, Mar 13, 2016 at 9:08 PM, Masahiro Yamada
>> <yamada.masahiro@socionext.com> wrote:
>>>
>>> Hi Andy
>>>
>>> 2016-03-14 9:39 GMT+09:00 Andy Lutomirski <luto@amacapital.net>:
>>> > On Mar 12, 2016 4:14 PM, "Masahiro Yamada"
>>> > <yamada.masahiro@socionext.com> wrote:
>>> >>
>>> >> These targets are marked as PHONY. No need to add FORCE to their
>>> >> dependency.
>>> >
>>> > If this is, in fact, correct, can you update
>>> > Documentation/kbuild/makefiles.txt as well?
>>>
>>> Which line do you want me to update?
>>>
>>
>> All the references to FORCE should probably mention .PHONY as an alternative.
>
> I do not get your point.
>
> All the examples in the makefile.txt correctly reference to FORCE.
> They are not PHONY targets.
> No need to update.
But they could be. For example:
$(obj)/image: vmlinux FORCE
$(call if_changed,objcopy)
could be:
.PHONY: $(obj)/image
$(obj)/image: vmlinux
$(call if_changed,objcopy)
I would at least change:
Note: It is a typical mistake to forget the FORCE prerequisite.
to:
Note: if-changed is only useful if make executes it, which won't
happen if it determines that the inputs have not changed since the
output was built. This can be avoided by specifying FORCE as a
prerequisite or by making declaring the output as .PHONY.
--Andy
>
>
>
>
> --
> Best Regards
> Masahiro Yamada
--
Andy Lutomirski
AMA Capital Management, LLC
[toc] | [prev] | [next] | [standalone]
| From | Masahiro Yamada <yamada.masahiro@socionext.com> |
|---|---|
| Date | 2016-03-14 07:30 +0100 |
| Message-ID | <rcuaS-8sW-9@gated-at.bofh.it> |
| In reply to | #1356908 |
Hi Andy,
2016-03-14 13:44 GMT+09:00 Andy Lutomirski <luto@amacapital.net>:
> On Sun, Mar 13, 2016 at 9:36 PM, Masahiro Yamada
> <yamada.masahiro@socionext.com> wrote:
>> 2016-03-14 13:28 GMT+09:00 Andy Lutomirski <luto@amacapital.net>:
>>> On Sun, Mar 13, 2016 at 9:08 PM, Masahiro Yamada
>>> <yamada.masahiro@socionext.com> wrote:
>>>>
>>>> Hi Andy
>>>>
>>>> 2016-03-14 9:39 GMT+09:00 Andy Lutomirski <luto@amacapital.net>:
>>>> > On Mar 12, 2016 4:14 PM, "Masahiro Yamada"
>>>> > <yamada.masahiro@socionext.com> wrote:
>>>> >>
>>>> >> These targets are marked as PHONY. No need to add FORCE to their
>>>> >> dependency.
>>>> >
>>>> > If this is, in fact, correct, can you update
>>>> > Documentation/kbuild/makefiles.txt as well?
>>>>
>>>> Which line do you want me to update?
>>>>
>>>
>>> All the references to FORCE should probably mention .PHONY as an alternative.
>>
>> I do not get your point.
>>
>> All the examples in the makefile.txt correctly reference to FORCE.
>> They are not PHONY targets.
>> No need to update.
>
> But they could be. For example:
>
> $(obj)/image: vmlinux FORCE
> $(call if_changed,objcopy)
>
> could be:
>
> .PHONY: $(obj)/image
> $(obj)/image: vmlinux
> $(call if_changed,objcopy)
>
> I would at least change:
>
> Note: It is a typical mistake to forget the FORCE prerequisite.
>
> to:
>
> Note: if-changed is only useful if make executes it, which won't
> happen if it determines that the inputs have not changed since the
> output was built. This can be avoided by specifying FORCE as a
> prerequisite or by making declaring the output as .PHONY.
>
No. This is absolutely wrong.
PHONY and FORCE are not interchangeable.
They have different behavior.
I will show you how they behave differently.
BTW, Linux 4.5 is out now.
Let's try a simple experiment on it.
The following shows that my source tree is v4.5
yamada@beagle:~/workspace/linux$ git describe
v4.5
Example 1)
Add the following code to the top Makefile.
Please note "FORCE" is used here.
yamada@beagle:~/workspace/linux$ git diff
diff --git a/Makefile b/Makefile
index 7b3ecdc..89b7d0d 100644
--- a/Makefile
+++ b/Makefile
@@ -914,6 +914,22 @@ export KBUILD_ALLDIRS := $(sort $(filter-out
arch/%,$(vmlinux-
vmlinux-deps := $(KBUILD_LDS) $(KBUILD_VMLINUX_INIT) $(KBUILD_VMLINUX_MAIN)
+quiet_cmd_gen_foo = FOO $@
+ cmd_gen_foo = (cat $<; echo hello) > $@
+
+foo: bar FORCE
+ $(call if_changed,gen_foo)
+
+quiet_cmd_gen_bar = BAR $@
+ cmd_gen_bar = (cat $<; echo $(GREETING)) > $@
+
+bar: baz FORCE
+ $(call if_changed,gen_bar)
+
+baz:
+ @touch $@
+
+
# Final link of vmlinux
cmd_link-vmlinux = $(CONFIG_SHELL) $< $(LD) $(LDFLAGS) $(LDFLAGS_vmlinux)
quiet_cmd_link-vmlinux = LINK $@
Try the following.
yamada@beagle:~/workspace/linux$ git clean -x -f
yamada@beagle:~/workspace/linux$ make -s defconfig
yamada@beagle:~/workspace/linux$ make GREETING=GoodMorning foo
scripts/kconfig/conf --silentoldconfig Kconfig
BAR bar
FOO foo
yamada@beagle:~/workspace/linux$ make GREETING=GoodMorning foo
make: `foo' is up to date.
yamada@beagle:~/workspace/linux$ make GREETING=GoodAfternoon foo
BAR bar
FOO foo
yamada@beagle:~/workspace/linux$ make GREETING=GoodAfternoon foo
make: `foo' is up to date.
yamada@beagle:~/workspace/linux$ make GREETING=GoodEvening foo
BAR bar
FOO foo
yamada@beagle:~/workspace/linux$ make GREETING=GoodEvening foo
make: `foo' is up to date.
Please notice "foo" and "bar" were not rebuilt
when I gave the same command line as the previous run.
When I changed the command line, "bar" was update
and "foo" was also updated because "foo" depends on "bar".
It means $(call if_changed,...) is working as expected.
Example 2)
Add the following to the top Makefile.
Please notice that I just replaced "FORCE" with ".PHONY".
diff --git a/Makefile b/Makefile
index 7b3ecdc..a0899c3 100644
--- a/Makefile
+++ b/Makefile
@@ -914,6 +914,24 @@ export KBUILD_ALLDIRS := $(sort $(filter-out
arch/%,$(vmlinux-
vmlinux-deps := $(KBUILD_LDS) $(KBUILD_VMLINUX_INIT) $(KBUILD_VMLINUX_MAIN)
+quiet_cmd_gen_foo = FOO $@
+ cmd_gen_foo = (cat $<; echo hello) > $@
+
+.PHONY: foo
+foo: bar
+ $(call if_changed,gen_foo)
+
+quiet_cmd_gen_bar = BAR $@
+ cmd_gen_bar = (cat $<; echo $(GREETING)) > $@
+
+.PHONY: bar
+bar: baz
+ $(call if_changed,gen_bar)
+
+baz:
+ @touch $@
+
+
# Final link of vmlinux
cmd_link-vmlinux = $(CONFIG_SHELL) $< $(LD) $(LDFLAGS) $(LDFLAGS_vmlinux)
quiet_cmd_link-vmlinux = LINK $@
Let's try the same thing.
yamada@beagle:~/workspace/linux$ git clean -x -f
yamada@beagle:~/workspace/linux$ make -s defconfig
yamada@beagle:~/workspace/linux$ make GREETING=GoodMorning foo
scripts/kconfig/conf --silentoldconfig Kconfig
BAR bar
FOO foo
yamada@beagle:~/workspace/linux$ make GREETING=GoodMorning foo
BAR bar
FOO foo
yamada@beagle:~/workspace/linux$ make GREETING=GoodMorning foo
BAR bar
FOO foo
yamada@beagle:~/workspace/linux$ make GREETING=GoodAfternoon foo
BAR bar
FOO foo
yamada@beagle:~/workspace/linux$ make GREETING=GoodAfternoon foo
BAR bar
FOO foo
yamada@beagle:~/workspace/linux$ make GREETING=GoodAfternoon foo
BAR bar
FOO foo
Did you notice the difference?
The "foo" and "bar" are always rebuilt
regardless the command line is changed or not.
It means $(call if_changed,...) is not working.
--
Best Regards
Masahiro Yamada
[toc] | [prev] | [next] | [standalone]
| From | Andy Lutomirski <luto@amacapital.net> |
|---|---|
| Date | 2016-03-15 19:30 +0100 |
| Message-ID | <rd1Tb-5O3-1@gated-at.bofh.it> |
| In reply to | #1356961 |
On Mar 13, 2016 11:26 PM, "Masahiro Yamada" <yamada.masahiro@socionext.com> wrote: > > Hi Andy, > > > 2016-03-14 13:44 GMT+09:00 Andy Lutomirski <luto@amacapital.net>: > > On Sun, Mar 13, 2016 at 9:36 PM, Masahiro Yamada > > <yamada.masahiro@socionext.com> wrote: > >> 2016-03-14 13:28 GMT+09:00 Andy Lutomirski <luto@amacapital.net>: > >>> On Sun, Mar 13, 2016 at 9:08 PM, Masahiro Yamada > >>> <yamada.masahiro@socionext.com> wrote: > >>>> > >>>> Hi Andy > >>>> > >>>> 2016-03-14 9:39 GMT+09:00 Andy Lutomirski <luto@amacapital.net>: > >>>> > On Mar 12, 2016 4:14 PM, "Masahiro Yamada" > >>>> > <yamada.masahiro@socionext.com> wrote: > >>>> >> > >>>> >> These targets are marked as PHONY. No need to add FORCE to their > >>>> >> dependency. > >>>> > > >>>> > If this is, in fact, correct, can you update > >>>> > Documentation/kbuild/makefiles.txt as well? > >>>> > >>>> Which line do you want me to update? > >>>> > >>> > >>> All the references to FORCE should probably mention .PHONY as an alternative. > >> > >> I do not get your point. > >> > >> All the examples in the makefile.txt correctly reference to FORCE. > >> They are not PHONY targets. > >> No need to update. > > > > But they could be. For example: > > > > $(obj)/image: vmlinux FORCE > > $(call if_changed,objcopy) > > > > could be: > > > > .PHONY: $(obj)/image > > $(obj)/image: vmlinux > > $(call if_changed,objcopy) > > > > I would at least change: > > > > Note: It is a typical mistake to forget the FORCE prerequisite. > > > > to: > > > > Note: if-changed is only useful if make executes it, which won't > > happen if it determines that the inputs have not changed since the > > output was built. This can be avoided by specifying FORCE as a > > prerequisite or by making declaring the output as .PHONY. > > > > > No. This is absolutely wrong. > PHONY and FORCE are not interchangeable. > > They have different behavior. > I will show you how they behave differently. > > > BTW, Linux 4.5 is out now. > > Let's try a simple experiment on it. > > > The following shows that my source tree is v4.5 > > yamada@beagle:~/workspace/linux$ git describe > v4.5 > > > > Example 1) > > > Add the following code to the top Makefile. > > Please note "FORCE" is used here. > > > yamada@beagle:~/workspace/linux$ git diff > diff --git a/Makefile b/Makefile > index 7b3ecdc..89b7d0d 100644 > --- a/Makefile > +++ b/Makefile > @@ -914,6 +914,22 @@ export KBUILD_ALLDIRS := $(sort $(filter-out > arch/%,$(vmlinux- > > vmlinux-deps := $(KBUILD_LDS) $(KBUILD_VMLINUX_INIT) $(KBUILD_VMLINUX_MAIN) > > +quiet_cmd_gen_foo = FOO $@ > + cmd_gen_foo = (cat $<; echo hello) > $@ > + > +foo: bar FORCE > + $(call if_changed,gen_foo) > + > +quiet_cmd_gen_bar = BAR $@ > + cmd_gen_bar = (cat $<; echo $(GREETING)) > $@ > + > +bar: baz FORCE > + $(call if_changed,gen_bar) > + > +baz: > + @touch $@ > + > + > # Final link of vmlinux > cmd_link-vmlinux = $(CONFIG_SHELL) $< $(LD) $(LDFLAGS) $(LDFLAGS_vmlinux) > quiet_cmd_link-vmlinux = LINK $@ > > > > Try the following. > > yamada@beagle:~/workspace/linux$ git clean -x -f > yamada@beagle:~/workspace/linux$ make -s defconfig > yamada@beagle:~/workspace/linux$ make GREETING=GoodMorning foo > scripts/kconfig/conf --silentoldconfig Kconfig > BAR bar > FOO foo > yamada@beagle:~/workspace/linux$ make GREETING=GoodMorning foo > make: `foo' is up to date. > yamada@beagle:~/workspace/linux$ make GREETING=GoodAfternoon foo > BAR bar > FOO foo > yamada@beagle:~/workspace/linux$ make GREETING=GoodAfternoon foo > make: `foo' is up to date. > yamada@beagle:~/workspace/linux$ make GREETING=GoodEvening foo > BAR bar > FOO foo > yamada@beagle:~/workspace/linux$ make GREETING=GoodEvening foo > make: `foo' is up to date. > > > > > Please notice "foo" and "bar" were not rebuilt > when I gave the same command line as the previous run. > > > When I changed the command line, "bar" was update > and "foo" was also updated because "foo" depends on "bar". > > > It means $(call if_changed,...) is working as expected. > > > > > > > Example 2) > > > Add the following to the top Makefile. > Please notice that I just replaced "FORCE" with ".PHONY". > > > > diff --git a/Makefile b/Makefile > index 7b3ecdc..a0899c3 100644 > --- a/Makefile > +++ b/Makefile > @@ -914,6 +914,24 @@ export KBUILD_ALLDIRS := $(sort $(filter-out > arch/%,$(vmlinux- > > vmlinux-deps := $(KBUILD_LDS) $(KBUILD_VMLINUX_INIT) $(KBUILD_VMLINUX_MAIN) > > +quiet_cmd_gen_foo = FOO $@ > + cmd_gen_foo = (cat $<; echo hello) > $@ > + > +.PHONY: foo > +foo: bar > + $(call if_changed,gen_foo) > + > +quiet_cmd_gen_bar = BAR $@ > + cmd_gen_bar = (cat $<; echo $(GREETING)) > $@ > + > +.PHONY: bar > +bar: baz > + $(call if_changed,gen_bar) > + > +baz: > + @touch $@ > + > + > # Final link of vmlinux > cmd_link-vmlinux = $(CONFIG_SHELL) $< $(LD) $(LDFLAGS) $(LDFLAGS_vmlinux) > quiet_cmd_link-vmlinux = LINK $@ > > > > Let's try the same thing. > > > > yamada@beagle:~/workspace/linux$ git clean -x -f > yamada@beagle:~/workspace/linux$ make -s defconfig > yamada@beagle:~/workspace/linux$ make GREETING=GoodMorning foo > scripts/kconfig/conf --silentoldconfig Kconfig > BAR bar > FOO foo > yamada@beagle:~/workspace/linux$ make GREETING=GoodMorning foo > BAR bar > FOO foo > yamada@beagle:~/workspace/linux$ make GREETING=GoodMorning foo > BAR bar > FOO foo > yamada@beagle:~/workspace/linux$ make GREETING=GoodAfternoon foo > BAR bar > FOO foo > yamada@beagle:~/workspace/linux$ make GREETING=GoodAfternoon foo > BAR bar > FOO foo > yamada@beagle:~/workspace/linux$ make GREETING=GoodAfternoon foo > BAR bar > FOO foo > > > Did you notice the difference? > > The "foo" and "bar" are always rebuilt > regardless the command line is changed or not. > > It means $(call if_changed,...) is not working. > Fair enough, although I'm curious why this happens. It might be worth changing the docs to say that .PHONY is *not* an substitute for FORCE in that context, then. --Andy
[toc] | [prev] | [next] | [standalone]
| From | Michal Marek <mmarek@suse.com> |
|---|---|
| Date | 2016-03-15 21:50 +0100 |
| Message-ID | <rd44G-7jA-5@gated-at.bofh.it> |
| In reply to | #1358183 |
Dne 15.3.2016 v 19:27 Andy Lutomirski napsal(a): > Fair enough, although I'm curious why this happens. It might be worth > changing the docs to say that .PHONY is *not* an substitute for FORCE > in that context, then. These two are unrelated, except that FORCE is redundant for a .PHONY target. FORCE is our idiom to tell make to always remake the target and let us handle the dependencies manually. Listing a target as .PHONY tells make that the target will not produce a file of the same name (typically, "all", "install", etc). Michal
[toc] | [prev] | [next] | [standalone]
| From | Andy Lutomirski <luto@amacapital.net> |
|---|---|
| Date | 2016-03-15 21:50 +0100 |
| Message-ID | <rd44G-7jA-13@gated-at.bofh.it> |
| In reply to | #1358235 |
On Tue, Mar 15, 2016 at 1:45 PM, Michal Marek <mmarek@suse.com> wrote: > Dne 15.3.2016 v 19:27 Andy Lutomirski napsal(a): >> Fair enough, although I'm curious why this happens. It might be worth >> changing the docs to say that .PHONY is *not* an substitute for FORCE >> in that context, then. > > These two are unrelated, except that FORCE is redundant for a .PHONY > target. FORCE is our idiom to tell make to always remake the target and > let us handle the dependencies manually. Listing a target as .PHONY > tells make that the target will not produce a file of the same name > (typically, "all", "install", etc). > Except that apparently if-changed doesn't work on .PHONY targets that don't specify FORCE, which confuses me. --Andy -- Andy Lutomirski AMA Capital Management, LLC
[toc] | [prev] | [next] | [standalone]
| From | Masahiro Yamada <yamada.masahiro@socionext.com> |
|---|---|
| Date | 2016-03-17 05:00 +0100 |
| Message-ID | <rdxgm-1SN-19@gated-at.bofh.it> |
| In reply to | #1358238 |
Hi Andy,
2016-03-16 5:48 GMT+09:00 Andy Lutomirski <luto@amacapital.net>:
> On Tue, Mar 15, 2016 at 1:45 PM, Michal Marek <mmarek@suse.com> wrote:
>> Dne 15.3.2016 v 19:27 Andy Lutomirski napsal(a):
>>> Fair enough, although I'm curious why this happens. It might be worth
>>> changing the docs to say that .PHONY is *not* an substitute for FORCE
>>> in that context, then.
>>
>> These two are unrelated, except that FORCE is redundant for a .PHONY
>> target. FORCE is our idiom to tell make to always remake the target and
>> let us handle the dependencies manually. Listing a target as .PHONY
>> tells make that the target will not produce a file of the same name
>> (typically, "all", "install", etc).
>>
>
> Except that apparently if-changed doesn't work on .PHONY targets that
> don't specify FORCE, which confuses me.
OK, I will try to explain it.
I hope this will help you, not confuse you even more...
I think the difference of Kbuild behavior
comes down to "$?" behavior of GNU Make.
Please see the definition of "if_changed".
if_changed = $(if $(strip $(any-prereq) $(arg-check)), \
@set -e; \
$(echo-cmd) $(cmd_$(1)); \
printf '%s\n' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd)
The "if_changed" does some actions if "any-prereq" or "arg-check" is non-empty.
Next, let's take a look at the definition of "any-prereq"
any-prereq = $(filter-out $(PHONY),$?) $(filter-out $(PHONY) $(wildcard $^),$^)
It seems $? makes the difference between FORCE and PHONY.
The GNU Make manual says as follows:
-------------------->8-----------------------------------
$? The names of all prerequisites that are newer than the target,
separated by spaces.
--------------------8<-----------------------------------
From this statement, it is unclear what happens to $? if the target is
a PHONY target.
I am not a GNU Make developer, so I have no idea about the detailed
implementation,
but anyway let's try simple experiments.
[Example 3]
Let's write a simple Makefile as follows.
--------------------->8---------------------
foo: bar FORCE
echo $$? is "$?"
cp $< $@
bar:
touch $@
.PHONY: FORCE
FORCE:
----------------------8<--------------------
yamada@beagle:~/workspace/test$ rm -f foo bar
yamada@beagle:~/workspace/test$ make
touch bar
echo $? is "bar FORCE"
0 is bar FORCE
cp bar foo
yamada@beagle:~/workspace/test$ make
echo $? is ""
0 is
cp bar foo
yamada@beagle:~/workspace/test$ make
echo $? is ""
0 is
cp bar foo
As we expected, $? contains the prerequisite "bar",
but it is empty for the second run or later (because "foo" is newer than "bar").
[Example 4]
Let's replace the FORCE with PHONY.
--------------------->8---------------------
.PHONY: foo
foo: bar
echo $$? is "$?"
cp $< $@
bar:
touch $@
----------------------8<--------------------
yamada@beagle:~/workspace/test2$ rm -f foo bar
yamada@beagle:~/workspace/test2$ make
touch bar
echo $? is "bar"
0 is bar
cp bar foo
yamada@beagle:~/workspace/test2$ make
echo $? is "bar"
0 is bar
cp bar foo
yamada@beagle:~/workspace/test2$ make
echo $? is "bar"
0 is bar
cp bar foo
This time, $? always contains "bar"
nevertheless "foo" is newer than "bar" on the second run or later.
So, it looks like GNU Make assumes that
all the prerequisites of a PHONY target are always newer than the target.
Go back to the definition of "any-prereq",
any-prereq = $(filter-out $(PHONY),$?) $(filter-out $(PHONY) $(wildcard $^),$^)
If the prerequisite is not a PHONY target (like the "baz" in the
example 2 in my former email),
it is not filtered out from $?. So, any-prereq is non-empty and
if_changed updates the target.
--
Best Regards
Masahiro Yamada
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web