| Index: third_party/grpc/templates/README.md
|
| diff --git a/third_party/grpc/templates/README.md b/third_party/grpc/templates/README.md
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..eedc6e9c09fa50725f127a31958fc5d39e4fa392
|
| --- /dev/null
|
| +++ b/third_party/grpc/templates/README.md
|
| @@ -0,0 +1,166 @@
|
| +# Quick justification
|
| +
|
| +We've approached the problem of the build system from a lot of different
|
| +angles. The main issue was that there isn't a single build system that
|
| +was going to single handedly cover all of our usage cases.
|
| +
|
| +So instead we decided to work the following way:
|
| +
|
| +* A `build.yaml` file at the root is the source of truth for listing all the
|
| +targets and files needed to build grpc and its tests, as well as a basic system
|
| +for dependency description.
|
| +
|
| +* Each project file (Makefile, Visual Studio project files, Bazel's BUILD) is
|
| +a [YAML](http://yaml.org) file used by the `build.yaml` file to generate the
|
| +final output file.
|
| +
|
| +This way we can maintain as many project system as we see fit, without having
|
| +to manually maintain them when we add or remove new code to the repository.
|
| +Only the structure of the project file is relevant to the template. The actual
|
| +list of source code and targets isn't.
|
| +
|
| +We currently have template files for GNU Make, Visual Studio 2013,
|
| +[Bazel](http://bazel.io) and [gyp](https://gyp.gsrc.io/) (albeit only for
|
| +Node.js). In the future, we
|
| +would like to expand to also generate [cmake](https://cmake.org)
|
| +project files, XCode project files, and an Android.mk file allowing to compile
|
| +gRPC using Android's NDK.
|
| +
|
| +We'll gladly accept contribution that'd create additional project files
|
| +using that system.
|
| +
|
| +# Structure of `build.yaml`
|
| +
|
| +The `build.yaml` file has the following structure:
|
| +
|
| +```
|
| +settings: # global settings, such as version number
|
| + ...
|
| +filegroups: # groups of files that are automatically expanded
|
| + ...
|
| +libs: # list of libraries to build
|
| + ...
|
| +target: # list of targets to build
|
| + ...
|
| +```
|
| +
|
| +The `filegroups` are helpful to re-use a subset of files in multiple targets.
|
| +One `filegroups` entry has the following structure:
|
| +
|
| +```
|
| +- name: "arbitrary string", # the name of the filegroup
|
| + public_headers: # list of public headers defined in that filegroup
|
| + - ...
|
| + headers: # list of headers defined in that filegroup
|
| + - ...
|
| + src: # list of source files defined in that filegroup
|
| + - ...
|
| +```
|
| +
|
| +The `libs` collection contains the list of all the libraries we describe. Some may be
|
| +helper libraries for the tests. Some may be installable libraries. Some may be
|
| +helper libraries for installable binaries.
|
| +
|
| +The `targets` array contains the list of all the binary targets we describe. Some may
|
| +be installable binaries.
|
| +
|
| +One `libs` or `targets` entry has the following structure (see below for
|
| +details):
|
| +
|
| +```
|
| +name: "arbitrary string", # the name of the library
|
| +build: "build type", # in which situation we want that library to be
|
| + # built and potentially installed (see below).
|
| +language: "...", # the language tag; "c" or "c++"
|
| +public_headers: # list of public headers to install
|
| +headers: # list of headers used by that target
|
| +src: # list of files to compile
|
| +secure: boolean, # see below
|
| +baselib: boolean, # this is a low level library that has system
|
| + # dependencies
|
| +vs_project_guid: '{...}', # Visual Studio's unique guid for that project
|
| +filegroups: # list of filegroups to merge to that project
|
| + # note that this will be expanded automatically
|
| +deps: # list of libraries this target depends on
|
| +deps_linkage: "..." # "static" or "dynamic". Used by the Makefile only to
|
| + # determine the way dependencies are linkned. Defaults
|
| + # to "dynamic".
|
| +dll: "..." # see below.
|
| +dll_def: "..." # Visual Studio's dll definition file.
|
| +vs_props: # List of property sheets to attach to that project.
|
| +vs_config_type: "..." # DynamicLibrary/StaticLibrary. Used only when
|
| + # creating a library. Specifies if we're building a
|
| + # static library or a dll. Use in conjunction with `dll_def`.
|
| +vs_packages: # List of nuget packages this project depends on.
|
| +```
|
| +
|
| +## The `"build"` tag
|
| +
|
| +Currently, the "`build`" tag have these meanings:
|
| +
|
| +* `"all"`: library to build on `"make all"`, and install on the system.
|
| +* `"protoc"`: a protoc plugin to build on `"make all"` and install on the system.
|
| +* `"private"`: a library to only build for tests.
|
| +* `"test"`: a test binary to run on `"make test"`.
|
| +* `"tool"`: a binary to be built upon `"make tools"`.
|
| +
|
| +All of the targets should always be present in the generated project file, if
|
| +possible and applicable. But the build tag is what should group the targets
|
| +together in a single build command.
|
| +
|
| +
|
| +## The `"secure"` tag
|
| +
|
| +This means this target requires OpenSSL one way or another. The values can be
|
| +`"yes"`, `"no"` and `"check"`. The default value is `"check"`. It means that
|
| +the target requires OpenSSL, but that since the target depends on another one
|
| +that is supposed to also import OpenSSL, the import should then be implicitely
|
| +transitive. `"check"` should then only disable that target if OpenSSL hasn't
|
| +been found or is unavailable.
|
| +
|
| +## The `"baselib"` boolean
|
| +
|
| +This means this is a library that will provide most of the features for gRPC.
|
| +In particular, if we're locally building OpenSSL, protobuf or zlib, then we
|
| +should merge OpenSSL, protobuf or zlib inside that library. That effect depends
|
| +on the `"language"` tag. OpenSSL and zlib are for `"c"` libraries, while
|
| +protobuf is for `"c++"` ones.
|
| +
|
| +## The `"dll"` tag
|
| +
|
| +Used only by Visual Studio's project files. "true" means the project will be
|
| +built with both static and dynamic runtimes. "false" means it'll only be built
|
| +with static runtime. "only" means it'll only be built with the dll runtime.
|
| +
|
| +## The `"dll_def"` tag
|
| +
|
| +Specifies the visual studio's dll definition file. When creating a DLL, you
|
| +sometimes (not always) need a def file (see grpc.def).
|
| +
|
| +
|
| +# The template system
|
| +
|
| +We're currently using the [mako templates](http://www.makotemplates.org/)
|
| +renderer. That choice enables us to simply render text files without dragging
|
| +with us a lot of other features. Feel free to explore the current templates
|
| +in that directory. The simplest one is probably [BUILD.template](BUILD.template)
|
| +which is used to create the [Bazel](http://bazel.io/) project file.
|
| +
|
| +## The renderer engine
|
| +
|
| +As mentioned, the renderer is using [mako templates](http://www.makotemplates.org/),
|
| +but some glue is needed to process all of that. See the [buildgen folder](../tools/buildgen)
|
| +for more details. We're mainly loading the build.json file, and massaging it,
|
| +in order to get the list of properties we need, into a Python dictionary, that
|
| +is then passed to the template while rending it.
|
| +
|
| +## The plugins
|
| +
|
| +The file build.json itself isn't passed straight to the template files. It is
|
| +first processed and modified by a few plugins. For example, the `filegroups`
|
| +expander is [a plugin](../tools/buildgen/plugins/expand_filegroups.py).
|
| +
|
| +The structure of a plugin is simple. The plugin must defined the function
|
| +`mako_plugin` that takes a Python dictionary. That dictionary represents the
|
| +current state of the build.json contents. The plugin can alter it to whatever
|
| +feature it needs to add.
|
|
|