Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(499)

Unified Diff: tools/gn/docs/style_guide.md

Issue 2076703002: GN style guide on static_libs and source_sets (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: format Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/gn/docs/style_guide.md
diff --git a/tools/gn/docs/style_guide.md b/tools/gn/docs/style_guide.md
index cdb04ff728660e1383516794a64bf65e796d3b0c..29d6b31e418fd81f92f0c19c7ac1263287c0264c 100644
--- a/tools/gn/docs/style_guide.md
+++ b/tools/gn/docs/style_guide.md
@@ -18,7 +18,7 @@ changes are more focused.
more important targets will be first, and unit tests will follow the
corresponding target. If there's no clear ordering, consider
alphabetical order.
- * Test support libraries should be source sets named "test\_support".
+ * Test support libraries should be static libraries named "test\_support".
So "//ui/compositor:test\_support". Test support libraries should
include as public deps the non-test-support version of the library
so tests need only depend on the test\_support target (rather than
@@ -53,7 +53,7 @@ Naming advice
Example for the `src/foo/BUILD.gn` file:
```
-# Copyright 2013 The Chromium Authors. All rights reserved.
+# Copyright 2016 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
@@ -150,10 +150,75 @@ import("//foo/bar/baz.gni") # Even if this file is in the foo/bar directory
## Usage
-Use `source_set` rather than `static_library` unless you have a reason
-to do otherwise. A static library is a standalone library which can be
-slow to generate. A source set just links all the object files from that
-target into the targets depending on it, which saves the "lib" step.
+### Source sets versus static libraries
+
+Source sets and static libraries can be used interchangeably in most cases. If
+you're unsure what to use, a source set is almost never wrong and is less likely
+to cause problems.
+
+Static libraries follow different linking rules. When a static library is
+included in a link, only the object files that contain unresolved symbols will
+be brought into the build. Source sets result in every object file being added
+to the link line of the final binary.
+
+ * If you're eventually linking code into a component, shared library, or
+ loadable module, you normally need to use source sets. This is because
+ object files with no symbols referenced from within the shared library will
+ not be linked into the final library at all. This omission will happen even
+ if that object file has a symbol marked for export that targets dependant
+ on that shared library need. This will result in undefined symbols when
+ linking later targets.
+
+ * Unit tests (and anything else with static initializers with side effects)
+ must use source sets. The gtest TEST macros create static initializers
+ that register the test. But since no code references symbols in the object
+ file, linking a test into a static library and then into a test executable
+ means the tests will get stripped.
+
+ * Static libraries involve duplicating all of the data in the object files
+ that comprise it. This takes more disk space and for certain very large
+ libraries in configurations with very large object files can cause
+ internal limits on the size of static libraries to be exceeded. Source
+ sets do not have this limitation. Some targets switch between source sets
+ and static libraries depending on the build configuration to avoid this
+ problem.
+
+ * In cases where a lot of the symbols are not needed for a particular link
+ (this especially happens when linking test binaries), putting that code in
+ a static library can dramatically increase linking performance. This is
+ because the object files not needed for the link are never considered in
+ the first place, rather than forcing the linker to strip the unused code
+ in a later pass when nothing references it.
+
+### Loadable modules versus shared libraries versus components
+
+A component is a Chrome primitive (rather than a built-in GN concept) that
+expands either to a shared library or a static library / source set depending
+on the value of the `is_component_build` variable. This allows release builds
+to be linked statically in a large binary, but for developers to use shared
+libraries for most operations.
+
+A shared library will be listed on the link line of dependant targets and will
+be loaded automatically by the operating system when the application starts
+and symbols automatically resolved. A loadable module will not be linked
+directly and the application must manually load it.
+
+On Windows and Linux shared libraries and loadable modules result in the same
+type of file (`.dll` and `.so`, respectively). The only difference is in how
+they are linked to dependant targets. On these platforms, having a `deps`
+dependency on a loadable module is the same as having a `data_deps`
+(non-linked) dependency on a shared library.
+
+On Mac, these targets have different formats: a shared library will generate a
+`.dylib` file and a loadable module will generate a `.so` file.
+
+Use loadable modules for things like plugins. Shared libraries should be
+seldom-used outside of components because most Chrome code is shipped to the
+end-user as a small number of large binaries. In the case of plugin-like
+libraries, it's good practice to use both a loadable module for the target type
+(even for platforms where it doesn't matter) and data deps for targets that
+depend on it so it's clear from both places that how the library will be linked
+and loaded.
## Build arguments
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698