|
20 | 20 | // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE |
21 | 21 | // USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
22 | 22 |
|
23 | | -use std::{ |
24 | | - env, |
25 | | - fs, |
26 | | - io::{ErrorKind, Write}, |
27 | | - path::{Path, PathBuf}, |
28 | | - process::Command, |
29 | | -}; |
| 23 | +use std::env; |
| 24 | + |
| 25 | +use cmake::Config; |
30 | 26 |
|
31 | 27 | #[allow(clippy::too_many_lines)] |
32 | 28 | fn main() { |
33 | | - let out_dir = env::var("OUT_DIR").unwrap(); |
34 | | - let project_dir = Path::new(&out_dir); |
35 | | - let cargo_dir = env::var("CARGO_MANIFEST_DIR").unwrap(); |
36 | | - |
37 | | - let repo_dir = PathBuf::from(env::var("RANDOMX_DIR").unwrap_or_else(|_| format!("{}/RandomX", &cargo_dir))); |
38 | | - let build_dir = &project_dir.join("randomx_build"); |
39 | | - |
40 | | - env::set_current_dir(Path::new(&repo_dir)).unwrap(); // change current path to repo for dependency build |
41 | | - match fs::create_dir_all(build_dir) { |
42 | | - Ok(_) => (), |
43 | | - Err(e) => match e.kind() { |
44 | | - ErrorKind::AlreadyExists => (), |
45 | | - _ => panic!("{}", e), |
46 | | - }, |
47 | | - } |
48 | | - env::set_current_dir(build_dir).unwrap(); |
49 | | - |
50 | | - let host = env::var("HOST").unwrap(); |
51 | | - // println!("host: {}", host); |
52 | | - let target = env::var("TARGET").unwrap(); |
53 | | - // println!("target: {}", target); |
54 | | - if host.contains("windows") && target.contains("windows-msvc") { |
55 | | - let c = Command::new("cmake") |
56 | | - .arg("-G") |
57 | | - .arg("Visual Studio 16 2019") |
58 | | - .arg(repo_dir.to_str().unwrap()) |
59 | | - .output() |
60 | | - .expect("failed to execute CMake"); |
61 | | - println!("status: {}", c.status); |
62 | | - std::io::stdout().write_all(&c.stdout).unwrap(); |
63 | | - std::io::stderr().write_all(&c.stderr).unwrap(); |
64 | | - assert!(c.status.success()); |
65 | | - |
66 | | - let m = Command::new("cmake") |
67 | | - .arg("--build") |
68 | | - .arg(".") |
69 | | - .arg("--config") |
70 | | - .arg("Release") |
71 | | - .output() |
72 | | - .expect("failed to execute Make"); |
73 | | - println!("status: {}", m.status); |
74 | | - std::io::stdout().write_all(&m.stdout).unwrap(); |
75 | | - std::io::stderr().write_all(&m.stderr).unwrap(); |
76 | | - assert!(m.status.success()); |
77 | | - } else if target.contains("aarch64-unknown-linux-gnu") { |
78 | | - let c = Command::new("cmake") |
79 | | - .arg("-D") |
80 | | - .arg("ARCH=arm64") |
81 | | - .arg("-D") |
82 | | - .arg("ARCH_ID=aarch64") |
83 | | - .arg("-D") |
84 | | - .arg("CMAKE_CROSSCOMPILING=true") |
85 | | - .arg("-D") |
86 | | - .arg("CMAKE_SYSTEM_PROCESSOR=aarch64") |
87 | | - .arg("-D") |
88 | | - .arg("CMAKE_C_COMPILER=/usr/bin/aarch64-linux-gnu-gcc") |
89 | | - .arg("-D") |
90 | | - .arg("CMAKE_CXX_COMPILER=/usr/bin/aarch64-linux-gnu-g++") |
91 | | - .arg(repo_dir.to_str().unwrap()) |
92 | | - .output() |
93 | | - .expect("failed to execute CMake"); |
94 | | - println!("status: {}", c.status); |
95 | | - std::io::stdout().write_all(&c.stdout).unwrap(); |
96 | | - std::io::stderr().write_all(&c.stderr).unwrap(); |
97 | | - assert!(c.status.success()); |
98 | | - |
99 | | - let m = Command::new("cmake") |
100 | | - .arg("--build") |
101 | | - .arg(".") |
102 | | - .arg("--config") |
103 | | - .arg("Release") |
104 | | - .output() |
105 | | - .expect("failed to execute Make"); |
106 | | - println!("status: {}", m.status); |
107 | | - std::io::stdout().write_all(&m.stdout).unwrap(); |
108 | | - std::io::stderr().write_all(&m.stderr).unwrap(); |
109 | | - assert!(m.status.success()); |
110 | | - } else if target.contains("riscv64gc-unknown-linux-gnu") { |
111 | | - let c = Command::new("cmake") |
112 | | - .arg("-D") |
113 | | - .arg("ARCH=rv64gc") |
114 | | - .arg("-D") |
115 | | - .arg("ARCH_ID=riscv64") |
116 | | - .arg("-D") |
117 | | - .arg("CMAKE_CROSSCOMPILING=true") |
118 | | - .arg("-D") |
119 | | - .arg("CMAKE_SYSTEM_PROCESSOR=riscv64") |
120 | | - .arg("-D") |
121 | | - .arg("CMAKE_C_COMPILER=/usr/bin/riscv64-linux-gnu-gcc") |
122 | | - .arg("-D") |
123 | | - .arg("CMAKE_CXX_COMPILER=/usr/bin/riscv64-linux-gnu-g++") |
124 | | - .arg(repo_dir.to_str().unwrap()) |
125 | | - .output() |
126 | | - .expect("failed to execute CMake"); |
127 | | - println!("status: {}", c.status); |
128 | | - std::io::stdout().write_all(&c.stdout).unwrap(); |
129 | | - std::io::stderr().write_all(&c.stderr).unwrap(); |
130 | | - assert!(c.status.success()); |
131 | | - |
132 | | - let m = Command::new("cmake") |
133 | | - .arg("--build") |
134 | | - .arg(".") |
135 | | - .arg("--config") |
136 | | - .arg("Release") |
137 | | - .output() |
138 | | - .expect("failed to execute Make"); |
139 | | - println!("status: {}", m.status); |
140 | | - std::io::stdout().write_all(&m.stdout).unwrap(); |
141 | | - std::io::stderr().write_all(&m.stderr).unwrap(); |
142 | | - assert!(m.status.success()); |
143 | | - } else if target.contains("linux-android") { |
144 | | - let android_abi = { |
145 | | - if target.contains("aarch64") { |
146 | | - "arm64-v8a" |
147 | | - } else if target.contains("x86_64") { |
148 | | - "x86_64" |
149 | | - } else if target.contains("armv7") { |
150 | | - "armeabi-v7a" |
151 | | - } else if target.contains("i686") { |
152 | | - "x86" |
153 | | - } else { |
154 | | - panic!("unknown Android ABI") |
155 | | - } |
156 | | - }; |
157 | | - |
158 | | - let android_sdk = env::var("ANDROID_SDK_ROOT").expect("ANDROID_SDK_ROOT variable not set"); |
159 | | - |
160 | | - let android_platform = env::var("ANDROID_PLATFORM").unwrap_or_else(|_| "android-26".to_owned()); |
161 | | - let android_cmake = env::var("ANDROID_CMAKE").unwrap_or(android_sdk.clone() + "/cmake/3.22.1/bin/cmake"); |
162 | | - let android_toolchain = env::var("ANDROID_CMAKE_TOOLCHAIN") |
163 | | - .unwrap_or(android_sdk + "/ndk/22.1.7171670/build/cmake/android.toolchain.cmake"); |
164 | | - |
165 | | - let c = Command::new(android_cmake) |
166 | | - .arg("-D") |
167 | | - .arg("CMAKE_TOOLCHAIN_FILE=".to_owned() + &android_toolchain) |
168 | | - .arg("-D") |
169 | | - .arg("ANDROID_ABI=".to_owned() + android_abi) |
170 | | - .arg("-D") |
171 | | - .arg("ANDROID_PLATFORM=".to_owned() + &android_platform) |
172 | | - .arg(repo_dir.to_str().unwrap()) |
173 | | - .output() |
174 | | - .expect("failed to execute CMake"); |
175 | | - |
176 | | - println!("status: {}", c.status); |
177 | | - std::io::stdout().write_all(&c.stdout).unwrap(); |
178 | | - std::io::stderr().write_all(&c.stderr).unwrap(); |
179 | | - assert!(c.status.success()); |
180 | | - |
181 | | - let m = Command::new("make").output().expect("failed to execute Make"); |
182 | | - println!("status: {}", m.status); |
183 | | - std::io::stdout().write_all(&m.stdout).unwrap(); |
184 | | - std::io::stderr().write_all(&m.stderr).unwrap(); |
185 | | - assert!(m.status.success()); |
186 | | - } else if target.contains("aarch64-apple-darwin") { |
187 | | - let mut c = Command::new("cmake"); |
188 | | - c.arg("-D") |
189 | | - .arg("ARCH=arm64") |
190 | | - .arg("-D") |
191 | | - .arg("ARCH_ID=aarch64") |
192 | | - .arg("-D") |
193 | | - .arg("CMAKE_CROSSCOMPILING=true") |
194 | | - .arg("-D") |
195 | | - .arg("CMAKE_SYSTEM_PROCESSOR=aarch64") |
196 | | - .arg("-D") |
197 | | - .arg("CMAKE_C_FLAGS='-arch arm64'") |
198 | | - .arg("-D") |
199 | | - .arg("CMAKE_CXX_FLAGS='-arch arm64'"); |
200 | | - if let Ok(env) = env::var("RANDOMX_RS_CMAKE_OSX_SYSROOT") { |
201 | | - c.arg("-D").arg("CMAKE_OSX_SYSROOT=".to_owned() + env.as_str()); |
202 | | - } |
203 | | - let output = c |
204 | | - .arg(repo_dir.to_str().unwrap()) |
205 | | - .output() |
206 | | - .expect("failed to execute CMake"); |
207 | | - println!("status: {}", output.status); |
208 | | - std::io::stdout().write_all(&output.stdout).unwrap(); |
209 | | - std::io::stderr().write_all(&output.stderr).unwrap(); |
210 | | - assert!(output.status.success()); |
211 | | - |
212 | | - let m = Command::new("cmake") |
213 | | - .arg("--build") |
214 | | - .arg(".") |
215 | | - .arg("--config") |
216 | | - .arg("Release") |
217 | | - .output() |
218 | | - .expect("failed to execute Make"); |
219 | | - println!("status: {}", m.status); |
220 | | - std::io::stdout().write_all(&m.stdout).unwrap(); |
221 | | - std::io::stderr().write_all(&m.stderr).unwrap(); |
222 | | - assert!(m.status.success()); |
223 | | - } else { |
224 | | - let c = Command::new("cmake") |
225 | | - .arg(repo_dir.to_str().unwrap()) |
226 | | - .output() |
227 | | - .expect("failed to execute CMake"); |
228 | | - println!("status: {}", c.status); |
229 | | - std::io::stdout().write_all(&c.stdout).unwrap(); |
230 | | - std::io::stderr().write_all(&c.stderr).unwrap(); |
231 | | - assert!(c.status.success()); |
232 | | - |
233 | | - let m = Command::new("make").output().expect("failed to execute Make"); |
234 | | - println!("status: {}", m.status); |
235 | | - std::io::stdout().write_all(&m.stdout).unwrap(); |
236 | | - std::io::stderr().write_all(&m.stderr).unwrap(); |
237 | | - assert!(m.status.success()); |
238 | | - } |
239 | | - |
240 | | - env::set_current_dir(Path::new(&project_dir)).unwrap(); // change path back to main project |
241 | | - |
242 | | - if target.contains("windows") { |
243 | | - let include = &build_dir.join("Release"); |
244 | | - println!("cargo:rustc-link-search=native={}", &include.to_str().unwrap()); |
245 | | - println!("cargo:rustc-link-lib=static=randomx"); |
246 | | - } else { |
247 | | - println!("cargo:rustc-link-search=native={}", &build_dir.to_str().unwrap()); |
248 | | - println!("cargo:rustc-link-lib=static=randomx"); |
249 | | - } // link to RandomX |
250 | | - |
251 | | - if target.contains("apple") || target.contains("android") || target.contains("freebsd") { |
252 | | - println!("cargo:rustc-link-lib=dylib=c++"); |
253 | | - } else if target.contains("linux") { |
254 | | - println!("cargo:rustc-link-lib=dylib=stdc++"); |
255 | | - } else if target.contains("windows") { |
256 | | - // println!("cargo:rustc-link-lib=dylib=c++"); |
257 | | - } else { |
258 | | - unimplemented!(); |
259 | | - } |
| 29 | + let randomx_path = Config::new(env::var("RANDOMX_DIR").unwrap_or_else(|_| "RandomX".to_string())) |
| 30 | + .define("DARCH", "native") |
| 31 | + .build(); |
| 32 | + println!("cargo:rustc-link-search=native={}/lib", randomx_path.display()); |
| 33 | + println!("cargo:rustc-link-lib=static=randomx"); |
| 34 | + let target_os = env::var("CARGO_CFG_TARGET_OS").unwrap_or("linux".to_string()); |
| 35 | + let dylib_name = match target_os.as_str() { |
| 36 | + "macos" | "ios" => "c++", |
| 37 | + _ => "stdc++", |
| 38 | + }; |
| 39 | + println!("cargo:rustc-link-lib=dylib={}", dylib_name); |
260 | 40 | } |
0 commit comments