diff --git a/R-package/cleanup b/R-package/cleanup new file mode 100755 index 00000000..e346d71d --- /dev/null +++ b/R-package/cleanup @@ -0,0 +1 @@ +rm -f src/Makevars diff --git a/book/src/get_started.md b/book/src/get_started.md index 0cb7c2af..bbd3f789 100644 --- a/book/src/get_started.md +++ b/book/src/get_started.md @@ -73,6 +73,7 @@ After `savvy::savvy_init()`, the structure of your R package should look like be ├── R │ └── 000-wrappers.R <-------(1) ├── configure <-------(2) +├── cleanup <-------(2) ├── foofoofoofoo.Rproj └── src ├── Makevars.in <-------(2) @@ -89,7 +90,8 @@ After `savvy::savvy_init()`, the structure of your R package should look like be ``` 1. `000-wrappers.R`: R functions for the corresponding Rust functions -2. `configure`, `Makevars.in`, and `Makevars.win`: Necessary build settings for compiling Rust code +2. `configure`, `cleanup`, `Makevars.in`, and `Makevars.win`: Necessary build + settings for compiling Rust code 3. `init.c` and `api.h`: C functions for the corresponding Rust functions 4. `-win.def` and `.cargo/config.toml`: These are tricks to avoid a minor error on Windows. See [extendr/rextendr#211][1] and [savvy#98][2] for diff --git a/savvy-bindgen/src/gen/static_files.rs b/savvy-bindgen/src/gen/static_files.rs index d7c5c1d7..c696685b 100644 --- a/savvy-bindgen/src/gen/static_files.rs +++ b/savvy-bindgen/src/gen/static_files.rs @@ -9,6 +9,10 @@ pub fn generate_configure() -> String { include_str!("./templates/configure").to_string() } +pub fn generate_cleanup() -> String { + include_str!("./templates/cleanup").to_string() +} + pub fn generate_makevars_win(crate_name: &str) -> String { format!( include_str!("./templates/Makevars.win"), diff --git a/savvy-bindgen/src/gen/templates/cleanup b/savvy-bindgen/src/gen/templates/cleanup new file mode 100644 index 00000000..37419212 --- /dev/null +++ b/savvy-bindgen/src/gen/templates/cleanup @@ -0,0 +1 @@ +rm -f src/Makevars \ No newline at end of file diff --git a/savvy-bindgen/src/lib.rs b/savvy-bindgen/src/lib.rs index ae3d3b04..0459431f 100644 --- a/savvy-bindgen/src/lib.rs +++ b/savvy-bindgen/src/lib.rs @@ -6,8 +6,9 @@ mod utils; pub use gen::c::{generate_c_header_file, generate_c_impl_file}; pub use gen::r::generate_r_impl_file; pub use gen::static_files::{ - generate_cargo_toml, generate_config_toml, generate_configure, generate_example_lib_rs, - generate_gitignore, generate_makevars_in, generate_makevars_win, generate_win_def, + generate_cargo_toml, generate_cleanup, generate_config_toml, generate_configure, + generate_example_lib_rs, generate_gitignore, generate_makevars_in, generate_makevars_win, + generate_win_def, }; pub use ir::savvy_enum::SavvyEnum; pub use ir::savvy_fn::{SavvyFn, SavvyFnArg, SavvyFnType}; diff --git a/savvy-cli/src/main.rs b/savvy-cli/src/main.rs index 092e7ecd..9c64eecc 100644 --- a/savvy-cli/src/main.rs +++ b/savvy-cli/src/main.rs @@ -20,9 +20,10 @@ use std::path::PathBuf; use futures_lite::{io::BufReader, prelude::*}; use savvy_bindgen::{ - generate_c_header_file, generate_c_impl_file, generate_cargo_toml, generate_config_toml, - generate_configure, generate_example_lib_rs, generate_gitignore, generate_makevars_in, - generate_makevars_win, generate_r_impl_file, generate_win_def, ParsedResult, + generate_c_header_file, generate_c_impl_file, generate_cargo_toml, generate_cleanup, + generate_config_toml, generate_configure, generate_example_lib_rs, generate_gitignore, + generate_makevars_in, generate_makevars_win, generate_r_impl_file, generate_win_def, + ParsedResult, }; /// Generate C bindings and R bindings for a Rust library @@ -124,6 +125,7 @@ const PATH_CONFIG_TOML: &str = "src/rust/.cargo/config.toml"; const PATH_LIB_RS: &str = "src/rust/src/lib.rs"; const PATH_MAKEVARS_IN: &str = "src/Makevars.in"; const PATH_CONFIGURE: &str = "configure"; +const PATH_CLEANUP: &str = "cleanup"; const PATH_MAKEVARS_WIN: &str = "src/Makevars.win"; const PATH_GITIGNORE: &str = "src/.gitignore"; const PATH_C_HEADER: &str = "src/rust/api.h"; @@ -175,20 +177,25 @@ fn append_file(path: &Path, contents: &str) { } #[cfg(unix)] -fn set_executable(path: &Path) { +fn set_executable(paths: &[&Path]) { use std::os::unix::fs::PermissionsExt; + for path in paths { + let path_str = path.to_string_lossy(); + println!("Setting {} as executable", path_str); - let path_str = path.to_string_lossy(); - println!("Setting {} as executable", path_str); - - let mut perm = std::fs::metadata(path).unwrap().permissions(); - perm.set_mode(0o755); - std::fs::set_permissions(path, perm).unwrap(); + let mut perm = std::fs::metadata(path).unwrap().permissions(); + perm.set_mode(0o755); + std::fs::set_permissions(path, perm).unwrap(); + } } #[cfg(not(unix))] -fn set_executable(path: &Path) { - let path_str = path.to_string_lossy(); +fn set_executable(paths: &[&Path]) { + let path_str = paths + .iter() + .map(|p| p.to_string_lossy()) + .collect::>() + .join(" "); eprintln!( " ### Warning ################################################################### @@ -335,7 +342,8 @@ savvy = "*""#, &generate_makevars_in(&pkg_metadata.package_name_for_rust()), ); write_file(&path.join(PATH_CONFIGURE), &generate_configure()); - set_executable(&path.join(PATH_CONFIGURE)); // This doesn't work on Windows! + write_file(&path.join(PATH_CLEANUP), &generate_cleanup()); + set_executable([&path.join(PATH_CONFIGURE), &path.join(PATH_CLEANUP)]); // This doesn't work on Windows! write_file( &path.join(format!( "src/{}-win.def",