--- a/build/moz.configure/toolchain.configure
+++ b/build/moz.configure/toolchain.configure
@@ -1098,23 +1098,23 @@ def build_not_win_mac(target):
return True
option('--enable-gold',
env='MOZ_FORCE_GOLD',
help='Enable GNU Gold Linker when it is not already the default',
when=build_not_win_mac)
+imply_option('--enable-linker',
+ depends_if('--enable-gold', when=build_not_win_mac)(lambda x: 'gold'),
+ when=build_not_win_mac)
-@depends('--enable-gold', c_compiler, developer_options, check_build_environment, when=build_not_win_mac)
-@checking('for ld', lambda x: x.KIND)
@imports('os')
@imports('shutil')
-def enable_gold(enable_gold_option, c_compiler, developer_options, build_env):
- linker = None
+def enable_gnu_linker(enable_gold_option, c_compiler, developer_options, build_env, linker_name):
# Used to check the kind of linker
version_check = ['-Wl,--version']
cmd_base = c_compiler.wrapper + [c_compiler.compiler] + c_compiler.flags
def resolve_gold():
# Try to force the usage of gold
targetDir = os.path.join(build_env.topobjdir, 'build', 'unix', 'gold')
@@ -1139,17 +1139,17 @@ def enable_gold(enable_gold_option, c_co
return namespace(
KIND='gold',
LINKER_FLAG=linker,
)
else:
# The -B trick didn't work, removing the directory
shutil.rmtree(targetDir)
- if enable_gold_option or developer_options:
+ if (enable_gold_option or developer_options) and linker_name != 'bfd':
result = resolve_gold()
if result:
return result
# gold is only required if --enable-gold is used.
elif enable_gold_option:
die('Could not find gold')
# Else fallthrough.
@@ -1170,10 +1170,35 @@ def enable_gold(enable_gold_option, c_co
KIND='gold'
)
# For other platforms without gold or the GNU linker
return namespace(
KIND='other'
)
-set_config('LD_IS_BFD', depends(enable_gold.KIND)(lambda x: x == 'bfd' or None))
-set_config('LINKER_LDFLAGS', enable_gold.LINKER_FLAG)
+js_option('--enable-linker', nargs=1,
+ choices=('bfd', 'gold', 'lld', 'other'),
+ help='Select the linker',
+ when=build_not_win_mac)
+
+@depends('--enable-linker', c_compiler, developer_options, check_build_environment, when=build_not_win_mac)
+@checking('for linker', lambda x: x.KIND)
+def select_linker(linker, c_compiler, developer_options, build_env):
+ linker = linker[0] if linker else 'other'
+ if linker in ('gold', 'bfd', 'other'):
+ return enable_gnu_linker(linker == 'gold', c_compiler, developer_options, build_env, linker)
+ if linker == 'lld':
+ version_check = ['-Wl,--version']
+ cmd_base = c_compiler.wrapper + [c_compiler.compiler] + c_compiler.flags
+ lld = "-fuse-ld=" + linker
+ cmd = cmd_base + [lld] + version_check
+ if 'LLD' in check_cmd_output(*cmd).decode('utf-8'):
+ return namespace(
+ KIND='lld',
+ LINKER_FLAG=lld,
+ )
+ else:
+ die("Could not use lld as linker")
+
+
+set_config('LD_IS_BFD', depends(select_linker.KIND)(lambda x: x == 'bfd' or None))
+set_config('LINKER_LDFLAGS', select_linker.LINKER_FLAG)