From ee927f89694f65814c7b3b45bc9775213d91517c Mon Sep 17 00:00:00 2001
From: yoshikawa <yoshikawa@preferred.jp>
Date: Mon, 1 Jun 2020 18:59:26 +0900
Subject: [PATCH 1/3] for cuda separate compilation

---
 src/lib.rs | 31 ++++++++++++++++++++++++++++++-
 1 file changed, 30 insertions(+), 1 deletion(-)

diff --git a/src/lib.rs b/src/lib.rs
index f46fade8..b0986e08 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -929,6 +929,22 @@ impl Build {
             objects.push(Object::new(file.to_path_buf(), obj));
         }
         self.compile_objects(&objects)?;
+
+        if self.cuda {
+            let compiler = self.try_get_compiler()?;
+            let mut cmd = compiler.to_command();
+            cmd.arg("-dlink");
+            for obj in objects.clone() {
+                cmd.arg(obj.dst);
+            }
+            cmd.arg("-o");
+            let out_dir = self.get_out_dir()?;
+            let out_dir = out_dir.join("link.o");
+            cmd.arg(out_dir);
+            println!("running {:?}", cmd);
+            run(&mut cmd, "nvcc")?;
+        }
+
         self.assemble(lib_name, &dst.join(gnu_lib_name), &objects)?;
 
         if self.get_target()?.contains("msvc") {
@@ -1165,6 +1181,11 @@ impl Build {
                     .into_owned(),
             )
         };
+
+        if self.cuda {
+            cmd.arg("-dc");
+        }
+
         let is_arm = target.contains("aarch64") || target.contains("arm");
         command_add_output_file(&mut cmd, &obj.dst, self.cuda, msvc, clang, is_asm, is_arm);
         // armasm and armasm64 don't requrie -c option
@@ -1713,7 +1734,15 @@ impl Build {
         // appends to it, which we don't want.
         let _ = fs::remove_file(&dst);
 
-        let objects: Vec<_> = objs.iter().map(|obj| obj.dst.clone()).collect();
+        let mut objects: Vec<_> = objs.iter().map(|obj| obj.dst.clone()).collect();
+
+        if self.cuda {
+            let out_dir = self.get_out_dir()?;
+            let out_dir = out_dir.join("link.o");
+            objects.push(out_dir);
+        }
+
+        let objects = objects;
         let target = self.get_target()?;
         if target.contains("msvc") {
             let (mut cmd, program) = self.get_ar()?;

From fdd5761cdc190f5f6f9b65e44396e27880eada46 Mon Sep 17 00:00:00 2001
From: yoshikawa <yoshikawa@preferred.jp>
Date: Tue, 2 Jun 2020 09:57:29 +0900
Subject: [PATCH 2/3] move to compile objects

---
 src/lib.rs | 31 +++++++++++++++----------------
 1 file changed, 15 insertions(+), 16 deletions(-)

diff --git a/src/lib.rs b/src/lib.rs
index b0986e08..c4869205 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -929,22 +929,6 @@ impl Build {
             objects.push(Object::new(file.to_path_buf(), obj));
         }
         self.compile_objects(&objects)?;
-
-        if self.cuda {
-            let compiler = self.try_get_compiler()?;
-            let mut cmd = compiler.to_command();
-            cmd.arg("-dlink");
-            for obj in objects.clone() {
-                cmd.arg(obj.dst);
-            }
-            cmd.arg("-o");
-            let out_dir = self.get_out_dir()?;
-            let out_dir = out_dir.join("link.o");
-            cmd.arg(out_dir);
-            println!("running {:?}", cmd);
-            run(&mut cmd, "nvcc")?;
-        }
-
         self.assemble(lib_name, &dst.join(gnu_lib_name), &objects)?;
 
         if self.get_target()?.contains("msvc") {
@@ -1155,6 +1139,21 @@ impl Build {
         for obj in objs {
             self.compile_object(obj)?;
         }
+
+        if self.cuda {
+            let compiler = self.try_get_compiler()?;
+            let mut cmd = compiler.to_command();
+            cmd.arg("-dlink");
+            for obj in objs {
+                cmd.arg(obj.dst.clone());
+            }
+            cmd.arg("-o");
+            let out_dir = self.get_out_dir()?;
+            let out_dir = out_dir.join("link.o");
+            cmd.arg(out_dir);
+            run(&mut cmd, "nvcc")?;
+        }
+
         Ok(())
     }
 

From 5d51a1d18cbcb8fe5383145786d716362eb12c95 Mon Sep 17 00:00:00 2001
From: yoshikawa <yoshikawa@preferred.jp>
Date: Tue, 9 Jun 2020 17:24:05 +0900
Subject: [PATCH 3/3] rename to __cc_internal_link.o

---
 src/lib.rs | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/lib.rs b/src/lib.rs
index c4869205..9a1c4886 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1149,7 +1149,7 @@ impl Build {
             }
             cmd.arg("-o");
             let out_dir = self.get_out_dir()?;
-            let out_dir = out_dir.join("link.o");
+            let out_dir = out_dir.join("__cc_internal_link.o");
             cmd.arg(out_dir);
             run(&mut cmd, "nvcc")?;
         }
@@ -1737,7 +1737,7 @@ impl Build {
 
         if self.cuda {
             let out_dir = self.get_out_dir()?;
-            let out_dir = out_dir.join("link.o");
+            let out_dir = out_dir.join("__cc_internal_link.o");
             objects.push(out_dir);
         }