Building multiple targets simultaneously

2 minute read

The #pragma multi directive lets you use one rule that creates multiple outputs simultaneously. You can use this directive when a pattern rule might not be suitable. This directive lets you create non-pattern rules that have multiple outputs. You can use this directive only with gmake and NMAKE emulation.

#pragma multi causes the targets of the immediately-following rule or dependency specification to be treated as updated together if they are updated. For example, the following produces one rule and one rule job, rather than three of each:

#pragma multi a b c: ; @echo building a b and c

The #pragma multi directive has the following restrictions:

  • If you apply #pragma multi to a target list, then you must apply it to all overlapping target lists. Those lists must specify the same set of targets (although they might do so in a different order).

  • Target- and pattern-specific variable assignments for the targets of a #pragma multi rule must agree. Otherwise, eMake might choose the assignments for just one target or combine them all.

  • You cannot apply #pragma multi to static patterns, double-colon rules, or pattern targets that follow non-pattern targets on the same line.

  • If you apply #pragma multi to a non-static pattern, a warning appears.

  • A #pragma multi rule with commands might not override (or be overridden by) other commands for the same targets.

  • A #pragma multi dependency specification must correspond to a #pragma multi rule with commands having the same set of targets. Otherwise, eMake will fail with errors. Implicit rules are not searched for these missing commands.

  • $@ has the same meaning as it does in multiple-target patterns: the target that first caused the rule to be needed.

  • Setting the --emake-disable-pragma=multi or --emake-disable-pragma=all options disables #pragma multi.