--- name: subspace-builds description: Build and test Subspace across supported platforms and build systems. Use when the user asks how to build, test, cross-compile, run CI-equivalent checks, or work with Bazel, CMake, Android, Soong/Blueprint, AOSP, QNX, Linux, or macOS builds in this repository. --- # Subspace Builds ## General Rules - User-facing examples should use `bazel`; use `bazelisk` as a drop-in replacement if `bazel` is not available. - Prefer focused targets while iterating; use `bazel test //...` only when broad verification is needed. - Check `.bazelrc`, `.github/workflows/ci.yml`, and `docs/android.md` before changing platform build behavior. - Do not check in generated protobuf files. ## Native Host Builds Linux: ```bash CC=clang bazel build //... bazel test //... cmake -S . -B build/cmake-Debug -DCMAKE_BUILD_TYPE=Debug cmake --build build/cmake-Debug --parallel ctest --test-dir build/cmake-Debug --output-on-failure --timeout 300 ``` macOS Apple Silicon: ```bash bazel build //... --config=macos_arm64 bazel test //... --config=macos_arm64 ``` macOS Intel: ```bash bazel build //... --config=macos_x86_64 bazel test //... --config=macos_x86_64 ``` ## Android With Bazel Requires `ANDROID_NDK_HOME`. ```bash bazel build \ //server:subspace_server \ //client:client_test \ //c_client:client_test \ //plugins:nop_plugin.so \ //plugins:split_buffer_free_test_plugin.so \ //android/jni:libsubspace_jni.so \ //android/java:subspace-java \ //android/java:subspace-java-test \ --config=android_arm64 ``` Use `--config=android_x86_64` for x86_64 emulators and GitHub CI. The emulator deployment and test flow is in `.github/scripts/android-test.sh`. ## Android With CMake Requires `ANDROID_NDK_HOME`. Build a host `protoc` first and pass it into the Android cross-compile so protobuf versions match: ```bash cmake -S . -B build/host-protoc -DCMAKE_BUILD_TYPE=Release cmake --build build/host-protoc --target protoc --parallel cmake -S . -B build/android \ -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_HOME/build/cmake/android.toolchain.cmake \ -DANDROID_ABI=arm64-v8a \ -DANDROID_PLATFORM=android-28 \ -DANDROID_STL=c++_shared \ -DCMAKE_BUILD_TYPE=Release \ -DPROTOC_EXECUTABLE="$PWD/build/host-protoc/_deps/protobuf-build/protoc" cmake --build build/android --parallel ``` Use `-DANDROID_ABI=x86_64` for x86_64 emulators and GitHub CI. The emulator deployment and test flow is in `.github/scripts/cmake-android-test.sh`. ## Android With Soong/Blueprint Soong requires a full AOSP checkout; GitHub-hosted runners do not provide one. Use a local AOSP tree or a self-hosted runner with AOSP already synced. Place this repository at `external/subspace`, ensure `external/coroutines` and `external/cpp_toolbelt` are present, and copy their repository-provided `Android.bp.example` files to `Android.bp`. Add to the product: ```make PRODUCT_SOONG_NAMESPACES += external/subspace PRODUCT_PACKAGES += \ subspace_server \ libsubspace_client \ libsubspace_jni \ subspace-java \ subspace_java_client_test ``` Build from AOSP root: ```bash source build/envsetup.sh lunch -userdebug m external.subspace-subspace_server-soong \ external.subspace-libsubspace_client-soong \ external.subspace-libsubspace_jni-soong \ external.subspace-subspace-java-soong \ external.subspace-subspace_java_client_test-soong ``` Run the device-side Java integration test: ```bash adb shell subspace_java_client_test ``` ## QNX With Bazel Requires the QNX SDP and `QNX_SDP_PATH`. ```bash bazel build //... --config=qnx_aarch64 bazel build //... --config=qnx_x86_64 ``` If the default path in `.bazelrc` is wrong, set `QNX_SDP_PATH` in the environment or user-local `user.bazelrc`. ## References - Android details: `docs/android.md` - General Bazel/CMake docs: `README.md` - CI build matrix: `.github/workflows/ci.yml` - Test runner rule: `.cursor/rules/test-runner.mdc`