1
1
use std:: env;
2
+ use std:: env:: VarError ;
2
3
use std:: io:: { Error , ErrorKind } ;
3
4
use std:: path:: Path ;
4
5
use std:: path:: PathBuf ;
@@ -7,30 +8,45 @@ fn get_current_working_dir() -> std::io::Result<PathBuf> {
7
8
env:: current_dir ( )
8
9
}
9
10
11
+ fn get_build_directory ( ) -> Result < String , VarError > {
12
+ env:: var ( "CBMC_BUILD_DIR" )
13
+ }
14
+
10
15
fn get_library_build_dir ( ) -> std:: io:: Result < PathBuf > {
11
- let env_var_name = "CBMC_LIB_DIR" ;
12
- let env_var_fetch_result = env:: var ( env_var_name) ;
13
- if let Ok ( lib_dir) = env_var_fetch_result {
16
+ let env_var_fetch_result = get_build_directory ( ) ;
17
+ if let Ok ( build_dir) = env_var_fetch_result {
14
18
let mut path = PathBuf :: new ( ) ;
15
- path. push ( lib_dir) ;
19
+ path. push ( build_dir) ;
20
+ path. push ( "lib/" ) ;
16
21
return Ok ( path) ;
17
22
}
18
- Err ( Error :: new ( ErrorKind :: Other , "failed to get library output directory" ) )
23
+ Err ( Error :: new ( ErrorKind :: Other , "failed to get build output directory" ) )
19
24
}
20
25
21
- fn get_sat_library ( ) -> & ' static str {
26
+ fn get_cadical_build_dir ( ) -> std:: io:: Result < PathBuf > {
27
+ let env_var_fetch_result = get_build_directory ( ) ;
28
+ if let Ok ( build_dir) = env_var_fetch_result {
29
+ let mut path = PathBuf :: new ( ) ;
30
+ path. push ( build_dir) ;
31
+ path. push ( "cadical-src/build/" ) ;
32
+ return Ok ( path) ;
33
+ }
34
+ Err ( Error :: new ( ErrorKind :: Other , "failed to get build output directory" ) )
35
+ }
36
+
37
+ fn get_sat_library ( ) -> std:: io:: Result < & ' static str > {
22
38
let env_var_name = "SAT_IMPL" ;
23
39
let env_var_fetch_result = env:: var ( env_var_name) ;
24
40
if let Ok ( sat_impl) = env_var_fetch_result {
25
41
let solver_lib = match sat_impl. as_str ( ) {
26
- "minisat2" => "minisat2-condensed" ,
27
- "glucose" => "libglucose -condensed",
28
- "cadical" => "cadical" ,
29
- _ => " Error: no identifiable solver detected"
42
+ "minisat2" => Ok ( "minisat2-condensed" ) ,
43
+ "glucose" => Ok ( "glucose -condensed") ,
44
+ "cadical" => Ok ( "cadical" ) ,
45
+ _ => Err ( Error :: new ( ErrorKind :: Other , " no identifiable solver detected") )
30
46
} ;
31
47
return solver_lib;
32
48
}
33
- " Error: no identifiable solver detected"
49
+ Err ( Error :: new ( ErrorKind :: Other , "SAT_IMPL environment variable not set" ) )
34
50
}
35
51
36
52
fn main ( ) {
@@ -49,9 +65,25 @@ fn main() {
49
65
50
66
let libraries_path = match get_library_build_dir ( ) {
51
67
Ok ( path) => path,
52
- Err ( err) => panic ! ( "{}" , err)
68
+ Err ( err) => panic ! ( "Error: {}" , err)
69
+ } ;
70
+
71
+ let solver_lib = match get_sat_library ( ) {
72
+ Ok ( solver) => solver,
73
+ Err ( err) => panic ! ( "Error: {}" , err)
53
74
} ;
54
75
76
+ // Cadical is being built in its own directory, with the resultant artefacts being
77
+ // present only there. Hence, we need to instruct cargo to look for them in cadical's
78
+ // build directory, otherwise we're going to get build errors.
79
+ if solver_lib == "cadical" {
80
+ let cadical_build_dir = match get_cadical_build_dir ( ) {
81
+ Ok ( cadical_directory) => cadical_directory,
82
+ Err ( err) => panic ! ( "Error: {}" , err)
83
+ } ;
84
+ println ! ( "cargo:rustc-link-search=native={}" , cadical_build_dir. display( ) ) ;
85
+ }
86
+
55
87
println ! ( "cargo:rustc-link-search=native={}" , libraries_path. display( ) ) ;
56
88
println ! ( "cargo:rustc-link-lib=static=goto-programs" ) ;
57
89
println ! ( "cargo:rustc-link-lib=static=util" ) ;
@@ -72,7 +104,7 @@ fn main() {
72
104
println ! ( "cargo:rustc-link-lib=static=statement-list" ) ;
73
105
println ! ( "cargo:rustc-link-lib=static=goto-symex" ) ;
74
106
println ! ( "cargo:rustc-link-lib=static=pointer-analysis" ) ;
75
- println ! ( "cargo:rustc-link-lib=static={}" , get_sat_library ( ) ) ;
107
+ println ! ( "cargo:rustc-link-lib=static={}" , solver_lib ) ;
76
108
println ! ( "cargo:rustc-link-lib=static=cbmc-lib" ) ;
77
109
println ! ( "cargo:rustc-link-lib=static=cprover-api-cpp" ) ;
78
110
}
0 commit comments