diff --git a/examples/hello_rust_cargo/CMakeLists.txt b/examples/hello_rust_cargo/CMakeLists.txt new file mode 100644 index 0000000000..be37ef97ce --- /dev/null +++ b/examples/hello_rust_cargo/CMakeLists.txt @@ -0,0 +1,63 @@ +# ############################################################################## +# apps/examples/hello_rust_cargo/CMakeLists.txt +# +# Licensed to the Apache Software Foundation (ASF) under one or more contributor +# license agreements. See the NOTICE file distributed with this work for +# additional information regarding copyright ownership. The ASF licenses this +# file to you under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +# +# ############################################################################## + +include(nuttx_add_library) + +if(CONFIG_EXAMPLES_HELLO_RUST_CARGO) + + # Call cargo build from CMakeLists and add it to the build system. Notice we + # should call cargo build with add_custom_target, otherwise cargo will be + # called every time when cmake is configured. + + add_custom_command( + OUTPUT + ${CMAKE_BINARY_DIR}/hello_rust_cargo/riscv32imac-unknown-nuttx-elf/release/libhello.a + COMMAND + cargo build --release -Zbuild-std=core --manifest-path + ${CMAKE_CURRENT_SOURCE_DIR}/hello/Cargo.toml --target + riscv32imac-unknown-nuttx-elf --target-dir + ${CMAKE_BINARY_DIR}/hello_rust_cargo) + + add_custom_target( + hello_rust_cargo + DEPENDS + ${CMAKE_BINARY_DIR}/hello_rust_cargo/riscv32imac-unknown-nuttx-elf/release/libhello.a + ) + + # Call cargo_build target each time when cmake is configured or generated. + + # Add static library to the build system. + nuttx_library_import( + rust_hello + ${CMAKE_BINARY_DIR}/hello_rust_cargo/riscv32imac-unknown-nuttx-elf/release/libhello.a + ) + nuttx_add_extra_library(rust_hello) + + nuttx_add_application( + NAME + ${CONFIG_EXAMPLES_HELLO_RUST_CARGO_PROGNAME} + SRCS + proxy_main.c + STACKSIZE + ${CONFIG_EXAMPLES_HELLO_STACKSIZE} + PRIORITY + ${CONFIG_EXAMPLES_HELLO_PRIORITY}) + +endif() # CONFIG_EXAMPLES_HELLO_RUST_CARGO diff --git a/examples/hello_rust_cargo/Kconfig b/examples/hello_rust_cargo/Kconfig new file mode 100644 index 0000000000..47954ed0f4 --- /dev/null +++ b/examples/hello_rust_cargo/Kconfig @@ -0,0 +1,29 @@ +# +# For a description of the syntax of this configuration file, +# see the file kconfig-language.txt in the NuttX tools repository. +# + +config EXAMPLES_HELLO_RUST_CARGO + tristate "\"Hello, Rust!\" example with Cargo" + default n + ---help--- + Enable the \"Hello, Rust!\" example using Cargo to build. + +if EXAMPLES_HELLO_RUST_CARGO + +config EXAMPLES_HELLO_RUST_CARGO_PROGNAME + string "Program name" + default "hello_rust_cargo" + ---help--- + This is the name of the program that will be used when the + program is installed. + +config EXAMPLES_HELLO_RUST_CARGO_PRIORITY + int "Hello Rust task priority" + default 100 + +config EXAMPLES_HELLO_RUST_CARGO_STACKSIZE + int "Hello Rust stack size" + default DEFAULT_TASK_STACKSIZE + +endif diff --git a/examples/hello_rust_cargo/Make.defs b/examples/hello_rust_cargo/Make.defs new file mode 100644 index 0000000000..9828f2ff60 --- /dev/null +++ b/examples/hello_rust_cargo/Make.defs @@ -0,0 +1,23 @@ +############################################################################ +# apps/examples/hello_rust_cargo/Make.defs +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +############################################################################ + +ifneq ($(CONFIG_EXAMPLES_HELLO_RUST_CARGO),) +CONFIGURED_APPS += $(APPDIR)/examples/hello_rust_cargo +endif diff --git a/examples/hello_rust_cargo/Makefile b/examples/hello_rust_cargo/Makefile new file mode 100644 index 0000000000..63ac265da0 --- /dev/null +++ b/examples/hello_rust_cargo/Makefile @@ -0,0 +1,32 @@ +############################################################################ +# apps/examples/hello_rust/Makefile +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +############################################################################ + +include $(APPDIR)/Make.defs + +# Hello, Rust! built-in application info + +PROGNAME = $(CONFIG_EXAMPLES_HELLO_RUST_CARGO_PROGNAME) +PRIORITY = $(CONFIG_EXAMPLES_HELLO_RUST_CARGO_PRIORITY) +STACKSIZE = $(CONFIG_EXAMPLES_HELLO_RUST_CARGO_STACKSIZE) +MODULE = $(CONFIG_EXAMPLES_HELLO_RUST_CARGO) + +# Do not suppport building this application from Makefile. + +include $(APPDIR)/Application.mk diff --git a/examples/hello_rust_cargo/hello/.gitignore b/examples/hello_rust_cargo/hello/.gitignore new file mode 100644 index 0000000000..eb5a316cbd --- /dev/null +++ b/examples/hello_rust_cargo/hello/.gitignore @@ -0,0 +1 @@ +target diff --git a/examples/hello_rust_cargo/hello/Cargo.toml b/examples/hello_rust_cargo/hello/Cargo.toml new file mode 100644 index 0000000000..92b98ce247 --- /dev/null +++ b/examples/hello_rust_cargo/hello/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "hello" +version = "0.1.0" +edition = "2021" + +[lib] +crate-type = ["staticlib"] + +[profile.dev] +panic = "abort" + +# Special hanlding for the panic! macro, can be removed once +# the libstd port for NuttX is complete. +[profile.release] +panic = "abort" +lto = true diff --git a/examples/hello_rust_cargo/hello/src/lib.rs b/examples/hello_rust_cargo/hello/src/lib.rs new file mode 100644 index 0000000000..0894fda393 --- /dev/null +++ b/examples/hello_rust_cargo/hello/src/lib.rs @@ -0,0 +1,7 @@ + +// Function hello_rust_cargo without manglng +#[no_mangle] +pub extern "C" fn rust_main() { + // Print hello world to stdout + println!("Hello, world! from Rust and Cargo!"); +} diff --git a/examples/hello_rust_cargo/proxy_main.c b/examples/hello_rust_cargo/proxy_main.c new file mode 100644 index 0000000000..e066e7ada1 --- /dev/null +++ b/examples/hello_rust_cargo/proxy_main.c @@ -0,0 +1,42 @@ +/**************************************************************************** + * apps/examples/hello_rust_cargo/proxy_main.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +extern void rust_main(void); + +/**************************************************************************** + * main + ****************************************************************************/ + +int main(int argc, FAR char *argv[]) +{ + rust_main(); + return 0; +}