|
6 | 6 | # LICENSE file in the root directory of this source tree.
|
7 | 7 |
|
8 | 8 |
|
9 |
| -import argparse |
10 | 9 | import glob
|
11 |
| -import itertools |
12 | 10 | import os
|
13 | 11 | import platform
|
14 | 12 | import re
|
@@ -65,201 +63,174 @@ def python_is_compatible():
|
65 | 63 | return True
|
66 | 64 |
|
67 | 65 |
|
68 |
| -def clean(): |
69 |
| - print("Cleaning build artifacts...") |
70 |
| - print("Cleaning pip-out/...") |
71 |
| - shutil.rmtree("pip-out/", ignore_errors=True) |
72 |
| - dirs = glob.glob("cmake-out*/") + glob.glob("cmake-android-out/") |
73 |
| - for d in dirs: |
74 |
| - print(f"Cleaning {d}...") |
75 |
| - shutil.rmtree(d, ignore_errors=True) |
76 |
| - print("Done cleaning build artifacts.") |
| 66 | +if not python_is_compatible(): |
| 67 | + sys.exit(1) |
77 | 68 |
|
| 69 | +# Parse options. |
78 | 70 |
|
79 |
| -VALID_PYBINDS = ["coreml", "mps", "xnnpack"] |
| 71 | +EXECUTORCH_BUILD_PYBIND = "" |
| 72 | +CMAKE_ARGS = os.getenv("CMAKE_ARGS", "") |
| 73 | +CMAKE_BUILD_ARGS = os.getenv("CMAKE_BUILD_ARGS", "") |
| 74 | +USE_PYTORCH_NIGHTLY = True |
80 | 75 |
|
81 |
| - |
82 |
| -def main(args): |
83 |
| - if not python_is_compatible(): |
84 |
| - sys.exit(1) |
85 |
| - |
86 |
| - # Parse options. |
87 |
| - |
88 |
| - EXECUTORCH_BUILD_PYBIND = "" |
89 |
| - CMAKE_ARGS = os.getenv("CMAKE_ARGS", "") |
90 |
| - CMAKE_BUILD_ARGS = os.getenv("CMAKE_BUILD_ARGS", "") |
91 |
| - USE_PYTORCH_NIGHTLY = True |
92 |
| - |
93 |
| - parser = argparse.ArgumentParser() |
94 |
| - parser.add_argument( |
95 |
| - "--pybind", |
96 |
| - action="append", |
97 |
| - nargs="+", |
98 |
| - help="one or more of coreml/mps/xnnpack, or off", |
99 |
| - ) |
100 |
| - parser.add_argument( |
101 |
| - "--clean", |
102 |
| - action="store_true", |
103 |
| - help="clean build artifacts and pip-out instead of installing", |
104 |
| - ) |
105 |
| - parser.add_argument( |
106 |
| - "--use-pt-pinned-commit", |
107 |
| - action="store_true", |
108 |
| - help="build from the pinned PyTorch commit instead of nightly", |
109 |
| - ) |
110 |
| - args = parser.parse_args(args) |
111 |
| - |
112 |
| - if args.clean: |
113 |
| - clean() |
114 |
| - return |
115 |
| - |
116 |
| - if args.pybind: |
117 |
| - # Flatten list of lists. |
118 |
| - args.pybind = list(itertools.chain(*args.pybind)) |
119 |
| - if "off" in args.pybind: |
120 |
| - if len(args.pybind) != 1: |
121 |
| - raise Exception( |
122 |
| - f"Cannot combine `off` with other pybinds: {args.pybind}" |
123 |
| - ) |
| 76 | +args = sys.argv[1:] |
| 77 | +for arg in args: |
| 78 | + if arg == "--pybind": |
| 79 | + pass |
| 80 | + elif arg in ["coreml", "mps", "xnnpack"]: |
| 81 | + if "--pybind" in args: |
| 82 | + arg_upper = arg.upper() |
| 83 | + EXECUTORCH_BUILD_PYBIND = "ON" |
| 84 | + CMAKE_ARGS += f" -DEXECUTORCH_BUILD_{arg_upper}=ON" |
| 85 | + else: |
| 86 | + print(f"Error: {arg} must follow --pybind") |
| 87 | + sys.exit(1) |
| 88 | + elif arg == "off": |
| 89 | + if "--pybind" in args: |
| 90 | + if EXECUTORCH_BUILD_PYBIND == "ON": |
| 91 | + print("Cannot turnoff pybind option as it is already set.") |
| 92 | + sys.exit(1) |
124 | 93 | EXECUTORCH_BUILD_PYBIND = "OFF"
|
125 | 94 | else:
|
126 |
| - for pybind_arg in args.pybind: |
127 |
| - if pybind_arg not in VALID_PYBINDS: |
128 |
| - raise Exception( |
129 |
| - f"Unrecognized pybind argument {pybind_arg}; valid options are: {', '.join(VALID_PYBINDS)}" |
130 |
| - ) |
131 |
| - EXECUTORCH_BUILD_PYBIND = "ON" |
132 |
| - CMAKE_ARGS += f" -DEXECUTORCH_BUILD_{pybind_arg.upper()}=ON" |
133 |
| - |
134 |
| - if args.use_pt_pinned_commit: |
| 95 | + print(f"Error: {arg} must follow --pybind") |
| 96 | + sys.exit(1) |
| 97 | + |
| 98 | + elif arg == "--clean": |
| 99 | + print("Cleaning build artifacts...") |
| 100 | + print("Cleaning pip-out/...") |
| 101 | + shutil.rmtree("pip-out/", ignore_errors=True) |
| 102 | + dirs = glob.glob("cmake-out*/") + glob.glob("cmake-android-out/") |
| 103 | + for d in dirs: |
| 104 | + print(f"Cleaning {d}...") |
| 105 | + shutil.rmtree(d, ignore_errors=True) |
| 106 | + print("Done cleaning build artifacts.") |
| 107 | + sys.exit(0) |
| 108 | + elif arg == "--use-pt-pinned-commit": |
135 | 109 | # This option is used in CI to make sure that PyTorch build from the pinned commit
|
136 | 110 | # is used instead of nightly. CI jobs wouldn't be able to catch regression from the
|
137 | 111 | # latest PT commit otherwise
|
138 | 112 | USE_PYTORCH_NIGHTLY = False
|
| 113 | + else: |
| 114 | + print(f"Error: Unknown option {arg}") |
| 115 | + sys.exit(1) |
139 | 116 |
|
140 |
| - # If --pybind is not set explicitly for backends (e.g., --pybind xnnpack) |
141 |
| - # or is not turned off explicitly (--pybind off) |
142 |
| - # then install XNNPACK by default. |
143 |
| - if EXECUTORCH_BUILD_PYBIND == "": |
144 |
| - EXECUTORCH_BUILD_PYBIND = "ON" |
145 |
| - CMAKE_ARGS += " -DEXECUTORCH_BUILD_XNNPACK=ON" |
146 |
| - |
147 |
| - # Use ClangCL on Windows. |
148 |
| - # ClangCL is an alias to Clang that configures it to work in an MSVC-compatible |
149 |
| - # mode. Using it on Windows to avoid compiler compatibility issues for MSVC. |
150 |
| - if os.name == "nt": |
151 |
| - CMAKE_ARGS += " -T ClangCL" |
152 |
| - |
153 |
| - # Since ExecuTorch often uses main-branch features of pytorch, only the nightly |
154 |
| - # pip versions will have the required features. |
155 |
| - # |
156 |
| - # NOTE: If a newly-fetched version of the executorch repo changes the value of |
157 |
| - # NIGHTLY_VERSION, you should re-run this script to install the necessary |
158 |
| - # package versions. |
159 |
| - NIGHTLY_VERSION = "dev20250104" |
160 |
| - |
161 |
| - # The pip repository that hosts nightly torch packages. |
162 |
| - TORCH_NIGHTLY_URL = "https://download.pytorch.org/whl/nightly/cpu" |
163 |
| - |
164 |
| - # pip packages needed by exir. |
165 |
| - EXIR_REQUIREMENTS = [ |
166 |
| - # Setting USE_PYTORCH_NIGHTLY to false to test the pinned PyTorch commit. Note |
167 |
| - # that we don't need to set any version number there because they have already |
168 |
| - # been installed on CI before this step, so pip won't reinstall them |
169 |
| - f"torch==2.6.0.{NIGHTLY_VERSION}" if USE_PYTORCH_NIGHTLY else "torch", |
170 |
| - ( |
171 |
| - f"torchvision==0.22.0.{NIGHTLY_VERSION}" |
172 |
| - if USE_PYTORCH_NIGHTLY |
173 |
| - else "torchvision" |
174 |
| - ), # For testing. |
175 |
| - "typing-extensions", |
176 |
| - ] |
177 |
| - |
178 |
| - # pip packages needed to run examples. |
179 |
| - # TODO: Make each example publish its own requirements.txt |
180 |
| - EXAMPLES_REQUIREMENTS = [ |
181 |
| - "timm==1.0.7", |
182 |
| - f"torchaudio==2.6.0.{NIGHTLY_VERSION}" if USE_PYTORCH_NIGHTLY else "torchaudio", |
183 |
| - "torchsr==1.0.4", |
184 |
| - "transformers==4.47.1", |
185 |
| - ] |
186 |
| - |
187 |
| - # pip packages needed for development. |
188 |
| - DEVEL_REQUIREMENTS = [ |
189 |
| - "cmake", # For building binary targets. |
190 |
| - "pip>=23", # For building the pip package. |
191 |
| - "pyyaml", # Imported by the kernel codegen tools. |
192 |
| - "setuptools>=63", # For building the pip package. |
193 |
| - "tomli", # Imported by extract_sources.py when using python < 3.11. |
194 |
| - "wheel", # For building the pip package archive. |
195 |
| - "zstd", # Imported by resolve_buck.py. |
196 |
| - ] |
197 |
| - |
198 |
| - # Assemble the list of requirements to actually install. |
199 |
| - # TODO: Add options for reducing the number of requirements. |
200 |
| - REQUIREMENTS_TO_INSTALL = ( |
201 |
| - EXIR_REQUIREMENTS + DEVEL_REQUIREMENTS + EXAMPLES_REQUIREMENTS |
202 |
| - ) |
203 |
| - |
204 |
| - # Install the requirements. `--extra-index-url` tells pip to look for package |
205 |
| - # versions on the provided URL if they aren't available on the default URL. |
206 |
| - subprocess.run( |
207 |
| - [ |
208 |
| - sys.executable, |
209 |
| - "-m", |
210 |
| - "pip", |
211 |
| - "install", |
212 |
| - *REQUIREMENTS_TO_INSTALL, |
213 |
| - "--extra-index-url", |
214 |
| - TORCH_NIGHTLY_URL, |
215 |
| - ], |
216 |
| - check=True, |
217 |
| - ) |
218 |
| - |
219 |
| - LOCAL_REQUIREMENTS = [ |
220 |
| - "third-party/ao", # We need the latest kernels for fast iteration, so not relying on pypi. |
221 |
| - ] |
222 |
| - |
223 |
| - # Install packages directly from local copy instead of pypi. |
224 |
| - # This is usually not recommended. |
225 |
| - subprocess.run( |
226 |
| - [ |
227 |
| - sys.executable, |
228 |
| - "-m", |
229 |
| - "pip", |
230 |
| - "install", |
231 |
| - *LOCAL_REQUIREMENTS, |
232 |
| - ], |
233 |
| - check=True, |
234 |
| - ) |
235 |
| - |
236 |
| - # |
237 |
| - # Install executorch pip package. This also makes `flatc` available on the path. |
238 |
| - # The --extra-index-url may be necessary if pyproject.toml has a dependency on a |
239 |
| - # pre-release or nightly version of a torch package. |
240 |
| - # |
241 |
| - |
242 |
| - # Set environment variables |
243 |
| - os.environ["EXECUTORCH_BUILD_PYBIND"] = EXECUTORCH_BUILD_PYBIND |
244 |
| - os.environ["CMAKE_ARGS"] = CMAKE_ARGS |
245 |
| - os.environ["CMAKE_BUILD_ARGS"] = CMAKE_BUILD_ARGS |
246 |
| - |
247 |
| - # Run the pip install command |
248 |
| - subprocess.run( |
249 |
| - [ |
250 |
| - sys.executable, |
251 |
| - "-m", |
252 |
| - "pip", |
253 |
| - "install", |
254 |
| - ".", |
255 |
| - "--no-build-isolation", |
256 |
| - "-v", |
257 |
| - "--extra-index-url", |
258 |
| - TORCH_NIGHTLY_URL, |
259 |
| - ], |
260 |
| - check=True, |
261 |
| - ) |
| 117 | +# If --pybind is not set explicitly for backends (e.g., --pybind xnnpack) |
| 118 | +# or is not turned off explicitly (--pybind off) |
| 119 | +# then install XNNPACK by default. |
| 120 | +if EXECUTORCH_BUILD_PYBIND == "": |
| 121 | + EXECUTORCH_BUILD_PYBIND = "ON" |
| 122 | + CMAKE_ARGS += " -DEXECUTORCH_BUILD_XNNPACK=ON" |
| 123 | + |
| 124 | +# Use ClangCL on Windows. |
| 125 | +# ClangCL is an alias to Clang that configures it to work in an MSVC-compatible |
| 126 | +# mode. Using it on Windows to avoid compiler compatibility issues for MSVC. |
| 127 | +if os.name == "nt": |
| 128 | + CMAKE_ARGS += " -T ClangCL" |
| 129 | + |
| 130 | +# Since ExecuTorch often uses main-branch features of pytorch, only the nightly |
| 131 | +# pip versions will have the required features. |
| 132 | +# |
| 133 | +# NOTE: If a newly-fetched version of the executorch repo changes the value of |
| 134 | +# NIGHTLY_VERSION, you should re-run this script to install the necessary |
| 135 | +# package versions. |
| 136 | +NIGHTLY_VERSION = "dev20250104" |
| 137 | + |
| 138 | +# The pip repository that hosts nightly torch packages. |
| 139 | +TORCH_NIGHTLY_URL = "https://download.pytorch.org/whl/nightly/cpu" |
| 140 | + |
| 141 | +# pip packages needed by exir. |
| 142 | +EXIR_REQUIREMENTS = [ |
| 143 | + # Setting USE_PYTORCH_NIGHTLY to false to test the pinned PyTorch commit. Note |
| 144 | + # that we don't need to set any version number there because they have already |
| 145 | + # been installed on CI before this step, so pip won't reinstall them |
| 146 | + f"torch==2.6.0.{NIGHTLY_VERSION}" if USE_PYTORCH_NIGHTLY else "torch", |
| 147 | + ( |
| 148 | + f"torchvision==0.22.0.{NIGHTLY_VERSION}" |
| 149 | + if USE_PYTORCH_NIGHTLY |
| 150 | + else "torchvision" |
| 151 | + ), # For testing. |
| 152 | + "typing-extensions", |
| 153 | +] |
| 154 | + |
| 155 | +# pip packages needed to run examples. |
| 156 | +# TODO: Make each example publish its own requirements.txt |
| 157 | +EXAMPLES_REQUIREMENTS = [ |
| 158 | + "timm==1.0.7", |
| 159 | + f"torchaudio==2.6.0.{NIGHTLY_VERSION}" if USE_PYTORCH_NIGHTLY else "torchaudio", |
| 160 | + "torchsr==1.0.4", |
| 161 | + "transformers==4.47.1", |
| 162 | +] |
| 163 | + |
| 164 | +# pip packages needed for development. |
| 165 | +DEVEL_REQUIREMENTS = [ |
| 166 | + "cmake", # For building binary targets. |
| 167 | + "pip>=23", # For building the pip package. |
| 168 | + "pyyaml", # Imported by the kernel codegen tools. |
| 169 | + "setuptools>=63", # For building the pip package. |
| 170 | + "tomli", # Imported by extract_sources.py when using python < 3.11. |
| 171 | + "wheel", # For building the pip package archive. |
| 172 | + "zstd", # Imported by resolve_buck.py. |
| 173 | +] |
| 174 | + |
| 175 | +# Assemble the list of requirements to actually install. |
| 176 | +# TODO: Add options for reducing the number of requirements. |
| 177 | +REQUIREMENTS_TO_INSTALL = EXIR_REQUIREMENTS + DEVEL_REQUIREMENTS + EXAMPLES_REQUIREMENTS |
| 178 | + |
| 179 | +# Install the requirements. `--extra-index-url` tells pip to look for package |
| 180 | +# versions on the provided URL if they aren't available on the default URL. |
| 181 | +subprocess.run( |
| 182 | + [ |
| 183 | + sys.executable, |
| 184 | + "-m", |
| 185 | + "pip", |
| 186 | + "install", |
| 187 | + *REQUIREMENTS_TO_INSTALL, |
| 188 | + "--extra-index-url", |
| 189 | + TORCH_NIGHTLY_URL, |
| 190 | + ], |
| 191 | + check=True, |
| 192 | +) |
| 193 | + |
| 194 | +LOCAL_REQUIREMENTS = [ |
| 195 | + "third-party/ao", # We need the latest kernels for fast iteration, so not relying on pypi. |
| 196 | +] |
| 197 | + |
| 198 | +# Install packages directly from local copy instead of pypi. |
| 199 | +# This is usually not recommended. |
| 200 | +subprocess.run( |
| 201 | + [ |
| 202 | + sys.executable, |
| 203 | + "-m", |
| 204 | + "pip", |
| 205 | + "install", |
| 206 | + *LOCAL_REQUIREMENTS, |
| 207 | + ], |
| 208 | + check=True, |
| 209 | +) |
262 | 210 |
|
| 211 | +# |
| 212 | +# Install executorch pip package. This also makes `flatc` available on the path. |
| 213 | +# The --extra-index-url may be necessary if pyproject.toml has a dependency on a |
| 214 | +# pre-release or nightly version of a torch package. |
| 215 | +# |
263 | 216 |
|
264 |
| -if __name__ == "__main__": |
265 |
| - main(sys.argv[1:]) |
| 217 | +# Set environment variables |
| 218 | +os.environ["EXECUTORCH_BUILD_PYBIND"] = EXECUTORCH_BUILD_PYBIND |
| 219 | +os.environ["CMAKE_ARGS"] = CMAKE_ARGS |
| 220 | +os.environ["CMAKE_BUILD_ARGS"] = CMAKE_BUILD_ARGS |
| 221 | + |
| 222 | +# Run the pip install command |
| 223 | +subprocess.run( |
| 224 | + [ |
| 225 | + sys.executable, |
| 226 | + "-m", |
| 227 | + "pip", |
| 228 | + "install", |
| 229 | + ".", |
| 230 | + "--no-build-isolation", |
| 231 | + "-v", |
| 232 | + "--extra-index-url", |
| 233 | + TORCH_NIGHTLY_URL, |
| 234 | + ], |
| 235 | + check=True, |
| 236 | +) |
0 commit comments