Allow explicit adding of include directories and libraries to link
parent
39adad3b5e
commit
5c5126d84b
64
src/build.rs
64
src/build.rs
|
@ -3,6 +3,7 @@ extern crate cc;
|
||||||
use super::{generate_bindings, read_bindings_file, Config};
|
use super::{generate_bindings, read_bindings_file, Config};
|
||||||
use regex::Regex;
|
use regex::Regex;
|
||||||
use serde_xml_rs::deserialize;
|
use serde_xml_rs::deserialize;
|
||||||
|
use std::env::var;
|
||||||
use std::io::{self, Write};
|
use std::io::{self, Write};
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
use std::process::Command;
|
use std::process::Command;
|
||||||
|
@ -73,8 +74,25 @@ fn run(cmd: &str, command: &mut Command) -> Vec<u8> {
|
||||||
|
|
||||||
/// Query a Qt environment variable via qmake.
|
/// Query a Qt environment variable via qmake.
|
||||||
fn qmake_query(var: &str) -> String {
|
fn qmake_query(var: &str) -> String {
|
||||||
String::from_utf8(run("qmake", Command::new("qmake").args(&["-query", var])))
|
let v = String::from_utf8(run("qmake", Command::new("qmake").args(&["-query", var])))
|
||||||
.expect("qmake output was not valid UTF-8")
|
.expect("qmake output was not valid UTF-8");
|
||||||
|
v.trim().to_string()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn qt_include_path() -> PathBuf {
|
||||||
|
let qt_include_path = PathBuf::from(qmake_query("QT_INSTALL_HEADERS"));
|
||||||
|
if qt_include_path.exists() {
|
||||||
|
return qt_include_path;
|
||||||
|
}
|
||||||
|
// NixOS workaround: get value from CMAKE env variable
|
||||||
|
let path = var("CMAKE_INCLUDE_PATH").expect("CMAKE_INCLUDE_PATH is not set");
|
||||||
|
let paths = path.split(':');
|
||||||
|
for path in paths {
|
||||||
|
if path.contains("qtbase") {
|
||||||
|
return path.into();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
panic!("Could not find QT_INSTALL_HEADERS")
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Version {
|
struct Version {
|
||||||
|
@ -172,6 +190,7 @@ pub enum QtModule {
|
||||||
/// This struct is meant to be used in a `build.rs` script.
|
/// This struct is meant to be used in a `build.rs` script.
|
||||||
pub struct Build {
|
pub struct Build {
|
||||||
qt_library_path: PathBuf,
|
qt_library_path: PathBuf,
|
||||||
|
qt_include_path: PathBuf,
|
||||||
out_dir: PathBuf,
|
out_dir: PathBuf,
|
||||||
build: cc::Build,
|
build: cc::Build,
|
||||||
bindings: Vec<PathBuf>,
|
bindings: Vec<PathBuf>,
|
||||||
|
@ -179,6 +198,7 @@ pub struct Build {
|
||||||
h: Vec<PathBuf>,
|
h: Vec<PathBuf>,
|
||||||
cpp: Vec<PathBuf>,
|
cpp: Vec<PathBuf>,
|
||||||
modules: Vec<QtModule>,
|
modules: Vec<QtModule>,
|
||||||
|
link_libs: Vec<PathBuf>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Build {
|
impl Build {
|
||||||
|
@ -201,14 +221,15 @@ impl Build {
|
||||||
/// }
|
/// }
|
||||||
/// ```
|
/// ```
|
||||||
pub fn new<P: AsRef<Path>>(out_dir: P) -> Build {
|
pub fn new<P: AsRef<Path>>(out_dir: P) -> Build {
|
||||||
let qt_include_path = qmake_query("QT_INSTALL_HEADERS");
|
let qt_include_path = qt_include_path();
|
||||||
let mut build = cc::Build::new();
|
let mut build = cc::Build::new();
|
||||||
build
|
build
|
||||||
.cpp(true)
|
.cpp(true)
|
||||||
.include(out_dir.as_ref())
|
.include(out_dir.as_ref())
|
||||||
.include(qt_include_path.trim());
|
.include(&qt_include_path);
|
||||||
Build {
|
Build {
|
||||||
qt_library_path: qmake_query("QT_INSTALL_LIBS").trim().into(),
|
qt_library_path: qmake_query("QT_INSTALL_LIBS").into(),
|
||||||
|
qt_include_path: PathBuf::from(qt_include_path),
|
||||||
out_dir: out_dir.as_ref().to_path_buf(),
|
out_dir: out_dir.as_ref().to_path_buf(),
|
||||||
build,
|
build,
|
||||||
bindings: Vec::new(),
|
bindings: Vec::new(),
|
||||||
|
@ -216,6 +237,7 @@ impl Build {
|
||||||
h: Vec::new(),
|
h: Vec::new(),
|
||||||
cpp: Vec::new(),
|
cpp: Vec::new(),
|
||||||
modules: vec![QtModule::Core],
|
modules: vec![QtModule::Core],
|
||||||
|
link_libs: Vec::new(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/// Add a bindings file to be processed.
|
/// Add a bindings file to be processed.
|
||||||
|
@ -249,6 +271,32 @@ impl Build {
|
||||||
self.cpp.push(path.as_ref().to_path_buf());
|
self.cpp.push(path.as_ref().to_path_buf());
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
/// Add the path to the paths includes for headers.
|
||||||
|
pub fn include_path<P: AsRef<Path>>(&mut self, path: P) -> &mut Build {
|
||||||
|
self.build.include(path);
|
||||||
|
self
|
||||||
|
}
|
||||||
|
/// Link to the specified library.
|
||||||
|
pub fn link_lib<P: AsRef<Path>>(&mut self, path: P) -> &mut Build {
|
||||||
|
self.link_libs.push(path.as_ref().to_path_buf());
|
||||||
|
self
|
||||||
|
}
|
||||||
|
fn print_link_libs(&self) {
|
||||||
|
for path in &self.link_libs {
|
||||||
|
if let Some(parent) = path.parent() {
|
||||||
|
println!("cargo:rustc-link-search=native={}", parent.display());
|
||||||
|
}
|
||||||
|
if let Some(name) = path.file_name().and_then(|a| a.to_str()) {
|
||||||
|
// remove 'lib' prefix and '.so...' suffix
|
||||||
|
let name = if let Some(pos) = name.find('.') {
|
||||||
|
&name[3..pos]
|
||||||
|
} else {
|
||||||
|
&name[3..]
|
||||||
|
};
|
||||||
|
println!("cargo:rustc-link-lib={}", name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
/// Add a Qt module to be linked to the executable
|
/// Add a Qt module to be linked to the executable
|
||||||
pub fn module(&mut self, module: QtModule) -> &mut Build {
|
pub fn module(&mut self, module: QtModule) -> &mut Build {
|
||||||
self.modules.push(module);
|
self.modules.push(module);
|
||||||
|
@ -276,6 +324,11 @@ impl Build {
|
||||||
compile_inputs.push(cpp);
|
compile_inputs.push(cpp);
|
||||||
self.build.file(cpp);
|
self.build.file(cpp);
|
||||||
}
|
}
|
||||||
|
// add the Qt module include folders
|
||||||
|
for module in &self.modules {
|
||||||
|
self.build
|
||||||
|
.include(self.qt_include_path.join(&format!("Qt{:?}", module)));
|
||||||
|
}
|
||||||
let lib = self.out_dir.join(&format!("lib{}.a", lib_name));
|
let lib = self.out_dir.join(&format!("lib{}.a", lib_name));
|
||||||
if should_run(&compile_inputs, &[&lib]) {
|
if should_run(&compile_inputs, &[&lib]) {
|
||||||
self.build.compile(lib_name);
|
self.build.compile(lib_name);
|
||||||
|
@ -289,6 +342,7 @@ impl Build {
|
||||||
for module in &self.modules {
|
for module in &self.modules {
|
||||||
println!("cargo:rustc-link-lib=Qt5{:?}", module);
|
println!("cargo:rustc-link-lib=Qt5{:?}", module);
|
||||||
}
|
}
|
||||||
|
self.print_link_libs();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue