Skip to content
This repository was archived by the owner on Aug 21, 2024. It is now read-only.

chore: verify Cairo0 compiler dependencies before compiling #1873

Open
wants to merge 1 commit into
base: dori/fetch-compiler-version
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions crates/blockifier/src/test_utils/cairo_compile.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
use std::process::Command;
use std::{env, fs};

use cached::proc_macro::cached;
use serde::{Deserialize, Serialize};

const CAIRO0_PIP_REQUIREMENTS_FILE: &str = "tests/requirements.txt";

/// Objects for simple deserialization of Cargo.toml to fetch the Cairo1 compiler version.
/// The compiler itself isn't actually a dependency, so we compile by using the version of the
/// cairo-lang-casm crate.
Expand Down Expand Up @@ -51,6 +54,7 @@ pub fn cairo1_compiler_version() -> String {

/// Compiles a Cairo0 program using the deprecated compiler.
pub fn cairo0_compile(path: String, extra_arg: Option<String>, debug_info: bool) -> Vec<u8> {
verify_cairo0_compiler_deps();
let mut command = Command::new("starknet-compile-deprecated");
if let Some(extra_arg) = extra_arg {
command.arg(extra_arg);
Expand All @@ -68,3 +72,28 @@ pub fn cairo0_compile(path: String, extra_arg: Option<String>, debug_info: bool)
pub fn cairo1_compile(_path: String) -> Vec<u8> {
todo!();
}

/// Verifies that the required dependencies are available before compiling.
fn verify_cairo0_compiler_deps() {
// Python compiler. Verify correct version.
let cairo_lang_version_output =
Command::new("sh").arg("-c").arg("pip freeze | grep cairo-lang").output().unwrap().stdout;
let cairo_lang_version = String::from_utf8(cairo_lang_version_output).unwrap();

let requirements_contents = fs::read_to_string(CAIRO0_PIP_REQUIREMENTS_FILE).unwrap();
let expected_cairo_lang_version = requirements_contents
.lines()
.nth(1) // Skip docstring.
.expect(
"Expecting requirements file to contain a docstring in the first line, and \
then the required cairo-lang version in the second line."
);

assert_eq!(
cairo_lang_version.trim(),
expected_cairo_lang_version.trim(),
"cairo-lang not found. Please run:\npip3.9 install -r {}/{}\nthen rerun the test.",
env::var("CARGO_MANIFEST_DIR").unwrap(),
CAIRO0_PIP_REQUIREMENTS_FILE
);
}
Loading