• Brad King's avatar
    Ninja: Fix inter-target order-only dependencies of custom commands · 1296a0ea
    Brad King authored
    Custom command dependencies are followed for each target's source files
    and add their transitive closure to the corresponding target.  This
    means that when a custom command in one target has a dependency on a
    custom command in another target, both will appear in the dependent
    target's sources.  For the Makefile, VS IDE, and Xcode generators this
    is not a problem because each target gets its own independent build
    system that is evaluated in target dependency order.  By the time the
    dependent target is built the custom command that belongs to one of its
    dependencies will already have been brought up to date.
    For the Ninja generator we need to generate a monolithic build system
    covering all targets so we can have only one copy of a custom command.
    This means that we need to reconcile the target-level ordering
    dependencies from its appearance in multiple targets to include only the
    least-dependent common set.  This is done by computing the set
    intersection of the dependencies of all the targets containing a custom
    command.  However, we previously included only the direct dependencies
    so any target-level dependency not directly added to all targets into
    which a custom command propagates was discarded.
    Fix this by computing the transitive closure of dependencies for each
    target and then intersecting those sets.  That will get the common set
    of dependencies.  Also add a test to cover a case in which the
    incorrectly dropped target ordering dependencies would fail.
TargetOrder.cmake 1.15 KB