Add GYP to GN conversion cookbook
diff --git a/docs/cookbook.md b/docs/cookbook.md
new file mode 100644
index 0000000..623f84f
--- /dev/null
+++ b/docs/cookbook.md
@@ -0,0 +1,684 @@
+# GYP->GN Conversion Cookbook
+
+[TOC]
+
+## Targets
+
+| *GYP*                                            | *GN*                                               |
+|:-------------------------------------------------|:---------------------------------------------------|
+| `'type': 'static_library', 'name': 'foo',`       | `static_library("foo") {` or `source_set("foo") {` |
+| `'type': 'shared_library', 'name': 'foo',`       | `shared_library("foo") {`                          |
+| `'type': 'loadable_module', 'name': 'foo',`      | `loadable_module("foo") {`                         |
+| `'type': '<(component)', 'name': 'foo',`         | `component("foo") {`                               |
+| `'type': 'executable', 'name': 'foo',`           | `executable("foo") {`                              |
+| `'type': '<(gtest_target_type)', 'name': 'foo',` | `test("foo") {`                                    |
+| `'type': 'none', 'name': 'foo',`                 | `group("foo") {`                                   |
+
+### Note on static libraries
+
+A source\_set is basically a transparent static\_library. The source files
+are compiled with the given options but not linked into anything.
+Targets that depend on a source set get the source set's object files
+linked into it. This saves the overhead of creating a static library on
+disk, avoids weird linker issues when a static library has no source
+files, and you can link source sets into shared libraries and have
+symbols exported from the shared library.
+
+The last issue is a cause of a lot of headaches in the GYP build. If you
+annotate a symbol as exported (i.e. `BASE_EXPORT`) then you can't have
+it in a file that goes into a static library because the function might
+be [stripped out](http://blogs.msdn.com/b/oldnewthing/archive/2014/03/21/10509670.aspx)
+if it's not called from within the static library. This
+prevents composing components of static libraries and exporting their
+symbols. A source set avoids this issue and `EXPORT` has the desired
+meaning of "export from the component this gets linked into" with no
+surprising dead code stripping behavior.
+
+A disadvantage of source sets is that if an object file is completely
+unused, it will still be linked into the result, which is not the case
+for static libraries. A few places in the build depend on this behavior
+(deliberately or accidentally). In general, small libraries that we
+expect to be entirely used, test helpers, etc. can be source sets. There
+is slightly less risk of subtle issues if you keep static libraries
+static libraries, however.
+
+### Actions
+
+GYP
+
+```
+{
+  'action_name': 'foo',
+  'inputs': [ 'bar.py' ],
+  'outputs': [ '<(SHARED_INTERMEDIATE_DIR)/bar.out' ],
+  'action': ['python', 'bar.py', '--la_dee_da' ],
+},
+```
+
+Unlike GYP, where an action is a part of a target, GN actions are
+separate targets that you then depend on via deps from other targets:
+
+```
+action("foo") {
+  script = "bar.py"
+  outputs = [ "$target_gen_dir/bar.out" ]
+  args = [ "--la_dee_da" ]
+}
+
+executable("foo.exe") {
+  ...
+  deps = [ ":foo" ]  # Depend on the action to make sure it runs.
+}
+```
+
+Rules in GYP become `action_foreach` in GN which work like actions but
+iterate over a set of sources.
+
+### Copies
+
+GYP
+
+```
+'copies': [
+  {
+    'destination': '<(PRODUCT_DIR)/',
+    'files': [
+      '../build/win/dbghelp_xp/dbghelp.dll',
+    ],
+  },
+],
+```
+
+Unlike GYP, where copies are part of a target, GN copies are
+separate targets that you then depend on via deps from other targets:
+
+```
+copy("bar") {
+  sources = [ "../path/to/secret.dll" ]
+  outputs = [ "$root_out_dir/{{source_file_part}}" ]
+}
+
+component("base") {
+  ...
+  deps = [ "bar" }  # Depend on the copy to make sure it runs.
+}
+```
+
+## Platform checking
+
+| *GYP*                                | *GN*                 |
+|:-------------------------------------|:---------------------|
+| `'conditions': [['OS=="win"', {`     | `if (is_win) {`      |
+| `'conditions': [['OS=="linux"', {`   | `if (is_linux) {`    |
+| `'conditions': [['OS=="android"', {` | `if (is_android) {`  |
+| `'conditions': [['OS=="mac"', {`     | `if (is_mac) {`      |
+| `'conditions': [['OS=="ios"', {`     | `if (is_ios) {`      |
+| `'conditions': [['chromeos==1', {`   | `if (is_chromeos) {` |
+
+## Typical sources and deps modifications
+
+### GYP
+
+```
+'sources': [
+  'a.cc',
+  'b.cc',
+  'c.cc',
+],
+'dependencies': [
+  '<(DEPTH)/base/base.gyp:foo',
+],
+'conditions': [
+  ['OS=="win"': {
+    'sources!': [
+       'a.cc',
+    ],
+    'sources': [
+      'foo.cc',
+    ],
+    'dependencies': [
+      '<(DEPTH)/base/base.gyp:bar',
+    ],
+  }, {
+    'sources/': [
+      ['exclude', '^b\\.cc$'],
+    ],
+  }],
+],
+```
+
+### GN
+
+```
+sources = [
+  "c.cc",
+]
+deps = [
+  "//base:foo",
+]
+
+if (is_win) {
+  sources += [
+    "b.cc",
+    "foo.cc',
+  ]
+  deps += [ "//base:bar" ]
+} else {
+  sources += [ "a.cc" ]
+}
+```
+
+Note that in GN we prefer to only add files when needed, and don't add all of
+them at first only to remove them later like in gyp.
+
+## Variable mappings
+
+### Build configuration
+
+Build configuration and feature flags are usually global in GYP. In GN
+we try to limit global variables and instead put variables used by only
+some files into `.gni` files. These files are then imported into your
+buildfile by specifying at the top:
+
+```
+import("//build/config/features.gni")
+
+# ... now you can use the variables declared in features.gni.
+if (is_tsan) {
+  # ...
+}
+if (cld_version == 2) {
+  # ...
+}
+```
+
+Other flags only apply to one `BUILD.gn` file and those flags are
+declared directly in that file (so other files can't use them). These
+places are noted in the table below.
+
+| *GYP*                                           | *GN*                                       | *GN import*                                    |
+|:------------------------------------------------|:-------------------------------------------|:-----------------------------------------------|
+| `arm_float_abi`                                 | `arm_float_abi`                            | `//build/config/arm.gni`                       |
+| `arm_neon` (0/1)                                | `arm_use_neon` (true/false)                | `//build/config/arm.gni`                       |
+| `arm_neon_optional` (0/1)                       | `arm_optionally_use_neon` (true/false)     | `//build/config/arm.gni`                       |
+| `arm_version`                                   | `arm_version`                              | `//build/config/arm.gni`                       |
+| `asan` (0/1)                                    | `is_asan` (true/false)                     | `//build/config/sanitizers/sanitizers.gni`     |
+| `branding` ("Chromium"/"Chrome")                | `is_chrome_branded` (true/false)           | `//build/config/chrome_build.gni`              |
+| `build_for_tool=="drmemory"`                    | `enable_iterator_debugging=false`          | (internal to `//build/config/BUILD.gn`)        |
+| `build_for_tool=="tsan"`                        | `enable_iterator_debugging=false`          | (internal to `//build/config/BUILD.gn`)        |
+| `buildtype` ("Official"/"Dev")                  | `is_official_build` (true/false)           | `//build/config/chrome_build.gni`              |
+| `chrome_multiple_dll` (0/1)                     | `is_multi_dll_chrome` (true/false)         | `//build/config/chrome_build.gni`              |
+| `clang` (0/1)                                   | `is_clang` (true/false)                    | (global)                                       |
+| `clang_use_chrome_plugins` (0/1)                | `clang_use_chrome_plugins` (true/false)    | (internal to `//build/config/clang/BUILD.gn`)  |
+| `component` ("shared_library"/"static_library") | `is_component_build` (true/false)          | (global)                                       |
+| `desktop_linux` (0/1)                           | `is_desktop_linux` (true/false)            | (global)                                       |
+| `disable_glibcxx_debug` (0/1)                   | `enable_iterator_debugging` (true/false)   | (internal to `//build/config/BUILD.gn`)        |
+| `fastbuild` (0/1/2)                             | `symbol_level` (2/1/0 — values inverted)   | `//build/config/compiler/compiler.gni`         |
+| `gomadir`                                       | `goma_dir`                                 | `//build/toolchain/goma.gni`                   |
+| `ios_deployment_target` (string)                | `ios_deployment_target`                    | `//build/config/ios/ios_sdk.gni`               |
+| `GYP_MSVS_OVERRIDE_PATH` environment variable   | `visual_studio_path`                       | `//build/config/win/visual_studio_version.gni` |
+| `GYP_MSVS_VERSION` environment variable         | (none)                                     |                                                |
+| `ios_sdk_path`                                  | `ios_sdk_path` and `use_ios_simulator`     | `//build/config/ios/ios_sdk.gni`               |
+| `lsan` (0/1)                                    | `is_lsan` (true/false)                     | `//build/config/sanitizers/sanitizers.gni`     |
+| `mac_sdk_min`                                   | `mac_sdk_min`                              | `//build/config/mac/mac_sdk.gni`               |
+| `mac_sdk_path`                                  | `mac_sdk_path`                             | `//build/config/mac/mac_sdk.gni`               |
+| `mac_sdk`                                       | `mac_sdk_version`                          | `//build/config/mac/mac_sdk.gni`               |
+| `mac_strip_release`                             | `enable_stripping`                         | `//build/config/mac/symbols.gni`               |
+| `mac_want_real_dsym`                            | `enable_dsyms`                             | `//build/config/mac/symbols.gni`               |
+| `msan` (0/1)                                    | `is_msan` (true/false)                     | `//build/config/sanitizers/sanitizers.gni`     |
+| `SDKROOT` (Mac)                                 | `sysroot`                                  | `//build/config/sysroot.gni`                   |
+| `sysroot`                                       | `sysroot`                                  | `//build/config/sysroot.gni`                   |
+| `target_arch` ("ia32"/"x64"/"arm"/"mipsel")     | `target_cpu` ("x86"/"x64"/"arm"/"mipsel")  | (global)                                       |
+| `toolkit_views` (0/1)                           | `toolkit_views`                            | `//build/config/ui.gni`                        |
+| `tsan` (0/1)                                    | `is_tsan` (true/false)                     | `//build/config/sanitizers/sanitizers.gni`     |
+| `windows_sdk_path`                              | `windows_sdk_path`                         | (internal to `//build/config/win/BUILD.gn`)    |
+
+### Feature flags
+
+| *GYP*                                   | *GN*                                           | *GN import*                   |
+|:----------------------------------------|:-----------------------------------------------|:------------------------------|
+| `cld_version` (number)                  | `cld_version` (number)                         | `//build/config/features.gni` |
+| `configuration_policy` (0/1)            | `enable_configuration_policy` (true/false)     | `//build/config/features.gni` |
+| `debug_devtools` (0/1)                  | `debug_devtools` (true/false)                  | `//build/config/features.gni` |
+| `disable_ftp_support` (0/1)             | `disable_ftp_support` (true/false)             | `//build/config/features.gni` |
+| `disable_nacl` (0/1)                    | `enable_nacl` (true/false)                     | `//build/config/features.gni` |
+| `enable_app_list` (0/1)                 | `enable_app_list` (true/false)                 | `//build/config/features.gni` |
+| `enable_autofill_dialog` (0/1)          | `enable_autofill_dialog` (true/false)          | `//build/config/features.gni` |
+| `enable_background` (0/1)               | `enable_background` (true/false)               | `//build/config/features.gni` |
+| `enable_captive_portal_detection` (0/1) | `enable_captive_portal_detection` (true/false) | `//build/config/features.gni` |
+| `enable_chromevox_next` (0/1)           | `enable_chromevox_next` (true/false)           | `//build/config/features.gni` |
+| `enable_extensions` (0/1)               | `enable_extensions` (true/false)               | `//build/config/features.gni` |
+| `enable_google_now` (0/1)               | `enable_google_now` (true/false)               | `//build/config/features.gni` |
+| `enable_hidpi` (0/1)                    | `enable_hidpi` (true/false)                    | `//ui/base/ui_features.gni`   |
+| `enable_managed_users` (0/1)            | `enable_managed_users` (true/false)            | `//build/config/features.gni` |
+| `enable_mdns` (0/1)                     | `enable_mdns` (true/false)                     | `//build/config/features.gni` |
+| `enable_one_click_signin` (0/1)         | `enable_one_click_signin` (true/false)         | `//chrome/common/features.gni` |
+| `enable_pepper_cdms` (0/1)              | `enable_pepper_cdms` (true/false)              | `//build/config/features.gni` |
+| `enable_plugins` (0/1)                  | `enable_plugins` (true/false)                  | `//build/config/features.gni` |
+| `enable_plugin_installation` (0/1)      | `enable_plugin_installation` (true/false)      | `//build/config/features.gni` |
+| `enable_basic_printing` (0/1)           | `enable_basic_printing` (true/false)           | `//build/config/features.gni` |
+| `enable_print_preview` (0/1)            | `enable_print_preview` (true/false)            | `//build/config/features.gni` |
+| `enable_rlz` (0/1)                      | `enable_rlz` (true/false)                      | `//build/config/features.gni` |
+| `enable_spellcheck` (0/1)               | `enable_spellcheck` (true/false)               | `//build/config/features.gni` |
+| `enable_session_service` (0/1)          | `enable_session_service` (true/false)          | `//build/config/features.gni` |
+| `enable_task_manager` (0/1)             | `enable_task_manager` (true/false)             | `//build/config/features.gni` |
+| `enable_themes` (0/1)                   | `enable_themes` (true/false)                   | `//build/config/features.gni` |
+| `enable_webrtc` (0/1)                   | `enable_webrtc` (true/false)                   | `//build/config/features.gni` |
+| `image_loader_extension` (0/1)          | `enable_image_loader_extension` (true/false)   | `//build/config/features.gni` |
+| `input_speech` (0/1)                    | `enable_speech_input` (true/false)             | `//build/config/features.gni` |
+| `notifications` (0/1)                   | `enable_notifications` (true/false)            | `//build/config/features.gni` |
+| `ozone_platform_dri` (0/1)              | `ozone_platform_dri` (true/false)              | `//build/config/ui.gni`       |
+| `remoting` (0/1)                        | `enable_remoting` (true/false)                 | `//build/config/features.gni` |
+| `safe_browsing` (0/1/2)                 | `safe_browsing_mode` (0/1/2)                   | `//build/config/features.gni` |
+| `use_allocator` (`'none'`|`'tcmalloc'`) | `use_allocator` (`"none"`|`"tcmalloc"`)        | (See "Allocator" below)       |
+| `ui_compositor_image_transport` (0/1)   | `ui_compositor_image_transport` (true/false)   | `//build/config/ui.gni`       |
+| `use_ash` (0/1)                         | `use_ash` (true/false)                         | `//build/config/ui.gni`       |
+| `use_athena` (0/1)                      | `use_athena` (true/false)                      | `//build/config/ui.gni`       |
+| `use_aura` (0/1)                        | `use_aura` (true/false)                        | `//build/config/ui.gni`       |
+| `use_brlapi` (0/1)                      | `use_brlapi` (true/false)                      | `//build/config/features.gni` |
+| `use_cairo` (0/1)                       | `use_cairo` (true/false)                       | `//build/config/ui.gni`       |
+| `use_clipboard_aurax11` (0/1)           | `use_aura && use_x11`                          |                               |
+| `use_cups` (0/1)                        | `use_cups` (true/false)                        | `//build/config/features.gni` |
+| `use_dbus` (0/1)                        | `use_dbus` (true/false)                        | `//build/config/features.gni` |
+| `use_gconf` (0/1)                       | `use_gconf` (true/false)                       | `//build/config/features.gni` |
+| `use_glib` (0/1)                        | `is_linux` (true/false)                        | (global)                      |
+| `use_gnome_keyring` (0/1)               | `use_gnome_keyring` (true/false)               |                               |
+| `use_goma` (0/1)                        | `use_goma` (true/false)                        | `//build/toolchain/goma.gni`  |
+| `use_nss_certs` (0/1)                   | `use_nss_certs` (true/false)                   | `//build/config/crypto.gni` (Many of these conditions can be deleted, see the "SSL" notes on targets below.) |
+| `use_pango` (0/1)                       | `use_pango` (true/false)                       | `//build/config/ui.gni`       |
+| `use_ozone` (0/1)                       | `use_ozone` (true/false)                       | `//build/config/ui.gni`       |
+| `use_seccomp_bpf` (0/1)                 | `use_seccomp_bpf` (true/false)                 | `//build/config/features.gni` |
+| `use_udev` (0/1)                        | `use_udev` (true/false)                        | `//build/config/features.gni` |
+| `use_x11` (0/1)                         | `use_x11` (true/false)                         | `//build/config/ui.gni`       |
+| `use_xi2_mt` (0/1)                      | `use_xi2_mt` (true/false)                      | `//build/config/ui.gni`       |
+| `win_use_allocator_shim` (0/1)          |                                                | (See "Allocator" below)       |
+
+### Common target conversion
+
+Some targets that lots of projects depend on and how the GN ones
+correspond to GYP ones. (This is for commonly-depended-on or weird
+targets only, don't add stuff here just because you converted it.)
+
+| *GYP*                                                                              | *GN*                                     | *Notes* (see below)  |
+|:-----------------------------------------------------------------------------------|:-----------------------------------------|:---------------------|
+| `base/base.gyp:base`                                                               | `//base`                                 |                      |
+| `base/base.gyp:base_i18n`                                                          | `//base:i18n`                            |                      |
+| `base/base.gyp:run_all_unittests`                                                  | `//base/test:run_all_unittests`          |                      |
+| `base/base.gyp:test_support_base`                                                  | `//base/test:test_support`               |                      |
+| `base/third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations` | `//base/third_party/dynamic_annotations` |                      |
+| `build/linux/system.gyp:*` (except nss)                                            | `//build/config/linux:*`                 | Linux system targets |
+| `build/linux/system.gyp:nss`                                                       | `//crypto:platform`                      | SSL                  |
+| `net/third_party/nss/ssl.gyp:libssl`                                               | `//crypto:platform`                      | SSL                  |
+| `skia/skia.gyp:skia`                                                               | `//skia`                                 |                      |
+| `testing/gmock.gyp:gmock`                                                          | `//testing/gmock`                        | Secondary tree       |
+| `testing/gtest.gyp:gtest`                                                          | `//testing/gtest`                        | Secondary treeo      |
+| `third_party/icu/icu.gyp:icui18n`                                                  | `//third_party/icu`                      | Secondary tree, ICU  |
+| `third_party/icu/icu.gyp:icuuc`                                                    | `//third_party/icu`                      | Secondary tree, ICU  |
+| `url/url.gyp:url_lib`                                                              | `//url` || ||
+
+Notes:
+
+  * *ICU:* GN has separate `//third_party/icu:icuuc` and
+    `//third_party/icu:icui18n` targets just like GYP. You can use these
+    if you only need one of them. Most targets want both, so GN made a
+    meta target that's just `//third_party/icu` which you can use that
+    redirects to both "uc" and "i18n".
+
+  * *Linux system targets:* Generally the names in GN patch the GYP
+    names for the Linux system-related stuff. However, most of them are
+    configs instead of actual targets (in GYP they're all targets). For
+    example, since "x11" is just a list of libraries and include
+    directories, and includes no sources it's a config that just adds
+    this configuration to your target. To use a config, do `configs += [
+    "//build/config/linux:x11" ]`
+
+  * *Secondary tree:* Some projects are DEPSed in and we want it to look
+    like a BUILD.gn file is in that directory without checking it in to
+    the upstream repo. The directory `build/secondary` mirrors the main
+    tree and is checked for BUILD.gn files if an expected file in the
+    main tree wasn't found.
+
+  * *SSL:* In GYP there are lots of conditions around NSS vs. OpenSSL
+    and different platforms that determine which of the different SSL
+    libraries is linked. In GN, there is a meta-target
+    `//crypto:platform` that will "do the right thing" according to the
+    current build platform and flags. Generally its safe to replace any
+    conditional reference to a SSL library with this one.
+
+## Visibility and header file issues
+
+GN is much more strict about header file checking. You may encounter
+errors that your target doesn't depend on the target containing a
+certain header file. The most common example is including
+`base/macros.h` without having `//base` in your project's dependency
+list. The solution is to just add the missing dependency.
+
+The dependency tree must be a DAG. Some components might share headers
+between a number of internal targets that makes adding the "proper"
+dependencies impossible. In this case, you can separate out a
+`source_set` type target containing just the header(s) in question, and
+make the targets that use that header depend on that source set to break
+the cycle.
+
+##  Other stuff
+
+### Target conditions
+
+`target_conditions` are like normal conditions but expanded in a
+different phase of GYP. You can generally just convert the conditions
+inside and not worry about the `conditions`/`target_conditions`
+difference.
+
+### xcode_settings
+
+Some xcode settings are obvious:
+
+```
+  'xcode_settings': {'OTHER_LDFLAGS': ['-foo']},
+```
+
+Should just expand to:
+
+```
+  ldflags = [ "-foo" ]
+```
+
+Other flags are less obvious:
+
+```
+  'xcode_settings': { 'GCC_SYMBOLS_PRIVATE_EXTERN': 'NO', },
+```
+
+These all correspond to various flags that get passed to the compiler or
+linker. You can use your favorite search engine to see what it
+corresponds to, but many of them are not well documented. You can also
+search for the string in
+[tools/gyp/pylib/gyp/xcode_emulation.py](https://code.google.com/p/chromium/codesearch#chromium/src/tools/gyp/pylib/gyp/xcode_emulation.py). GYP uses this file to decode
+the Xcode settings into command line flags for the ninja build.
+
+### wexit-time destructors
+
+Replace
+
+```
+'enable_wexit_time_destructors': 1,
+```
+
+with
+
+```
+configs += [ "//build/config/compiler:wexit_time_destructors" ]
+```
+
+### Chromium code
+
+In GYP code is "non-Chromium" by default, and you opt into higher warning levels using:
+
+```
+'chromium_code': 1,
+```
+
+In GN, all code is Chromium code by default. If you're compiling a
+static library that needs more lax warnings, opt out of the
+Chromium-code settings with:
+
+```
+configs -= [ "//build/config/compiler:chromium_code" ]
+configs += [ "//build/config/compiler:no_chromium_code" ]
+```
+
+### -fvisibility
+
+All symbols in the build have "hidden" visibility by default (this means
+that symbols aren't exported from shared libraries, a concept different
+than GN's target visibility). If you needed to export all symbols (for a
+third party library) by default in GYP you would do:
+
+```
+'xcode_settings': [
+  'GCC_SYMBOLS_PRIVATE_EXTERN': 'NO',  # no -fvisibility=hidden
+],
+'cflags!': [
+  '-fvisibility=hidden',
+],
+```
+
+In GN the equivalent is:
+
+```
+if (!is_win) {
+  configs -= [ "//build/config/gcc:symbol_visibility_hidden" ]
+}
+```
+
+### Dependent settings
+
+In GYP you'll see stuff like this, especially in third-party code.
+
+```
+'direct_dependent_settings': {
+  'include_dirs': [
+    '.',  # This directory.
+    '../..',  # Root "src" path.
+  ],
+  'defines': [
+    'FOO',
+  ],
+},
+```
+
+Note that many of the includes are trying to add the root "src"
+directory to the include path. This is always present in GN so you can
+remove these.
+
+GYP also requires you to duplicate these settings, once for the target
+itself, and once for the direct/all dependent settings. In GN,
+public/all dependent configs also apply to the current target so you
+only need to specify it once.
+
+In GN, put the settings in a config (declared above your target), and
+then reference that as a public config in your target:
+
+```
+config("foo_config") {
+  include_dirs = [ "." ]
+  defines = [ "FOO" ]
+}
+
+component("foo") {
+  ...
+  public_configs = [ ":foo_config" ]
+}
+```
+
+Targets that depend on `foo` will now get `foo_config` applied.
+
+GYP would say `export_dependent_settings` to forward
+`direct_dependent_settings` up the dependency chain. In GN, put the
+dependency in the `public_deps` section and this will happen
+automatically.
+
+### MSVS disabled warnings
+
+In GYP you'll see for third-party code:
+
+```
+'msvs_disabled_warnings': [ 4018, 4244, 4267, ],
+```
+
+At least half of the warnings in these blocks are already disabled
+globally (we added more global ones later). From the command line, do:
+
+```
+$ cd src/build/config
+$ git grep 4018
+compiler/BUILD.gn:      "/wd4018",  # Comparing signed and unsigned values.
+```
+
+tells us that warning 4018 is already disabled globally from the
+`default_warning_flags` variable in `//build/config/compiler`, and the same
+for 4244. So ignore these.
+
+Always comment what the warning is. Use your favorite search engine and
+type "vc warning 4267" to look it up. You'll end up with:
+
+```
+if (is_win) {
+  cflags += [
+    "/wd4267",  # Conversion from size_t to 'type'.
+  ]
+}
+```
+
+(Use `=` instead of `+=` is you haven't already defined a `cflags` variable.)
+
+### Mac frameworks
+
+GN knows to convert `.framework` files in the `libs` list to the right
+thing on Mac. You don't need to specify the directories either. So
+convert this:
+
+```
+'link_settings': {
+  'libraries': [
+    '$(SDKROOT)/System/Library/Frameworks/Accelerate.framework',
+  ],
+},
+```
+
+to this:
+
+```
+libs = [ "Accelerate.framework" ]
+```
+
+### hard_dependency
+
+GYP code sometimes sets
+
+```
+  'hard_dependency': 1,
+```
+
+to indicate that the current target must be build before its dependents.
+GN can deduce this internally, so you can ignore this directive.
+
+### Allocator
+
+GYP has `win_use_allocator_shim` and `use_allocator`. In GN, these are
+merged into `use_allocator` which is defined in
+`//build/config/allocator.gni`. _However_ you should almost never need
+to use this flag. The `//base/allocator` target will change depending on
+the current allocator flag, so you can unconditionally depend on this
+target to pick up the current build defaults.
+
+This:
+
+```
+  ['use_allocator!='none'', {
+    'dependencies': [ '../base/allocator/allocator.gyp:allocator' ]
+  }],
+  ['win_use_allocator_shim==1', {
+    'dependencies': [ '<(allocator_target)' ],
+  }],
+```
+
+Becomes:
+
+```
+  deps = [ "//base/allocator" ]
+```
+
+As in GYP, the allocator should only be depended on by executables (and
+tests). Libraries should not set the allocator.
+
+### optimize: max
+
+In Gyp:
+
+```
+'optimize': 'max',
+```
+
+only affects Windows and will optimize for speed rather than size. To
+get the same behavior in GN, do:
+
+```
+if (!is_debug && is_win) {
+  configs -= [ "//build/config/compiler:default_optimization" ]
+  configs += [ "//build/config/compiler:optimize_max" ]
+}
+```
+
+The `is_win` check is needed because the `optimize_max` config also
+affects Posix systems. Some components might additionally specify `-O2`
+on Posix further optimize, in which case you can remove the `is_win`
+check.
+
+### Protobufs
+
+```
+import("//third_party/protobuf/proto_library.gni")
+
+proto_library("myproto") {
+  sources = [ "foo.proto" ]
+}
+```
+
+See the `third_party/protobuf/proto_library.gni` file for full
+documentation and extra flags.
+
+### Java stuff
+
+JNI generator in GYP:
+
+```
+{
+  'target_name': 'foo_headers',
+  'type': 'none',
+  'sources': [ <java files> ]
+  'variables': { 'jni_gen_package': 'foobar' }
+  'includes': [ 'build/jni_generator.gypi' ]
+}
+```
+
+JNI generator in GN:
+
+```
+# At top of file:
+if (is_android) {
+  import("//build/config/android/rules.gni")
+}
+
+# Later:
+if (is_android) {
+  generate_jni("foo_headers") {
+    sources = [ <java files> ]
+    jni_package = "foobar"
+  }
+}
+```
+
+### Grit
+
+```
+import("//tools/grit/grit_rule.gni")
+
+grit("resources") {
+  source = "my_resources.grd"
+}
+```
+
+See `src/build/secondary/tools/grit/grit_rule.gni` for more documentation.
+
+### Mojo
+
+```
+import("//mojo/public/tools/bindings/mojom.gni")
+
+mojom("mojo_bindings") {
+  sources = [
+    "foo.mojom",
+  ]
+}
+```