From 3cb80db314379798dcfd99e43246f976be6fbec6 Mon Sep 17 00:00:00 2001 From: sagudev <16504129+sagudev@users.noreply.github.com> Date: Sat, 19 Aug 2023 13:13:49 +0200 Subject: [PATCH 01/10] Add derive_compiled feature to force full compilation of derive --- precompiled/serde_derive/Cargo.toml | 6 ++++++ precompiled/serde_derive/src/lib.rs | 10 ++++++++-- serde/Cargo.toml | 3 +++ serde_derive/Cargo.toml | 1 + 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/precompiled/serde_derive/Cargo.toml b/precompiled/serde_derive/Cargo.toml index 0910b574a..0091f2177 100644 --- a/precompiled/serde_derive/Cargo.toml +++ b/precompiled/serde_derive/Cargo.toml @@ -17,6 +17,7 @@ rust-version = "1.56" [features] default = [] deserialize_in_place = [] +compiled = ["proc-macro2", "quote", "syn"] [lib] proc-macro = true @@ -26,6 +27,11 @@ proc-macro2 = "1" quote = "1" syn = "2.0.28" +[dependencies] +proc-macro2 = { version = "1", optional = true } +quote = { version = "1", optional = true } +syn = { version = "2.0.28", optional = true } + [dev-dependencies] serde = { version = "1", path = "../../serde" } diff --git a/precompiled/serde_derive/src/lib.rs b/precompiled/serde_derive/src/lib.rs index fbddcca56..aff611723 100644 --- a/precompiled/serde_derive/src/lib.rs +++ b/precompiled/serde_derive/src/lib.rs @@ -15,8 +15,14 @@ #![doc(html_root_url = "https://docs.rs/serde_derive/1.0.183")] -#[cfg(not(all(target_arch = "x86_64", target_os = "linux", target_env = "gnu")))] +#[cfg(any( + feature = "compiled", + not(all(target_arch = "x86_64", target_os = "linux", target_env = "gnu")) +))] include!("lib_from_source.rs"); -#[cfg(all(target_arch = "x86_64", target_os = "linux", target_env = "gnu"))] +#[cfg(not(any( + feature = "compiled", + not(all(target_arch = "x86_64", target_os = "linux", target_env = "gnu")) +)))] include!("lib_precompiled.rs"); diff --git a/serde/Cargo.toml b/serde/Cargo.toml index 342645206..76a642d93 100644 --- a/serde/Cargo.toml +++ b/serde/Cargo.toml @@ -40,6 +40,9 @@ default = ["std"] # Provide derive(Serialize, Deserialize) macros. derive = ["serde_derive"] +# Force full compilation of serde_derive +derive_compiled = ["serde_derive/compiled"] + # Provide impls for common standard library types like Vec and HashMap. # Requires a dependency on the Rust standard library. std = [] diff --git a/serde_derive/Cargo.toml b/serde_derive/Cargo.toml index 1baae9f27..97e45e5ce 100644 --- a/serde_derive/Cargo.toml +++ b/serde_derive/Cargo.toml @@ -15,6 +15,7 @@ rust-version = "1.56" [features] default = [] deserialize_in_place = [] +compiled = [] [lib] name = "serde_derive" From b12293e8bb5d3a471e8a98f5ab8275992753dbef Mon Sep 17 00:00:00 2001 From: pinkforest <36498018+pinkforest@users.noreply.github.com> Date: Sun, 20 Aug 2023 09:21:38 +1000 Subject: [PATCH 02/10] Add cfg opt-in for the precompiled binary --- precompiled/serde_derive/Cargo.toml | 8 +------- precompiled/serde_derive/src/lib.rs | 20 ++++++++++++-------- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/precompiled/serde_derive/Cargo.toml b/precompiled/serde_derive/Cargo.toml index 0091f2177..f40a6f8cb 100644 --- a/precompiled/serde_derive/Cargo.toml +++ b/precompiled/serde_derive/Cargo.toml @@ -17,21 +17,15 @@ rust-version = "1.56" [features] default = [] deserialize_in_place = [] -compiled = ["proc-macro2", "quote", "syn"] [lib] proc-macro = true -[target.'cfg(not(all(target_arch = "x86_64", target_os = "linux", target_env = "gnu")))'.dependencies] +[target.'cfg(not(all(serde_derive_build = "precompiled", target_arch = "x86_64", target_os = "linux", target_env = "gnu")))'.dependencies] proc-macro2 = "1" quote = "1" syn = "2.0.28" -[dependencies] -proc-macro2 = { version = "1", optional = true } -quote = { version = "1", optional = true } -syn = { version = "2.0.28", optional = true } - [dev-dependencies] serde = { version = "1", path = "../../serde" } diff --git a/precompiled/serde_derive/src/lib.rs b/precompiled/serde_derive/src/lib.rs index aff611723..4b0aa0d07 100644 --- a/precompiled/serde_derive/src/lib.rs +++ b/precompiled/serde_derive/src/lib.rs @@ -15,14 +15,18 @@ #![doc(html_root_url = "https://docs.rs/serde_derive/1.0.183")] -#[cfg(any( - feature = "compiled", - not(all(target_arch = "x86_64", target_os = "linux", target_env = "gnu")) -))] +#[cfg(not(all( + serde_derive_build = "precompiled", + target_arch = "x86_64", + target_os = "linux", + target_env = "gnu" +)))] include!("lib_from_source.rs"); -#[cfg(not(any( - feature = "compiled", - not(all(target_arch = "x86_64", target_os = "linux", target_env = "gnu")) -)))] +#[cfg(all( + serde_derive_build = "precompiled", + target_arch = "x86_64", + target_os = "linux", + target_env = "gnu" +))] include!("lib_precompiled.rs"); From 8d54439c49fb7ade1b16cbd5ac72d57ea51de0b6 Mon Sep 17 00:00:00 2001 From: pinkforest <36498018+pinkforest@users.noreply.github.com> Date: Sun, 20 Aug 2023 09:24:44 +1000 Subject: [PATCH 03/10] Remove redundant features --- serde/Cargo.toml | 3 --- serde_derive/Cargo.toml | 1 - 2 files changed, 4 deletions(-) diff --git a/serde/Cargo.toml b/serde/Cargo.toml index 76a642d93..342645206 100644 --- a/serde/Cargo.toml +++ b/serde/Cargo.toml @@ -40,9 +40,6 @@ default = ["std"] # Provide derive(Serialize, Deserialize) macros. derive = ["serde_derive"] -# Force full compilation of serde_derive -derive_compiled = ["serde_derive/compiled"] - # Provide impls for common standard library types like Vec and HashMap. # Requires a dependency on the Rust standard library. std = [] diff --git a/serde_derive/Cargo.toml b/serde_derive/Cargo.toml index 97e45e5ce..1baae9f27 100644 --- a/serde_derive/Cargo.toml +++ b/serde_derive/Cargo.toml @@ -15,7 +15,6 @@ rust-version = "1.56" [features] default = [] deserialize_in_place = [] -compiled = [] [lib] name = "serde_derive" From 2e5bba001f0c678df009e8117df7680b33712e64 Mon Sep 17 00:00:00 2001 From: pinkforest <36498018+pinkforest@users.noreply.github.com> Date: Sun, 20 Aug 2023 12:50:26 +1000 Subject: [PATCH 04/10] Use opt-out instead and provide doc --- README.md | 19 +++++++++++++++++++ precompiled/serde_derive/src/lib.rs | 8 ++++---- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 477fd3647..6b7367640 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,25 @@ fn main() { } ``` +## Note about serde_derive Binary + +When using `serde_derive` either directly or via `serde` with `derive` feature. + +Please note that `serde_derive` may be distributed from within pre-compiled binary + +To force building `serde_derive` from source, an override is provided: + +```sh +RUSTFLAGS='--cfg serde_derive_build="source"' +``` + +Alternatively in `~/.cargo/config`: +```toml +rustflags = ['--cfg serde_derive_build="source"'] +``` + +More info from [cargo reference](https://doc.rust-lang.org/cargo/reference/config.html#buildrustflags). + ## Getting help Serde is one of the most widely used Rust libraries so any place that Rustaceans diff --git a/precompiled/serde_derive/src/lib.rs b/precompiled/serde_derive/src/lib.rs index 4b0aa0d07..d43a76213 100644 --- a/precompiled/serde_derive/src/lib.rs +++ b/precompiled/serde_derive/src/lib.rs @@ -15,16 +15,16 @@ #![doc(html_root_url = "https://docs.rs/serde_derive/1.0.183")] -#[cfg(not(all( - serde_derive_build = "precompiled", +#[cfg(all( + serde_derive_build = "source", target_arch = "x86_64", target_os = "linux", target_env = "gnu" -)))] +))] include!("lib_from_source.rs"); #[cfg(all( - serde_derive_build = "precompiled", + not(serde_derive_build = "source"), target_arch = "x86_64", target_os = "linux", target_env = "gnu" From 10a0210d15688741e99eb40f479231239cea6126 Mon Sep 17 00:00:00 2001 From: pinkforest <36498018+pinkforest@users.noreply.github.com> Date: Sun, 20 Aug 2023 18:01:03 +1000 Subject: [PATCH 05/10] Add simplified gating via build.rs --- precompiled/serde_derive/Cargo.toml | 2 +- precompiled/serde_derive/build.rs | 21 +++++++++++++++++++++ precompiled/serde_derive/src/lib.rs | 14 ++------------ 3 files changed, 24 insertions(+), 13 deletions(-) create mode 100644 precompiled/serde_derive/build.rs diff --git a/precompiled/serde_derive/Cargo.toml b/precompiled/serde_derive/Cargo.toml index f40a6f8cb..8fe632559 100644 --- a/precompiled/serde_derive/Cargo.toml +++ b/precompiled/serde_derive/Cargo.toml @@ -21,7 +21,7 @@ deserialize_in_place = [] [lib] proc-macro = true -[target.'cfg(not(all(serde_derive_build = "precompiled", target_arch = "x86_64", target_os = "linux", target_env = "gnu")))'.dependencies] +[target.'cfg(serde_derive_build = "source")'.dependencies] proc-macro2 = "1" quote = "1" syn = "2.0.28" diff --git a/precompiled/serde_derive/build.rs b/precompiled/serde_derive/build.rs new file mode 100644 index 000000000..4ff2dce24 --- /dev/null +++ b/precompiled/serde_derive/build.rs @@ -0,0 +1,21 @@ +fn is_target_precompiled(target: &str) -> bool { + target == "x86_64-unknown-linux-gnu" +} + +fn main() { + // Alternatively use platforms crate etc. for Types + let target = match std::env::var("TARGET") { + Ok(target) => target, + _ => "".to_string(), // TARGET should be required ? + }; + println!("cargo:warning=\"{target}\""); + // This is required to simplify gating + let derive_build = match std::env::var("CARGO_CFG_SERDE_DERIVE_BUILD").as_deref() { + Ok("source") => "source", + _ => match is_target_precompiled(&target) { + true => "precompiled", + false => "source", + }, + }; + println!("cargo:rustc-cfg=serde_derive_build=\"{derive_build}\""); +} diff --git a/precompiled/serde_derive/src/lib.rs b/precompiled/serde_derive/src/lib.rs index d43a76213..cdd1197d0 100644 --- a/precompiled/serde_derive/src/lib.rs +++ b/precompiled/serde_derive/src/lib.rs @@ -15,18 +15,8 @@ #![doc(html_root_url = "https://docs.rs/serde_derive/1.0.183")] -#[cfg(all( - serde_derive_build = "source", - target_arch = "x86_64", - target_os = "linux", - target_env = "gnu" -))] +#[cfg(serde_derive_build = "source")] include!("lib_from_source.rs"); -#[cfg(all( - not(serde_derive_build = "source"), - target_arch = "x86_64", - target_os = "linux", - target_env = "gnu" -))] +#[cfg(not(serde_derive_build = "source"))] include!("lib_precompiled.rs"); From 81e79c1257598139dc4039f0307d917ab9ba4c3a Mon Sep 17 00:00:00 2001 From: pinkforest <36498018+pinkforest@users.noreply.github.com> Date: Sun, 20 Aug 2023 18:26:30 +1000 Subject: [PATCH 06/10] Provide the opt-out gate without build.rs --- precompiled/serde_derive/Cargo.toml | 2 +- precompiled/serde_derive/build.rs | 21 --------------------- precompiled/serde_derive/src/lib.rs | 12 ++++++++++-- 3 files changed, 11 insertions(+), 24 deletions(-) delete mode 100644 precompiled/serde_derive/build.rs diff --git a/precompiled/serde_derive/Cargo.toml b/precompiled/serde_derive/Cargo.toml index 8fe632559..89147ba36 100644 --- a/precompiled/serde_derive/Cargo.toml +++ b/precompiled/serde_derive/Cargo.toml @@ -21,7 +21,7 @@ deserialize_in_place = [] [lib] proc-macro = true -[target.'cfg(serde_derive_build = "source")'.dependencies] +[target.'cfg(any(serde_derive_build = "source", all(target_arch = "x86_64", target_os = "linux", target_env = "gnu")))'.dependencies] proc-macro2 = "1" quote = "1" syn = "2.0.28" diff --git a/precompiled/serde_derive/build.rs b/precompiled/serde_derive/build.rs deleted file mode 100644 index 4ff2dce24..000000000 --- a/precompiled/serde_derive/build.rs +++ /dev/null @@ -1,21 +0,0 @@ -fn is_target_precompiled(target: &str) -> bool { - target == "x86_64-unknown-linux-gnu" -} - -fn main() { - // Alternatively use platforms crate etc. for Types - let target = match std::env::var("TARGET") { - Ok(target) => target, - _ => "".to_string(), // TARGET should be required ? - }; - println!("cargo:warning=\"{target}\""); - // This is required to simplify gating - let derive_build = match std::env::var("CARGO_CFG_SERDE_DERIVE_BUILD").as_deref() { - Ok("source") => "source", - _ => match is_target_precompiled(&target) { - true => "precompiled", - false => "source", - }, - }; - println!("cargo:rustc-cfg=serde_derive_build=\"{derive_build}\""); -} diff --git a/precompiled/serde_derive/src/lib.rs b/precompiled/serde_derive/src/lib.rs index cdd1197d0..7afd328c2 100644 --- a/precompiled/serde_derive/src/lib.rs +++ b/precompiled/serde_derive/src/lib.rs @@ -15,8 +15,16 @@ #![doc(html_root_url = "https://docs.rs/serde_derive/1.0.183")] -#[cfg(serde_derive_build = "source")] +#[cfg(any( + serde_derive_build = "source", + not(all(target_arch = "x86_64", target_os = "linux", target_env = "gnu")) +))] include!("lib_from_source.rs"); -#[cfg(not(serde_derive_build = "source"))] +#[cfg(all( + not(serde_derive_build = "source"), + target_arch = "x86_64", + target_os = "linux", + target_env = "gnu" +))] include!("lib_precompiled.rs"); From 6bccee788ad3d566945640756deebf4a754af0d2 Mon Sep 17 00:00:00 2001 From: pinkforest <36498018+pinkforest@users.noreply.github.com> Date: Sun, 20 Aug 2023 18:32:12 +1000 Subject: [PATCH 07/10] Fix the manifest gate for opt-out - thanks @sagudev Co-authored-by: sagudev <16504129+sagudev@users.noreply.github.com> --- precompiled/serde_derive/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/precompiled/serde_derive/Cargo.toml b/precompiled/serde_derive/Cargo.toml index 89147ba36..5d76bd3a4 100644 --- a/precompiled/serde_derive/Cargo.toml +++ b/precompiled/serde_derive/Cargo.toml @@ -21,7 +21,7 @@ deserialize_in_place = [] [lib] proc-macro = true -[target.'cfg(any(serde_derive_build = "source", all(target_arch = "x86_64", target_os = "linux", target_env = "gnu")))'.dependencies] +[target.'cfg(any(serde_derive_build = "source", not(all(target_arch = "x86_64", target_os = "linux", target_env = "gnu"))))'.dependencies] proc-macro2 = "1" quote = "1" syn = "2.0.28" From 5854820c21b9c1de194f48ab442c230632a87421 Mon Sep 17 00:00:00 2001 From: pinkforest <36498018+pinkforest@users.noreply.github.com> Date: Sun, 20 Aug 2023 20:41:49 +1000 Subject: [PATCH 08/10] Provide opt-out source compilation by feature `from_source Co-authored-by: sagudev <16504129+sagudev@users.noreply.github.com> Co-authored-by: Oliver Schneider --- README.md | 18 ++---------------- precompiled/serde_derive/Cargo.toml | 10 +++++++++- precompiled/serde_derive/src/lib.rs | 4 ++-- serde/Cargo.toml | 3 +++ serde_derive/Cargo.toml | 1 + 5 files changed, 17 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 6b7367640..d458df318 100644 --- a/README.md +++ b/README.md @@ -75,22 +75,8 @@ fn main() { ## Note about serde_derive Binary -When using `serde_derive` either directly or via `serde` with `derive` feature. - -Please note that `serde_derive` may be distributed from within pre-compiled binary - -To force building `serde_derive` from source, an override is provided: - -```sh -RUSTFLAGS='--cfg serde_derive_build="source"' -``` - -Alternatively in `~/.cargo/config`: -```toml -rustflags = ['--cfg serde_derive_build="source"'] -``` - -More info from [cargo reference](https://doc.rust-lang.org/cargo/reference/config.html#buildrustflags). +To force building `serde_derive` from source, an override is provided via +feature `from_source` if the target environment requires it. ## Getting help diff --git a/precompiled/serde_derive/Cargo.toml b/precompiled/serde_derive/Cargo.toml index 5d76bd3a4..c5d33bef5 100644 --- a/precompiled/serde_derive/Cargo.toml +++ b/precompiled/serde_derive/Cargo.toml @@ -17,11 +17,19 @@ rust-version = "1.56" [features] default = [] deserialize_in_place = [] +from_source = ["proc-macro2", "quote", "syn"] [lib] proc-macro = true -[target.'cfg(any(serde_derive_build = "source", not(all(target_arch = "x86_64", target_os = "linux", target_env = "gnu"))))'.dependencies] +# By feature source compilation +[dependencies] +proc-macro2 = { version = "1", optional = true } +quote = { version = "1", optional = true } +syn = { version = "2.0.28", optional = true } + +# Compile from source when no precompiled binary available +[target.'cfg(not(all(target_arch = "x86_64", target_os = "linux", target_env = "gnu")))'.dependencies] proc-macro2 = "1" quote = "1" syn = "2.0.28" diff --git a/precompiled/serde_derive/src/lib.rs b/precompiled/serde_derive/src/lib.rs index 7afd328c2..bcc18a7d4 100644 --- a/precompiled/serde_derive/src/lib.rs +++ b/precompiled/serde_derive/src/lib.rs @@ -16,13 +16,13 @@ #![doc(html_root_url = "https://docs.rs/serde_derive/1.0.183")] #[cfg(any( - serde_derive_build = "source", + feature = "from_source", not(all(target_arch = "x86_64", target_os = "linux", target_env = "gnu")) ))] include!("lib_from_source.rs"); #[cfg(all( - not(serde_derive_build = "source"), + not(feature = "from_source"), target_arch = "x86_64", target_os = "linux", target_env = "gnu" diff --git a/serde/Cargo.toml b/serde/Cargo.toml index 342645206..6c4167e3a 100644 --- a/serde/Cargo.toml +++ b/serde/Cargo.toml @@ -40,6 +40,9 @@ default = ["std"] # Provide derive(Serialize, Deserialize) macros. derive = ["serde_derive"] +# Force compilation from source - currently serde_derive +from_source = ["serde_derive/from_source"] + # Provide impls for common standard library types like Vec and HashMap. # Requires a dependency on the Rust standard library. std = [] diff --git a/serde_derive/Cargo.toml b/serde_derive/Cargo.toml index 1baae9f27..04f8e6c4f 100644 --- a/serde_derive/Cargo.toml +++ b/serde_derive/Cargo.toml @@ -14,6 +14,7 @@ rust-version = "1.56" [features] default = [] +from_source = [] deserialize_in_place = [] [lib] From 23059f70c687ad8a461097441f35c5f06312bf81 Mon Sep 17 00:00:00 2001 From: pinkforest <36498018+pinkforest@users.noreply.github.com> Date: Sun, 20 Aug 2023 23:00:05 +1000 Subject: [PATCH 09/10] Provide another opt-out alternative w/ nightly with cross-compile With stable in non-cross compile context is still possible: RUSTFLAGS='--cfg serde_derive_build="source"' Co-authored-by: Nemo157 --- README.md | 13 +++++++++++-- precompiled/serde_derive/Cargo.toml | 10 +--------- precompiled/serde_derive/src/lib.rs | 4 ++-- serde/Cargo.toml | 3 --- serde_derive/Cargo.toml | 1 - 5 files changed, 14 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index d458df318..84d21398d 100644 --- a/README.md +++ b/README.md @@ -75,8 +75,17 @@ fn main() { ## Note about serde_derive Binary -To force building `serde_derive` from source, an override is provided via -feature `from_source` if the target environment requires it. +To force building `serde_derive` from source, an override is provided: + +In your project `~/.cargo/config`: +```toml +[host] +rustflags = ['--cfg=serde_derive_build="source"'] +``` + +And then using `-Ztarget-applies-to-host` and `-Zhost-config` flags. + +For example: `cargo -Ztarget-applies-to-host -Zhost-config build` ## Getting help diff --git a/precompiled/serde_derive/Cargo.toml b/precompiled/serde_derive/Cargo.toml index c5d33bef5..5d76bd3a4 100644 --- a/precompiled/serde_derive/Cargo.toml +++ b/precompiled/serde_derive/Cargo.toml @@ -17,19 +17,11 @@ rust-version = "1.56" [features] default = [] deserialize_in_place = [] -from_source = ["proc-macro2", "quote", "syn"] [lib] proc-macro = true -# By feature source compilation -[dependencies] -proc-macro2 = { version = "1", optional = true } -quote = { version = "1", optional = true } -syn = { version = "2.0.28", optional = true } - -# Compile from source when no precompiled binary available -[target.'cfg(not(all(target_arch = "x86_64", target_os = "linux", target_env = "gnu")))'.dependencies] +[target.'cfg(any(serde_derive_build = "source", not(all(target_arch = "x86_64", target_os = "linux", target_env = "gnu"))))'.dependencies] proc-macro2 = "1" quote = "1" syn = "2.0.28" diff --git a/precompiled/serde_derive/src/lib.rs b/precompiled/serde_derive/src/lib.rs index bcc18a7d4..7afd328c2 100644 --- a/precompiled/serde_derive/src/lib.rs +++ b/precompiled/serde_derive/src/lib.rs @@ -16,13 +16,13 @@ #![doc(html_root_url = "https://docs.rs/serde_derive/1.0.183")] #[cfg(any( - feature = "from_source", + serde_derive_build = "source", not(all(target_arch = "x86_64", target_os = "linux", target_env = "gnu")) ))] include!("lib_from_source.rs"); #[cfg(all( - not(feature = "from_source"), + not(serde_derive_build = "source"), target_arch = "x86_64", target_os = "linux", target_env = "gnu" diff --git a/serde/Cargo.toml b/serde/Cargo.toml index 6c4167e3a..342645206 100644 --- a/serde/Cargo.toml +++ b/serde/Cargo.toml @@ -40,9 +40,6 @@ default = ["std"] # Provide derive(Serialize, Deserialize) macros. derive = ["serde_derive"] -# Force compilation from source - currently serde_derive -from_source = ["serde_derive/from_source"] - # Provide impls for common standard library types like Vec and HashMap. # Requires a dependency on the Rust standard library. std = [] diff --git a/serde_derive/Cargo.toml b/serde_derive/Cargo.toml index 04f8e6c4f..1baae9f27 100644 --- a/serde_derive/Cargo.toml +++ b/serde_derive/Cargo.toml @@ -14,7 +14,6 @@ rust-version = "1.56" [features] default = [] -from_source = [] deserialize_in_place = [] [lib] From cb23de92e7f479139add329e8629eb3b179109f6 Mon Sep 17 00:00:00 2001 From: pinkforest <36498018+pinkforest@users.noreply.github.com> Date: Mon, 21 Aug 2023 01:05:20 +1000 Subject: [PATCH 10/10] Switch back to opt-out `feature=from_source` override. This can be useful in target environments which require building from the source. The feature flag is provided both via serde_derive and serde. Co-authored-by: sagudev <16504129+sagudev@users.noreply.github.com> Co-authored-by: Oliver Schneider --- README.md | 13 ++----------- precompiled/serde_derive/Cargo.toml | 10 +++++++++- precompiled/serde_derive/src/lib.rs | 4 ++-- serde/Cargo.toml | 3 +++ serde_derive/Cargo.toml | 1 + 5 files changed, 17 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 84d21398d..d458df318 100644 --- a/README.md +++ b/README.md @@ -75,17 +75,8 @@ fn main() { ## Note about serde_derive Binary -To force building `serde_derive` from source, an override is provided: - -In your project `~/.cargo/config`: -```toml -[host] -rustflags = ['--cfg=serde_derive_build="source"'] -``` - -And then using `-Ztarget-applies-to-host` and `-Zhost-config` flags. - -For example: `cargo -Ztarget-applies-to-host -Zhost-config build` +To force building `serde_derive` from source, an override is provided via +feature `from_source` if the target environment requires it. ## Getting help diff --git a/precompiled/serde_derive/Cargo.toml b/precompiled/serde_derive/Cargo.toml index 5d76bd3a4..c5d33bef5 100644 --- a/precompiled/serde_derive/Cargo.toml +++ b/precompiled/serde_derive/Cargo.toml @@ -17,11 +17,19 @@ rust-version = "1.56" [features] default = [] deserialize_in_place = [] +from_source = ["proc-macro2", "quote", "syn"] [lib] proc-macro = true -[target.'cfg(any(serde_derive_build = "source", not(all(target_arch = "x86_64", target_os = "linux", target_env = "gnu"))))'.dependencies] +# By feature source compilation +[dependencies] +proc-macro2 = { version = "1", optional = true } +quote = { version = "1", optional = true } +syn = { version = "2.0.28", optional = true } + +# Compile from source when no precompiled binary available +[target.'cfg(not(all(target_arch = "x86_64", target_os = "linux", target_env = "gnu")))'.dependencies] proc-macro2 = "1" quote = "1" syn = "2.0.28" diff --git a/precompiled/serde_derive/src/lib.rs b/precompiled/serde_derive/src/lib.rs index 7afd328c2..bcc18a7d4 100644 --- a/precompiled/serde_derive/src/lib.rs +++ b/precompiled/serde_derive/src/lib.rs @@ -16,13 +16,13 @@ #![doc(html_root_url = "https://docs.rs/serde_derive/1.0.183")] #[cfg(any( - serde_derive_build = "source", + feature = "from_source", not(all(target_arch = "x86_64", target_os = "linux", target_env = "gnu")) ))] include!("lib_from_source.rs"); #[cfg(all( - not(serde_derive_build = "source"), + not(feature = "from_source"), target_arch = "x86_64", target_os = "linux", target_env = "gnu" diff --git a/serde/Cargo.toml b/serde/Cargo.toml index 342645206..6c4167e3a 100644 --- a/serde/Cargo.toml +++ b/serde/Cargo.toml @@ -40,6 +40,9 @@ default = ["std"] # Provide derive(Serialize, Deserialize) macros. derive = ["serde_derive"] +# Force compilation from source - currently serde_derive +from_source = ["serde_derive/from_source"] + # Provide impls for common standard library types like Vec and HashMap. # Requires a dependency on the Rust standard library. std = [] diff --git a/serde_derive/Cargo.toml b/serde_derive/Cargo.toml index 1baae9f27..04f8e6c4f 100644 --- a/serde_derive/Cargo.toml +++ b/serde_derive/Cargo.toml @@ -14,6 +14,7 @@ rust-version = "1.56" [features] default = [] +from_source = [] deserialize_in_place = [] [lib]