diff --git a/Cargo.toml b/Cargo.toml index 19106a61..f5c708df 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -47,6 +47,7 @@ traditional_chinese = [ "erg_parser/traditional_chinese", "erg_compiler/traditional_chinese", ] +no_build_rs = ["erg_compiler/no_build_rs"] pre-commit = [] [dependencies] diff --git a/compiler/erg_compiler/Cargo.toml b/compiler/erg_compiler/Cargo.toml index 618c16ec..591f381b 100644 --- a/compiler/erg_compiler/Cargo.toml +++ b/compiler/erg_compiler/Cargo.toml @@ -22,6 +22,7 @@ traditional_chinese = [ "erg_common/traditional_chinese", "erg_parser/traditional_chinese", ] +no_build_rs = [] [dependencies] erg_common = { version = "0.5.9", path = "../erg_common" } diff --git a/compiler/erg_compiler/build.rs b/compiler/erg_compiler/build.rs index d9aecdd5..57e47670 100644 --- a/compiler/erg_compiler/build.rs +++ b/compiler/erg_compiler/build.rs @@ -5,6 +5,9 @@ use std::fs; use std::path; fn main() -> std::io::Result<()> { + if cfg!(feature = "no_build_rs") { + return Ok(()); + } // Create a ".erg" directory let erg_path = env::home_dir() .expect("failed to get the location of the home dir") diff --git a/compiler/erg_compiler/codegen.rs b/compiler/erg_compiler/codegen.rs index 4fef9b24..27ab7215 100644 --- a/compiler/erg_compiler/codegen.rs +++ b/compiler/erg_compiler/codegen.rs @@ -2051,27 +2051,36 @@ impl CodeGenerator { } fn load_prelude_py(&mut self) { - self.emit_global_import_items( - Identifier::public("sys"), - vec![( - Identifier::public("path"), - Some(Identifier::private("#path")), - )], - ); - self.emit_load_name_instr(Identifier::private("#path")); - self.emit_load_method_instr("Array!", None, Identifier::public("push!")); - self.emit_load_const(env!("ERG_STD_PATH")); - self.write_instr(CALL_METHOD); - self.write_arg(1u8); - self.stack_dec(); - self.emit_pop_top(); - self.emit_global_import_items( - Identifier::public("_erg_std_prelude"), - vec![( - Identifier::public("in_operator"), - Some(Identifier::private("#in_operator")), - )], - ); + if let Some(std_path) = option_env!("ERG_STD_PATH") { + self.emit_global_import_items( + Identifier::public("sys"), + vec![( + Identifier::public("path"), + Some(Identifier::private("#path")), + )], + ); + self.emit_load_name_instr(Identifier::private("#path")); + self.emit_load_method_instr("Array!", None, Identifier::public("push!")); + self.emit_load_const(std_path); + self.write_instr(CALL_METHOD); + self.write_arg(1u8); + self.stack_dec(); + self.emit_pop_top(); + self.emit_global_import_items( + Identifier::public("_erg_std_prelude"), + vec![( + Identifier::public("in_operator"), + Some(Identifier::private("#in_operator")), + )], + ); + } else { + self.emit_load_name_instr(Identifier::private("exec")); + self.emit_load_const(include_str!("std/_erg_std_prelude.py")); + self.write_instr(CALL_FUNCTION); + self.write_arg(1u8); + self.stack_dec(); + self.emit_pop_top(); + } } fn load_record_type(&mut self) {