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