| # Building the NDK |
| |
| The latest version of this document is available at |
| https://android.googlesource.com/platform/ndk/+/master/docs/Building.md. |
| |
| Both Linux and Windows NDKs are built on Linux machines. Windows host binaries |
| are cross-compiled with MinGW. |
| |
| Building the NDK for Mac OS X requires at least 10.13. |
| |
| ## Prerequisites |
| |
| The first thing you need is the AOSP NDK repository. If you're new to using repo |
| and gerrit, see [repo.md](repo.md) for tips. If you're already familiar with how |
| to use repo and gerrit from other Android projects, you already know plenty :) |
| |
| Check out the branch `master-ndk`. Do this in a new directory. |
| |
| ```bash |
| # For non-Googlers: |
| repo init -u https://android.googlesource.com/platform/manifest -b master-ndk --partial-clone |
| |
| # Googlers, follow http://go/repo-init/master-ndk (select AOSP in the Host menu, |
| # and uncheck the box for the git superproject). At time of writing, the correct |
| # invocation is: |
| repo init -u \ |
| sso://android.git.corp.google.com/platform/manifest -b master-ndk --partial-clone |
| ``` |
| |
| If you wish to rebuild a given release of the NDK, the release branches can also |
| be checked out. They're named `ndk-release-r${RELEASE}` for newer releases, but |
| `ndk-r{RELEASE}-release` for older releases. For example, to check out the r19 |
| release branch, use the `-b ndk-release-r19` flag instad of `-b master-ndk`. |
| |
| Linux dependencies are listed in the [Dockerfile]. You can use docker to build |
| the NDK: |
| |
| ```bash |
| docker build -t ndk-dev infra/docker |
| docker run -it -u $UID -v `realpath ..`:/src -w /src/ndk ndk-dev ./checkbuild.py |
| ``` |
| |
| Building on Mac OS X has similar dependencies as Linux, but also requires Xcode. |
| |
| Running tests requires that `adb` is in your `PATH`. This is provided as part of |
| the [Android SDK]. |
| |
| [Dockerfile]: ../infra/docker/Dockerfile |
| [Android SDK]: https://developer.android.com/studio/index.html#downloads |
| |
| ## Python environment setup |
| |
| To set up your environment to use the correct versions of Python and Python |
| packages, install [Poetry](https://python-poetry.org/). |
| |
| Note: do **not** use the Python binaries in prebuilts/python. That distribution |
| lacks a functioning ssl module which is necessary for installing dependencies. |
| |
| The first time, and also anytime you sync because there might be new or updated |
| dependencies, install the NDK dependencies to the virtualenv managed by poetry. |
| |
| ```bash |
| poetry install |
| ``` |
| |
| Note: If `poetry install` hangs on Linux, try |
| `PYTHON_KEYRING_BACKEND=keyring.backends.null.Keyring poetry install`. |
| |
| Spawn a new shell using the virtualenv that Poetry created. You could instead |
| run NDK commands with the `poetry run` prefix (e.g. `poetry run |
| ./checkbuild.py`), but it's simpler to just spawn a new shell. Plus, if it's in |
| your environment your editor can use it. |
| |
| ```bash |
| poetry shell |
| ``` |
| |
| ### macOS workarounds |
| |
| On macOS you may not be able to use the Python that is in prebuilts because it |
| does not support the ssl module (which poetry itself needs). Until the Python |
| prebuilt includes that module, do the following to use a different Python: |
| |
| First time setup: ensure that you have pyenv installed. You may need to install |
| homebrew (http://go/homebrew for Googlers, else https://brew.sh/). |
| |
| ``` |
| $ brew update && brew upgrade pyenv |
| ``` |
| |
| Then set up your tree to use the correct version of Python. This setting will |
| apply to the directory it is run in, so you will need to do it per NDK tree. |
| |
| ``` |
| # From the //ndk directory of your NDK tree: |
| $ ../prebuilts/python/darwin-x86/bin/python3 --version |
| Python 3.11.4 |
| # We don't need to match the version exactly, just the major/minor version. |
| $ pyenv install 3.11:latest |
| $ pyenv local 3.11 |
| $ python --version |
| Python 3.11.8 |
| $ poetry env use 3.11 |
| poetry install |
| ``` |
| |
| Each time the NDK updates to a new version of Python, you'll need to repeat |
| those steps. You may also need to remove the old poetry environment |
| (`poetry env list` to get the name, `poetry env remove` to remove it). |
| |
| `checkbuild.py` and `run_tests.py` will complain when you try to use a Python |
| that doesn't come from prebuilts by default. To suppress that, pass |
| `--permissive-python-environment` when using those tools in this environment. |
| |
| ## Build |
| |
| ### For Linux or Darwin |
| |
| ```bash |
| $ python checkbuild.py |
| ``` |
| |
| If you get errors from the pythonlint task but it appears to only affect your |
| machine, one of the linters you have installed is probably not the correct |
| version. Run `poetry install` to sync your environment with the expected |
| versions. |
| |
| ### For Windows, from Linux |
| |
| ```bash |
| $ python checkbuild.py --system windows64 |
| ``` |
| |
| `checkbuild.py` will also build all of the NDK tests. This takes about 3x as |
| long as building the NDK itself, so pass `--no-build-tests` to skip building the |
| tests if you're iterating on build behavior or plan to rebuild only specific |
| tests. Tests can be built later with `python run_tests.py --rebuild`. |
| |
| Note: The NDK's build and test scripts are implemented in Python 3 (currently |
| 3.9). `checkbuild.py` will use a prebuilt Python, but `run_tests.py` does not do |
| this yet. `run_tests.py` also can be run outside of a complete development |
| environment (as it is when it is run on Windows), so a Python 3.9 virtualenv is |
| recommended. |
| |
| ## Packaging |
| |
| Packaging uses `zip -9` so is extremely time consuming and disabled by default. |
| Use the `--package` flag to force packaging locally. This is not required for |
| local development and only needs to be used when testing packaging behavior. |