|  | --- | 
|  | layout: documentation | 
|  | title: Getting Started | 
|  | --- | 
|  |  | 
|  | # Getting Started with Bazel | 
|  |  | 
|  | ## Setup | 
|  |  | 
|  | Use the [installation instructions](/docs/install.html) to install a copy of | 
|  | Bazel on your machine. | 
|  |  | 
|  | ## Using a Workspace | 
|  |  | 
|  | All Bazel builds take place in a [_workspace_](/docs/build-ref.html#workspaces), | 
|  | a directory on your filesystem that contains source code for the software you | 
|  | want to build, as well symbolic links to directories that contain the build | 
|  | outputs (for example, `bazel-bin` and `bazel-out`). The location of the | 
|  | workspace directory is not significant, but it must contain a file called | 
|  | `WORKSPACE` in the top-level directory; an empty file is a valid workspace. | 
|  | The `WORKSPACE` file can be used to reference | 
|  | [external dependencies](/docs/external.html) required to build the outputs. | 
|  | One workspace can be shared among multiple projects if desired. | 
|  |  | 
|  | ```bash | 
|  | $ touch WORKSPACE | 
|  | ``` | 
|  |  | 
|  | ## Creating a Build File | 
|  |  | 
|  | To know which targets can be built in your project, Bazel inspects `BUILD` | 
|  | files. They are written in Bazel's build language which is syntactically | 
|  | similar to Python. Usually they are just a sequence of declarations of rules. | 
|  | Each rule specifies its inputs, outputs, and a way to compute the outputs from | 
|  | the inputs. | 
|  |  | 
|  | The rule probably most familiar to people who have used `Makefile`s before (as | 
|  | it is the only rule available there) is the | 
|  | [genrule](/docs/be/general.html#genrule), which specifies how the output can | 
|  | be generated by invoking a shell command. | 
|  |  | 
|  | ``` | 
|  | genrule( | 
|  | name = "hello", | 
|  | outs = ["hello_world.txt"], | 
|  | cmd = "echo Hello World > $@", | 
|  | ) | 
|  | ``` | 
|  |  | 
|  | The shell command may contain [Make variables](/docs/be/make-variables.html). | 
|  |  | 
|  | Using the above `BUILD` file, you can ask Bazel to generate the target. | 
|  |  | 
|  | ``` | 
|  | $ bazel build :hello | 
|  | . | 
|  | INFO: Found 1 target... | 
|  | Target //:hello up-to-date: | 
|  | bazel-genfiles/hello_world.txt | 
|  | INFO: Elapsed time: 2.255s, Critical Path: 0.07s | 
|  | ``` | 
|  |  | 
|  | We note two things. First, targets are normally referred to by their | 
|  | [label](/docs/build-ref.html#labels), which is specified by the | 
|  | [name](/docs/be/general.html#genrule.name) attribute of the rule. (Referencing | 
|  | them by the output file name is also possible, but this is not the preferred | 
|  | way.) Second, Bazel puts the generated files into a separate directory (the | 
|  | `bazel-genfiles` directory is actually a symbolic link) so as not to pollute | 
|  | your source tree. | 
|  |  | 
|  | Rules may use the output of other rules as input, as in the following | 
|  | example. Again, the generated sources are referred to by their label. | 
|  |  | 
|  | ``` | 
|  | genrule( | 
|  | name = "hello", | 
|  | outs = ["hello_world.txt"], | 
|  | cmd = "echo Hello World > $@", | 
|  | ) | 
|  |  | 
|  | genrule( | 
|  | name = "double", | 
|  | srcs = [":hello"], | 
|  | outs = ["double_hello.txt"], | 
|  | cmd = "cat $< $< > $@", | 
|  | ) | 
|  | ``` | 
|  |  | 
|  | Finally, note that, while the [genrule](/docs/be/general.html#genrule) might | 
|  | seem familiar, it usually is _not_ the best rule to use. It is preferrable to | 
|  | use one of the specialized [rules](/docs/be/overview.html#rules) for various | 
|  | languages. | 
|  |  | 
|  | # Next Steps | 
|  |  | 
|  | Next, check out the tutorial on building [java](/docs/tutorial/java.html) | 
|  | or [C++](/docs/tutorial/cpp.html) programs. |