| --- |
| layout: documentation |
| title: Windows |
| --- |
| |
| |
| Windows support is highly experimental. Known issues are [marked with label |
| "Windows"](https://github.com/bazelbuild/bazel/issues?q=is%3Aissue+is%3Aopen+label%3A%22category%3A+multi-platform+%3E+windows%22) |
| on github issues. |
| |
| We currently support only 64 bit Windows 7 or higher and we compile Bazel as a |
| msys2 binary. |
| |
| ## <a name="install"></a>Installation |
| |
| See instructions on the [installation page](install.md#windows). |
| |
| |
| ## <a name="requirements"></a>Requirements |
| |
| Before you can compile or run Bazel, you will need to set some environment |
| variables: |
| |
| ```bash |
| export JAVA_HOME="$(ls -d C:/Program\ Files/Java/jdk* | sort | tail -n 1)" |
| export BAZEL_SH=c:/tools/msys64/usr/bin/bash.exe |
| ``` |
| |
| If you run outside of `bash`, ensure that ``msys-2.0.dll`` is in your ``PATH`` |
| (if you install msys2 to ``c:\tools\msys64``, just add |
| ``c:\tools\msys64\usr\bin`` to ``PATH``). |
| |
| If you have another tool that vendors msys2 (such as msysgit), then |
| ``c:\tools\msys64\usr\bin`` must appear in your ``PATH`` *before* entries for |
| those tools. |
| |
| Similarly, if you have [bash on Ubuntu on |
| Windows](https://msdn.microsoft.com/en-gb/commandline/wsl/about) installed, you |
| should make sure ``c:\tools\msys64\usr\bin`` appears in ``PATH`` *before* |
| ``c:\windows\system32``, because otherwise Windows' ``bash.exe`` is used before |
| msys2's. |
| |
| Use ``where msys-2.0.dll`` to ensure your ``PATH`` is set up correctly. |
| |
| To **run** Bazel (even pre-built binaries), you will need: |
| |
| * Java JDK 8 or later |
| * [msys2 shell](https://msys2.github.io/) (need to be installed at |
| ``C:\tools\msys64\``). |
| * We build against version |
| [20160205](https://sourceforge.net/projects/msys2/files/Base/x86_64/msys2-x86_64-20160205.exe/download), |
| you will need this version in order to run the pre-built |
| [release Bazel binaries](https://github.com/bazelbuild/bazel/releases). |
| * You can also use newer versions or the |
| [latest version](https://sourceforge.net/projects/msys2/files/latest/download?source=files), |
| but then you will need to compile Bazel from the distribution archive (the |
| source zip file) so that it's linked against the right version of |
| ``msys-2.0.dll``. See also the |
| [known issues](install.md#compiling-from-source-issues). |
| * Several msys2 packages. Use the ``pacman`` command to install them: |
| |
| ``` |
| pacman -Syuu gcc git curl zip unzip zlib-devel |
| ``` |
| |
| To **compile** Bazel, in addition to the above you will need: |
| |
| * [Visual C++](https://www.visualstudio.com/) with Windows SDK installed |
| (Community Edition is fine). Note: we intend to relax this requirement in |
| the future to only require the Microsoft Visual C++ Build Tools, see |
| [github issue #2448](https://github.com/bazelbuild/bazel/issues/2448). |
| * You may need to apply some patches/workarounds, see the |
| [known issues](install.md#compiling-from-source-issues). |
| |
| ## <a name="compiling"></a>Compiling Bazel on Windows |
| |
| Ensure you have the [requirements](#requirements). |
| |
| To build Bazel: |
| |
| * Open the msys2 shell. |
| * Clone the Bazel git repository as normal. |
| * Set the environment variables (see above) |
| * Run ``compile.sh`` in Bazel directory. |
| * If all works fine, bazel will be built at ``output\bazel.exe``. |
| |
| |
| ## <a name="using"></a>Using Bazel on Windows |
| |
| Bazel now supports building C++, Java and Python targets on Windows. |
| |
| ### Build C++ |
| |
| To build C++ targets, you will need: |
| |
| * [Visual Studio](https://www.visualstudio.com/) |
| <br/>We are using MSVC as the native C++ toolchain, so please ensure you have Visual |
| Studio installed with the `Visual C++ > Common Tools for Visual C++` and |
| `Visual C++ > Microsoft Foundation Classes for C++` features. |
| (which is NOT the default installation type of Visual Studio). |
| You can set `BAZEL_VS` environment variable to tell Bazel |
| where Visual Studio is, otherwise Bazel will try to find the latest version installed. |
| <br/>For example: `export BAZEL_VS="C:/Program Files (x86)/Microsoft Visual Studio 14.0"` |
| |
| * [Python 2.7](https://www.python.org/downloads/) |
| <br/>Currently, we use python wrapper scripts to call the actual MSVC compiler, so |
| please make sure Python is installed and its location is added into PATH. |
| It's also a good idea to set `BAZEL_PYTHON` environment variable to tell Bazel |
| where python is. |
| <br/>For example: `export BAZEL_PYTHON=C:/Python27/python.exe` |
| |
| Bazel will auto-configure the location of Visual Studio and Python at the first |
| time you build any target. |
| If you need to auto-configure again, just run `bazel clean` then build a target. |
| |
| If everything is set up, you can build C++ target now! However, since MSVC |
| toolchain is not default on Windows yet, you should use flag |
| `--cpu=x64_windows_msvc` to enable it like this: |
| |
| ```bash |
| $ bazel build --cpu=x64_windows_msvc examples/cpp:hello-world |
| $ ./bazel-bin/examples/cpp/hello-world.exe |
| $ bazel run --cpu=x64_windows_msvc examples/cpp:hello-world |
| ``` |
| |
| ### Build Java |
| |
| Building Java targets works well on Windows, no special configuration is needed. |
| Just try: |
| |
| ```bash |
| $ bazel build examples/java-native/src/main/java/com/example/myproject:hello-world |
| $ ./bazel-bin/examples/java-native/src/main/java/com/example/myproject/hello-world |
| $ bazel run examples/java-native/src/main/java/com/example/myproject:hello-world |
| ``` |
| |
| ### Build Python |
| |
| On Windows, we build a self-extracting zip file for executable python targets, you can even use |
| `python ./bazel-bin/path/to/target` to run it in native Windows command line (cmd.exe). |
| See more details in this [design doc](/designs/2016/09/05/build-python-on-windows.html). |
| |
| ```bash |
| $ bazel build examples/py_native:bin |
| $ ./bazel-bin/examples/py_native/bin |
| $ python ./bazel-bin/examples/py_native/bin # This works in both msys and cmd.exe |
| $ bazel run examples/py_native:bin |
| ``` |