* [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 [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
all inboxes | Powered by JetHome®