fix windows build

This commit is contained in:
John Smith
2022-01-29 13:53:55 -05:00
parent 172730a132
commit 32908dd719
7 changed files with 263 additions and 152 deletions

View File

@@ -1,17 +1,15 @@
use cfg_if::*;
use std::env;
use std::ffi::OsStr;
use std::fs;
use std::path::{Path, PathBuf};
use std::process::Command;
fn resolve_llvm_path() -> Option<PathBuf> {
let paths: Vec<PathBuf> =
env::var_os("PATH").map(|paths| env::split_paths(&paths).collect())?;
cfg_if! {
if #[cfg(target_os="linux")] {
// build host is linux
let paths: Vec<PathBuf> =
env::var_os("PATH").map(|paths| env::split_paths(&paths).collect())?;
// find clang
let d = paths.iter().find_map(|p| {
@@ -36,7 +34,7 @@ fn resolve_llvm_path() -> Option<PathBuf> {
["/opt/homebrew/opt/llvm", "/usr/local/homebrew/opt/llvm"].iter().map(Path::new).find_map(|p| if p.exists() { Some(p.to_owned()) } else { None } )
} else {
// anywhere else, just use the default paths
llvm_path = None;
None
}
}
}
@@ -97,13 +95,28 @@ fn main() {
// Build freezed
// Run: flutter pub run build_runner build
let mut command = Command::new("flutter");
command.args([
OsStr::new("pub"),
OsStr::new("run"),
OsStr::new("build_runner"),
OsStr::new("build"),
]);
let mut command;
cfg_if! {
if #[cfg(target_os="windows")] {
command = Command::new("cmd");
command.args([
OsStr::new("/c"),
OsStr::new("flutter"),
OsStr::new("pub"),
OsStr::new("run"),
OsStr::new("build_runner"),
OsStr::new("build"),
]);
} else {
command = Command::new("flutter");
command.args([
OsStr::new("pub"),
OsStr::new("run"),
OsStr::new("build_runner"),
OsStr::new("build"),
]);
}
}
let mut child = command
.spawn()

View File

@@ -17,8 +17,9 @@ target_include_directories(${PLUGIN_NAME} INTERFACE
"${CMAKE_CURRENT_SOURCE_DIR}/include")
target_link_libraries(${PLUGIN_NAME} PRIVATE flutter flutter_wrapper_plugin)
include(./rust.cmake)
# List of absolute paths to libraries that should be bundled with the plugin
set(veilid_bundled_libraries
""
"$<TARGET_FILE:${CRATE_NAME}-shared>"
PARENT_SCOPE
)
)

View File

@@ -0,0 +1,23 @@
# We include Corrosion inline here, but ideally in a project with
# many dependencies we would need to install Corrosion on the system.
# See instructions on https://github.com/AndrewGaspar/corrosion#cmake-install
# Once done, uncomment this line:
# find_package(Corrosion REQUIRED)
include(FetchContent)
FetchContent_Declare(
Corrosion
GIT_REPOSITORY https://github.com/AndrewGaspar/corrosion.git
GIT_TAG origin/master # Optionally specify a version tag or branch here
)
FetchContent_MakeAvailable(Corrosion)
corrosion_import_crate(MANIFEST_PATH ${CMAKE_SOURCE_DIR}/../../rust/Cargo.toml)
# Flutter-specific
set(CRATE_NAME "veilid-flutter")
target_link_libraries(${PLUGIN_NAME} PUBLIC ${CRATE_NAME})
# list(APPEND PLUGIN_BUNDLED_LIBRARIES $<TARGET_FILE:${CRATE_NAME}-shared>)

View File

@@ -28,54 +28,54 @@ namespace
private:
// Called when a method is called on this plugin's channel from Dart.
void HandleMethodCall(
const flutter::MethodCall<flutter::EncodableValue> &method_call,
std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
// void HandleMethodCall(
// const flutter::MethodCall<flutter::EncodableValue> &method_call,
// std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
};
// static
void VeilidPlugin::RegisterWithRegistrar(
flutter::PluginRegistrarWindows *registrar)
{
auto channel =
std::make_unique<flutter::MethodChannel<flutter::EncodableValue>>(
registrar->messenger(), "veilid",
&flutter::StandardMethodCodec::GetInstance());
// auto channel =
// std::make_unique<flutter::MethodChannel<flutter::EncodableValue>>(
// registrar->messenger(), "veilid",
// &flutter::StandardMethodCodec::GetInstance());
auto plugin = std::make_unique<VeilidPlugin>();
// auto plugin = std::make_unique<VeilidPlugin>();
channel->SetMethodCallHandler(
[plugin_pointer = plugin.get()](const auto &call, auto result)
{
plugin_pointer->HandleMethodCall(call, std::move(result));
});
// channel->SetMethodCallHandler(
// [plugin_pointer = plugin.get()](const auto &call, auto result)
// {
// plugin_pointer->HandleMethodCall(call, std::move(result));
// });
registrar->AddPlugin(std::move(plugin));
// registrar->AddPlugin(std::move(plugin));
}
VeilidPlugin::VeilidPlugin() {}
VeilidPlugin::~VeilidPlugin() {}
void VeilidPlugin::HandleMethodCall(
const flutter::MethodCall<flutter::EncodableValue> &method_call,
std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result)
{
// if (method_call.method_name().compare("getPlatformVersion") == 0) {
// std::ostringstream version_stream;
// version_stream << "Windows ";
// if (IsWindows10OrGreater()) {
// version_stream << "10+";
// } else if (IsWindows8OrGreater()) {
// version_stream << "8";
// } else if (IsWindows7OrGreater()) {
// version_stream << "7";
// }
// result->Success(flutter::EncodableValue(version_stream.str()));
// } else {
result->NotImplemented();
// }
}
// void VeilidPlugin::HandleMethodCall(
// const flutter::MethodCall<flutter::EncodableValue> &method_call,
// std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result)
// {
// // if (method_call.method_name().compare("getPlatformVersion") == 0) {
// // std::ostringstream version_stream;
// // version_stream << "Windows ";
// // if (IsWindows10OrGreater()) {
// // version_stream << "10+";
// // } else if (IsWindows8OrGreater()) {
// // version_stream << "8";
// // } else if (IsWindows7OrGreater()) {
// // version_stream << "7";
// // }
// // result->Success(flutter::EncodableValue(version_stream.str()));
// // } else {
// result->NotImplemented();
// // }
// }
} // namespace