1
1
use super :: collect_versions;
2
- use crate :: { codegen:: general, env:: Env , file_saver:: save_to_file} ;
2
+ use crate :: {
3
+ codegen:: general, env:: Env , file_saver:: save_to_file, library:: MAIN_NAMESPACE , nameutil,
4
+ } ;
3
5
use log:: info;
4
6
use std:: io:: { Result , Write } ;
5
7
6
- pub fn generate ( env : & Env ) {
8
+ pub fn generate ( env : & Env , has_abi_tests : bool ) {
7
9
info ! (
8
10
"Generating sys build script for {}" ,
9
11
env. config. library_name
@@ -15,7 +17,7 @@ pub fn generate(env: &Env) {
15
17
if !split_build_rs || !path. exists ( ) {
16
18
info ! ( "Generating file {:?}" , path) ;
17
19
save_to_file ( & path, env. config . make_backup , |w| {
18
- generate_build_script ( w, env, split_build_rs)
20
+ generate_build_script ( w, env, split_build_rs, has_abi_tests )
19
21
} ) ;
20
22
}
21
23
@@ -29,11 +31,17 @@ pub fn generate(env: &Env) {
29
31
}
30
32
31
33
#[ allow( clippy:: write_literal) ]
32
- fn generate_build_script ( w : & mut dyn Write , env : & Env , split_build_rs : bool ) -> Result < ( ) > {
34
+ fn generate_build_script (
35
+ w : & mut dyn Write ,
36
+ env : & Env ,
37
+ split_build_rs : bool ,
38
+ has_abi_tests : bool ,
39
+ ) -> Result < ( ) > {
33
40
if !split_build_rs {
34
41
general:: start_comments ( w, & env. config ) ?;
35
42
writeln ! ( w) ?;
36
43
}
44
+
37
45
writeln ! (
38
46
w,
39
47
"{}" ,
@@ -55,13 +63,61 @@ fn main() {} // prevent linking libraries to avoid documentation failure
55
63
56
64
#[cfg(not(feature = "dox"))]
57
65
fn main() {
58
- if let Err(s) = system_deps::Config::new().probe() {
66
+ let deps = system_deps::Config::new().probe();
67
+ if let Err(s) = deps {
59
68
println!("cargo:warning={}", s);
60
69
process::exit(1);
70
+ }"##
71
+ ) ?;
72
+
73
+ if has_abi_tests {
74
+ let ns = env. library . namespace ( MAIN_NAMESPACE ) ;
75
+ let package_name = ns. package_name . as_ref ( ) . expect ( "Missing package name" ) ;
76
+ let lib_name = nameutil:: crate_name ( package_name) ;
77
+
78
+ write ! (
79
+ w,
80
+ "{}" ,
81
+ r##"
82
+
83
+ #[cfg(feature = "abi-tests")]
84
+ {
85
+ let deps = deps.unwrap();
86
+ "##
87
+ ) ?;
88
+
89
+ write ! (
90
+ w,
91
+ " let includes = deps.get(\" {}\" ).unwrap().include_paths.clone();" ,
92
+ lib_name
93
+ ) ?;
94
+
95
+ write ! (
96
+ w,
97
+ "{}" ,
98
+ r##"
99
+
100
+ let mut cc = cc::Build::new();
101
+
102
+ cc.flag_if_supported("-Wno-deprecated-declarations");
103
+ cc.flag_if_supported("/std:c11"); // for _Generic
104
+ cc.flag_if_supported("-std=c11"); // for _Generic
105
+
106
+ cc.file("tests/constant.c");
107
+ cc.file("tests/layout.c");
108
+
109
+ for i in includes {
110
+ cc.include(i);
111
+ }
112
+
113
+ cc.compile("cabitests");
114
+ }
61
115
}
62
- }
63
116
"##
64
- )
117
+ )
118
+ } else {
119
+ writeln ! ( w, "}}" )
120
+ }
65
121
}
66
122
67
123
fn generate_build_version ( w : & mut dyn Write , env : & Env ) -> Result < ( ) > {
0 commit comments