Skip to content

Commit 836d844

Browse files
committed
ui-sys: remove cmake dependency for windows
Remove the need to call `cmake` on Windows. This is the first commit in a series that allows for statically building programs without external dependencies. Signed-off-by: Sean Cross <[email protected]>
1 parent 1e0b398 commit 836d844

File tree

2 files changed

+139
-26
lines changed

2 files changed

+139
-26
lines changed

ui-sys/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,6 @@ build = []
4848
libc = "0.2"
4949

5050
[build-dependencies]
51-
cmake = "0.1"
5251
bindgen = "0.31"
53-
52+
cc = "1.0"
53+
embed-resource = "1.3"

ui-sys/build.rs

Lines changed: 137 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
extern crate cmake;
21
extern crate bindgen;
2+
extern crate cc;
3+
extern crate embed_resource;
34

4-
use cmake::Config;
55
use bindgen::Builder as BindgenBuilder;
66

77
use std::env;
@@ -43,38 +43,151 @@ fn main() {
4343
.expect("Couldn't write bindings");
4444

4545
// Deterimine build platform
46-
let target = env::var("TARGET").unwrap();
47-
let msvc = target.contains("msvc");
48-
let apple = target.contains("apple");
46+
let target_os = env::var("CARGO_CFG_TARGET_OS").unwrap();
47+
let target_triple = env::var("TARGET").unwrap();
48+
let msvc = target_triple.contains("msvc");
49+
let apple = target_triple.contains("apple");
4950

5051
// Build libui if needed. Otherwise, assume it's in lib/
51-
let mut dst;
5252
if cfg!(feature = "build") {
53-
let mut cfg = Config::new("libui");
54-
cfg.build_target("").profile("release");
55-
if apple {
56-
cfg.cxxflag("--stdlib=libc++");
57-
}
58-
dst = cfg.build();
53+
let mut base_config = cc::Build::new();
54+
let src_base = env::var("SRC_BASE").unwrap_or("libui".to_string());
55+
56+
base_config.include(format!("{}{}", src_base, "/common"));
57+
58+
base_config.file(format!("{}{}", src_base, "/common/attribute.c"));
59+
base_config.file(format!("{}{}", src_base, "/common/attrlist.c"));
60+
base_config.file(format!("{}{}", src_base, "/common/attrstr.c"));
61+
base_config.file(format!("{}{}", src_base, "/common/areaevents.c"));
62+
base_config.file(format!("{}{}", src_base, "/common/control.c"));
63+
base_config.file(format!("{}{}", src_base, "/common/debug.c"));
64+
base_config.file(format!("{}{}", src_base, "/common/matrix.c"));
65+
base_config.file(format!("{}{}", src_base, "/common/opentype.c"));
66+
base_config.file(format!("{}{}", src_base, "/common/shouldquit.c"));
67+
base_config.file(format!("{}{}", src_base, "/common/tablemodel.c"));
68+
base_config.file(format!("{}{}", src_base, "/common/tablevalue.c"));
69+
base_config.file(format!("{}{}", src_base, "/common/userbugs.c"));
70+
base_config.file(format!("{}{}", src_base, "/common/utf.c"));
71+
72+
if target_os == "windows" {
73+
base_config.cpp(true);
74+
base_config.include(format!("{}{}", src_base, "/windows"));
75+
76+
base_config.file(format!("{}{}", src_base, "/windows/alloc.cpp"));
77+
base_config.file(format!("{}{}", src_base, "/windows/area.cpp"));
78+
base_config.file(format!("{}{}", src_base, "/windows/areadraw.cpp"));
79+
base_config.file(format!("{}{}", src_base, "/windows/areaevents.cpp"));
80+
base_config.file(format!("{}{}", src_base, "/windows/areascroll.cpp"));
81+
base_config.file(format!("{}{}", src_base, "/windows/areautil.cpp"));
82+
base_config.file(format!("{}{}", src_base, "/windows/attrstr.cpp"));
83+
base_config.file(format!("{}{}", src_base, "/windows/box.cpp"));
84+
base_config.file(format!("{}{}", src_base, "/windows/button.cpp"));
85+
base_config.file(format!("{}{}", src_base, "/windows/checkbox.cpp"));
86+
base_config.file(format!("{}{}", src_base, "/windows/colorbutton.cpp"));
87+
base_config.file(format!("{}{}", src_base, "/windows/colordialog.cpp"));
88+
base_config.file(format!("{}{}", src_base, "/windows/combobox.cpp"));
89+
base_config.file(format!("{}{}", src_base, "/windows/container.cpp"));
90+
base_config.file(format!("{}{}", src_base, "/windows/control.cpp"));
91+
base_config.file(format!("{}{}", src_base, "/windows/d2dscratch.cpp"));
92+
base_config.file(format!("{}{}", src_base, "/windows/datetimepicker.cpp"));
93+
base_config.file(format!("{}{}", src_base, "/windows/debug.cpp"));
94+
base_config.file(format!("{}{}", src_base, "/windows/draw.cpp"));
95+
base_config.file(format!("{}{}", src_base, "/windows/drawmatrix.cpp"));
96+
base_config.file(format!("{}{}", src_base, "/windows/drawpath.cpp"));
97+
base_config.file(format!("{}{}", src_base, "/windows/drawtext.cpp"));
98+
base_config.file(format!("{}{}", src_base, "/windows/dwrite.cpp"));
99+
base_config.file(format!("{}{}", src_base, "/windows/editablecombo.cpp"));
100+
base_config.file(format!("{}{}", src_base, "/windows/entry.cpp"));
101+
base_config.file(format!("{}{}", src_base, "/windows/events.cpp"));
102+
base_config.file(format!("{}{}", src_base, "/windows/fontbutton.cpp"));
103+
base_config.file(format!("{}{}", src_base, "/windows/fontdialog.cpp"));
104+
base_config.file(format!("{}{}", src_base, "/windows/fontmatch.cpp"));
105+
base_config.file(format!("{}{}", src_base, "/windows/form.cpp"));
106+
base_config.file(format!("{}{}", src_base, "/windows/graphemes.cpp"));
107+
base_config.file(format!("{}{}", src_base, "/windows/grid.cpp"));
108+
base_config.file(format!("{}{}", src_base, "/windows/group.cpp"));
109+
base_config.file(format!("{}{}", src_base, "/windows/image.cpp"));
110+
base_config.file(format!("{}{}", src_base, "/windows/init.cpp"));
111+
base_config.file(format!("{}{}", src_base, "/windows/label.cpp"));
112+
base_config.file(format!("{}{}", src_base, "/windows/main.cpp"));
113+
base_config.file(format!("{}{}", src_base, "/windows/menu.cpp"));
114+
base_config.file(format!("{}{}", src_base, "/windows/multilineentry.cpp"));
115+
base_config.file(format!("{}{}", src_base, "/windows/opentype.cpp"));
116+
base_config.file(format!("{}{}", src_base, "/windows/parent.cpp"));
117+
base_config.file(format!("{}{}", src_base, "/windows/progressbar.cpp"));
118+
base_config.file(format!("{}{}", src_base, "/windows/radiobuttons.cpp"));
119+
base_config.file(format!("{}{}", src_base, "/windows/separator.cpp"));
120+
base_config.file(format!("{}{}", src_base, "/windows/sizing.cpp"));
121+
base_config.file(format!("{}{}", src_base, "/windows/slider.cpp"));
122+
base_config.file(format!("{}{}", src_base, "/windows/spinbox.cpp"));
123+
base_config.file(format!("{}{}", src_base, "/windows/stddialogs.cpp"));
124+
base_config.file(format!("{}{}", src_base, "/windows/tab.cpp"));
125+
base_config.file(format!("{}{}", src_base, "/windows/table.cpp"));
126+
base_config.file(format!("{}{}", src_base, "/windows/tabledispinfo.cpp"));
127+
base_config.file(format!("{}{}", src_base, "/windows/tabledraw.cpp"));
128+
base_config.file(format!("{}{}", src_base, "/windows/tableediting.cpp"));
129+
base_config.file(format!("{}{}", src_base, "/windows/tablemetrics.cpp"));
130+
base_config.file(format!("{}{}", src_base, "/windows/tabpage.cpp"));
131+
base_config.file(format!("{}{}", src_base, "/windows/text.cpp"));
132+
base_config.file(format!("{}{}", src_base, "/windows/utf16.cpp"));
133+
base_config.file(format!("{}{}", src_base, "/windows/utilwin.cpp"));
134+
base_config.file(format!("{}{}", src_base, "/windows/window.cpp"));
135+
base_config.file(format!("{}{}", src_base, "/windows/winpublic.cpp"));
136+
base_config.file(format!("{}{}", src_base, "/windows/winutil.cpp"));
137+
138+
// See https://github.com/nabijaczleweli/rust-embed-resource/issues/11
139+
let target = env::var("TARGET").unwrap();
140+
if let Some(tool) = cc::windows_registry::find_tool(target.as_str(), "cl.exe") {
141+
for (key, value) in tool.env() {
142+
env::set_var(key, value);
143+
}
144+
}
145+
embed_resource::compile(format!("{}{}", src_base, "/windows/resources.rc"));
59146

60-
let mut postfix = Path::new("build").join("out");
61-
if msvc {
62-
postfix = postfix.join("Release");
147+
link("user32", false);
148+
link("kernel32", false);
149+
link("gdi32", false);
150+
link("comctl32", false);
151+
link("uxtheme", false);
152+
link("msimg32", false);
153+
link("comdlg32", false);
154+
link("d2d1", false);
155+
link("dwrite", false);
156+
link("ole32", false);
157+
link("oleaut32", false);
158+
link("oleacc", false);
159+
link("uuid", false);
160+
link("windowscodecs", false);
63161
}
64-
dst = dst.join(&postfix);
162+
base_config.compile("libui.a");
65163
} else {
66-
dst = env::current_dir()
67-
.expect("Unable to retrieve current directory location.");
164+
// If we're not building the library, then assume it's pre-built and exists in `lib/`
165+
let mut dst = env::current_dir().expect("Unable to retrieve current directory location.");
68166
dst.push("lib");
167+
168+
let libname = if msvc { "libui" } else { "ui" };
169+
170+
println!("cargo:rustc-link-search=native={}", dst.display());
171+
println!("cargo:rustc-link-lib={}", libname);
69172
}
173+
}
70174

71-
let libname;
72-
if msvc {
73-
libname = "libui";
175+
/// Tell cargo to link the given library, and optionally to bundle it in.
176+
pub fn link(name: &str, bundled: bool) {
177+
let target = env::var("TARGET").unwrap();
178+
let target: Vec<_> = target.split('-').collect();
179+
if target.get(2) == Some(&"windows") {
180+
println!("cargo:rustc-link-lib=dylib={}", name);
181+
if bundled && target.get(3) == Some(&"gnu") {
182+
let dir = env::var("CARGO_MANIFEST_DIR").unwrap();
183+
println!("cargo:rustc-link-search=native={}/{}", dir, target[0]);
184+
}
74185
} else {
75-
libname = "ui";
186+
println!("cargo:rustc-link-lib=dylib={}", name);
76187
}
188+
}
77189

78-
println!("cargo:rustc-link-search=native={}", dst.display());
79-
println!("cargo:rustc-link-lib={}", libname);
190+
/// Add the given framework to the linker path
191+
pub fn link_framework(name: &str) {
192+
println!("cargo:rustc-link-lib=framework={}", name);
80193
}

0 commit comments

Comments
 (0)