diff --git a/examples/hello_rust_cargo/CMakeLists.txt b/examples/hello_rust_cargo/CMakeLists.txt new file mode 100644 index 00000000000..fd43f52fdcf --- /dev/null +++ b/examples/hello_rust_cargo/CMakeLists.txt @@ -0,0 +1,56 @@ +# ############################################################################## +# 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 00000000000..47954ed0f41 --- /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 00000000000..9828f2ff607 --- /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 00000000000..63ac265da07 --- /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 00000000000..eb5a316cbd1 --- /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 00000000000..c70be734645 --- /dev/null +++ b/examples/hello_rust_cargo/hello/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "hello" +version = "0.1.0" +edition = "2021" + +[lib] +crate-type = ["staticlib"] + +[dependencies] +libc = { git = "https://github.com/no1wudi/libc", branch = "libc-0.2" } + +[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" 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 00000000000..535385951fa --- /dev/null +++ b/examples/hello_rust_cargo/hello/src/lib.rs @@ -0,0 +1,22 @@ +// no-std libraray for the Rust programming language +#![no_std] + +extern crate libc; + +// Function hello_rust_cargo without manglng +#[no_mangle] +pub extern "C" fn rust_main() { + // Print hello world to stdout + unsafe { + libc::printf( + "Hello World from Rust build with Cargo!\n\0" + .as_ptr() + .cast(), + ); + } +} + +#[panic_handler] +fn panic(_info: &core::panic::PanicInfo) -> ! { + loop {} +} diff --git a/examples/hello_rust_cargo/proxy_main.c b/examples/hello_rust_cargo/proxy_main.c new file mode 100644 index 00000000000..e066e7ada10 --- /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; +}