The branch main has been updated by jhb:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=81fc74fd26da2f75c3010595db7a706c3e28d95b

commit 81fc74fd26da2f75c3010595db7a706c3e28d95b
Author:     John Baldwin <j...@freebsd.org>
AuthorDate: 2025-08-06 20:14:01 +0000
Commit:     John Baldwin <j...@freebsd.org>
CommitDate: 2025-08-06 20:14:01 +0000

    cross-build make.py: Permit specifying cross toolchains by a package name
    
    Add a --cross-toolchain option whose value is a package name.  This is
    currently only supported with brew on macOS.  A sample invocation is
    `--cross-toolchain=llvm@19`.
    
    Differential Revision:  https://reviews.freebsd.org/D51741
---
 tools/build/make.py | 40 ++++++++++++++++++++++++++++++----------
 1 file changed, 30 insertions(+), 10 deletions(-)

diff --git a/tools/build/make.py b/tools/build/make.py
index 618a2aa7abb0..2f36a3e23e32 100755
--- a/tools/build/make.py
+++ b/tools/build/make.py
@@ -34,11 +34,22 @@
 # On FreeBSD you can use it the same way as just calling make:
 # `MAKEOBJDIRPREFIX=~/obj ./tools/build/make.py buildworld -DWITH_FOO`
 #
-# On Linux and MacOS you will either need to set XCC/XCXX/XLD/XCPP or pass
-# --cross-bindir to specify the path to the cross-compiler bindir:
-# `MAKEOBJDIRPREFIX=~/obj ./tools/build/make.py
-# --cross-bindir=/path/to/cross/compiler buildworld -DWITH_FOO TARGET=foo
-# TARGET_ARCH=bar`
+# On Linux and MacOS you may need to explicitly indicate the cross toolchain
+# to use.  You can do this by:
+# - setting XCC/XCXX/XLD/XCPP to the paths of each tool
+# - using --cross-bindir to specify the path to the cross-compiler bindir:
+#   `MAKEOBJDIRPREFIX=~/obj ./tools/build/make.py
+#    --cross-bindir=/path/to/cross/compiler buildworld -DWITH_FOO TARGET=foo
+#    TARGET_ARCH=bar`
+# - using --cross-toolchain to specify the package containing the 
cross-compiler
+#   (MacOS only currently):
+#   `MAKEOBJDIRPREFIX=~/obj ./tools/build/make.py
+#    --cross-toolchain=llvm@NN buildworld -DWITH_FOO TARGET=foo
+#    TARGET_ARCH=bar`
+#
+# On MacOS, this tool will search for an llvm toolchain installed via brew and
+# use it as the cross toolchain if an explicit toolchain is not specified.
+
 import argparse
 import functools
 import os
@@ -160,7 +171,8 @@ def check_required_make_env_var(varname, binary_name, 
bindir):
         return
     if not bindir:
         sys.exit("Could not infer value for $" + varname + ". Either set $" +
-                 varname + " or pass --cross-bindir=/cross/compiler/dir/bin")
+                 varname + " or pass --cross-bindir=/cross/compiler/dir/bin" +
+                 " or --cross-toolchain=<package>")
     # try to infer the path to the tool
     guess = os.path.join(bindir, binary_name)
     if not os.path.isfile(guess):
@@ -179,7 +191,8 @@ def check_xtool_make_env_var(varname, binary_name):
         return
     global parsed_args
     if parsed_args.cross_bindir is None:
-        cross_bindir = default_cross_toolchain(binary_name)
+        cross_bindir = cross_toolchain_bindir(binary_name,
+                                              parsed_args.cross_toolchain)
     else:
         cross_bindir = parsed_args.cross_bindir
     return check_required_make_env_var(varname, binary_name,
@@ -201,17 +214,20 @@ def binary_path(bindir: str, binary_name: str) -> 
"Optional[str]":
         pass
     return None
 
-def default_cross_toolchain(binary_name: str) -> str:
+def cross_toolchain_bindir(binary_name: str, package: "Optional[str]") -> str:
     # default to homebrew-installed clang on MacOS if available
     if sys.platform.startswith("darwin"):
         if shutil.which("brew"):
-            bindir = binary_path(brew_prefix("llvm"), binary_name)
+            if not package:
+                package = "llvm"
+            bindir = binary_path(brew_prefix(package), binary_name)
             if bindir:
                 return bindir
 
             # brew installs lld as a separate package for LLVM 19 and later
             if binary_name == "ld.lld":
-                bindir = binary_path(brew_prefix("lld"), binary_name)
+                lld_package = package.replace("llvm", "lld")
+                bindir = binary_path(brew_prefix(lld_package), binary_name)
                 if bindir:
                     return bindir
     return None
@@ -233,6 +249,10 @@ if __name__ == "__main__":
                         help="Compiler type to find in --cross-bindir (only "
                              "needed if XCC/XCPP/XLD are not set)"
                              "Note: using CC is currently highly experimental")
+    parser.add_argument("--cross-toolchain", default=None,
+                        help="Name of package containing cc/c++/cpp/ld to 
build "
+                             "target binaries (only needed if XCC/XCPP/XLD "
+                             "are not set)")
     parser.add_argument("--host-compiler-type", choices=("cc", "clang", "gcc"),
                         default="cc",
                         help="Compiler type to find in --host-bindir (only "

Reply via email to