Skip to content
This repository was archived by the owner on Mar 7, 2021. It is now read-only.

Commit c69a902

Browse files
committed
Update build process to integrate with kernel patches
1 parent 998c374 commit c69a902

File tree

2 files changed

+26
-20
lines changed

2 files changed

+26
-20
lines changed

build.rs

+26-17
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ use shlex;
44

55
use std::io::{BufRead, BufReader};
66
use std::path::PathBuf;
7-
use std::process::Command;
87
use std::{env, fs};
98

109
const INCLUDED_TYPES: &[&str] = &["file_system_type", "mode_t", "umode_t", "ctl_table"];
@@ -85,32 +84,43 @@ fn handle_kernel_version_cfg(bindings_path: &PathBuf) {
8584
}
8685
}
8786

87+
fn prepare_cflags(cflags: &str, kernel_dir: &str) -> Vec<String> {
88+
let cflag_parts = shlex::split(&cflags).unwrap();
89+
let mut cflag_iter = cflag_parts.iter();
90+
let mut kernel_args = vec![];
91+
while let Some(arg) = cflag_iter.next() {
92+
if arg.starts_with("-I") {
93+
kernel_args.push(format!("-I{}/{}", kernel_dir, &arg[2..]));
94+
} else if arg == "-include" {
95+
kernel_args.push(arg.to_string());
96+
kernel_args.push(format!("{}/{}", kernel_dir, cflag_iter.next().unwrap()));
97+
} else {
98+
kernel_args.push(arg.to_string());
99+
}
100+
}
101+
return kernel_args;
102+
}
103+
88104
fn main() {
89105
println!("cargo:rerun-if-env-changed=KDIR");
90106
println!("cargo:rerun-if-env-changed=CLANG");
107+
println!("cargo:rerun-if-env-changed=KERNEL_CLFAGS");
91108
println!("cargo:rerun-if-changed=kernel-cflags-finder/Makefile");
92-
let output = Command::new("make")
93-
.arg("-C")
94-
.arg("kernel-cflags-finder")
95-
.arg("-s")
96-
.output()
97-
.unwrap();
98-
if !output.status.success() {
99-
eprintln!("kernel-cflags-finder did not succeed");
100-
eprintln!("stdout: {}", std::str::from_utf8(&output.stdout).unwrap());
101-
eprintln!("stderr: {}", std::str::from_utf8(&output.stderr).unwrap());
102-
std::process::exit(1);
103-
}
109+
110+
let kernel_cflags = env::var("KERNEL_CLFAGS").expect("Must be invoked from kernel makefile");
111+
let kernel_dir = env::var("KDIR").expect("Must be invoked from kernel makefile");
112+
let kernel_args = prepare_cflags(&kernel_cflags, &kernel_dir);
104113

105114
let mut builder = bindgen::Builder::default()
106115
.use_core()
107116
.ctypes_prefix("c_types")
108117
.derive_default(true)
109118
.rustfmt_bindings(true);
110119

120+
// TODO: parameterize
111121
builder = builder.clang_arg("--target=x86_64-linux-kernel");
112-
for arg in shlex::split(std::str::from_utf8(&output.stdout).unwrap()).unwrap() {
113-
builder = builder.clang_arg(arg.to_string());
122+
for arg in kernel_args.iter() {
123+
builder = builder.clang_arg(arg.clone());
114124
}
115125

116126
println!("cargo:rerun-if-changed=src/bindings_helper.h");
@@ -138,12 +148,11 @@ fn main() {
138148
handle_kernel_version_cfg(&out_path.join("bindings.rs"));
139149

140150
let mut builder = cc::Build::new();
141-
println!("cargo:rerun-if-env-changed=CLANG");
142151
builder.compiler(env::var("CLANG").unwrap_or("clang".to_string()));
143152
builder.target("x86_64-linux-kernel");
144153
builder.warnings(false);
145154
builder.file("src/helpers.c");
146-
for arg in shlex::split(std::str::from_utf8(&output.stdout).unwrap()).unwrap() {
155+
for arg in kernel_args.iter() {
147156
builder.flag(&arg);
148157
}
149158
builder.compile("helpers");

hello-world/Makefile

-3
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,6 @@ obj-m := helloworld.o
22
helloworld-objs := hello_world.rust.o
33
KDIR ?= /lib/modules/$(shell uname -r)/build
44

5-
%.rust.o: target/x86_64-linux-kernel/debug/lib%.a
6-
$(LD) -r -o $@ --whole-archive $<
7-
85
all:
96
$(MAKE) -C $(KDIR) M=$(CURDIR)
107

0 commit comments

Comments
 (0)