155 lines
3.6 KiB
Markdown
155 lines
3.6 KiB
Markdown
|
|
# Bazel Project Exporter
|
||
|
|
|
||
|
|
Skia's authoritative build system is moving to Bazel. For users needing to
|
||
|
|
use other build system, this tool will export a subset of the Bazel build
|
||
|
|
targets to other build systems.
|
||
|
|
|
||
|
|
# Bazel to CMake
|
||
|
|
|
||
|
|
**Note:** This is not meant for any purpose beyond development.
|
||
|
|
|
||
|
|
At the root level of the Skia workspace:
|
||
|
|
|
||
|
|
```sh
|
||
|
|
make -C bazel generate_cmake
|
||
|
|
```
|
||
|
|
|
||
|
|
This will write to a single `CMakeLists.txt` file a valid CMake project with
|
||
|
|
targets to build the artifacts covered by the Bazel //:skia_public target
|
||
|
|
and all dependent targets.
|
||
|
|
|
||
|
|
## Current limitations
|
||
|
|
|
||
|
|
* External dependencies are not supported.
|
||
|
|
* Only the `//:skia_public` rule is supported. Other rules *may* work.
|
||
|
|
|
||
|
|
# Bazel to *.gni
|
||
|
|
|
||
|
|
Generating the predefined `*.gni` files is done by running the following
|
||
|
|
at the root level of the Skia workspace:
|
||
|
|
|
||
|
|
```sh
|
||
|
|
make -C bazel generate_gni
|
||
|
|
```
|
||
|
|
|
||
|
|
This will update the `*.gni` files that reside in `//gn` that contain
|
||
|
|
file lists necessary for a GN build. The exporter tool is hardcoded
|
||
|
|
with the Bazel rules to be exported, and to which GNI file and
|
||
|
|
file list they should be mapped. As Bazel project rules are
|
||
|
|
refactored it may be necessary to update the exporter tool to reflect
|
||
|
|
those changes.
|
||
|
|
|
||
|
|
## Bazel Rule to GNI File List Mapping
|
||
|
|
|
||
|
|
The GNI export process is platform agnostic and generates the GNI files
|
||
|
|
with the same file lists on all platforms. Let's describe the mapping
|
||
|
|
process using a fictitious example program:
|
||
|
|
|
||
|
|
In `//include/example/BUILD.bazel` exists a rule defining the header
|
||
|
|
file:
|
||
|
|
|
||
|
|
```bazel
|
||
|
|
filegroup(
|
||
|
|
name = "public_hdrs",
|
||
|
|
srcs = [ "example.h" ],
|
||
|
|
)
|
||
|
|
```
|
||
|
|
|
||
|
|
**Note:** Bazel **visibility rules are ignored**. The exporter
|
||
|
|
tool can export private files.
|
||
|
|
|
||
|
|
In `//src/example/BUILD.bazel` a rule to define the example
|
||
|
|
sources:
|
||
|
|
|
||
|
|
```bazel
|
||
|
|
filegroup(
|
||
|
|
name = "example_srcs",
|
||
|
|
srcs = [
|
||
|
|
"main.cpp",
|
||
|
|
"draw.cpp",
|
||
|
|
select({
|
||
|
|
":is_windows": [ "draw_win.cpp" ]
|
||
|
|
}).
|
||
|
|
],
|
||
|
|
)
|
||
|
|
```
|
||
|
|
|
||
|
|
The rule → file list mapping in the exporter tool looks like:
|
||
|
|
|
||
|
|
```go
|
||
|
|
var gniExportDescs = []exporter.GNIExportDesc{
|
||
|
|
// ... Other GNI definitions.
|
||
|
|
{GNI: "gn/example.gni", Vars: []exporter.GNIFileListExportDesc{
|
||
|
|
{Var: "example_headers",
|
||
|
|
Rules: []string{"//include/example:public_hdrs"}},
|
||
|
|
{Var: "example_sources",
|
||
|
|
Rules: []string{"//src/example:example_srcs"}}},
|
||
|
|
},
|
||
|
|
// ... Other GNI definitions.
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
When the exporter tool is run, it will create the following
|
||
|
|
definitions in `//gn/example.gni`:
|
||
|
|
|
||
|
|
```gn
|
||
|
|
# DO NOT EDIT: This is a generated file.
|
||
|
|
|
||
|
|
_src = get_path_info("../src", "abspath")
|
||
|
|
_include = get_path_info("../include", "abspath")
|
||
|
|
|
||
|
|
example_headers = [ "$_include/example/example.h" ]
|
||
|
|
|
||
|
|
example_sources = [
|
||
|
|
"$_src/example/main.cpp",
|
||
|
|
"$_src/example/draw.cpp",
|
||
|
|
"$_src/example/draw_win.cpp",
|
||
|
|
]
|
||
|
|
```
|
||
|
|
|
||
|
|
**Note:** The exporter always includes the contents of all `select()`
|
||
|
|
calls. This may be desired -- if not the solution is to pull
|
||
|
|
the files in a select into a new Bazel filegroup. For example:
|
||
|
|
|
||
|
|
```bazel
|
||
|
|
filegroup(
|
||
|
|
name = "win_example_srcs",
|
||
|
|
srcs = [ "draw_win.cpp" ],
|
||
|
|
)
|
||
|
|
|
||
|
|
filegroup(
|
||
|
|
name = "example_srcs",
|
||
|
|
srcs = [
|
||
|
|
"main.cpp",
|
||
|
|
"draw.cpp",
|
||
|
|
srcs = select({
|
||
|
|
":is_windows": [ ":win_example_srcs" ]
|
||
|
|
}).
|
||
|
|
],
|
||
|
|
)
|
||
|
|
```
|
||
|
|
|
||
|
|
Or alternatively:
|
||
|
|
|
||
|
|
```bazel
|
||
|
|
filegroup(
|
||
|
|
name = "win_example_srcs",
|
||
|
|
srcs = select({
|
||
|
|
":is_windows": [ "draw_win.cpp" ]
|
||
|
|
}).
|
||
|
|
)
|
||
|
|
|
||
|
|
filegroup(
|
||
|
|
name = "example_srcs",
|
||
|
|
srcs = [
|
||
|
|
"main.cpp",
|
||
|
|
"draw.cpp",
|
||
|
|
":win_example_srcs", # Not recursively followed.
|
||
|
|
],
|
||
|
|
)
|
||
|
|
```
|
||
|
|
|
||
|
|
In each case the referenced rule (`win_example_srcs`) is not
|
||
|
|
followed and **only files directly listed in a rule are exported**
|
||
|
|
to a GNI file.
|