Jakub Jelinek <ja...@redhat.com> writes:

> On Sun, Jan 12, 2025 at 04:16:58PM +0100, Arsen Arsenović wrote:
>> Regstrapped on x86_64-pc-linux-gnu.  I've also checked the generated
>> dependency files are correct by hand and "instrumented" the build to
>> fail if two dependency files are the same, by doing the following:
>> 
>>   DPOSTCOMPILE = ! test -f $(DEPFILE).Po && mv ...
>> 
>> ... and confirmed no further conflicts of this sort happen.
>> 
>> OK for trunk?
>> ---------- >8 ----------
>> Currently, the dependency files for root-file.o and common-file.o were
>> both d/.deps/file.Po, which would cause parallel builds to fail
>> sometimes with:
>> 
>>   make[3]: Leaving directory 
>> '/var/tmp/portage/sys-devel/gcc-14.1.1_p20240511/work/build/gcc'
>>   make[3]: Entering directory 
>> '/var/tmp/portage/sys-devel/gcc-14.1.1_p20240511/work/build/gcc'
>>   mv: cannot stat 'd/.deps/file.TPo': No such file or directory
>>   make[3]: *** 
>> [/var/tmp/portage/sys-devel/gcc-14.1.1_p20240511/work/gcc-14-20240511/gcc/d/Make-lang.in:421:
>>  d/root-file.o] Error 1 shuffle=131581365
>> 
>> Also, this means that dependencies of one of root-file or common-file
>> are missing when developing.  After this patch, those two files get
>> assigned dependency files d/.deps/d-root-file.o.Po and
>> d/.deps/d-common-file.o.Po respectively.
>> 
>> There are other files with similar conflicts (mangle-package.o,
>> visitor-package.o for instance).
>
> Note, I ran into the same problem in
> https://kojipkgs.fedoraproject.org//work/tasks/6545/127766545/build.log
>> 
>> gcc/d/ChangeLog:
>> 
>>      * Make-lang.in: Assign dependency-tracking files better
>>      filenames.
>> ---
>>  gcc/d/Make-lang.in | 5 +++--
>>  1 file changed, 3 insertions(+), 2 deletions(-)
>> 
>> diff --git a/gcc/d/Make-lang.in b/gcc/d/Make-lang.in
>> index f28761e4b370..25e2b0bbfe94 100644
>> --- a/gcc/d/Make-lang.in
>> +++ b/gcc/d/Make-lang.in
>> @@ -65,8 +65,9 @@ ALL_DFLAGS = $(DFLAGS-$@) $(GDCFLAGS) -fversion=IN_GCC 
>> $(CHECKING_DFLAGS) \
>>      $(WARN_DFLAGS)
>>  
>>  DCOMPILE.base = $(GDC) -c $(ALL_DFLAGS) -o $@
>> -DCOMPILE = $(DCOMPILE.base) -MT $@ -MMD -MP -MF $(@D)/$(DEPDIR)/$(*F).TPo
>> -DPOSTCOMPILE = @mv $(@D)/$(DEPDIR)/$(*F).TPo $(@D)/$(DEPDIR)/$(*F).Po
>> +DEPFILE = $(subst /,-,$@)
>
> Why do you need there the directory or suffix?
> $(*F) is clearly bad, because there are rules like
> d/%.o: d/dmd/%.d
>         $(DCOMPILE) $(D_INCLUDES) $<
>         $(DPOSTCOMPILE)
>         
> d/common-%.o: d/dmd/common/%.d
>         $(DCOMPILE) $(D_INCLUDES) $<
>         $(DPOSTCOMPILE)
> etc. and while the stem in the first case is the basename of the filename
> part, in the second case it is the basename of the filename part in the
> common directory.
> I think
> DEPFILE = $(basename $(@F))
> would be sufficient.
>
> So the former d/.deps/file.Po which handled both d/dmd/common/file.d and
> d/dmd/root/file.d in your case would be d/.deps/d-common-file.o.d and
> d/.deps/d-root-file.o.d while with the above DEPFILE it would be
> d/.deps/common-file.d and d/.deps/root-file.d
> There are no d/dmd/*-*.d files and among d/*-*.cc the only are just d-
> prefixed ones, and there are no clashes between the *.cc and *.d filenames:
> for i in gcc/d/*.cc; do j=`basename $i .cc`; find gcc/d -name $j.d; done

Relying that is more error-prone, I think.  While that is true today, it
might not stay true forever, and such a change won't be caught until it
fails again in the same way.

$@ is necessarily unique (however, still, with the proposed approach
d/foo.o and d-foo.o will collide).

I might be overthinking it - I trust your judgment, so I'm okay with
either.

> So just (or if you want a helper variable, perhaps it should standa for the
> whole $(@D)/$(DEPDIR)/$(basename $(@F)) part?
>
> 2025-01-13  Arsen Arsenović  <ar...@aarsen.me>
>           Jakub Jelinek  <ja...@redhat.com>
>
>       * Make-lang.in (DCOMPILE, DPOSTCOMPILE): Use $(basename $(@F))
>       instead of $(*F).
>
> --- gcc/d/Make-lang.in.jj     2025-01-13 09:12:07.408983471 +0100
> +++ gcc/d/Make-lang.in        2025-01-13 10:57:16.398315375 +0100
> @@ -65,8 +65,8 @@ ALL_DFLAGS = $(DFLAGS-$@) $(GDCFLAGS) -f
>       $(WARN_DFLAGS)
>  
>  DCOMPILE.base = $(GDC) -c $(ALL_DFLAGS) -o $@
> -DCOMPILE = $(DCOMPILE.base) -MT $@ -MMD -MP -MF $(@D)/$(DEPDIR)/$(*F).TPo
> -DPOSTCOMPILE = @mv $(@D)/$(DEPDIR)/$(*F).TPo $(@D)/$(DEPDIR)/$(*F).Po
> +DCOMPILE = $(DCOMPILE.base) -MT $@ -MMD -MP -MF $(@D)/$(DEPDIR)/$(basename 
> $(@F)).TPo
> +DPOSTCOMPILE = @mv $(@D)/$(DEPDIR)/$(basename $(@F)).TPo 
> $(@D)/$(DEPDIR)/$(basename $(@F)).Po
>  DLINKER = $(GDC) $(NO_PIE_FLAG) -lstdc++
>  
>  # Like LINKER, but use a mutex for serializing front end links.
>
>       Jakub
-- 
Arsen Arsenović

Attachment: signature.asc
Description: PGP signature

Reply via email to