Remove strip_prefix failure mode from relative paths
diff --git a/src/error.rs b/src/error.rs
index a05f7c8..0c19f98 100644
--- a/src/error.rs
+++ b/src/error.rs
@@ -1,16 +1,14 @@
 use std::io;
-use std::path::StripPrefixError;
 use thiserror::Error;
 
 pub(super) type Result<T, E = Error> = std::result::Result<T, E>;
 
 #[derive(Error, Debug)]
-#[error(transparent)]
 pub(super) enum Error {
     #[error("missing OUT_DIR environment variable")]
     MissingOutDir,
     #[error("failed to locate target dir")]
     TargetDir,
+    #[error(transparent)]
     Io(#[from] io::Error),
-    StripPrefix(#[from] StripPrefixError),
 }
diff --git a/src/paths.rs b/src/paths.rs
index 866d377..8e5d717 100644
--- a/src/paths.rs
+++ b/src/paths.rs
@@ -44,10 +44,17 @@
 
 fn relative_to_parent_of_target_dir(original: &Path) -> Result<PathBuf> {
     let target_dir = target_dir()?;
-    let parent_of_target_dir = target_dir.parent().unwrap();
+    let mut outer = target_dir.parent().unwrap();
     let original = original.canonicalize()?;
-    let suffix = original.strip_prefix(parent_of_target_dir)?;
-    Ok(suffix.to_owned())
+    loop {
+        if let Ok(suffix) = original.strip_prefix(outer) {
+            return Ok(suffix.to_owned());
+        }
+        match outer.parent() {
+            Some(parent) => outer = parent,
+            None => return Ok(original.components().skip(1).collect()),
+        }
+    }
 }
 
 pub(crate) fn out_with_extension(path: &Path, ext: &str) -> Result<PathBuf> {