On Mar 5, 2024 at 10:06:44, Paul Smith <psm...@gnu.org> wrote:

> These two formulations are not really the same: grouped targets work
> differently and can't be replaced with an expanded version.  A grouped
> target:
>
> a.x b.x &: a.q b.q ; <cmd>
>
> can only be emulated by something like this:
>
> a.x b.x : .sentinel ;
>
> .sentinel : a.q b.q ; <cmd> ; touch $@

This actually comes close to working for my use-case. It fixes the
O(n^2) performance issue of having every file depend on every other
file since the `.sentinel` intermediate step short-circuits things and
only needs to be evaluated once.

Unfortunately it forces a full rebuild in my case. The `Makefile` looks
something like:

```
.PHONY: output

output: output_a output_b

output_a: build/a/x build/a/y
[ build for a performed here ]

output_b: build/b/x build/b/y
[ build for b performed here ]

build/a/x build/a/y build/b/x build/b/y: build/.sentinel

build/.sentinel: src/a/x src/a/y src/b/x src/b/y
cp -a src build
touch $@
```

This is a minimal example, but in my case the number of outputs is large
and each of those outputs depends upon a few dozen sources. With this
style of recipe, if any of the sources is changed it causes
`make` to consider `build/.sentinel` stale. This in turn causes all the
outputs to be considered stale.

What I would like is if I `touch build/a/x` and re-`make`, the whole
source directory is copied into the build directory in one go *but* only
`output_a` is rebuilt (since the timestamps for everything under
`build/b` are unchanged).
  • Performan... Stephen Touset via Users list for the GNU implementation of make
    • Re: ... Dmitry Goncharov
      • ... Paul Smith
        • ... Stephen Touset via Users list for the GNU implementation of make
          • ... Stephen Touset via Users list for the GNU implementation of make
        • ... Stephen Touset via Users list for the GNU implementation of make
      • ... Stephen Touset via Users list for the GNU implementation of make
      • ... Kaz Kylheku

Reply via email to