| {namespace buck.build_file} |
| |
| /***/ |
| {template .soyweb} |
| {call buck.page} |
| {param title: 'Build File' /} |
| {param prettify: true /} |
| {param content} |
| |
| A <strong>build file</strong> is a file named <code>BUCK</code> that defines |
| one or more <a href="build_rule.html">build rules</a>. |
| |
| <p> |
| |
| A source file in your project can only be referenced by rules in its "nearest" |
| build file, where "nearest" means its closest direct ancestor in your |
| project's file tree. (If a source file has a build file as a sibling, then that |
| is its nearest ancestor.) |
| For example, if your project had the following <code>BUCK</code> files: |
| |
| {literal}<pre> |
| java/com/facebook/base/BUCK |
| java/com/facebook/common/BUCK |
| java/com/facebook/common/collect/BUCK |
| </pre>{/literal} |
| |
| Then your build rules would have the following constraints: |
| |
| <ul> |
| <li>Rules in <code>java/com/facebook/base/BUCK</code> can |
| reference any file under <code>java/com/facebook/base/</code>. |
| |
| <li>Rules in <code>java/com/facebook/common/</code> can reference any files |
| under that directory, except for those under |
| {sp}<code>java/com/facebook/common/collect/</code>, |
| as those "belong" to the <code>BUCK</code> file in the |
| {sp}<code>collect</code> directory. |
| </ul> |
| |
| The set of source files accessible to a build file is also known as |
| its <em>build package</em>. |
| |
| <p> |
| |
| The way to refer to code across build packages is to create build rules |
| and use <code>deps</code> to refer to that code. Going back to the previous |
| example, suppose code in <code>java/com/facebook/common/concurrent/</code> wants |
| to depend on code in <code>java/com/facebook/common/collect/</code>. Presumably |
| {sp}<code>java/com/facebook/common/collect/BUCK</code> has a build rule like: |
| |
| {literal}<pre class="prettyprint lang-py"> |
| java_library( |
| name = 'collect', |
| srcs = glob(['*.java']), |
| deps = [ |
| '//java/com/facebook/base:base', |
| ], |
| ) |
| </pre>{/literal} |
| |
| Then <code>java/com/facebook/common/BUCK</code> could have a rule like: |
| |
| {literal}<pre class="prettyprint lang-py"> |
| java_library( |
| name = 'concurrent', |
| srcs = glob(['concurrent/*.java']), |
| deps = [ |
| '//java/com/facebook/base:base', |
| '//java/com/facebook/common/collect:collect', |
| ], |
| ) |
| </pre>{/literal} |
| |
| whereas the following <strong>would be invalid</strong> because |
| {sp}<code>java/com/facebook/common/collect/</code> has its own build file, |
| so <code>//java/com/facebook/common/collect:concurrent</code> cannot list |
| {sp}<code>java/com/facebook/common/collect/*.java</code> in its <code>srcs</code>. |
| |
| {literal}<pre class="prettyprint lang-py"> |
| java_library( |
| name = 'concurrent', |
| srcs = glob(['collect/*.java', 'concurrent/*.java']), |
| deps = [ |
| '//java/com/facebook/base:base', |
| ], |
| ) |
| </pre>{/literal} |
| |
| {/param} |
| {/call} |
| {/template} |