* [RFC][PATCH 0/1] tools/build: Let link command read option from file
@ 2025-07-22 6:13 changqing.li
2025-07-22 6:13 ` [PATCH 1/1] " changqing.li
0 siblings, 1 reply; 4+ messages in thread
From: changqing.li @ 2025-07-22 6:13 UTC (permalink / raw)
To: namhyung, charlie, james.clark, irogers, linux-kernel; +Cc: changqing.li
From: Changqing Li <changqing.li@windriver.com>
Hi, Dear Maintainers
I am building perf with yocto project, and we don't want to put compile
object files to source folder, so pass O=xxx;
When we use a relatively long path like this:
O=/buildarea1/wrlinux-10.25/build/Virtualization/customized-WRLINUX1025_Nightly_Linux_systemd/250609-044304/lxbuilds/Harcuvar_platform_up/intel-x86-64-preempt-rt-glibc-std/wrlinux/build/tmp/work/intel_x86_64-wrs-linux/perf/1.0/perf-1.0
perf will compile failed with error:
| make[4]: /bin/sh: Argument list too long
| make[4]: *** [.../perf/1.0/perf-1.0/tools/build/Makefile.build:156: .../perf/1.0/perf-1.0/util/perf-in.o] Error 127
The error is from this line: "$(call if_changed,$(host)ld_multi)",
Since perf have many .o, and when above long O passed, if_changed will
evoke sh with long argument list.
So I try to fix this issue by this RFC patch. This is the first time I
touch this part, so the patch may not perfect, please help to review and
give your comments, thanks.
Changqing Li (1):
tools/build: Let link command read option from file
tools/build/Makefile.build | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
--
2.34.1
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 1/1] tools/build: Let link command read option from file
2025-07-22 6:13 [RFC][PATCH 0/1] tools/build: Let link command read option from file changqing.li
@ 2025-07-22 6:13 ` changqing.li
2025-07-22 15:43 ` Ian Rogers
0 siblings, 1 reply; 4+ messages in thread
From: changqing.li @ 2025-07-22 6:13 UTC (permalink / raw)
To: namhyung, charlie, james.clark, irogers, linux-kernel; +Cc: changqing.li
From: Changqing Li <changqing.li@windriver.com>
ld_multi will link multiple objects, when there are many objects, and
O=[absolute_path] is set, and the absolute_path is relatively long. It
is possile that this line "$(call if_changed,$(host)ld_multi)" will
report error:
"make[4]: /bin/sh: Argument list too long"
So make the ld command read option from file to fix above error. In
order to convenient debug, write the file content in dot-target.cmd
as comments.
Signed-off-by: Changqing Li <changqing.li@windriver.com>
---
tools/build/Makefile.build | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/tools/build/Makefile.build b/tools/build/Makefile.build
index 3584ff308607..e57ce8c34685 100644
--- a/tools/build/Makefile.build
+++ b/tools/build/Makefile.build
@@ -70,11 +70,13 @@ quiet_cmd_gen = GEN $@
# If there's nothing to link, create empty $@ object.
quiet_cmd_ld_multi = LD $@
cmd_ld_multi = $(if $(strip $(obj-y)),\
- $(LD) -r -o $@ $(filter $(obj-y),$^),rm -f $@; $(AR) rcs $@)
+ $(LD) -r -o $@ @$@.in,rm -f $@; $(AR) rcs $@)
quiet_cmd_host_ld_multi = HOSTLD $@
cmd_host_ld_multi = $(if $(strip $(obj-y)),\
- $(HOSTLD) -r -o $@ $(filter $(obj-y),$^),rm -f $@; $(HOSTAR) rcs $@)
+ $(HOSTLD) -r -o $@ @$@.in,rm -f $@; $(HOSTAR) rcs $@)
+
+output_ld_multi_dotin = $(if $(quiet),,@printf "# %s:\n# " $@.in >> $(dot-target).cmd;cat $@.in >> $(dot-target).cmd)
ifneq ($(filter $(obj),$(hostprogs)),)
host = host_
@@ -145,7 +147,10 @@ $(sort $(subdir-obj-y)): $(subdir-y) ;
$(in-target): $(obj-y) $(test-y) FORCE
$(call rule_mkdir)
+ $(file >$@.in,$(filter $(obj-y),$^))
$(call if_changed,$(host)ld_multi)
+ $(if $(strip $(any-prereq) $(arg-check)), $(output_ld_multi_dotin))
+ @rm $@.in
__build: $(in-target)
@:
--
2.34.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH 1/1] tools/build: Let link command read option from file
2025-07-22 6:13 ` [PATCH 1/1] " changqing.li
@ 2025-07-22 15:43 ` Ian Rogers
2025-08-11 1:37 ` Changqing Li
0 siblings, 1 reply; 4+ messages in thread
From: Ian Rogers @ 2025-07-22 15:43 UTC (permalink / raw)
To: changqing.li; +Cc: namhyung, charlie, james.clark, linux-kernel
On Mon, Jul 21, 2025 at 11:13 PM <changqing.li@windriver.com> wrote:
>
> From: Changqing Li <changqing.li@windriver.com>
>
> ld_multi will link multiple objects, when there are many objects, and
> O=[absolute_path] is set, and the absolute_path is relatively long. It
> is possile that this line "$(call if_changed,$(host)ld_multi)" will
> report error:
> "make[4]: /bin/sh: Argument list too long"
>
> So make the ld command read option from file to fix above error. In
> order to convenient debug, write the file content in dot-target.cmd
> as comments.
>
> Signed-off-by: Changqing Li <changqing.li@windriver.com>
Hi Changqing,
I believe your change makes sense. I notice that the regular kernel
build has had to work around this problem too:
https://web.git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/scripts/Makefile.build#n290
https://web.git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/scripts/Makefile.build#n463
but in those workarounds the need for an extra .in file isn't
necessary. Would such a change be possible here and avoid the need for
cleaning up an extra file?
Thanks,
Ian
> ---
> tools/build/Makefile.build | 9 +++++++--
> 1 file changed, 7 insertions(+), 2 deletions(-)
>
> diff --git a/tools/build/Makefile.build b/tools/build/Makefile.build
> index 3584ff308607..e57ce8c34685 100644
> --- a/tools/build/Makefile.build
> +++ b/tools/build/Makefile.build
> @@ -70,11 +70,13 @@ quiet_cmd_gen = GEN $@
> # If there's nothing to link, create empty $@ object.
> quiet_cmd_ld_multi = LD $@
> cmd_ld_multi = $(if $(strip $(obj-y)),\
> - $(LD) -r -o $@ $(filter $(obj-y),$^),rm -f $@; $(AR) rcs $@)
> + $(LD) -r -o $@ @$@.in,rm -f $@; $(AR) rcs $@)
>
> quiet_cmd_host_ld_multi = HOSTLD $@
> cmd_host_ld_multi = $(if $(strip $(obj-y)),\
> - $(HOSTLD) -r -o $@ $(filter $(obj-y),$^),rm -f $@; $(HOSTAR) rcs $@)
> + $(HOSTLD) -r -o $@ @$@.in,rm -f $@; $(HOSTAR) rcs $@)
> +
> +output_ld_multi_dotin = $(if $(quiet),,@printf "# %s:\n# " $@.in >> $(dot-target).cmd;cat $@.in >> $(dot-target).cmd)
>
> ifneq ($(filter $(obj),$(hostprogs)),)
> host = host_
> @@ -145,7 +147,10 @@ $(sort $(subdir-obj-y)): $(subdir-y) ;
>
> $(in-target): $(obj-y) $(test-y) FORCE
> $(call rule_mkdir)
> + $(file >$@.in,$(filter $(obj-y),$^))
> $(call if_changed,$(host)ld_multi)
> + $(if $(strip $(any-prereq) $(arg-check)), $(output_ld_multi_dotin))
> + @rm $@.in
>
> __build: $(in-target)
> @:
> --
> 2.34.1
>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 1/1] tools/build: Let link command read option from file
2025-07-22 15:43 ` Ian Rogers
@ 2025-08-11 1:37 ` Changqing Li
0 siblings, 0 replies; 4+ messages in thread
From: Changqing Li @ 2025-08-11 1:37 UTC (permalink / raw)
To: Ian Rogers; +Cc: namhyung, charlie, james.clark, linux-kernel
On 7/22/25 23:43, Ian Rogers wrote:
> CAUTION: This email comes from a non Wind River email account!
> Do not click links or open attachments unless you recognize the sender and know the content is safe.
>
> On Mon, Jul 21, 2025 at 11:13 PM <changqing.li@windriver.com> wrote:
>> From: Changqing Li <changqing.li@windriver.com>
>>
>> ld_multi will link multiple objects, when there are many objects, and
>> O=[absolute_path] is set, and the absolute_path is relatively long. It
>> is possile that this line "$(call if_changed,$(host)ld_multi)" will
>> report error:
>> "make[4]: /bin/sh: Argument list too long"
>>
>> So make the ld command read option from file to fix above error. In
>> order to convenient debug, write the file content in dot-target.cmd
>> as comments.
>>
>> Signed-off-by: Changqing Li <changqing.li@windriver.com>
> Hi Changqing,
>
> I believe your change makes sense. I notice that the regular kernel
> build has had to work around this problem too:
> https://web.git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/scripts/Makefile.build#n290
> https://web.git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/scripts/Makefile.build#n463
> but in those workarounds the need for an extra .in file isn't
> necessary. Would such a change be possible here and avoid the need for
> cleaning up an extra file?
>
> Thanks,
> Ian
Hi, Ian
Thanks for your help. I have resend a patch as what you suggested, could
you help to review it?
subject: "tools/build: make in-target rule robust against too long
argument error"
Regards
changqing
>> ---
>> tools/build/Makefile.build | 9 +++++++--
>> 1 file changed, 7 insertions(+), 2 deletions(-)
>>
>> diff --git a/tools/build/Makefile.build b/tools/build/Makefile.build
>> index 3584ff308607..e57ce8c34685 100644
>> --- a/tools/build/Makefile.build
>> +++ b/tools/build/Makefile.build
>> @@ -70,11 +70,13 @@ quiet_cmd_gen = GEN $@
>> # If there's nothing to link, create empty $@ object.
>> quiet_cmd_ld_multi = LD $@
>> cmd_ld_multi = $(if $(strip $(obj-y)),\
>> - $(LD) -r -o $@ $(filter $(obj-y),$^),rm -f $@; $(AR) rcs $@)
>> + $(LD) -r -o $@ @$@.in,rm -f $@; $(AR) rcs $@)
>>
>> quiet_cmd_host_ld_multi = HOSTLD $@
>> cmd_host_ld_multi = $(if $(strip $(obj-y)),\
>> - $(HOSTLD) -r -o $@ $(filter $(obj-y),$^),rm -f $@; $(HOSTAR) rcs $@)
>> + $(HOSTLD) -r -o $@ @$@.in,rm -f $@; $(HOSTAR) rcs $@)
>> +
>> +output_ld_multi_dotin = $(if $(quiet),,@printf "# %s:\n# " $@.in >> $(dot-target).cmd;cat $@.in >> $(dot-target).cmd)
>>
>> ifneq ($(filter $(obj),$(hostprogs)),)
>> host = host_
>> @@ -145,7 +147,10 @@ $(sort $(subdir-obj-y)): $(subdir-y) ;
>>
>> $(in-target): $(obj-y) $(test-y) FORCE
>> $(call rule_mkdir)
>> + $(file >$@.in,$(filter $(obj-y),$^))
>> $(call if_changed,$(host)ld_multi)
>> + $(if $(strip $(any-prereq) $(arg-check)), $(output_ld_multi_dotin))
>> + @rm $@.in
>>
>> __build: $(in-target)
>> @:
>> --
>> 2.34.1
>>
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2025-08-11 1:37 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-07-22 6:13 [RFC][PATCH 0/1] tools/build: Let link command read option from file changqing.li
2025-07-22 6:13 ` [PATCH 1/1] " changqing.li
2025-07-22 15:43 ` Ian Rogers
2025-08-11 1:37 ` Changqing Li
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).