xref: /aosp_15_r20/external/skia/third_party/libgrapheme/BUILD.gn (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1# Copyright 2022 Google LLC
2#
3# Use of this source code is governed by a ISC-License license that can be
4# found in the LICENSE file.
5
6import("../third_party.gni")
7
8declare_args() {
9  UNICODE_VERSION = "15.0.0"
10}
11
12config("c99") {
13  cflags_c = []
14  if (is_win) {
15    cflags_c += [ "-std:c11" ]
16  } else {
17    cflags_c += [ "-std=c99" ]
18  }
19}
20
21# Header generation only happens on the host.
22# Ensure it will not be built for non-host even when implicitly building all targets.
23if (current_toolchain == "//gn/toolchain:$host_toolchain") {
24  copy("copy_unicode_data") {
25    unicode_tools_dir =
26        "../externals/unicodetools/unicodetools/data/ucd/$UNICODE_VERSION"
27    sources = [
28      "$unicode_tools_dir/BidiBrackets.txt",
29      "$unicode_tools_dir/BidiCharacterTest.txt",
30      "$unicode_tools_dir/BidiMirroring.txt",
31      "$unicode_tools_dir/BidiTest.txt",
32      "$unicode_tools_dir/DerivedCoreProperties.txt",
33      "$unicode_tools_dir/EastAsianWidth.txt",
34      "$unicode_tools_dir/LineBreak.txt",
35      "$unicode_tools_dir/SpecialCasing.txt",
36      "$unicode_tools_dir/UnicodeData.txt",
37      "$unicode_tools_dir/auxiliary/GraphemeBreakProperty.txt",
38      "$unicode_tools_dir/auxiliary/GraphemeBreakTest.txt",
39      "$unicode_tools_dir/auxiliary/LineBreakTest.txt",
40      "$unicode_tools_dir/auxiliary/SentenceBreakProperty.txt",
41      "$unicode_tools_dir/auxiliary/SentenceBreakTest.txt",
42      "$unicode_tools_dir/auxiliary/WordBreakProperty.txt",
43      "$unicode_tools_dir/auxiliary/WordBreakTest.txt",
44      "$unicode_tools_dir/emoji/emoji-data.txt",
45      "$unicode_tools_dir/extracted/DerivedBidiClass.txt",
46    ]
47    outputs =
48        [ "$root_gen_dir/third_party/libgrapheme/data/{{source_file_part}}" ]
49  }
50
51  template("compile_tool") {
52    executable(target_name) {
53      forward_variables_from(invoker, "*", [ "deps" ])
54      if (defined(invoker.deps)) {
55        deps += invoker.deps
56      }
57      configs += [ ":c99" ]
58      sources += [ "../externals/libgrapheme/gen/util.c" ]
59    }
60  }
61
62  compile_tool("bidirectional") {
63    sources = [ "../externals/libgrapheme/gen/bidirectional.c" ]
64  }
65
66  compile_tool("case") {
67    sources = [ "../externals/libgrapheme/gen/case.c" ]
68  }
69
70  compile_tool("character") {
71    sources = [ "../externals/libgrapheme/gen/character.c" ]
72  }
73
74  compile_tool("line") {
75    sources = [ "../externals/libgrapheme/gen/line.c" ]
76  }
77
78  compile_tool("sentence") {
79    sources = [ "../externals/libgrapheme/gen/sentence.c" ]
80  }
81
82  compile_tool("word") {
83    sources = [ "../externals/libgrapheme/gen/word.c" ]
84  }
85
86  # Run an executable that will produce a header
87  action_foreach("generate_headers") {
88    script = "generate_headers.py"
89    cmd_dir = rebase_path(root_out_dir)
90    args = [
91      "$cmd_dir/{{source_name_part}}",
92      rebase_path(
93          "$root_gen_dir/third_party/libgrapheme/gen/{{source_name_part}}.h",
94          root_build_dir),
95      rebase_path("$root_gen_dir/third_party/libgrapheme", root_build_dir),
96    ]
97    _src = "../externals/libgrapheme/gen"
98    sources = [
99      "$_src/bidirectional.c",
100      "$_src/case.c",
101      "$_src/character.c",
102      "$_src/line.c",
103      "$_src/sentence.c",
104      "$_src/word.c",
105    ]
106    outputs =
107        [ "$root_gen_dir/third_party/libgrapheme/gen/{{source_name_part}}.h" ]
108    deps = [
109      ":bidirectional",
110      ":case",
111      ":character",
112      ":copy_unicode_data",
113      ":line",
114      ":sentence",
115      ":word",
116    ]
117  }
118}
119
120# libgrapheme is built for the target and so must be able to always see headers and headers_config.
121config("headers_config") {
122  if (current_toolchain == "//gn/toolchain:$host_toolchain") {
123    include_dirs = [ "$root_gen_dir/third_party/libgrapheme/gen" ]
124  }
125}
126
127source_set("headers") {
128  if (current_toolchain == "//gn/toolchain:$host_toolchain") {
129    # Prevent :generate_headers from being run when building all targets.
130    sources = get_target_outputs(":generate_headers")
131
132    #get_target_outputs does not actually depend on the outputs
133    deps = [ ":generate_headers" ]
134  }
135}
136
137third_party("libgrapheme") {
138  public_include_dirs = [ "../externals/libgrapheme" ]
139  _src = "../externals/libgrapheme/src"
140
141  configs = [
142    ":c99",
143    ":headers_config(//gn/toolchain:$host_toolchain)",
144  ]
145
146  sources = [
147    "$_src/bidirectional.c",
148    "$_src/case.c",
149    "$_src/character.c",
150    "$_src/line.c",
151    "$_src/sentence.c",
152    "$_src/utf8.c",
153    "$_src/util.c",
154    "$_src/word.c",
155  ]
156
157  deps = [ ":headers(//gn/toolchain:$host_toolchain)" ]
158}
159