ninja-to-soong is a project to generate Soong files (Android.bp) for the Android build system.
ninja-to-soong is licensed under the terms of the Apache 2.0 license
ninja-to-soonggenerates Ninja files using either:ninja-to-soonggeneratesSoongfiles using Ninja files.
<ninja-to-soong> $ cargo run --release -- --aosp-path <path> <project1> <project2>
--aosp-path <path>: Path to Android tree--ext-proj-path <path>: Path to external project rust file--clean-tmp: Remove the temporary directory before running--copy-to-aosp: Copy generated Soong files into the Android tree--skip-build: Skip build step--skip-gen-ninja: Skip generation of Ninja files-h,--help: Display the help and exit
N2S_ANGLE_PATH: Path to angle sources (default:<aosp-path>/external/angle)N2S_NDK: Android NDK (default:android-ndk-r27c)N2S_NDK_PATH: Path to Android NDK (default: temporary directory)N2S_TMP_PATH: Path used byninja-to-soongto store its temporary directories (default:std::env::temp_dir())
| Project | Ninja Generator | Targets |
|---|---|---|
| angle (WIP) | GN |
libEGL_angle.so, libGLESv2_angle.so, libGLESv1_CM_angle.so |
| clpeak | CMake |
clpeak |
| clspv | CMake |
clvk dependencies |
| clvk | CMake |
libclvk.so |
| fwupd (WIP) | Meson |
fwupdmgr & fwupd-binder |
| llvm-project | CMake |
clvk & clspv dependencies |
| mesa | meson |
libgallium_dri.so, libglapi.so, libEGL_mesa.so, libGLESv2_mesa.so, libGLESv1_CM_mesa.so, libvulkan_${VENDOR}.so |
| OpenCL-CTS | CMake |
Every binary in test_conformance/opencl_conformance_tests_full.csv |
| OpenCL-ICD-Loader | CMake |
libOpenCL.so |
| SPIRV-Tools | CMake |
clvk dependencies & spirv-val (for OpenCL-CTS) |
| SPIRV-Headers | CMake |
clspv & SPIRV-Tools dependencies |
To add a project, create a <project>.rs implementing the Project trait under the project folder.
Then add the project in define_ProjectId! in project.rs.
The following feature can be used to output debug information when writting a new project:
<ninja-to-soong> $ cargo run --release --features debug_project -- --aosp-path <path> <new_project>
ninja-to-soong is able to take a external rust project file, compile it and link with it at runtime.
This is useful for project where the configuration file cannot be shared upstream for example, or when a project prefer to have the configuration file hosted in the project repository.
An example of such a configuration file can be found here
The important points are:
- Add
ninja-to-soongcrate:extern crate ninja_to_soong;, and use all modules needed for the project. - Expose a
get_projectfunction without mangling:
#[no_mangle]
pub fn get_project() -> Box<dyn Project>
Then the project can be run with the following command:
<ninja-to-soong> $ cargo run --release -- --ext-proj-path <path_to_rust_file>
ninja-to-soong uses github actions to check that changes do not bring regression. It checks that the generated files match their reference (located in the tests folder).
Each project in the tests folder contains the following files:
Android.bp: the reference file to generatecheckout.sh: a script to checkout the repository in the CIgen-ninja.sh: a script to generateNinjafiles
Modification to checkout.sh & gen-ninja.sh trigger the generation of Ninja files in the CI, otherwise it uses the cached files from a previous CI run.
If you want more information take a look at the github action script
Generate Raspberry Pi specific Mesa soong blueprint makefiles:
<ninja-to-soong> $ cargo run --release -- mesa3d-rpi
<ninja-to-soong> $ cargo run --release -- mesa3d-rpi --copy-to-aosp
Generate Raspberry Pi specific libcamera soong blueprint makefiles:
<ninja-to-soong> $ cargo run --release -- libcamera-rpi
<ninja-to-soong> $ cargo run --release -- libcamera-rpi --copy-to-aosp