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

Commit cafdd01

Browse files
author
Denis Davydov
committed
build.rs: Build fixes for Centos 7
1 parent b9a4c2d commit cafdd01

File tree

5 files changed

+55
-6
lines changed

5 files changed

+55
-6
lines changed

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@ edition = "2018"
88
bitflags = "1"
99

1010
[build-dependencies]
11-
bindgen = "0.54"
11+
bindgen = "0.56"
1212
cc = "1.0"
1313
shlex = "0.1"

build.rs

+34-2
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,14 @@ const OPAQUE_TYPES: &[&str] = &[
5353
// and https://github.com/rust-lang/rust-bindgen/issues/1538
5454
"desc_struct",
5555
"xregs_state",
56+
"xsave_struct",
57+
];
58+
const CLANG_ARGS_BLACKLIST: [&'static str; 5] = [
59+
"-maccumulate-outgoing-args",
60+
"-mpreferred-stack-boundary=3",
61+
"-mindirect-branch=thunk-extern",
62+
"-mindirect-branch-register",
63+
"-fconserve-stack",
5664
];
5765

5866
fn handle_kernel_version_cfg(bindings_path: &PathBuf) {
@@ -86,10 +94,26 @@ fn handle_kernel_version_cfg(bindings_path: &PathBuf) {
8694
}
8795
if major >= 4 {
8896
// We don't currently support anything older than 4.4
89-
for x in 4..=if major > 4 { 20 } else { minor } {
97+
for x in 1..=if major > 4 { 20 } else { minor } {
9098
println!("cargo:rustc-cfg=kernel_4_{}_0_or_greater", x);
9199
}
92100
}
101+
if major >= 3 {
102+
for x in 1..=if major > 3 { 19 } else { minor } {
103+
println!("cargo:rustc-cfg=kernel_3_{}_0_or_greater", x);
104+
}
105+
}
106+
}
107+
108+
fn handle_kernel_rhel_kabi(fs_ops_path: &PathBuf) {
109+
println!("path is {}", fs_ops_path.to_str().unwrap());
110+
let f = BufReader::new(fs::File::open(fs_ops_path).unwrap());
111+
for line in f.lines() {
112+
if line.unwrap().contains("RH_KABI") {
113+
println!("cargo:rustc-cfg=kernel_rh_kabi");
114+
break;
115+
}
116+
}
93117
}
94118

95119
fn handle_kernel_symbols_cfg(symvers_path: &PathBuf) {
@@ -153,6 +177,9 @@ fn main() {
153177

154178
builder = builder.clang_arg(format!("--target={}", target));
155179
for arg in kernel_args.iter() {
180+
if CLANG_ARGS_BLACKLIST.contains(&arg.as_str()) {
181+
continue;
182+
}
156183
builder = builder.clang_arg(arg.clone());
157184
}
158185

@@ -179,16 +206,21 @@ fn main() {
179206
.expect("Couldn't write bindings!");
180207

181208
handle_kernel_version_cfg(&out_path.join("bindings.rs"));
209+
handle_kernel_rhel_kabi(&PathBuf::from(&kernel_dir).parent().unwrap().join("source/include/linux/fs.h"));
182210
handle_kernel_symbols_cfg(&PathBuf::from(&kernel_dir).join("Module.symvers"));
183211

184212
let mut builder = cc::Build::new();
185-
builder.compiler(env::var("CC").unwrap_or_else(|_| "clang".to_string()));
213+
let compiler = env::var("CC").unwrap_or_else(|_| "clang".to_string());
214+
builder.compiler(&compiler);
186215
builder.target(&target);
187216
builder.warnings(false);
188217
println!("cargo:rerun-if-changed=src/helpers.c");
189218
builder.file("src/helpers.c");
190219
for arg in kernel_args.iter() {
191220
builder.flag(&arg);
192221
}
222+
if &compiler == "gcc" {
223+
builder.flag("-fno-pie");
224+
}
193225
builder.compile("helpers");
194226
}

hello-world/Kbuild

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ CARGO ?= cargo
66
export c_flags
77

88
$(src)/target/x86_64-linux-kernel/debug/libhello_world.a: cargo_will_determine_dependencies
9-
cd $(src); $(CARGO) build -Z build-std=core,alloc --target=x86_64-linux-kernel
9+
cd $(src); $(CARGO) +nightly build -Z build-std=core,alloc --target=x86_64-linux-kernel
1010

1111
.PHONY: cargo_will_determine_dependencies
1212

hello-world/Makefile

+8-1
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,19 @@
11
export KDIR ?= /lib/modules/$(shell uname -r)/build
22

3+
CONFIG_CC_IS_CLANG := y
34
CLANG ?= clang
45
ifeq ($(origin CC),default)
56
CC := ${CLANG}
67
endif
78

9+
HEADER_SEMVER ?= $(shell uname -r | grep -oG "[0-9]\+\.[0-9]\+\.[0-9]\+" | head -1)
10+
ifeq ($(shell echo $(HEADER_SEMVER) 4.4.0 | tr " " "\n" | sort -V | head -1), $(HEADER_SEMVER))
11+
CC := gcc
12+
CONFIG_CC_IS_CLANG := n
13+
endif
14+
815
all:
9-
$(MAKE) -C $(KDIR) M=$(CURDIR) CC=$(CC) CONFIG_CC_IS_CLANG=y
16+
$(MAKE) -C $(KDIR) M=$(CURDIR) CC=$(CC) CONFIG_CC_IS_CLANG=$(CONFIG_CC_IS_CLANG)
1017

1118
clean:
1219
$(MAKE) -C $(KDIR) M=$(CURDIR) CC=$(CC) clean

src/file_operations.rs

+11-1
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,12 @@ impl<T: FileOperations> FileOperationsVtable<T> {
159159
} else {
160160
None
161161
},
162-
162+
#[cfg(not(kernel_4_1_0_or_greater))]
163+
aio_read: None,
164+
#[cfg(not(kernel_4_1_0_or_greater))]
165+
aio_write: None,
166+
#[cfg(not(kernel_3_11_0_or_greater))]
167+
readdir: None,
163168
#[cfg(not(kernel_4_9_0_or_greater))]
164169
aio_fsync: None,
165170
check_flags: None,
@@ -189,17 +194,22 @@ impl<T: FileOperations> FileOperationsVtable<T> {
189194
mmap_supported_flags: 0,
190195
owner: ptr::null_mut(),
191196
poll: None,
197+
#[cfg(kernel_3_16_0_or_greater)]
192198
read_iter: None,
193199
#[cfg(kernel_4_20_0_or_greater)]
194200
remap_file_range: None,
195201
sendpage: None,
196202
#[cfg(kernel_aufs_setfl)]
197203
setfl: None,
204+
#[cfg(kernel_rh_kabi)]
205+
__bindgen_anon_1: bindings::file_operations__bindgen_ty_1 { setlease: None },
206+
#[cfg(not(kernel_rh_kabi))]
198207
setlease: None,
199208
show_fdinfo: None,
200209
splice_read: None,
201210
splice_write: None,
202211
unlocked_ioctl: None,
212+
#[cfg(kernel_3_16_0_or_greater)]
203213
write_iter: None,
204214
};
205215
}

0 commit comments

Comments
 (0)