I usually instruct my co-workers to avoid making recipes along those lines
as I consider it to be a form of painting yourself into a corner, though
there are times where it's unavoidable.

In the build I maintain it used to have something like this:

blah.o : blah.xyz
> some command | sed 'some stuff' | some other command > blah.cc
> ${compiler and flags} blah.cc -o blah.o

There were a few problems with it:

* The 1st line of the recipe also produced a header as a side effect
(hidden dependency)
* This won't fail the build: /bin/true | /bin/false | /bin/true.  That can
be changed if bash is the shell your build uses (.SHELL_FLAGS := -euo
pipefail -c)
* Even if one command in that pipeline fails the build it might not be
obvious what the failure was.

I changed it to (extensions changed to protect the innocent):

blah.x1 : blah.xyz
> some command > ${@}

blah.x2 : blah.x1
> sed 'some stuff' > ${@}

blah.cc : blah.x2
> some other command > ${@}

blah.h : blah.cc
> no real recipe was provided, just adding this note for emphasis; this
last part is how I suggest you solve it

-brian

On Wed, Dec 19, 2018 at 5:53 AM Renaud Pacalet <invalid.nore...@gnu.org>
wrote:

> URL:
>   <https://savannah.gnu.org/bugs/?55243>
>
>                  Summary: Request for a way to indicate that the same
> recipe
> execution produces several targets
>                  Project: make
>             Submitted by: pacalet
>             Submitted on: Wed 19 Dec 2018 12:53:09 PM UTC
>                 Severity: 3 - Normal
>               Item Group: Enhancement
>                   Status: None
>                  Privacy: Public
>              Assigned to: None
>              Open/Closed: Open
>          Discussion Lock: Any
>        Component Version: 4.2.1
>         Operating System: Any
>            Fixed Release: None
>            Triage Status: None
>
>     _______________________________________________________
>
> Details:
>
> This request for enhancement concerns cases where multiple targets are
> produced by one single execution of a recipe.
>
> I frequently encounter situations where a single recipe execution produces
> several targets and I'd like make to know about all these targets.
>
> I know there is a side-effect of pattern rules with several targets that
> leads
> make to consider that all targets matched by one activation of the rule are
> produced by a single execution of the recipe.
>
> But exploiting this sometimes leads to clumsy Makefiles where pattern rules
> are used without any other reason than this side effect. Moreover, building
> the list of pattern targets is sometimes difficult.
>
> It would be much more convenient to have a new type of rule dedicated to
> this
> situation. For instance, a triple-colon rule:
>
>
> a b c::: foo
>     touch a b c
>
>
> Of course, there are several related questions, like, for instance:
>
> 0 the semantics of the $@ automatic variable (list of targets, first
> target in
> the list, other?),
> 0 the existence or not of a corresponding (static) pattern rule,
> 0 ...
>
>
>
>
>     _______________________________________________________
>
> Reply to this item at:
>
>   <https://savannah.gnu.org/bugs/?55243>
>
> _______________________________________________
>   Message sent via Savannah
>   https://savannah.gnu.org/
>
>
> _______________________________________________
> Bug-make mailing list
> Bug-make@gnu.org
> https://lists.gnu.org/mailman/listinfo/bug-make
>
_______________________________________________
Bug-make mailing list
Bug-make@gnu.org
https://lists.gnu.org/mailman/listinfo/bug-make

Reply via email to