From 903ae13d643c305c48c4271ed4a05939656ed041 Mon Sep 17 00:00:00 2001 From: "Lauren N. Liberda" Date: Sat, 8 Apr 2023 02:56:35 +0200 Subject: [PATCH 1/2] add gn args specifying libc for linux --- build/config/compiler/BUILD.gn | 8 ++- build/config/linux/detect_host_libc.py | 42 ++++++++++++ build/config/linux/libc.gni | 51 +++++++++++++++ build/toolchain/linux/BUILD.gn | 89 ++++++++++++++------------ 4 files changed, 147 insertions(+), 43 deletions(-) create mode 100755 build/config/linux/detect_host_libc.py create mode 100644 build/config/linux/libc.gni diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn index 4c9a1ee..155d433 100644 --- ./build/config/compiler/BUILD.gn.orig +++ ./build/config/compiler/BUILD.gn @@ -12,6 +12,9 @@ if (is_win) { import("//build/config/win/visual_studio_version.gni") } +if (is_linux) { + import("//build/config/linux/libc.gni") +} import("//build/config/c++/c++.gni") import("//build/config/profiler.gni") @@ -339,8 +342,8 @@ ldflags += [ "-pthread" ] if (current_cpu == "arm64") { - cflags += [ "--target=aarch64-linux-gnu" ] - ldflags += [ "--target=aarch64-linux-gnu" ] + cflags += [ "--target=aarch64-alpine-linux-musl" ] + ldflags += [ "--target=aarch64-alpine-linux-musl" ] cflags += [ "-DBORINGSSL_CLANG_SUPPORTS_DOT_ARCH" ] } } @@ -622,12 +625,15 @@ default_warning_flags += [ # Enables. "-Wendif-labels", # Weird old-style text after an #endif. - "-Werror", # Warnings as errors. # Disables. "-Wno-missing-field-initializers", # "struct foo f = {0};" "-Wno-unused-parameter", # Unused function parameters. ] + if (!is_linux || is_glibc) { + # Warnings as errors. Fails on musl. + default_warning_flags += [ "-Werror" ] + } if (is_wasm) { default_warning_flags += [ diff --git a/build/config/linux/detect_host_libc.py b/build/config/linux/detect_host_libc.py new file mode 100755 index 0000000..1ebb498 --- /dev/null +++ b/build/config/linux/detect_host_libc.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python3 +# +# Copyright (c) 2013 The Flutter Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +from optparse import OptionParser +import re +import subprocess +import sys + + +def main(): + if 'linux' not in sys.platform: + return 1 + + parser = OptionParser() + parser.add_option('--compiler-path', action='store', + type='string', default='gcc') + (options, args) = parser.parse_args() + + # should work with both gcc and clang + # + # example outputs: "aarch64-unknown-linux-gnu", "x86_64-alpine-linux-musl", + # "armv7-unknown-linux-musleabihf", "mipsel-linux-muslhf" + default_target = subprocess.check_output([ + options.compiler_path, '-dumpmachine']).decode('utf-8').strip() + + host_libc_re = re.match( + r'^(?:[^-]+-){1,2}linux-(?Pgnu|musl|uclibc)(?:eabi)?(?:hf)?$', + default_target) + if host_libc_re is None: + print(f'Target not understood: {default_target}') + + host_libc = host_libc_re.group('libc') + # print would add a newline + sys.stdout.write(host_libc) + return 0 + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/build/config/linux/libc.gni b/build/config/linux/libc.gni new file mode 100644 index 0000000..653f312 --- /dev/null +++ b/build/config/linux/libc.gni @@ -0,0 +1,51 @@ +# Copyright (c) 2013 The Flutter Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build/config/sysroot.gni") + +declare_args() { + # The C library used by the compilation host. + # Expecting one of: "gnu" (glibc), "uclibc", "musl" + host_libc = "" + + # The C library of the compilation target. + # Expecting one of: "gnu" (glibc), "uclibc", "musl" + target_libc = "" +} + +# try to detect host's libc if not explicitly provided +if (host_libc == "" && is_linux) { + if (sysroot == "") { + host_compiler = "gcc" + if (is_clang) { + host_compiler = "clang" + } + + # tries to determine libc from "gcc/clang -printmachine" + host_libc = exec_script("//build/config/linux/detect_host_libc.py", + [ + "--compiler-path", + host_compiler, + ], + "string") + } else { + # currently there is only debian sysroot + host_libc = "gnu" + } +} + +assert(!is_linux || host_libc != "", "Host libc not specified and not detected") + +# assume compiling for host if not explicitly specified +if (target_libc == "") { + target_libc = host_libc +} + +is_cross_libc = host_libc != target_libc + +is_glibc = target_libc == "gnu" +is_musl = target_libc == "musl" + +is_host_glibc = host_libc == "gnu" +is_host_musl = host_libc == "musl" diff --git a/build/toolchain/linux/BUILD.gn b/build/toolchain/linux/BUILD.gn index 05630d0..b1288ce 100644 --- a/build/toolchain/linux/BUILD.gn +++ b/build/toolchain/linux/BUILD.gn @@ -2,6 +2,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/config/linux/libc.gni") import("//build/config/sysroot.gni") import("//build/toolchain/ccache.gni") import("//build/toolchain/gcc_toolchain.gni") @@ -21,16 +22,20 @@ if (use_goma) { compiler_prefix = "" } -if (host_cpu == "arm64") { - rebased_clang_dir = - rebase_path("//buildtools/linux-arm64/clang/bin", root_build_dir) +if (is_host_glibc) { + if (host_cpu == "arm64") { + rebased_clang_dir = + rebase_path("//buildtools/linux-arm64/clang/bin/", root_build_dir) + } else { + rebased_clang_dir = + rebase_path("//buildtools/linux-x64/clang/bin/", root_build_dir) + } } else { - rebased_clang_dir = - rebase_path("//buildtools/linux-x64/clang/bin", root_build_dir) + rebased_clang_dir = "" } gcc_toolchain("arm") { - prefix = "arm-linux-gnueabihf-" + prefix = "arm-linux-${target_libc}eabihf-" if (toolchain_prefix != "") { prefix = toolchain_prefix } @@ -51,14 +56,14 @@ gcc_toolchain("arm") { gcc_toolchain("clang_arm") { prefix = rebased_clang_dir - cc = "${compiler_prefix}${prefix}/clang" - cxx = "${compiler_prefix}${prefix}/clang++" + cc = "${compiler_prefix}${prefix}clang" + cxx = "${compiler_prefix}${prefix}clang++" - readelf = "${prefix}/llvm-readelf" - nm = "${prefix}/llvm-nm" - ar = "${prefix}/llvm-ar" + readelf = "${prefix}llvm-readelf" + nm = "${prefix}llvm-nm" + ar = "${prefix}llvm-ar" ld = cxx - llvm_objcopy = "${prefix}/llvm-objcopy" + llvm_objcopy = "${prefix}llvm-objcopy" toolchain_cpu = "arm" toolchain_os = "linux" @@ -66,7 +71,7 @@ gcc_toolchain("clang_arm") { } gcc_toolchain("arm64") { - prefix = "aarch64-linux-gnu-" + prefix = "aarch64-linux-${target_libc}-" if (toolchain_prefix != "") { prefix = toolchain_prefix } @@ -87,14 +92,14 @@ gcc_toolchain("arm64") { gcc_toolchain("clang_arm64") { prefix = rebased_clang_dir - cc = "${compiler_prefix}${prefix}/clang" - cxx = "${compiler_prefix}${prefix}/clang++" + cc = "${compiler_prefix}${prefix}clang" + cxx = "${compiler_prefix}${prefix}clang++" readelf = "readelf" - nm = "${prefix}/llvm-nm" - ar = "${prefix}/llvm-ar" + nm = "${prefix}llvm-nm" + ar = "${prefix}llvm-ar" ld = cxx - llvm_objcopy = "${prefix}/llvm-objcopy" + llvm_objcopy = "${prefix}llvm-objcopy" toolchain_cpu = "arm64" toolchain_os = "linux" @@ -103,14 +108,14 @@ gcc_toolchain("clang_arm64") { gcc_toolchain("clang_x86") { prefix = rebased_clang_dir - cc = "${compiler_prefix}${prefix}/clang" - cxx = "${compiler_prefix}${prefix}/clang++" + cc = "${compiler_prefix}${prefix}clang" + cxx = "${compiler_prefix}${prefix}clang++" - readelf = "${prefix}/llvm-readelf" - nm = "${prefix}/llvm-nm" - ar = "${prefix}/llvm-ar" + readelf = "${prefix}llvm-readelf" + nm = "${prefix}llvm-nm" + ar = "${prefix}llvm-ar" ld = cxx - llvm_objcopy = "${prefix}/llvm-objcopy" + llvm_objcopy = "${prefix}llvm-objcopy" toolchain_cpu = "x86" toolchain_os = "linux" @@ -135,14 +140,14 @@ gcc_toolchain("x86") { gcc_toolchain("clang_x64") { prefix = rebased_clang_dir - cc = "${compiler_prefix}${prefix}/clang" - cxx = "${compiler_prefix}${prefix}/clang++" + cc = "${compiler_prefix}${prefix}clang" + cxx = "${compiler_prefix}${prefix}clang++" - readelf = "${prefix}/llvm-readelf" - nm = "${prefix}/llvm-nm" - ar = "${prefix}/llvm-ar" + readelf = "${prefix}llvm-readelf" + nm = "${prefix}llvm-nm" + ar = "${prefix}llvm-ar" ld = cxx - llvm_objcopy = "${prefix}/llvm-objcopy" + llvm_objcopy = "${prefix}llvm-objcopy" toolchain_cpu = "x64" toolchain_os = "linux" @@ -166,7 +171,7 @@ gcc_toolchain("x64") { } gcc_toolchain("riscv32") { - prefix = "riscv32-linux-gnu-" + prefix = "riscv32-linux-${target_libc}-" if (toolchain_prefix != "") { prefix = toolchain_prefix } @@ -187,14 +192,14 @@ gcc_toolchain("riscv32") { gcc_toolchain("clang_riscv32") { prefix = rebased_clang_dir - cc = "${compiler_prefix}${prefix}/clang" - cxx = "${compiler_prefix}${prefix}/clang++" + cc = "${compiler_prefix}${prefix}clang" + cxx = "${compiler_prefix}${prefix}clang++" readelf = "readelf" - nm = "${prefix}/llvm-nm" - ar = "${prefix}/llvm-ar" + nm = "${prefix}llvm-nm" + ar = "${prefix}llvm-ar" ld = cxx - llvm_objcopy = "${prefix}/llvm-objcopy" + llvm_objcopy = "${prefix}llvm-objcopy" toolchain_cpu = "riscv32" toolchain_os = "linux" @@ -202,7 +207,7 @@ gcc_toolchain("clang_riscv32") { } gcc_toolchain("riscv64") { - prefix = "riscv64-linux-gnu-" + prefix = "riscv64-linux-${target_libc}-" if (toolchain_prefix != "") { prefix = toolchain_prefix } @@ -223,14 +228,14 @@ gcc_toolchain("riscv64") { gcc_toolchain("clang_riscv64") { prefix = rebased_clang_dir - cc = "${compiler_prefix}${prefix}/clang" - cxx = "${compiler_prefix}${prefix}/clang++" + cc = "${compiler_prefix}${prefix}clang" + cxx = "${compiler_prefix}${prefix}clang++" readelf = "readelf" - nm = "${prefix}/llvm-nm" - ar = "${prefix}/llvm-ar" + nm = "${prefix}llvm-nm" + ar = "${prefix}llvm-ar" ld = cxx - llvm_objcopy = "${prefix}/llvm-objcopy" + llvm_objcopy = "${prefix}llvm-objcopy" toolchain_cpu = "riscv64" toolchain_os = "linux" -- 2.40.0