|
14 | 14 | class ProjectRust(Project): |
15 | 15 | def __init__(self, directory): |
16 | 16 | super().__init__(directory) |
17 | | - self.cargo_file = self._get_cargo_file() |
| 17 | + self.cargo_file = self.get_cargo_file() |
18 | 18 |
|
19 | 19 | def clean(self): |
20 | 20 | super().clean() |
21 | 21 | utils.remove_folder(path.join(self.directory, "wasm", "target")) |
22 | 22 |
|
23 | | - def _get_cargo_file(self): |
24 | | - cargo_path = path.join(self.directory, "Cargo.toml") |
| 23 | + def get_cargo_file(self): |
| 24 | + cargo_path = self.path / 'Cargo.toml' |
25 | 25 | return CargoFile(cargo_path) |
26 | 26 |
|
| 27 | + def get_meta_folder(self): |
| 28 | + return self.path / 'meta' |
| 29 | + |
27 | 30 | def perform_build(self): |
| 31 | + meta = self.has_meta() |
28 | 32 | try: |
| 33 | + if meta: |
| 34 | + self.run_meta() |
29 | 35 | self.run_cargo() |
30 | | - self._generate_abi() |
| 36 | + |
| 37 | + # ABI generated separately for backwards compatibility |
| 38 | + if not meta: |
| 39 | + self.generate_abi() |
31 | 40 | except subprocess.CalledProcessError as err: |
32 | 41 | raise errors.BuildError(err.output) |
33 | 42 |
|
34 | 43 | def run_cargo(self): |
35 | | - env = self._get_env() |
| 44 | + env = self.get_env() |
36 | 45 |
|
37 | 46 | args = [ |
38 | 47 | "cargo", |
39 | 48 | "build", |
40 | 49 | "--target=wasm32-unknown-unknown", |
41 | 50 | "--release", |
42 | 51 | "--out-dir", |
43 | | - self._get_output_folder(), |
| 52 | + self.get_output_folder(), |
44 | 53 | "-Z" |
45 | 54 | "unstable-options" |
46 | 55 | ] |
47 | | - self._decorate_cargo_args(args) |
| 56 | + self.decorate_cargo_args(args) |
48 | 57 |
|
49 | 58 | if not self.options.get("wasm_symbols"): |
50 | 59 | env["RUSTFLAGS"] = "-C link-arg=-s" |
51 | 60 |
|
52 | | - cwd = path.join(self.directory, "wasm") |
53 | | - return_code = myprocess.run_process_async(args, env=env, cwd=cwd) |
| 61 | + cwd = self.path / 'wasm' |
| 62 | + return_code = myprocess.run_process_async(args, env=env, cwd=str(cwd)) |
| 63 | + if return_code != 0: |
| 64 | + raise errors.BuildError(f"error code = {return_code}, see output") |
| 65 | + |
| 66 | + def run_meta(self): |
| 67 | + cwd = self.get_meta_folder() |
| 68 | + env = self.get_env() |
| 69 | + |
| 70 | + args = [ |
| 71 | + "cargo", |
| 72 | + "build", |
| 73 | + ] |
| 74 | + |
| 75 | + return_code = myprocess.run_process_async(args, env=env, cwd=str(cwd)) |
54 | 76 | if return_code != 0: |
55 | 77 | raise errors.BuildError(f"error code = {return_code}, see output") |
56 | 78 |
|
57 | | - def _decorate_cargo_args(self, args): |
| 79 | + def decorate_cargo_args(self, args): |
58 | 80 | target_dir = self.options.get("cargo_target_dir") |
59 | 81 | if target_dir: |
60 | 82 | args.extend(["--target-dir", target_dir]) |
61 | 83 |
|
62 | | - def _generate_abi(self): |
63 | | - if not self._has_abi(): |
| 84 | + def generate_abi(self): |
| 85 | + if not self.has_abi(): |
64 | 86 | return |
65 | 87 |
|
66 | 88 | args = [ |
67 | 89 | "cargo", |
68 | 90 | "run" |
69 | 91 | ] |
70 | | - self._decorate_cargo_args(args) |
| 92 | + self.decorate_cargo_args(args) |
71 | 93 |
|
72 | | - env = self._get_env() |
| 94 | + env = self.get_env() |
73 | 95 | cwd = path.join(self.directory, "abi") |
74 | | - sink = myprocess.FileOutputSink(self._get_abi_filepath()) |
| 96 | + sink = myprocess.FileOutputSink(self.get_abi_filepath()) |
75 | 97 | return_code = myprocess.run_process_async(args, env=env, cwd=cwd, stdout_sink=sink) |
76 | 98 | if return_code != 0: |
77 | 99 | raise errors.BuildError(f"error code = {return_code}, see output") |
78 | 100 |
|
79 | | - utils.prettify_json_file(self._get_abi_filepath()) |
| 101 | + utils.prettify_json_file(self.get_abi_filepath()) |
| 102 | + |
| 103 | + def has_meta(self): |
| 104 | + return self.get_meta_folder().exists() |
80 | 105 |
|
81 | | - def _has_abi(self): |
82 | | - return (self._get_abi_folder() / "Cargo.toml").exists() |
| 106 | + def has_abi(self): |
| 107 | + return (self.get_abi_folder() / "Cargo.toml").exists() |
83 | 108 |
|
84 | | - def _get_abi_filepath(self): |
85 | | - return self._get_abi_folder() / "abi.json" |
| 109 | + def get_abi_filepath(self): |
| 110 | + return self.get_abi_folder() / "abi.json" |
86 | 111 |
|
87 | | - def _get_abi_folder(self): |
| 112 | + def get_abi_folder(self): |
88 | 113 | return Path(self.directory, "abi") |
89 | 114 |
|
90 | 115 | def _do_after_build(self) -> Path: |
91 | 116 | original_name = self.cargo_file.package_name |
92 | 117 | wasm_base_name = self.cargo_file.package_name.replace("-", "_") |
93 | | - wasm_file = Path(self._get_output_folder(), f"{wasm_base_name}_wasm.wasm").resolve() |
| 118 | + wasm_file = Path(self.get_output_folder(), f"{wasm_base_name}_wasm.wasm").resolve() |
94 | 119 | wasm_file_renamed = self.options.get("wasm_name") |
95 | 120 | if not wasm_file_renamed: |
96 | 121 | wasm_file_renamed = f"{original_name}.wasm" |
97 | | - wasm_file_renamed_path = Path(self._get_output_folder(), wasm_file_renamed) |
| 122 | + wasm_file_renamed_path = Path(self.get_output_folder(), wasm_file_renamed) |
98 | 123 | shutil.move(wasm_file, wasm_file_renamed_path) |
99 | 124 |
|
100 | | - if self._has_abi(): |
101 | | - abi_file = self._get_abi_filepath() |
102 | | - abi_file_renamed = Path(self._get_output_folder(), f"{original_name}.abi.json") |
| 125 | + if self.has_abi(): |
| 126 | + abi_file = self.get_abi_filepath() |
| 127 | + abi_file_renamed = Path(self.get_output_folder(), f"{original_name}.abi.json") |
103 | 128 | shutil.move(abi_file, abi_file_renamed) |
104 | 129 |
|
105 | 130 | return wasm_file_renamed_path |
106 | 131 |
|
107 | 132 | def get_dependencies(self): |
108 | 133 | return ["rust"] |
109 | 134 |
|
110 | | - def _get_env(self): |
| 135 | + def get_env(self): |
111 | 136 | return dependencies.get_module_by_key("rust").get_env() |
112 | 137 |
|
113 | 138 |
|
114 | 139 | class CargoFile: |
115 | 140 | data: Dict[str, Any] |
116 | 141 |
|
117 | | - def __init__(self, path): |
| 142 | + def __init__(self, path: Path): |
118 | 143 | self.data = {} |
119 | 144 | self.path = path |
120 | 145 |
|
|
0 commit comments