# Building on a new platform ## Upstream prerequisites - A recent Qt, PyQt5 and PyQtWebEngine must work on your platform. Chances are wheels for your platform are not available on PyPI, so you will need to have a working version installed already, either from your Linux distro's archives, or by building from source. - Rust and Node must support your platform. - If the Bazel Rust and Node rules do not support your platform, extra work may be required. ## 32 bit builds Bazel does not support running on a 32-bit host. It may be theoretically possible to cross-compile from a 64-bit host, but this is not something we've tried, and it will likely not work out of the box. ## Protobuf & Python - Edit /platforms/BUILD.bzl and add the new platform. Available platforms and CPUs can be found here: https://github.com/bazelbuild/platforms - Edit /protobuf.bzl and add the new platform and a link to a protoc binary. - Edit /pylib/anki/BUILD.bazel and add the new platform and the relevant Python wheel name for your platform. Example of the above changes: https://github.com/ankitects/anki/commit/db3308e788f20b188e84add40d6a1dce5bf726a0 - We need to tell the build process to use your local PyQt5 install, instead of fetching it from PyPI. Locate your Python site-packages folder where the PyQt5 folder is, and add the following to user.bazelrc in the project folder root: ``` build --action_env=PYTHON_SITE_PACKAGES=/path/to/site-packages/ ``` - Anki uses the Python 'orjson' module to speed up DB access. If you're on a platform that can not build orjson, you can remove it from python/requirements.txt to skip it during running/building, but DB operations will be slower. The py_wheel() rule in pylib/anki/BUILD.bazel adds an orjson requirement to the generated Anki wheel. If you have removed orjson, you'll want to remove that line. If you have successfully built orjson for another platform, you'll want to adjust that line to include your platform. ## Rust - Ensure you have Rust installed (eg via rustup) - Edit /Cargo.toml in this project, and add your platform to the targets. Check that the platform [is supported](https://github.com/bazelbuild/rules_rust/blob/master/rust/platform/platform.bzl) by rules_rust; if it is not, you'll need to send a PR to them adding it. You can test your change locally by modifying /repos.bzl in this project to point to a local rules_rust checkout. - Edit /cargo/BUILD.request.bazel and add the new platform. - Run update.py in the /cargo folder. Examples of the required changes: - https://github.com/ankitects/anki/commit/eca27b371000e77b68cb4c790b44848507ca3883 - https://github.com/ankitects/anki/commit/3f3f4b5c3640a7d1f4eec02f326fda93214ec34b ## NodeJS If node doesn't provide a binary for your platform and you have a local copy installed, you can create a local_node folder in the project root, symlink in your local installation, and modify defs.bzl. ```patch diff --git a/defs.bzl b/defs.bzl index eff3d9df2..fb2e9f7fe 100644 --- a/defs.bzl +++ b/defs.bzl @@ -41,7 +41,15 @@ def setup_deps(): python_runtime = "@python//:python", ) - node_repositories(package_json = ["@ankidesktop//ts:package.json"]) + native.local_repository( + name = "local_node", + path = "local_node", + ) + + node_repositories( + package_json = ["@ankidesktop//ts:package.json"], + vendored_node = "@local_node//:node", + ) yarn_install( name = "npm", diff --git a/local_node/BUILD.bazel b/local_node/BUILD.bazel new file mode 100644 index 000000000..aa0c473ae --- /dev/null +++ b/local_node/BUILD.bazel @@ -0,0 +1 @@ +exports_files(["node/bin/node"] + glob(["node/lib/node_modules/**"])) diff --git a/local_node/WORKSPACE b/local_node/WORKSPACE new file mode 100644 index 000000000..e69de29bb diff --git a/local_node/node/bin/node b/local_node/node/bin/node new file mode 120000 index 000000000..d7b371472 --- /dev/null +++ b/local_node/node/bin/node @@ -0,0 +1 @@ +/usr/local/bin/node \ No newline at end of file diff --git a/local_node/node/lib/node_modules b/local_node/node/lib/node_modules new file mode 120000 index 000000000..23dd0736e --- /dev/null +++ b/local_node/node/lib/node_modules @@ -0,0 +1 @@ +/usr/local/lib/node_modules \ No newline at end of file ``` ## Submitting changes If the changes to support your platform do not require platform-specific hacks, a PR that adds them is welcome - please see [Contributing](./contributing.md) for more.