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
This commit is contained in:
Martin Fischer 2023-01-11 09:11:12 +01:00
parent e3fa5a54ba
commit fea57bcb04
2 changed files with 18 additions and 13 deletions

View file

@ -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<String> {
fn requires_lalrpop(source: &str, target: &Path) -> Option<String> {
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<String> {
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:

View file

@ -1,3 +1,3 @@
#![allow(clippy::all)]
#![allow(unused)]
include!("../python.rs");
include!(concat!(env!("OUT_DIR"), "/python.rs"));