1
1
use std:: fmt:: Write as _;
2
2
use std:: fs:: File ;
3
3
use std:: io:: { BufRead , BufReader , BufWriter , Write } ;
4
- use std:: path:: PathBuf ;
4
+ use std:: path:: { Path , PathBuf } ;
5
5
use tiny_keccak:: { Hasher , Sha3 } ;
6
6
7
7
fn main ( ) -> anyhow:: Result < ( ) > {
8
8
const SOURCE : & str = "python.lalrpop" ;
9
- const TARGET : & str = "python.rs" ;
9
+ let out_dir = PathBuf :: from ( std :: env :: var_os ( "OUT_DIR" ) . unwrap ( ) ) ;
10
10
11
11
println ! ( "cargo:rerun-if-changed={SOURCE}" ) ;
12
12
13
- try_lalrpop ( SOURCE , TARGET ) ?;
14
- gen_phf ( ) ;
13
+ try_lalrpop ( SOURCE , & out_dir . join ( "python.rs" ) ) ?;
14
+ gen_phf ( & out_dir ) ;
15
15
16
16
Ok ( ( ) )
17
17
}
18
18
19
- fn requires_lalrpop ( source : & str , target : & str ) -> Option < String > {
19
+ fn requires_lalrpop ( source : & str , target : & Path ) -> Option < String > {
20
20
let Ok ( target) = File :: open ( target) else {
21
21
return Some ( "python.rs doesn't exist. regenerate." . to_owned ( ) ) ;
22
22
} ;
@@ -68,16 +68,22 @@ fn requires_lalrpop(source: &str, target: &str) -> Option<String> {
68
68
None
69
69
}
70
70
71
- fn try_lalrpop ( source : & str , target : & str ) -> anyhow:: Result < ( ) > {
71
+ fn try_lalrpop ( source : & str , target : & Path ) -> anyhow:: Result < ( ) > {
72
72
let Some ( _message) = requires_lalrpop ( source, target) else {
73
73
return Ok ( ( ) ) ;
74
74
} ;
75
75
76
76
#[ cfg( feature = "lalrpop" ) ]
77
- lalrpop:: process_root ( ) . unwrap_or_else ( |e| {
78
- println ! ( "cargo:warning={_message}" ) ;
79
- panic ! ( "running lalrpop failed. {e:?}" ) ;
80
- } ) ;
77
+ // We are not using lalrpop::process_root() or Configuration::process_current_dir()
78
+ // because of https://github.com/lalrpop/lalrpop/issues/699.
79
+ lalrpop:: Configuration :: new ( )
80
+ . use_cargo_dir_conventions ( )
81
+ . set_in_dir ( Path :: new ( "." ) )
82
+ . process ( )
83
+ . unwrap_or_else ( |e| {
84
+ println ! ( "cargo:warning={_message}" ) ;
85
+ panic ! ( "running lalrpop failed. {e:?}" ) ;
86
+ } ) ;
81
87
82
88
#[ cfg( not( feature = "lalrpop" ) ) ]
83
89
{
@@ -98,8 +104,7 @@ fn sha_equal(expected_sha3_str: &str, actual_sha3: &[u8; 32]) -> bool {
98
104
* actual_sha3 == expected_sha3
99
105
}
100
106
101
- fn gen_phf ( ) {
102
- let out_dir = PathBuf :: from ( std:: env:: var_os ( "OUT_DIR" ) . unwrap ( ) ) ;
107
+ fn gen_phf ( out_dir : & Path ) {
103
108
let mut kwds = phf_codegen:: Map :: new ( ) ;
104
109
let kwds = kwds
105
110
// Alphabetical keywords:
0 commit comments