import subprocess def getRoot(config): if not config.parent: return config return getRoot(config.parent) def is_gold_linker_available(): if not config.gold_executable: return False try: ld_cmd = subprocess.Popen([config.gold_executable, '--help'], stdout = subprocess.PIPE) ld_out = ld_cmd.stdout.read().decode() ld_cmd.wait() except: return False if not '-plugin' in ld_out: return False # config.clang is not guaranteed to be just the executable! clang_cmd = subprocess.Popen(" ".join([config.clang, '-fuse-ld=gold', '-xc', '-']), shell=True, universal_newlines = True, stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE) clang_err = clang_cmd.communicate('int main() { return 0; }')[1] if not 'invalid linker' in clang_err: return True return False root = getRoot(config) if root.host_os not in ['Linux'] or not is_gold_linker_available(): config.unsupported = True