This patch simplifies LLVM's lit infrastructure by enforcing an ordering that a site config is always run before a source-tree config. There are multiple ways of running lit. The most common are:
Run lit.py from the source tree against a directory or file also in the source tree, specifying various parameters like llvm_site_config=<foo>
- This is what the ninja check targets currently do.
Run llvm-lit.py from the build tree against a directory or file in the source tree, specifying no other parameters.
- This is what developers usually do.
Run llvm-lit.py from the source tree against a directory or file in the build tree.
- This is necessary to run asan tests, where you cannot currently run against a directory in the source tree.
Run lit.py from the source tree against a directory in the build tree.
- Not aware of anyone who does this, but in theory it should work.
A significant amount of the complexity from lit config files arises from the fact that inside of a source-tree config file, we don't yet know if the site config has been executed. It is *always* necessary to execute a site config first, because it initializes variables that are handed down through CMake that the main configuration depends on.
This patch solves the problem by emitting a mapping from source tree config file to binary tree site config file in llvm-lit.py. Then, during discovery when we find a config file, we check to see if we have a target mapping for it, and if so we use that instead.
This mechanism is generic enough that it does not affect external users of lit. They will just not have a config mapping defined, and everything will work as normal.
On the other hand, for us it allows us to make many simplifications:
- We are guaranteed that a site config will be executed first
- Inside of a main config, we no longer have to assume that attributes might not be present and use getattr everywhere.
- We no longer have to pass parameters such as --param llvm_site_config=<path> on the command line.
- It is future-proof, meaning you don't have to edit llvm-lit.in to add support for new projects.
- All of the duplicated logic of trying various fallback mechanisms of finding a site config from the main config are now gone.
One potentially noteworthy thing that was required to implement this change is that whereas the ninja check targets previously used the first method to spawn lit, they now use the second. In particular, the first method is now deprecated and no longer works.
I have tested the following:
- Running check targets ninja check-llvm, ninja check-llvm-unit, ninja check-lld, ninja check-clang, ninja check-clang-unit
- Running llvm-lit.py against individual directories in the llvm/test, llvm/unittests, lld/test, clang/test, clang/unittests folder.
- Running lit.py against corresponding directories in the build folder.
I think these three scenarios are enough to show that everything works, but if someone wants to help me test compiler-rt that would be great.