2 """Calls `gn` with the right --dotfile= and --root= arguments for LLVM."""
4 # GN normally expects a file called '.gn' at the root of the repository.
5 # Since LLVM's GN build isn't supported, putting that file at the root
6 # is deemed inappropriate, which requires passing --dotfile= and -root= to GN.
7 # Since that gets old fast, this script automatically passes these arguments.
14 THIS_DIR
= os
.path
.dirname(__file__
)
15 ROOT_DIR
= os
.path
.join(THIS_DIR
, "..", "..", "..")
21 if sys
.platform
== "darwin":
22 return "mac-amd64" if platform
.machine() != "arm64" else "mac-arm64"
23 if platform
.machine() not in ("AMD64", "x86_64"):
25 if sys
.platform
.startswith("linux"):
27 if sys
.platform
== "win32":
28 return "windows-amd64"
31 def print_no_gn(mention_get
):
32 print("gn binary not found in PATH")
34 print("run llvm/utils/gn/get.py to download a binary and try again, or")
35 print("follow https://gn.googlesource.com/gn/#getting-started")
40 # Find real gn executable.
45 stdout
=open(os
.devnull
, "w"),
46 stderr
=subprocess
.STDOUT
,
51 # Not on path. See if get.py downloaded a prebuilt binary and run that
52 # if it's there, or suggest to run get.py if it isn't.
53 platform
= get_platform()
55 return print_no_gn(mention_get
=False)
56 gn
= os
.path
.join(os
.path
.dirname(__file__
), "bin", platform
, "gn")
57 if not os
.path
.exists(gn
+ (".exe" if sys
.platform
== "win32" else "")):
58 return print_no_gn(mention_get
=True)
60 # Compute --dotfile= and --root= args to add.
62 gn_main_arg
= next((x
for x
in sys
.argv
[1:] if not x
.startswith("-")), None)
63 if gn_main_arg
!= "help": # `gn help` gets confused by the switches.
65 dotfile
= os
.path
.relpath(os
.path
.join(THIS_DIR
, ".gn"), cwd
)
66 root
= os
.path
.relpath(ROOT_DIR
, cwd
)
67 extra_args
= ["--dotfile=" + dotfile
, "--root=" + root
]
69 # Run GN command with --dotfile= and --root= added.
70 cmd
= [gn
] + extra_args
+ sys
.argv
[1:]
71 sys
.exit(subprocess
.call(cmd
))
74 if __name__
== "__main__":