xref: /aosp_15_r20/external/skia/bazel/exporter_tool/README.md (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker# Bazel Project Exporter
2*c8dee2aaSAndroid Build Coastguard Worker
3*c8dee2aaSAndroid Build Coastguard WorkerSkia's authoritative build system is moving to Bazel. For users needing to
4*c8dee2aaSAndroid Build Coastguard Workeruse other build system, this tool will export a subset of the Bazel build
5*c8dee2aaSAndroid Build Coastguard Workertargets to other build systems.
6*c8dee2aaSAndroid Build Coastguard Worker
7*c8dee2aaSAndroid Build Coastguard Worker# Bazel to CMake
8*c8dee2aaSAndroid Build Coastguard Worker
9*c8dee2aaSAndroid Build Coastguard Worker**Note:** This is not meant for any purpose beyond development.
10*c8dee2aaSAndroid Build Coastguard Worker
11*c8dee2aaSAndroid Build Coastguard WorkerAt the root level of the Skia workspace:
12*c8dee2aaSAndroid Build Coastguard Worker
13*c8dee2aaSAndroid Build Coastguard Worker```sh
14*c8dee2aaSAndroid Build Coastguard Workermake -C bazel generate_cmake
15*c8dee2aaSAndroid Build Coastguard Worker```
16*c8dee2aaSAndroid Build Coastguard Worker
17*c8dee2aaSAndroid Build Coastguard WorkerThis will write to a single `CMakeLists.txt` file a valid CMake project with
18*c8dee2aaSAndroid Build Coastguard Workertargets to build the artifacts covered by the Bazel //:core target
19*c8dee2aaSAndroid Build Coastguard Workerand all dependent targets.
20*c8dee2aaSAndroid Build Coastguard Worker
21*c8dee2aaSAndroid Build Coastguard Worker## Current limitations
22*c8dee2aaSAndroid Build Coastguard Worker
23*c8dee2aaSAndroid Build Coastguard Worker* External dependencies are not supported.
24*c8dee2aaSAndroid Build Coastguard Worker* Only the `//:core` rule is supported. Other rules *may* work.
25*c8dee2aaSAndroid Build Coastguard Worker
26*c8dee2aaSAndroid Build Coastguard Worker# Bazel to *.gni
27*c8dee2aaSAndroid Build Coastguard Worker
28*c8dee2aaSAndroid Build Coastguard WorkerGenerating the predefined `*.gni` files is done by running the following
29*c8dee2aaSAndroid Build Coastguard Workerat the root level of the Skia workspace:
30*c8dee2aaSAndroid Build Coastguard Worker
31*c8dee2aaSAndroid Build Coastguard Worker```sh
32*c8dee2aaSAndroid Build Coastguard Workermake -C bazel generate_gni
33*c8dee2aaSAndroid Build Coastguard Worker```
34*c8dee2aaSAndroid Build Coastguard Worker
35*c8dee2aaSAndroid Build Coastguard WorkerThis will update the `*.gni` files that reside in `//gn` that contain
36*c8dee2aaSAndroid Build Coastguard Workerfile lists necessary for a GN build. The exporter tool is hardcoded
37*c8dee2aaSAndroid Build Coastguard Workerwith the Bazel rules to be exported, and to which GNI file and
38*c8dee2aaSAndroid Build Coastguard Workerfile list they should be mapped. As Bazel project rules are
39*c8dee2aaSAndroid Build Coastguard Workerrefactored it may be necessary to update the exporter tool to reflect
40*c8dee2aaSAndroid Build Coastguard Workerthose changes.
41*c8dee2aaSAndroid Build Coastguard Worker
42*c8dee2aaSAndroid Build Coastguard Worker## Bazel Rule to GNI File List Mapping
43*c8dee2aaSAndroid Build Coastguard Worker
44*c8dee2aaSAndroid Build Coastguard WorkerThe GNI export process is platform agnostic and generates the GNI files
45*c8dee2aaSAndroid Build Coastguard Workerwith the same file lists on all platforms. Let's describe the mapping
46*c8dee2aaSAndroid Build Coastguard Workerprocess using a fictitious example program:
47*c8dee2aaSAndroid Build Coastguard Worker
48*c8dee2aaSAndroid Build Coastguard WorkerIn `//include/example/BUILD.bazel` exists a rule defining the header
49*c8dee2aaSAndroid Build Coastguard Workerfile:
50*c8dee2aaSAndroid Build Coastguard Worker
51*c8dee2aaSAndroid Build Coastguard Worker```bazel
52*c8dee2aaSAndroid Build Coastguard Workerfilegroup(
53*c8dee2aaSAndroid Build Coastguard Worker    name = "public_hdrs",
54*c8dee2aaSAndroid Build Coastguard Worker    srcs = [ "example.h" ],
55*c8dee2aaSAndroid Build Coastguard Worker)
56*c8dee2aaSAndroid Build Coastguard Worker```
57*c8dee2aaSAndroid Build Coastguard Worker
58*c8dee2aaSAndroid Build Coastguard Worker**Note:** Bazel **visibility rules are ignored**. The exporter
59*c8dee2aaSAndroid Build Coastguard Workertool can export private files.
60*c8dee2aaSAndroid Build Coastguard Worker
61*c8dee2aaSAndroid Build Coastguard WorkerIn `//src/example/BUILD.bazel` a rule to define the example
62*c8dee2aaSAndroid Build Coastguard Workersources:
63*c8dee2aaSAndroid Build Coastguard Worker
64*c8dee2aaSAndroid Build Coastguard Worker```bazel
65*c8dee2aaSAndroid Build Coastguard Workerfilegroup(
66*c8dee2aaSAndroid Build Coastguard Worker    name = "example_srcs",
67*c8dee2aaSAndroid Build Coastguard Worker    srcs = [
68*c8dee2aaSAndroid Build Coastguard Worker        "main.cpp",
69*c8dee2aaSAndroid Build Coastguard Worker        "draw.cpp",
70*c8dee2aaSAndroid Build Coastguard Worker    ] + select({
71*c8dee2aaSAndroid Build Coastguard Worker        ":is_windows": [ "draw_win.cpp" ]
72*c8dee2aaSAndroid Build Coastguard Worker    })
73*c8dee2aaSAndroid Build Coastguard Worker)
74*c8dee2aaSAndroid Build Coastguard Worker```
75*c8dee2aaSAndroid Build Coastguard Worker
76*c8dee2aaSAndroid Build Coastguard WorkerThe rule → file list mapping in the exporter tool looks like:
77*c8dee2aaSAndroid Build Coastguard Worker
78*c8dee2aaSAndroid Build Coastguard Worker```go
79*c8dee2aaSAndroid Build Coastguard Workervar gniExportDescs = []exporter.GNIExportDesc{
80*c8dee2aaSAndroid Build Coastguard Worker    // ... Other GNI definitions.
81*c8dee2aaSAndroid Build Coastguard Worker    {GNI: "gn/example.gni", Vars: []exporter.GNIFileListExportDesc{
82*c8dee2aaSAndroid Build Coastguard Worker		{Var: "example_headers",
83*c8dee2aaSAndroid Build Coastguard Worker			Rules: []string{"//include/example:public_hdrs"}},
84*c8dee2aaSAndroid Build Coastguard Worker		{Var: "example_sources",
85*c8dee2aaSAndroid Build Coastguard Worker			Rules: []string{"//src/example:example_srcs"}}},
86*c8dee2aaSAndroid Build Coastguard Worker	},
87*c8dee2aaSAndroid Build Coastguard Worker    // ... Other GNI definitions.
88*c8dee2aaSAndroid Build Coastguard Worker}
89*c8dee2aaSAndroid Build Coastguard Worker```
90*c8dee2aaSAndroid Build Coastguard Worker
91*c8dee2aaSAndroid Build Coastguard WorkerWhen the exporter tool is run, it will create the following
92*c8dee2aaSAndroid Build Coastguard Workerdefinitions in `//gn/example.gni`:
93*c8dee2aaSAndroid Build Coastguard Worker
94*c8dee2aaSAndroid Build Coastguard Worker```gn
95*c8dee2aaSAndroid Build Coastguard Worker# DO NOT EDIT: This is a generated file.
96*c8dee2aaSAndroid Build Coastguard Worker
97*c8dee2aaSAndroid Build Coastguard Worker_src = get_path_info("../src", "abspath")
98*c8dee2aaSAndroid Build Coastguard Worker_include = get_path_info("../include", "abspath")
99*c8dee2aaSAndroid Build Coastguard Worker
100*c8dee2aaSAndroid Build Coastguard Workerexample_headers = [ "$_include/example/example.h" ]
101*c8dee2aaSAndroid Build Coastguard Worker
102*c8dee2aaSAndroid Build Coastguard Workerexample_sources = [
103*c8dee2aaSAndroid Build Coastguard Worker    "$_src/example/main.cpp",
104*c8dee2aaSAndroid Build Coastguard Worker    "$_src/example/draw.cpp",
105*c8dee2aaSAndroid Build Coastguard Worker    "$_src/example/draw_win.cpp",
106*c8dee2aaSAndroid Build Coastguard Worker]
107*c8dee2aaSAndroid Build Coastguard Worker```
108*c8dee2aaSAndroid Build Coastguard Worker
109*c8dee2aaSAndroid Build Coastguard Worker**Note:** The exporter always includes the contents of all `select()`
110*c8dee2aaSAndroid Build Coastguard Workercalls. This may be desired -- if not the solution is to pull
111*c8dee2aaSAndroid Build Coastguard Workerthe files in a select into a new Bazel filegroup. For example:
112*c8dee2aaSAndroid Build Coastguard Worker
113*c8dee2aaSAndroid Build Coastguard Worker```bazel
114*c8dee2aaSAndroid Build Coastguard Workerfilegroup(
115*c8dee2aaSAndroid Build Coastguard Worker    name = "win_example_srcs",
116*c8dee2aaSAndroid Build Coastguard Worker    srcs = [ "draw_win.cpp" ],
117*c8dee2aaSAndroid Build Coastguard Worker)
118*c8dee2aaSAndroid Build Coastguard Worker
119*c8dee2aaSAndroid Build Coastguard Workerfilegroup(
120*c8dee2aaSAndroid Build Coastguard Worker    name = "example_srcs",
121*c8dee2aaSAndroid Build Coastguard Worker    srcs = [
122*c8dee2aaSAndroid Build Coastguard Worker        "main.cpp",
123*c8dee2aaSAndroid Build Coastguard Worker        "draw.cpp",
124*c8dee2aaSAndroid Build Coastguard Worker        srcs = select({
125*c8dee2aaSAndroid Build Coastguard Worker            ":is_windows": [ ":win_example_srcs" ]
126*c8dee2aaSAndroid Build Coastguard Worker        }).
127*c8dee2aaSAndroid Build Coastguard Worker    ],
128*c8dee2aaSAndroid Build Coastguard Worker)
129*c8dee2aaSAndroid Build Coastguard Worker```
130*c8dee2aaSAndroid Build Coastguard Worker
131*c8dee2aaSAndroid Build Coastguard WorkerOr alternatively:
132*c8dee2aaSAndroid Build Coastguard Worker
133*c8dee2aaSAndroid Build Coastguard Worker```bazel
134*c8dee2aaSAndroid Build Coastguard Workerfilegroup(
135*c8dee2aaSAndroid Build Coastguard Worker    name = "win_example_srcs",
136*c8dee2aaSAndroid Build Coastguard Worker    srcs = select({
137*c8dee2aaSAndroid Build Coastguard Worker        ":is_windows": [ "draw_win.cpp" ]
138*c8dee2aaSAndroid Build Coastguard Worker    }).
139*c8dee2aaSAndroid Build Coastguard Worker)
140*c8dee2aaSAndroid Build Coastguard Worker
141*c8dee2aaSAndroid Build Coastguard Workerfilegroup(
142*c8dee2aaSAndroid Build Coastguard Worker    name = "example_srcs",
143*c8dee2aaSAndroid Build Coastguard Worker    srcs = [
144*c8dee2aaSAndroid Build Coastguard Worker        "main.cpp",
145*c8dee2aaSAndroid Build Coastguard Worker        "draw.cpp",
146*c8dee2aaSAndroid Build Coastguard Worker        ":win_example_srcs", # Not recursively followed.
147*c8dee2aaSAndroid Build Coastguard Worker    ],
148*c8dee2aaSAndroid Build Coastguard Worker)
149*c8dee2aaSAndroid Build Coastguard Worker```
150*c8dee2aaSAndroid Build Coastguard Worker
151*c8dee2aaSAndroid Build Coastguard WorkerIn each case the referenced rule (`win_example_srcs`) is not
152*c8dee2aaSAndroid Build Coastguard Workerfollowed and **only files directly listed in a rule are exported**
153*c8dee2aaSAndroid Build Coastguard Workerto a GNI file.
154