Add the Occlum-compatible Rust toolchains and a demo
This commit is contained in:
		
							parent
							
								
									bc6002f6dd
								
							
						
					
					
						commit
						b29aa1d6d0
					
				| @ -19,6 +19,7 @@ This set of demos shows how real-world apps can be easily run inside SGX enclave | |||||||
| * [grpc](grpc/): A client and server communicating through [gRPC](https://grpc.io/). | * [grpc](grpc/): A client and server communicating through [gRPC](https://grpc.io/). | ||||||
| * [openvino](openvino/) A benchmark of [OpenVINO Inference Engine](https://docs.openvinotoolkit.org/2019_R3/_docs_IE_DG_inference_engine_intro.html). | * [openvino](openvino/) A benchmark of [OpenVINO Inference Engine](https://docs.openvinotoolkit.org/2019_R3/_docs_IE_DG_inference_engine_intro.html). | ||||||
| * [python](python/) A demo of [Python](https://www.python.org). | * [python](python/) A demo of [Python](https://www.python.org). | ||||||
|  | * [rust](rust/) A demo of [Rust](https://www.rust-lang.org/). | ||||||
| * [sqlite](sqlite/) A demo of [SQLite](https://www.sqlite.org) SQL database engine. | * [sqlite](sqlite/) A demo of [SQLite](https://www.sqlite.org) SQL database engine. | ||||||
| * [tensorflow_lite](tensorflow_lite/): A demo and benchmark of [Tensorflow Lite](https://www.tensorflow.org/lite) inference engine. | * [tensorflow_lite](tensorflow_lite/): A demo and benchmark of [Tensorflow Lite](https://www.tensorflow.org/lite) inference engine. | ||||||
| * [xgboost](xgboost/): A demo of [XGBoost](https://xgboost.readthedocs.io/en/latest/). | * [xgboost](xgboost/): A demo of [XGBoost](https://xgboost.readthedocs.io/en/latest/). | ||||||
|  | |||||||
							
								
								
									
										27
									
								
								demos/rust/README.md
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										27
									
								
								demos/rust/README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,27 @@ | |||||||
|  | # Use Rust with Occlum | ||||||
|  | 
 | ||||||
|  | This directory contains scripts and source code to demonstrate how to | ||||||
|  | compile and run Rust programs on Occlum. | ||||||
|  | 
 | ||||||
|  | ## occlum-cargo and occlum-rustc | ||||||
|  | 
 | ||||||
|  | We introduce cargo and rustc wrappers called occlum-cargo and occlum-rustc | ||||||
|  | respectively. They wrap the original commands with options specific to occlum. | ||||||
|  | Refer to tools/toolchains/rust/build.sh for more information. | ||||||
|  | 
 | ||||||
|  | ## rust\_app | ||||||
|  | 
 | ||||||
|  | This directory contains source code of a Rust program with a cpp FFI. The cpp | ||||||
|  | interface increments the input by one. Rust code calls the function and | ||||||
|  | displays the result on the terminal. | ||||||
|  | 
 | ||||||
|  | One can use occlum-cargo in the way cargo is used. In the rust\_app directory, | ||||||
|  | calling ```occlum-cargo build``` will build the demo and ```occlum-cargo run``` | ||||||
|  | will run the demo on host. To run the demo in occlum, run: | ||||||
|  | ``` | ||||||
|  | run_rust_demo_on_occlum.sh | ||||||
|  | ``` | ||||||
|  | The output will be displayed on the terminal: | ||||||
|  | ``` | ||||||
|  | 5 + 1 = 6 | ||||||
|  | ``` | ||||||
							
								
								
									
										16
									
								
								demos/rust/run_rust_demo_on_occlum.sh
									
									
									
									
									
										Executable file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										16
									
								
								demos/rust/run_rust_demo_on_occlum.sh
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,16 @@ | |||||||
|  | #!/bin/bash | ||||||
|  | set -e | ||||||
|  | 
 | ||||||
|  | # compile rust_app | ||||||
|  | pushd rust_app | ||||||
|  | occlum-cargo build | ||||||
|  | popd | ||||||
|  | 
 | ||||||
|  | # initialize occlum workspace | ||||||
|  | rm -rf occlum_context && mkdir occlum_context && cd occlum_context | ||||||
|  | 
 | ||||||
|  | occlum init | ||||||
|  | cp ../rust_app/target/x86_64-unknown-linux-musl/debug/rust_app image/bin | ||||||
|  | 
 | ||||||
|  | occlum build | ||||||
|  | occlum run /bin/rust_app | ||||||
							
								
								
									
										11
									
								
								demos/rust/rust_app/Cargo.toml
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										11
									
								
								demos/rust/rust_app/Cargo.toml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | |||||||
|  | [package] | ||||||
|  | name = "rust_app" | ||||||
|  | version = "1.0.0" | ||||||
|  | authors = ["He Sun <bochang.sh@antfin.com>"] | ||||||
|  | build = "build.rs" | ||||||
|  | 
 | ||||||
|  | [dependencies] | ||||||
|  | libc = "0.2" | ||||||
|  | 
 | ||||||
|  | [build-dependencies] | ||||||
|  | cc = "1.0" | ||||||
							
								
								
									
										8
									
								
								demos/rust/rust_app/build.rs
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										8
									
								
								demos/rust/rust_app/build.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | |||||||
|  | extern crate cc; | ||||||
|  | 
 | ||||||
|  | fn main() { | ||||||
|  |     cc::Build::new() | ||||||
|  |         .file("src/util.cpp") | ||||||
|  |         .cpp(true) | ||||||
|  |         .compile("libutil.a"); | ||||||
|  | } | ||||||
							
								
								
									
										12
									
								
								demos/rust/rust_app/src/main.rs
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										12
									
								
								demos/rust/rust_app/src/main.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,12 @@ | |||||||
|  | extern crate libc; | ||||||
|  | 
 | ||||||
|  | extern "C" { | ||||||
|  |     fn increment_by_one(input: *mut libc::c_int); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn main() { | ||||||
|  |     let mut input = 5; | ||||||
|  |     let old = input; | ||||||
|  |     unsafe { increment_by_one(&mut input) }; | ||||||
|  |     println!("{} + 1 = {}", old, input); | ||||||
|  | } | ||||||
							
								
								
									
										4
									
								
								demos/rust/rust_app/src/util.cpp
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										4
									
								
								demos/rust/rust_app/src/util.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | |||||||
|  | extern "C" | ||||||
|  | void increment_by_one(int *input) { | ||||||
|  |     *input += 1; | ||||||
|  | } | ||||||
| @ -100,6 +100,12 @@ WORKDIR /tmp | |||||||
| RUN ./build.sh | RUN ./build.sh | ||||||
| ENV PATH="/usr/local/occlum/golang/bin:$PATH" | ENV PATH="/usr/local/occlum/golang/bin:$PATH" | ||||||
| 
 | 
 | ||||||
|  | # Install Occlum Rust toolchain | ||||||
|  | COPY toolchains/rust/* /tmp/ | ||||||
|  | WORKDIR /tmp | ||||||
|  | RUN ./build.sh | ||||||
|  | ENV PATH="/opt/occlum/toolchains/rust/bin:$PATH" | ||||||
|  | 
 | ||||||
| # Install the latest version of Occlum | # Install the latest version of Occlum | ||||||
| WORKDIR /root | WORKDIR /root | ||||||
| RUN git clone https://github.com/occlum/occlum && \ | RUN git clone https://github.com/occlum/occlum && \ | ||||||
|  | |||||||
| @ -86,6 +86,12 @@ WORKDIR /tmp | |||||||
| RUN ./build.sh | RUN ./build.sh | ||||||
| ENV PATH="/usr/local/occlum/golang/bin:$PATH" | ENV PATH="/usr/local/occlum/golang/bin:$PATH" | ||||||
| 
 | 
 | ||||||
|  | # Install Occlum Rust toolchain | ||||||
|  | COPY toolchains/rust/* /tmp/ | ||||||
|  | WORKDIR /tmp | ||||||
|  | RUN ./build.sh | ||||||
|  | ENV PATH="/opt/occlum/toolchains/rust/bin:$PATH" | ||||||
|  | 
 | ||||||
| # Install the latest version of Occlum | # Install the latest version of Occlum | ||||||
| WORKDIR /root | WORKDIR /root | ||||||
| RUN git clone https://github.com/occlum/occlum && \ | RUN git clone https://github.com/occlum/occlum && \ | ||||||
|  | |||||||
							
								
								
									
										31
									
								
								tools/toolchains/rust/build.sh
									
									
									
									
									
										Executable file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										31
									
								
								tools/toolchains/rust/build.sh
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,31 @@ | |||||||
|  | #!/bin/bash | ||||||
|  | THIS_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}"  )" >/dev/null 2>&1 && pwd )" | ||||||
|  | INSTALL_DIR=/opt/occlum/toolchains/rust | ||||||
|  | 
 | ||||||
|  | mkdir -p ${INSTALL_DIR}/bin | ||||||
|  | 
 | ||||||
|  | rustup target add x86_64-unknown-linux-musl | ||||||
|  | 
 | ||||||
|  | # Generate the wrapper for Cargo | ||||||
|  | # Use -crt-static to dynamically link the application to musl libc library. | ||||||
|  | # Refer to https://github.com/rust-lang/rfcs/blob/master/text/1721-crt-static.md | ||||||
|  | # for more information about crt-static | ||||||
|  | cat > ${INSTALL_DIR}/bin/occlum-cargo <<EOF | ||||||
|  | #!/bin/bash | ||||||
|  | env CC_x86_64_unknown_linux_musl=x86_64-linux-musl-gcc \ | ||||||
|  | CCFLAGS_x86_64_unknown_linux_musl="-fPIC -pie -Wl,-rpath,/opt/occlum/toolchains/gcc/x86_64-linux-musl/lib" \ | ||||||
|  | CXX_x86_64_unknown_linux_musl=x86_64-linux-musl-g++ \ | ||||||
|  | CXXFLAGS_x86_64_unknown_linux_musl="-fPIC -pie -Wl,-rpath,/opt/occlum/toolchains/gcc/x86_64-linux-musl/lib" \ | ||||||
|  | RUSTFLAGS="-C target-feature=-crt-static -C linker=occlum-gcc" \ | ||||||
|  | CARGO_BUILD_TARGET=x86_64-unknown-linux-musl \ | ||||||
|  | cargo "\$@" | ||||||
|  | EOF | ||||||
|  | 
 | ||||||
|  | # Generate the wrapper for rustc | ||||||
|  | cat > ${INSTALL_DIR}/bin/occlum-rustc <<EOF | ||||||
|  | #!/bin/bash | ||||||
|  | rustc -C linker=occlum-gcc -C target-feature=-crt-static "\$@" --target=x86_64-unknown-linux-musl | ||||||
|  | EOF | ||||||
|  | 
 | ||||||
|  | chmod +x ${INSTALL_DIR}/bin/occlum-cargo | ||||||
|  | chmod +x ${INSTALL_DIR}/bin/occlum-rustc | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user