Explorar el Código

Prepare this crate for more wasm32 compatibility

This commit prepares the build script for a wasm32 target that doesn't use
Emcripten, notably forcing the `mem` feature to get activated and forcibly
ignoring the `c` feature, even if activated, for the wasm32 target.
Alex Crichton hace 7 años
padre
commit
45cd956acc
Se han modificado 2 ficheros con 16 adiciones y 6 borrados
  1. 13 3
      build.rs
  2. 3 3
      src/macros.rs

+ 13 - 3
build.rs

@@ -12,6 +12,12 @@ fn main() {
         return;
         return;
     }
     }
 
 
+    // Forcibly enable memory intrinsics on wasm32 as we don't have a libc to
+    // provide them.
+    if target.contains("wasm32") {
+        println!("cargo:rustc-cfg=feature=\"mem\"");
+    }
+
     // NOTE we are going to assume that llvm-target, what determines our codegen option, matches the
     // NOTE we are going to assume that llvm-target, what determines our codegen option, matches the
     // target triple. This is usually correct for our built-in targets but can break in presence of
     // target triple. This is usually correct for our built-in targets but can break in presence of
     // custom targets, which can have arbitrary names.
     // custom targets, which can have arbitrary names.
@@ -25,9 +31,13 @@ fn main() {
     // mangling names though we assume that we're also in test mode so we don't
     // mangling names though we assume that we're also in test mode so we don't
     // build anything and we rely on the upstream implementation of compiler-rt
     // build anything and we rely on the upstream implementation of compiler-rt
     // functions
     // functions
-    if !cfg!(feature = "mangled-names") {
-        #[cfg(feature = "c")]
-        c::compile(&llvm_target);
+    if !cfg!(feature = "mangled-names") && cfg!(feature = "c") {
+        // no C compiler for wasm
+        if !target.contains("wasm32") {
+            #[cfg(feature = "c")]
+            c::compile(&llvm_target);
+            println!("cargo:rustc-cfg=use_c");
+        }
     }
     }
 
 
     // To compile intrinsics.rs for thumb targets, where there is no libc
     // To compile intrinsics.rs for thumb targets, where there is no libc

+ 3 - 3
src/macros.rs

@@ -31,7 +31,7 @@
 /// A quick overview of attributes supported right now are:
 /// A quick overview of attributes supported right now are:
 ///
 ///
 /// * `use_c_shim_if` - takes a #[cfg] directive and falls back to the
 /// * `use_c_shim_if` - takes a #[cfg] directive and falls back to the
-///   C-compiled version if `feature = "c"` is specified.
+///   C-compiled version if `use_c` is specified.
 /// * `aapcs_on_arm` - forces the ABI of the function to be `"aapcs"` on ARM and
 /// * `aapcs_on_arm` - forces the ABI of the function to be `"aapcs"` on ARM and
 ///   the specified ABI everywhere else.
 ///   the specified ABI everywhere else.
 /// * `unadjusted_on_win64` - like `aapcs_on_arm` this switches to the
 /// * `unadjusted_on_win64` - like `aapcs_on_arm` this switches to the
@@ -68,7 +68,7 @@ macro_rules! intrinsics {
         $($rest:tt)*
         $($rest:tt)*
     ) => (
     ) => (
 
 
-        #[cfg(all(feature = "c", $($cfg_clause)*))]
+        #[cfg(all(use_c, $($cfg_clause)*))]
         pub extern $abi fn $name( $($argname: $ty),* ) -> $ret {
         pub extern $abi fn $name( $($argname: $ty),* ) -> $ret {
             extern $abi {
             extern $abi {
                 fn $name($($argname: $ty),*) -> $ret;
                 fn $name($($argname: $ty),*) -> $ret;
@@ -78,7 +78,7 @@ macro_rules! intrinsics {
             }
             }
         }
         }
 
 
-        #[cfg(not(all(feature = "c", $($cfg_clause)*)))]
+        #[cfg(not(all(use_c, $($cfg_clause)*)))]
         intrinsics! {
         intrinsics! {
             $(#[$($attr)*])*
             $(#[$($attr)*])*
             pub extern $abi fn $name( $($argname: $ty),* ) -> $ret {
             pub extern $abi fn $name( $($argname: $ty),* ) -> $ret {