-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbuild.rs
121 lines (101 loc) · 3.5 KB
/
build.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
// SPDX-FileCopyrightText: 2024 Darshan Phaldesai <[email protected]>
// SPDX-License-Identifier: MPL-2.0
use std::path::PathBuf;
use cmake_package::find_package;
use cxx_qt_build::CxxQtBuilder;
// list of (LibraryName, [LibraryTargets])
const LIBRARIES: &[(&str, &[&str])] = &[
("KF6CoreAddons", &["KF6::CoreAddons"]),
("KF6I18n", &["KF6::I18n"]),
("KF6Crash", &["KF6::Crash"]),
("KF6IconThemes", &["KF6::IconThemes"]),
("KF6ConfigWidgets", &["KF6::ConfigWidgets"]),
];
fn main() {
write_headers();
let interface = cxx_qt_build::Interface::default()
.export_include_prefixes([])
.export_include_directory(header_dir(), "cxx-kde-frameworks")
.reexport_dependency("cxx-qt-lib");
let mut builder = CxxQtBuilder::library(interface);
builder = setup_linker(builder);
let rust_files = vec![
"kcoreaddons/kaboutdata",
"kcoreaddons/kformat",
"ki18n/klocalizedcontext",
"ki18n/klocalizedstring",
"kcrash/kcrash",
"kiconthemes/kicontheme",
"kconfigwidgets/kstylemanager",
];
for source in &rust_files {
builder = builder.file(format!("src/{source}.rs"))
}
let cpp_files = vec![
"kcoreaddons/kaboutdata",
"kcoreaddons/kformat",
"ki18n/klocalizedcontext",
"ki18n/klocalizedstring",
"kcrash/kcrash",
"kiconthemes/kicontheme",
];
builder = builder.cc_builder(move |cc| {
for file in &cpp_files {
cc.file(format!("src/{file}.cpp"));
println!("cargo:rerun-if-changed=src/{file}.cpp");
}
});
builder.build();
}
fn write_headers() {
println!("cargo::rerun-if-changed=include/");
std::fs::create_dir_all(header_dir()).expect("Failed to create include directory");
write_headers_in("kcoreaddons");
write_headers_in("ki18n");
write_headers_in("kcrash");
write_headers_in("kiconthemes");
write_headers_in("kconfigwidgets");
}
fn write_headers_in(subfolder: &str) {
println!("cargo::rerun-if-changed=include/{subfolder}");
for entry in
std::fs::read_dir(format!("include/{subfolder}")).expect("Failed to read include directory")
{
let entry = entry.expect("Failed to read header file!");
let header_name = entry.file_name();
println!(
"cargo::rerun-if-changed=include/{subfolder}/{header_name}",
header_name = header_name.to_string_lossy()
);
// TODO: Do we want to add the headers into a subdirectory?
std::fs::copy(entry.path(), header_dir().join(header_name))
.expect("Failed to copy header file!");
}
}
fn header_dir() -> PathBuf {
PathBuf::from(std::env::var("OUT_DIR").unwrap())
.join("include")
.join("cxx-kde-frameworks")
}
fn setup_linker(builder: CxxQtBuilder) -> CxxQtBuilder {
let mut directories = Vec::new();
for (name, targets) in LIBRARIES {
match find_package(*name).find() {
Err(err) => panic!("Cannot find {name}: {err:?}"),
Ok(package) => {
for target in *targets {
let cmake_target = package.target(target.to_owned()).unwrap();
cmake_target.link();
for dir in cmake_target.include_directories {
directories.push(dir);
}
}
}
}
}
builder.cc_builder(move |cc| {
for dir in &directories {
cc.include(dir);
}
})
}