Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ninja tool sometimes obscures getting file contents for scanning #4581

Open
mwichmann opened this issue Jul 29, 2024 · 0 comments
Open

ninja tool sometimes obscures getting file contents for scanning #4581

mwichmann opened this issue Jul 29, 2024 · 0 comments
Labels

Comments

@mwichmann
Copy link
Collaborator

mwichmann commented Jul 29, 2024

This information is collected from the discord thread at
https://discord.com/channels/571796279483564041/1262451038435414027
Filing this to make sure it's captured, I did not discover it.

It is reported that sometimes dependencies are not found when generating the build.ninja file. This appears to happen because the tool monkey-patches several core SCons routines as not needed, so the ninja work can go faster. One of those has a side effect that may not be what we want:

    SCons.Node.FS.File.get_contents = ninja_contents(SCons.Node.FS.File.get_contents)

Means for a File node, we get a decorated form of get_contents. The decorator is:

def ninja_contents(original):
    """Return a dummy content without doing IO"""
    def wrapper(self):
        if isinstance(self, SCons.Node.Node) and (self.is_sconscript() or self.is_conftest()):
            return original(self)
        return bytes("dummy_ninja_contents", encoding="utf-8")

    return wrapper

So only if the node is an SConscript file, or we're a conftest node will the file's contents be returned, else it's skipped. That's fine - we don't need the binary file contents in ninja mode, but we do need the text contents, for use by the scanner, if the file type has a scanner. There is no consistency about how this is done across all the Node types, but in the case of File nodes, get_text_contents is implemented in terms of get_contents:

    def get_text_contents(self) -> str:
        """Return the contents of the file as text."""
        return SCons.Util.to_Text(self.get_contents())

Since the matching get_contents is stubbed out in this case, we don't get any file contents. Most scanners use get_text_contents, so perhaps some rethinking is needed here.

Some code permalinks:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant