Skip to content

Commit

Permalink
Fix docs.rs build for rustpython-parser
Browse files Browse the repository at this point in the history
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 RustPython#4436.

[1]: https://docs.rs/about/builds#read-only-directories
  • Loading branch information
not-my-profile committed Jan 11, 2023
1 parent c7faae9 commit 658d5a8
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 15 deletions.
2 changes: 0 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,3 @@ flamescope.json

extra_tests/snippets/resources
extra_tests/not_impl.py

compiler/parser/python.rs
29 changes: 17 additions & 12 deletions compiler/parser/build.rs
Original file line number Diff line number Diff line change
@@ -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());
};
Expand Down Expand Up @@ -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"))]
{
Expand All @@ -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:
Expand Down
2 changes: 1 addition & 1 deletion compiler/parser/src/python.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
#![allow(clippy::all)]
#![allow(unused)]
include!("../python.rs");
include!(concat!(env!("OUT_DIR"), "/python.rs"));

0 comments on commit 658d5a8

Please sign in to comment.