From 658d5a8b7e94589df517a5ad0021796c4d8b4c9e Mon Sep 17 00:00:00 2001 From: Martin Fischer Date: Wed, 11 Jan 2023 09:11:12 +0100 Subject: [PATCH] Fix docs.rs build for rustpython-parser docs.rs failed to build the documentation of the recently released rustpython-parser 0.2.0 because the build.rs script couldn't write the parser.rs file because docs.rs builds the documentation in a sandbox with a read-only filesystem. This commit fixes this by writing the parser.rs file to the cargo output directory instead, as recommended by the docs.rs documentation.[1] Fixes #4436. [1]: https://docs.rs/about/builds#read-only-directories --- .gitignore | 2 -- compiler/parser/build.rs | 29 +++++++++++++++++------------ compiler/parser/src/python.rs | 2 +- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/.gitignore b/.gitignore index 3b098f1c8..23facc8e6 100644 --- a/.gitignore +++ b/.gitignore @@ -19,5 +19,3 @@ flamescope.json extra_tests/snippets/resources extra_tests/not_impl.py - -compiler/parser/python.rs diff --git a/compiler/parser/build.rs b/compiler/parser/build.rs index 4559f2630..f9a3439b3 100644 --- a/compiler/parser/build.rs +++ b/compiler/parser/build.rs @@ -1,22 +1,22 @@ use std::fmt::Write as _; use std::fs::File; use std::io::{BufRead, BufReader, BufWriter, Write}; -use std::path::PathBuf; +use std::path::{Path, PathBuf}; use tiny_keccak::{Hasher, Sha3}; fn main() -> anyhow::Result<()> { const SOURCE: &str = "python.lalrpop"; - const TARGET: &str = "python.rs"; + let out_dir = PathBuf::from(std::env::var_os("OUT_DIR").unwrap()); println!("cargo:rerun-if-changed={SOURCE}"); - try_lalrpop(SOURCE, TARGET)?; - gen_phf(); + try_lalrpop(SOURCE, &out_dir.join("python.rs"))?; + gen_phf(&out_dir); Ok(()) } -fn requires_lalrpop(source: &str, target: &str) -> Option { +fn requires_lalrpop(source: &str, target: &Path) -> Option { let Ok(target) = File::open(target) else { return Some("python.rs doesn't exist. regenerate.".to_owned()); }; @@ -68,16 +68,22 @@ fn requires_lalrpop(source: &str, target: &str) -> Option { None } -fn try_lalrpop(source: &str, target: &str) -> anyhow::Result<()> { +fn try_lalrpop(source: &str, target: &Path) -> anyhow::Result<()> { let Some(_message) = requires_lalrpop(source, target) else { return Ok(()); }; #[cfg(feature = "lalrpop")] - lalrpop::process_root().unwrap_or_else(|e| { - println!("cargo:warning={_message}"); - panic!("running lalrpop failed. {e:?}"); - }); + // We are not using lalrpop::process_root() or Configuration::process_current_dir() + // because of https://github.com/lalrpop/lalrpop/issues/699. + lalrpop::Configuration::new() + .use_cargo_dir_conventions() + .set_in_dir(Path::new(".")) + .process() + .unwrap_or_else(|e| { + println!("cargo:warning={_message}"); + panic!("running lalrpop failed. {e:?}"); + }); #[cfg(not(feature = "lalrpop"))] { @@ -98,8 +104,7 @@ fn sha_equal(expected_sha3_str: &str, actual_sha3: &[u8; 32]) -> bool { *actual_sha3 == expected_sha3 } -fn gen_phf() { - let out_dir = PathBuf::from(std::env::var_os("OUT_DIR").unwrap()); +fn gen_phf(out_dir: &Path) { let mut kwds = phf_codegen::Map::new(); let kwds = kwds // Alphabetical keywords: diff --git a/compiler/parser/src/python.rs b/compiler/parser/src/python.rs index e38af9b73..a00274d6c 100644 --- a/compiler/parser/src/python.rs +++ b/compiler/parser/src/python.rs @@ -1,3 +1,3 @@ #![allow(clippy::all)] #![allow(unused)] -include!("../python.rs"); +include!(concat!(env!("OUT_DIR"), "/python.rs"));