1. 20 Jul, 2016 1 commit
    • 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.