Build from Source
Run build commands from the repository root unless a section says otherwise. LakeSoul has one Rust workspace and one Maven multi-module build; the Python package compiles a PyO3 module from the same Rust sources.
Build dependency flow
Protobuf definitions
|
v
Rust metadata + NativeIO libraries
| |
| `----> Python PyO3 extension
v
C ABI libraries (.so)
|
v
Java JNI bridge
|
+----> Spark connector
+----> Flink connector
`----> Presto connector
The JVM connectors load the native C ABI libraries. Build order matters: native libraries must exist before Maven packages or tests that load JNI.
Rust workspace
The root Cargo.toml is the Cargo workspace entry point. The stable toolchain and required components are declared in rust-toolchain.toml.
Build active workspace members:
cargo -q build
Build the optimized C ABI libraries required by Java JNI:
cargo -q build --release \
-p lakesoul-io-c \
-p lakesoul-metadata-c
On Linux, the outputs are:
rust/target/release/liblakesoul_io_c.so
rust/target/release/liblakesoul_metadata_c.so
A missing protoc normally fails during a crate build script before Rust compilation completes.
JVM modules
Use JDK 11 for the Maven build. Confirm JAVA_HOME and the active JVM before starting:
java -version
mvn --version
After building the native libraries, build all Maven modules without tests:
mvn -q -B package -DskipTests --file pom.xml
Build one connector and its dependencies:
mvn -q -B package \
-pl :lakesoul-spark-3.5_2.12 -am \
-DskipTests --file pom.xml
mvn -q -B package \
-pl :lakesoul-flink-1.20_2.12 -am \
-DskipTests --file pom.xml
mvn -q -B package \
-pl :lakesoul-presto-0.296 -am \
-DskipTests --file pom.xml
-pl selects the module and -am also builds required reactor dependencies. Do not mix connector JARs and native libraries from different LakeSoul revisions.
Python SDK
The Python project lives under python/ and requires Python 3.10 or later.
Install the development dependency group and build the Rust extension into the virtual environment:
cd python
uv sync --group dev
uvx --from 'maturin>=1,<2' maturin develop
After maturin develop, imports resolve to the locally built extension:
uv run python -c 'import lakesoul; print(lakesoul.__file__)'
Re-run uvx --from 'maturin>=1,<2' maturin develop after changing Rust code exposed through PyO3. Pure Python changes under python/src/ do not require a native rebuild in an editable development environment.
Build a release wheel:
uvx --from 'maturin>=1,<2' maturin build --release
The Python release and LakeSoul Core release have independent versions. See the compatibility matrix before combining a local Python build with connector artifacts.
Website
The Docusaurus site lives under website/ and requires Node.js 18 or later.
cd website
npm ci --omit-lockfile-registry-resolved true
npm run build
Start the development server for interactive documentation work:
npm run start
The production build renders both English and Chinese locales and fails on unresolved documentation links.
Clean rebuilds
Prefer incremental builds during development. Use a clean build only when generated output or dependency resolution is suspected:
cargo -q clean
mvn -q -B clean package -DskipTests --file pom.xml
These commands remove build caches and can make the next build substantially slower. They do not reset PostgreSQL, RustFS, .devenv/state, or Python virtual environments.