diff options
-rw-r--r-- | Cargo.toml | 1 | ||||
-rw-r--r-- | build.rs | 101 | ||||
-rw-r--r-- | examples/hello-world.rs | 2 | ||||
-rw-r--r-- | src/lib.rs | 2 | ||||
-rw-r--r-- | src/wx-sys.cpp | 4 | ||||
-rw-r--r-- | src/wx-sys.h | 2 |
6 files changed, 9 insertions, 103 deletions
@@ -11,3 +11,4 @@ anyhow = "1.0.44" cxx-build = "1.0" ureq = "2.3.0" url = "2.2.2" +vcpkg = "0.2.15" @@ -1,59 +1,6 @@ use std::env; -use std::ffi::{OsStr, OsString}; -use std::fs; -use std::io; -use std::path::{Path, PathBuf}; -use anyhow::{anyhow, ensure, Result}; -use url::Url; - -// there's probably a crate for this somewhere -fn os_concat(a: impl AsRef<OsStr>, b: impl AsRef<OsStr>) -> OsString { - let mut result = OsString::from(&a); - result.push(b); - result -} - -fn out_dir() -> PathBuf { - PathBuf::from(env::var_os("OUT_DIR").expect("no OUT_DIR found")) -} - -fn download(url: &str) -> Result<PathBuf> { - let url = Url::parse(url)?; - let file_name = url - .path_segments() - .and_then(|x| x.last()) - .ok_or_else(|| anyhow!("Weird URL downloaded"))?; - let out_path = out_dir().join(file_name); - if !out_path.exists() { - let mut body_reader = ureq::request_url("GET", &url).call()?.into_reader(); - let mut out_file = fs::File::create(&out_path)?; - io::copy(&mut body_reader, &mut out_file)?; - } - Ok(out_path) -} - -fn un7z(archive: PathBuf) -> Result<()> { - // WARNING: This code is horrifying and also bad. - // It should never be used by anyone. - // TODO port the 7zip LZMA SDK to Rust - use std::process::{Command, Stdio}; - let my_7z_exe = Path::new(r"C:\Program Files\7-Zip\7z.exe"); - ensure!(my_7z_exe.exists()); - let output_folder = archive - .parent() - .ok_or_else(|| anyhow!("archive with no parent"))?; - let output_folder_arg = os_concat("-o", &output_folder); - let extract_result = Command::new(my_7z_exe) - .args(["x", "-aos"]) - .arg(output_folder_arg) - .arg(&archive) - .stdin(Stdio::null()) - .stdout(Stdio::null()) - .status()?; - ensure!(extract_result.success()); - Ok(()) -} +use anyhow::Result; fn main() -> Result<()> { println!("cargo:rerun-if-changed=build.rs"); @@ -65,49 +12,12 @@ fn main() -> Result<()> { } } -/* - <Choose> - <When Condition="Exists('lib\vc14x_x64_dll\wxbase31$(wxSuffix).lib')"> - <PropertyGroup Label="UserMacros"> - <wxUsingVersionABICompat>1</wxUsingVersionABICompat> - <wxUsingDll>1</wxUsingDll> - <wxLibOrDllDir>lib\vc14x_x64_dll</wxLibOrDllDir> - </PropertyGroup> - </When> - - <When Condition="Exists('lib\vc14x_x64_lib\wxbase31$(wxSuffix).lib')"> - <PropertyGroup Label="UserMacros"> - <wxUsingVersionABICompat>1</wxUsingVersionABICompat> - <wxUsingLib>1</wxUsingLib> - <wxLibOrDllDir>lib\vc14x_x64_lib</wxLibOrDllDir> - </PropertyGroup> - </When> - </Choose> -*/ - fn build_x64_windows_msvc() -> Result<()> { - let headers = download("https://github.com/wxWidgets/wxWidgets/releases/download/v3.1.5/wxWidgets-3.1.5-headers.7z")?; - un7z(headers)?; - - // TODO make sure VS2015+ is actually the right thing - let libs = download("https://github.com/wxWidgets/wxWidgets/releases/download/v3.1.5/wxMSW-3.1.5_vc14x_x64_Dev.7z")?; - un7z(libs)?; - - let out_dir = out_dir(); - - // TODO consider actually parsing wxwidgets.props at build time instead of doing it manually - // TODO find a static build instead bc fuck DLLs - let libs_folder = out_dir.join("lib/vc14x_x64_dll"); - let debug = env::var("PROFILE")? == "release"; - let wx_suffix = if debug { "u" } else { "ud" }; - - let mut include_dirs = vec![out_dir.join("include/msvc"), out_dir.join("include")]; - // TODO this is only in ResourceCompile in wxwidgets.props, is that bad - include_dirs.push(libs_folder.join(format!("msw{}", wx_suffix))); + let wx = vcpkg::find_package("wxwidgets").unwrap(); cxx_build::bridge("src/lib.rs") .file("src/wx-sys.cpp") - .includes(include_dirs) + .includes(wx.include_paths) .flag_if_supported("-Wno-invalid-token-paste") .define("__WXMSW__", None) .define("wxMSVC_VERSION_AUTO", None) @@ -131,10 +41,5 @@ fn build_x64_windows_msvc() -> Result<()> { // TODO dylib or static println!("cargo:rustc-link-lib={}", lib); } - // TODO is "native=" the right thing there (or display() for that matter) - println!("cargo:rustc-link-search=native={}", libs_folder.display()); - - // TODO which libs do we actually want to link - println!("cargo:rustc-link-lib=static=wxmsw31{}_core", wx_suffix); Ok(()) } diff --git a/examples/hello-world.rs b/examples/hello-world.rs index 9928016..835de22 100644 --- a/examples/hello-world.rs +++ b/examples/hello-world.rs @@ -1,5 +1,5 @@ use shit_wx_sys as wx; fn main() { - wx::message_box(); + wx::message_box("sample text"); } @@ -3,7 +3,7 @@ mod ffi { unsafe extern "C++" { include!("shit-wx-sys/src/wx-sys.h"); - fn message_box(); + fn message_box(message: &str); } } diff --git a/src/wx-sys.cpp b/src/wx-sys.cpp index 8e07962..229b018 100644 --- a/src/wx-sys.cpp +++ b/src/wx-sys.cpp @@ -1,6 +1,6 @@ #include "shit-wx-sys/src/wx-sys.h" #include <wx/msgdlg.h> -void message_box() { - wxMessageBox("Hello World!!!"); +void message_box(rust::Str message) { + wxMessageBox(std::string(message)); } diff --git a/src/wx-sys.h b/src/wx-sys.h index 68c4484..fa649f3 100644 --- a/src/wx-sys.h +++ b/src/wx-sys.h @@ -1,4 +1,4 @@ #include "rust/cxx.h" #include <memory> -void message_box(); +void message_box(rust::Str message); |