When working with Unreal Engine’s BuildGraph system in conjunction with Horde, it’s not uncommon to encounter issues when one node modifies the build products of a previous node. By design, Horde enforces strong guarantees about build output consistency. If a node unexpectedly changes a file that was already produced and finalized by another node, the system throws an error such as:
Build products from a previous step have been modified:
Missing file from manifest - ...
Output overlapping artifacts to a different location, or ignore them using the Node's IgnoreModified attribute.
This validation ensures reproducibility and correctness across distributed builds—but sometimes, intentional modifications to files from earlier nodes are necessary. In such cases, BuildGraph provides a hidden but crucial escape hatch: the IgnoreModified
attribute.
What Is IgnoreModified
?
IgnoreModified
is a node-level attribute in BuildGraph that tells Horde to intentionally ignore modifications to specific files made by the node, even if those files were output by a previous node.
Contrary to what you might expect, IgnoreModified
is not a simple boolean flag. Instead, it takes a string filter pattern that matches file paths, using the same syntax as other file filters in BuildGraph (like ...
for recursive matches).
Here’s how it looks in practice:
<Node Name="MyNode" IgnoreModified="$(ProjectBinariesPath)/...">
...
</Node>
In this example, Horde will allow MyNode
to modify any file under the $(ProjectBinariesPath)
directory without triggering the “modified build product” error—even if those files were generated by another node earlier in the build graph.
When Should You Use It?
You should use IgnoreModified
only when you have a valid reason to allow a node to touch files from a previous step. Some valid scenarios include:
- A final packaging step that compresses or signs binaries.
- A post-processing node that injects metadata or branding into already-built files.
- A cleanup or patching step that modifies timestamps or debug symbols.
However, avoid using IgnoreModified
to mask incorrect or overlapping outputs, as this can lead to brittle or unreproducible builds.
Best Practices
- Be specific. Instead of using a blanket
...
filter, narrow it down to just the files or folders you expect to modify. - Document the intent. If you’re using
IgnoreModified
, leave a comment explaining why it’s needed. - Use alternative paths when possible. If your node can write to a new location, prefer that over modifying existing files.
- Coordinate with Horde users. Since this affects build verification, ensure your team understands why the node is exempted.