This is an adapted patch from the games/anki FreeBSD port. https://github.com/freebsd/freebsd-ports/blob/109c3d4629b84972e660b689d169ac0761c1a519/games/anki/files/patch-build_configure_src_python.rs https://github.com/freebsd/freebsd-ports/blob/109c3d4629b84972e660b689d169ac0761c1a519/games/anki/files/patch-build_ninja__gen_src_python.rs Use the "PythonEnvironmentStub" function to use a native Python environment instead of a Python venv. * Avoid the use of Python's pip (network access). * Remove the python_binary input for PythonEnvironmentStub since we create the pseudo venv manually in the ebuild. This saves us from setting an extra environment variable to prevent network access. The python_binary input should really only be added to PythonEnvironment, if the venv is not set up. * TODO: add dev-python/mypy-protobuf to tree for fully typed Anki. From: Lucio Sauer --- a/build/configure/src/python.rs +++ b/build/configure/src/python.rs @@ -13,6 +13,7 @@ use ninja_gen::input::BuildInput; use ninja_gen::inputs; use ninja_gen::python::python_format; use ninja_gen::python::PythonEnvironment; +use ninja_gen::python::PythonEnvironmentStub; use ninja_gen::python::PythonLint; use ninja_gen::python::PythonTypecheck; use ninja_gen::rsync::RsyncFiles; @@ -81,6 +82,25 @@ pub fn setup_venv(build: &mut Build) -> Result<()> { Ok(()) } +pub fn setup_venv_stub(build: &mut Build) -> Result<()> { + build.add_action( + "pyenv", + PythonEnvironmentStub { + folder: "pyenv", + extra_binary_exports: &[ + "mypy", // Required in some parts of the code, but not for build + "black", // dito + "isort", // dito + "pylint", // dito + "pytest", // dito + "protoc-gen-mypy", + ], + }, + )?; + + Ok(()) +} + pub struct GenPythonProto { pub proto_files: BuildInput, } @@ -88,9 +108,7 @@ pub struct GenPythonProto { impl BuildAction for GenPythonProto { fn command(&self) -> &str { "$protoc $ - --plugin=protoc-gen-mypy=$protoc-gen-mypy $ --python_out=$builddir/pylib $ - --mypy_out=$builddir/pylib $ -Iproto $in" } @@ -108,7 +126,6 @@ impl BuildAction for GenPythonProto { .collect(); build.add_inputs("in", &self.proto_files); build.add_inputs("protoc", inputs![":protoc_binary"]); - build.add_inputs("protoc-gen-mypy", inputs![":pyenv:protoc-gen-mypy"]); build.add_outputs("", python_outputs); } @@ -254,7 +271,6 @@ impl BuildAction for Sphinx { fn files(&mut self, build: &mut impl FilesHandle) { build.add_inputs("python", inputs![":pyenv:bin"]); - build.add_inputs("pip", inputs![":pyenv:pip"]); build.add_inputs("", &self.deps); build.add_output_stamp("python/sphinx/stamp"); } --- a/build/ninja_gen/src/python.rs +++ b/build/ninja_gen/src/python.rs @@ -86,6 +86,11 @@ pub struct PythonEnvironment { pub extra_binary_exports: &'static [&'static str], } +pub struct PythonEnvironmentStub { + pub folder: &'static str, + pub extra_binary_exports: &'static [&'static str], +} + impl BuildAction for PythonEnvironment { fn command(&self) -> &str { "$runner pyenv $python_binary $builddir/$pyenv_folder $system_pkgs $base_requirements $requirements" @@ -118,6 +123,34 @@ impl BuildAction for PythonEnvironment { } } +impl BuildAction for PythonEnvironmentStub { + fn command(&self) -> &str { + "echo Running PythonEnvironmentStub..." + } + + fn files(&mut self, build: &mut impl crate::build::FilesHandle) { + let bin_path = |binary: &str| -> Vec { + let folder = self.folder; + let path = if cfg!(windows) { + format!("{folder}/scripts/{binary}.exe") + } else { + format!("{folder}/bin/{binary}") + }; + vec![path] + }; + + build.add_variable("pyenv_folder", self.folder); + build.add_outputs_ext("bin", bin_path("python"), true); + for binary in self.extra_binary_exports { + build.add_outputs_ext(*binary, bin_path(binary), true); + } + } + + fn check_output_timestamps(&self) -> bool { + true + } +} + pub struct PythonTypecheck { pub folders: &'static [&'static str], pub deps: BuildInput,