commit | 402d5036995855ac049e7b549e1f3b0a605068e9 | [log] [tgz] |
---|---|---|
author | adonovan <adonovan@google.com> | Wed Dec 18 12:05:28 2019 -0800 |
committer | Copybara-Service <copybara-worker@google.com> | Wed Dec 18 12:06:33 2019 -0800 |
tree | 81e63c5ca5c72674bc48ef63b1932a8e6372d71f | |
parent | 5381e48db4d405cf4c43324865120a283018fe33 [diff] |
bazel repository_rule: don't introspect on FuncallExpression This CL changes the rule class name heuristic using during instantiation of non-exported repository_rules (an unintended feature). A repository rule ought to be subject to the same "exported" check applied to an ordinary package rule, that is, one should not be able to instantiate it unless it has been "exported", which means assigned to a variable at top level. However, the necessary check was sadly omitted and now several projects exploit the weakness to create and instantiate repository rules back to back without an intervening "export". (Never mind that the current assignment-based export semantics are problematic.) To guess the name of a non-exported rule class, the previous code hackily introspected the syntax tree of the call expression f() or x.f(), so in the code below it would infer a rule class name of "r": def f(): r = repository_rule(impl=_r_impl) r(name="name", ...) Soon, the syntax tree will no longer be available to the callee, so the heuristic must change. Now, it uses "unexported-_r_impl", based on the name of the rule implementation function. Users should not be instantiating non-exported repository rules. The correct usage, which has not changed, is to declare the repository rule at top level: r = repository_rule(impl=_r_impl) def f(): r(...) # instantiates an "r" repository rule PiperOrigin-RevId: 286239162
{Fast, Correct} - Choose two
Build and test software of any size, quickly and reliably.
Speed up your builds and tests: Bazel rebuilds only what is necessary. With advanced local and distributed caching, optimized dependency analysis and parallel execution, you get fast and incremental builds.
One tool, multiple languages: Build and test Java, C++, Android, iOS, Go, and a wide variety of other language platforms. Bazel runs on Windows, macOS, and Linux.
Scalable: Bazel helps you scale your organization, codebase, and continuous integration solution. It handles codebases of any size, in multiple repositories or a huge monorepo.
Extensible to your needs: Easily add support for new languages and platforms with Bazel's familiar extension language. Share and re-use language rules written by the growing Bazel community.
Follow our tutorials:
See CONTRIBUTING.md