aboutsummaryrefslogtreecommitdiff
path: root/toolchains/BUILD.gn
blob: 16abe57956ce8c7452e906e2494c529ed24efc68 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# Copyright 2020 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.

import("//build_overrides/pigweed.gni")
import("$dir_pigweed/targets/host/target_toolchains.gni")
import("$dir_pw_toolchain/generate_toolchain.gni")

config("common_config") {
  include_dirs = [ "//include" ]

  # No language extensions, to promote portability.
  cflags_c = [
    "-Wvla",
    "-std=c99",
    "-pedantic",
  ]

  # Modern C++ for test and tooling.
  cflags_cc = [ "-std=c++20" ]
}

config("enable_sanitizers") {
  filter_path = rebase_path("sanitize_filter.txt", root_build_dir)
  cflags = [
    "-fsanitize=address,undefined,integer",
    "-fsanitize-blacklist=$filter_path",
  ]
  ldflags = cflags
  inputs = [ "sanitize_filter.txt" ]
}

config("enable_fuzzer") {
  cflags = [
    "-fsanitize=fuzzer",
    "-O1",
    "-fno-omit-frame-pointer",
    "-fno-optimize-sibling-calls",
  ]
  ldflags = cflags
}

# Define a scope for each toolchain that can be fed into generate_toolchain.
_host_debug = {
  # Use Pigweed's host_clang_debug toolchain as a base.
  _toolchain_base = pw_target_toolchain_host.clang_debug

  # Forward everything except the defaults scope from that toolchain.
  forward_variables_from(_toolchain_base, "*", [ "defaults" ])

  defaults = {
    # Forward everything from the base toolchain's defaults.
    forward_variables_from(_toolchain_base.defaults, "*")

    # Extend with custom build arguments for the target.
    default_configs += [
      "//toolchains:common_config",
      "//toolchains:enable_sanitizers",
    ]
  }
}

_host_fuzz = {
  # Use Pigweed's host_clang_debug toolchain as a base.
  _toolchain_base = pw_target_toolchain_host.clang_debug

  # Forward everything except the defaults scope from that toolchain.
  forward_variables_from(_toolchain_base, "*", [ "defaults" ])

  defaults = {
    # Forward everything from the base toolchain's defaults.
    forward_variables_from(_toolchain_base.defaults, "*")

    # Extend with custom build arguments for the target.
    default_configs += [
      "//toolchains:common_config",
      "//toolchains:enable_sanitizers",
      "//toolchains:enable_fuzzer",
    ]
  }
}

_host_optimized = {
  # Use Pigweed's host_clang_size_optimized toolchain as a base.
  _toolchain_base = pw_target_toolchain_host.clang_size_optimized

  # Forward everything except the defaults scope from that toolchain.
  forward_variables_from(_toolchain_base, "*", [ "defaults" ])

  defaults = {
    # Forward everything from the base toolchain's defaults.
    forward_variables_from(_toolchain_base.defaults, "*")

    # Extend with custom build arguments for the target.
    default_configs += [ "//toolchains:common_config" ]
  }
}

# Create the actual GN toolchains.
generate_toolchain("host_debug") {
  forward_variables_from(_host_debug, "*")
}

generate_toolchain("host_fuzz") {
  forward_variables_from(_host_fuzz, "*")
}

generate_toolchain("host_optimized") {
  forward_variables_from(_host_optimized, "*")
}