Consolidate cfg checks for wasm/proc_macro
diff --git a/build.rs b/build.rs
new file mode 100644
index 0000000..4567b6c
--- /dev/null
+++ b/build.rs
@@ -0,0 +1,21 @@
+use std::env;
+
+fn main() {
+    println!("cargo:rerun-if-changed=build.rs");
+
+    let target = env::var("TARGET").unwrap();
+
+    maybe_enable_use_proc_macro(&target);
+}
+
+fn maybe_enable_use_proc_macro(target: &str) {
+    // wasm targets don't have the `proc_macro` crate, disable this feature.
+    if target.contains("wasm32") {
+        return
+    }
+
+    // Otherwise, only enable it if our feature is actually enabled.
+    if cfg!(feature = "proc-macro") {
+        println!("cargo:rustc-cfg=use_proc_macro");
+    }
+}
diff --git a/src/lib.rs b/src/lib.rs
index 35d9089..7edbfec 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -46,7 +46,7 @@
 #![doc(html_root_url = "https://docs.rs/proc-macro2/0.4.9")]
 #![cfg_attr(feature = "nightly", feature(proc_macro_raw_ident, proc_macro_span))]
 
-#[cfg(all(not(all(target_arch = "wasm32", target_os = "unknown")), feature = "proc-macro"))]
+#[cfg(use_proc_macro)]
 extern crate proc_macro;
 extern crate unicode_xid;
 
@@ -146,14 +146,14 @@
     }
 }
 
-#[cfg(all(not(all(target_arch = "wasm32", target_os = "unknown")), feature = "proc-macro"))]
+#[cfg(use_proc_macro)]
 impl From<proc_macro::TokenStream> for TokenStream {
     fn from(inner: proc_macro::TokenStream) -> TokenStream {
         TokenStream::_new(inner.into())
     }
 }
 
-#[cfg(all(not(all(target_arch = "wasm32", target_os = "unknown")), feature = "proc-macro"))]
+#[cfg(use_proc_macro)]
 impl From<TokenStream> for proc_macro::TokenStream {
     fn from(inner: TokenStream) -> proc_macro::TokenStream {
         inner.inner.into()
@@ -318,7 +318,7 @@
     }
 
     /// This method is only available when the `"nightly"` feature is enabled.
-    #[cfg(all(not(all(target_arch = "wasm32", target_os = "unknown")), feature = "nightly", feature = "proc-macro"))]
+    #[cfg(all(feature = "nightly", use_proc_macro))]
     pub fn unstable(self) -> proc_macro::Span {
         self.inner.unstable()
     }
diff --git a/src/stable.rs b/src/stable.rs
index 94452e1..0efc32c 100644
--- a/src/stable.rs
+++ b/src/stable.rs
@@ -116,7 +116,7 @@
     }
 }
 
-#[cfg(all(not(all(target_arch = "wasm32", target_os = "unknown")), feature = "proc-macro"))]
+#[cfg(use_proc_macro)]
 impl From<::proc_macro::TokenStream> for TokenStream {
     fn from(inner: ::proc_macro::TokenStream) -> TokenStream {
         inner
@@ -126,7 +126,7 @@
     }
 }
 
-#[cfg(all(not(all(target_arch = "wasm32", target_os = "unknown")), feature = "proc-macro"))]
+#[cfg(use_proc_macro)]
 impl From<TokenStream> for ::proc_macro::TokenStream {
     fn from(inner: TokenStream) -> ::proc_macro::TokenStream {
         inner