From 2432fc9e6a8e4587d900845ab8b2d05ff0c9e57c 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 | 15 ++++--- src/build/config/openwrt/BUILD.gn | 66 ++++++++++++++++++++++++++++ src/build/toolchain/openwrt/BUILD.gn | 15 +++++++ 4 files changed, 94 insertions(+), 6 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 6ee83a41a0..0edb3384c1 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 b3ba6b8e65..a8119d15dd 100644 --- a/src/build/config/compiler/BUILD.gn +++ b/src/build/config/compiler/BUILD.gn @@ -286,6 +286,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) { @@ -1100,7 +1103,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" ] } @@ -1120,7 +1124,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" ] } @@ -1129,7 +1134,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" ] @@ -1260,7 +1265,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" ] @@ -1368,7 +1373,7 @@ config("compiler_cpu_abi") { ldflags += [ "-m64" ] } } else if (current_cpu == "riscv64") { - if (is_clang && !is_android) { + if (is_clang && !is_android && current_os != "openwrt") { cflags += [ "--target=riscv64-linux-gnu" ] ldflags += [ "--target=riscv64-linux-gnu" ] } diff --git a/src/build/config/openwrt/BUILD.gn b/src/build/config/openwrt/BUILD.gn new file mode 100644 index 0000000000..20d2ee9ff5 --- /dev/null +++ b/src/build/config/openwrt/BUILD.gn @@ -0,0 +1,66 @@ +# 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 if (current_cpu == "riscv64") { + arch = "riscv64" + } 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" + } +}