linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [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).