Re: [PATCH 0/1] old-fashioned suffix rules cannot have any prerequisites

2020-04-02 Thread Petr Ovtchenkov
On Wed, 01 Apr 2020 21:00:15 -0400
Paul Smith  wrote:
>
> > 
> > But % pattern rules are GNU make specific syntax, since this syntax
> > is not specified by POSIX [1]. I fear that I'll have to use a more
> > complicated fix...  
> 
> Correct, you cannot use pattern rules in portable makefiles.

Well, BSD make prefer % notaion too. What is example of POSIX make,
that not understand % rules?

> The only problematic rule is this one:
> 
>   .po.gmo: $(srcdir)/$(DOMAIN).pot
> 
> The other changes are not necessary.

Agree. With note: both main make families (GNU and BSD) mention
.a.b notaion as 'old' [2], and prefer %b: %a [2,3], and ... what
is non-BSD, non-GNU POSIX make we keep in mind? That used by Sun
Microsytems, before preference for GNU Make? This was more then 20
years ago.

The .a.b notation instigate ill-formed ".a.b: d" construction,
so I would prefer to avoid it outside of "standard implicit rules".

> ...
>> 
> In short, in no version of GNU make did the suffix rule defined here
> ever actually do what was desired and there will be no loss of
> functionality by simply removing the extra prerequisite completely:
> 
>   .po.gmo:
>   @lang=`echo $* | sed -e 's,.*/,,'`; \
> ...

Dependency from .pot file is a scope of gettext authors, I think.

WBR,

--

   - ptr

[2]
https://www.gnu.org/software/make/manual/html_node/Suffix-Rules.html#Suffix-Rules

[3]
https://www.freebsd.org/cgi/man.cgi?query=make=0=0=SunOS+5.9=html



Re: [PATCH 0/1] old-fashioned suffix rules cannot have any prerequisites

2020-04-01 Thread Paul Smith
Sorry, somehow the original email went by me.

On Thu, 2020-04-02 at 02:01 +0200, Bruno Haible wrote:
> Petr Ovtchenkov wrote in
> 
> 
> > Template po/Makefile.in.in use old-fashioned suffix rules
> > for generating .gmo. But this rules do not allow any prerequisites.
> > 
> > See:https://www.gnu.org/software/make/manual/html_node/Suffix-Rules.html#Suffix-Rules
> > 
> > 
> >Suffix rules cannot have any prerequisites of their own. If they have
> >any, they are treated as normal files with funny names, not as suffix
> >rules. Thus, the rule:
> >...
> > 
> > 
> > This lead to problem when used relatively new GNU Make:
> > 
> >make[3]: *** No rule to make target 'en.gmo', needed by ...
> > 
> 
> Please, to make it easier for me to reproduce, could you tell which
> version of GNU make you're using?

There should be no final version of GNU make that shows this as an
error.  In the final release 4.3, the following appears in the NEWS
file:

> * NOTE: Deprecated behavior.
>   Contrary to the documentation, suffix rules with prerequisites are being
>   treated BOTH as simple targets AND as pattern rules.  Further, the
>   prerequisites are ignored by the pattern rules.  POSIX specifies that in
>   order to be a suffix rule there can be no prerequisites defined.  In this
>   release if POSIX mode is enabled then rules with prerequisites cannot be
>   suffix rules.  If POSIX mode is not enabled then the previous behavior is
>   preserved (a pattern rule with no extra prerequisites is created) AND a
>   warning about this behavior is generated:
> warning: ignoring prerequisites on suffix rule definition
>   The POSIX behavior will be adopted as the only behavior in a future release
>   of GNU make so please resolve any warnings.

So, you should be seeing a warning, not an error, in GNU make 4.3. 
There were some prereleases of GNU make 4.3 created where this was an
error.

> > In this patch I am avoid significant changes and gmake-specific
> > syntax.
> 
> But % pattern rules are GNU make specific syntax, since this syntax
> is not specified by POSIX [1]. I fear that I'll have to use a more
> complicated fix...

Correct, you cannot use pattern rules in portable makefiles.  The only
problematic rule is this one:

  .po.gmo: $(srcdir)/$(DOMAIN).pot

The other changes are not necessary.

I should point out that even in older versions of GNU make where the
syntax in question didn't generate any warnings or errors, it never
worked as desired: the extra prerequisite are completely ignored.

You can easily confirm this by running "make -p" with this makefile and
in the rule database; locate the pattern rule and you will see:

  %.gmo: %.po
  #  recipe to execute (from 'Makefile', line 111):
@lang=`echo $* | sed -e 's,.*/,,'`; \
   ...

As you can see, there is no prerequisite for the .pot file here.

In short, in no version of GNU make did the suffix rule defined here
ever actually do what was desired and there will be no loss of
functionality by simply removing the extra prerequisite completely:

  .po.gmo:
  @lang=`echo $* | sed -e 's,.*/,,'`; \
...

If you really do want the .gmo files to list the .pot file as a
prerequisite you'll need to create a separate prerequisite statement
for that, for all versions of GNU make.

Cheers!




Re: [PATCH 0/1] old-fashioned suffix rules cannot have any prerequisites

2020-04-01 Thread Bruno Haible
[CCing bug-gettext, because po/Makefile.in.in comes from GNU gettext.]

Petr Ovtchenkov wrote in


> Template po/Makefile.in.in use old-fashioned suffix rules
> for generating .gmo. But this rules do not allow any prerequisites.
> 
> See:
> 
> https://www.gnu.org/software/make/manual/html_node/Suffix-Rules.html#Suffix-Rules
> 
> 
>   Suffix rules cannot have any prerequisites of their own. If they have
>   any, they are treated as normal files with funny names, not as suffix
>   rules. Thus, the rule:
>   ...
> 
> 
> This lead to problem when used relatively new GNU Make:
> 
>   make[3]: *** No rule to make target 'en.gmo', needed by ...
> 

Please, to make it easier for me to reproduce, could you tell which version
of GNU make you're using?

> In this patch I am avoid significant changes and gmake-specific
> syntax.

But % pattern rules are GNU make specific syntax, since this syntax is not
specified by POSIX [1]. I fear that I'll have to use a more complicated fix...

Bruno

[1] https://pubs.opengroup.org/onlinepubs/9699919799/utilities/make.html