From a9f4611c78d78ec46e39c2dbbee839960c23bd8c Mon Sep 17 00:00:00 2001 From: klzgrad Date: Mon, 17 May 2021 02:01:16 +0800 Subject: [PATCH] build: Add OpenWrt toolchains --- src/build/config/BUILDCONFIG.gn | 4 +- src/build/config/compiler/BUILD.gn | 13 ++++-- src/build/config/openwrt/BUILD.gn | 64 ++++++++++++++++++++++++++++ src/build/toolchain/openwrt/BUILD.gn | 15 +++++++ 4 files changed, 91 insertions(+), 5 deletions(-) create mode 100644 src/build/config/openwrt/BUILD.gn create mode 100644 src/build/toolchain/openwrt/BUILD.gn diff --git a/src/build/config/BUILDCONFIG.gn b/src/build/config/BUILDCONFIG.gn index 1fa42b1b1b..30b8e27e0a 100644 --- a/src/build/config/BUILDCONFIG.gn +++ b/src/build/config/BUILDCONFIG.gn @@ -268,6 +268,8 @@ if (target_os == "android") { _default_toolchain = "//build/toolchain/aix:$target_cpu" } else if (target_os == "zos") { _default_toolchain = "//build/toolchain/zos:$target_cpu" +} else if (target_os == "openwrt") { + _default_toolchain = "//build/toolchain/openwrt:$target_cpu" } else { assert(false, "Unsupported target_os: $target_os") } @@ -302,7 +304,7 @@ is_android = current_os == "android" is_chromeos = current_os == "chromeos" is_fuchsia = current_os == "fuchsia" is_ios = current_os == "ios" -is_linux = current_os == "linux" +is_linux = current_os == "linux" || current_os == "openwrt" is_mac = current_os == "mac" is_nacl = current_os == "nacl" is_win = current_os == "win" || current_os == "winuwp" diff --git a/src/build/config/compiler/BUILD.gn b/src/build/config/compiler/BUILD.gn index 2faeef81af..5c853ff49b 100644 --- a/src/build/config/compiler/BUILD.gn +++ b/src/build/config/compiler/BUILD.gn @@ -273,6 +273,9 @@ config("compiler") { configs += [ "//build/config/android:compiler" ] } else if (is_linux || is_chromeos) { configs += [ "//build/config/linux:compiler" ] + if (current_os == "openwrt") { + configs += [ "//build/config/openwrt:compiler" ] + } } else if (is_nacl) { configs += [ "//build/config/nacl:compiler" ] } else if (is_mac) { @@ -1014,7 +1017,8 @@ config("compiler_cpu_abi") { } } else if (current_cpu == "arm") { if (is_clang && !is_android && !is_nacl && - !(is_chromeos_lacros && is_chromeos_device)) { + !(is_chromeos_lacros && is_chromeos_device) && + current_os != "openwrt") { cflags += [ "--target=arm-linux-gnueabihf" ] ldflags += [ "--target=arm-linux-gnueabihf" ] } @@ -1034,7 +1038,8 @@ config("compiler_cpu_abi") { } } else if (current_cpu == "arm64") { if (is_clang && !is_android && !is_nacl && !is_fuchsia && - !(is_chromeos_lacros && is_chromeos_device)) { + !(is_chromeos_lacros && is_chromeos_device) && + current_os != "openwrt") { cflags += [ "--target=aarch64-linux-gnu" ] ldflags += [ "--target=aarch64-linux-gnu" ] } @@ -1043,7 +1048,7 @@ config("compiler_cpu_abi") { } } else if (current_cpu == "mipsel" && !is_nacl) { ldflags += [ "-Wl,--hash-style=sysv" ] - if (custom_toolchain == "") { + if (custom_toolchain == "" && current_os != "openwrt") { if (is_clang) { if (is_android) { cflags += [ "--target=mipsel-linux-android" ] @@ -1174,7 +1179,7 @@ config("compiler_cpu_abi") { } else if (current_cpu == "mips64el") { cflags += [ "-D__SANE_USERSPACE_TYPES__" ] ldflags += [ "-Wl,--hash-style=sysv" ] - if (custom_toolchain == "") { + if (custom_toolchain == "" && current_os != "openwrt") { if (is_clang) { if (is_android) { cflags += [ "--target=mips64el-linux-android" ] diff --git a/src/build/config/openwrt/BUILD.gn b/src/build/config/openwrt/BUILD.gn new file mode 100644 index 0000000000..a4a4e72a4c --- /dev/null +++ b/src/build/config/openwrt/BUILD.gn @@ -0,0 +1,64 @@ +# Copyright 2014 The Chromium 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/c++/c++.gni") +import("//build/config/compiler/compiler.gni") +import("//build/config/sanitizers/sanitizers.gni") + +if (current_toolchain == default_toolchain) { + import("//build/toolchain/concurrent_links.gni") +} + +assert(current_os == "openwrt") + +declare_args() { + build_static = false +} + +# This is included by reference in the //build/config/compiler config that +# is applied to all targets. It is here to separate out the logic that is +# Android-only. +config("compiler") { + cflags = [] + ldflags = [] + + defines = [ + "_LIBCPP_HAS_MUSL_LIBC", + "__UCLIBC__", + "__MUSL__", + ] + + if (build_static) { + # Musl static objects are not built with -fPIC, cannot use -static-pie. + ldflags += [ "-static" ] + } else if (current_cpu == "x86") { + ldflags += [ "-Wl,--dynamic-linker=/lib/ld-musl-i386.so.1" ] + } else if (current_cpu == "mipsel") { + ldflags += [ "-Wl,--dynamic-linker=/lib/ld-musl-mipsel-sf.so.1" ] + } + + abi = "musl" + if (current_cpu == "arm") { + abi = "muslgnueabi" + arch = "arm" + } else if (current_cpu == "arm64") { + arch = "aarch64" + } else if (current_cpu == "x86") { + arch = "i486" + } else if (current_cpu == "x64") { + arch = "x86_64" + } else if (current_cpu == "mipsel") { + arch = "mipsel" + } else if (current_cpu == "mips64el") { + arch = "mips64el" + } else { + assert(false, "Architecture not supported") + } + cflags += [ "--target=$arch-openwrt-linux-$abi" ] + ldflags += [ "--target=$arch-openwrt-linux-$abi" ] + + # Assign any flags set for the C compiler to asmflags so that they are sent + # to the assembler. + asmflags = cflags +} diff --git a/src/build/toolchain/openwrt/BUILD.gn b/src/build/toolchain/openwrt/BUILD.gn new file mode 100644 index 0000000000..d05b4503d7 --- /dev/null +++ b/src/build/toolchain/openwrt/BUILD.gn @@ -0,0 +1,15 @@ +# Copyright 2013 The Chromium 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") +import("//build/toolchain/gcc_toolchain.gni") + +assert(target_os == "openwrt") + +clang_toolchain(target_cpu) { + toolchain_args = { + current_cpu = target_cpu + current_os = "openwrt" + } +}