1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
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 which is the only dependant of the
python_binary target. 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 <watermanpaint@posteo.net>
--- 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<String> {
+ 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,
|