[sdk] Allow C++ source/prebuilt libraries to specify an API golden file.

Bug: DX-685
Change-Id: Ic8ab7f822eb1c594090e8349f29fbc896ae16a47
diff --git a/build/cpp/sdk_shared_library.gni b/build/cpp/sdk_shared_library.gni
index 32cf233..f5c9c12 100644
--- a/build/cpp/sdk_shared_library.gni
+++ b/build/cpp/sdk_shared_library.gni
@@ -13,6 +13,11 @@
 #     Publication level of the library in SDKs.
 #     See //build/sdk/sdk_atom.gni.
 #
+#   api (optional)
+#     Path to the file representing the API of this library.
+#     This file is used to ensure modifications to the library's API are
+#     explicitly acknowledged.
+#
 #   no_headers (optional)
 #     Whether to include the library's headers in the SDK.
 #     Defaults to false.
@@ -47,6 +52,7 @@
     forward_variables_from(invoker,
                            "*",
                            [
+                             "api",
                              "category",
                              "include_base",
                              "no_headers",
@@ -138,8 +144,8 @@
       }
     }
   }
-  sdk_headers = []
-  sdk_files = []
+  sdk_metadata_headers = []
+  sdk_header_files = []
   foreach(header, all_headers) {
     include_base = "include"
     if (defined(invoker.include_base)) {
@@ -147,8 +153,8 @@
     }
     destination = rebase_path(header, include_base)
     header_dest = "$file_base/include/$destination"
-    sdk_headers += [ header_dest ]
-    sdk_files += [
+    sdk_metadata_headers += [ header_dest ]
+    sdk_header_files += [
       {
         source = header
         dest = header_dest
@@ -161,7 +167,7 @@
   lib_name = "lib$output_name.so"
   link_lib = "$prebuilt_base/lib/$lib_name"
   dist_lib = "$prebuilt_base/dist/$lib_name"
-  sdk_files += [
+  sdk_files = sdk_header_files + [
     {
       # TODO(TO-791): put ABI stubs under lib/, not the full thing.
       source = "$shared_out_dir/$lib_name"
@@ -197,7 +203,7 @@
              "--include-dir",
              "$file_base/include",
              "--deps",
-           ] + sdk_metas + [ "--headers" ] + sdk_headers +
+           ] + sdk_metas + [ "--headers" ] + sdk_metadata_headers +
            [
              "--arch",
              target_cpu,
@@ -221,6 +227,12 @@
 
     category = invoker.category
 
+    if (defined(invoker.api) && !no_headers) {
+      api = invoker.api
+
+      api_contents = sdk_header_files
+    }
+
     meta = {
       source = metadata_file
       dest = "$file_base/meta.json"
diff --git a/build/cpp/sdk_source_set.gni b/build/cpp/sdk_source_set.gni
index 35ef4c41..8f1b931 100644
--- a/build/cpp/sdk_source_set.gni
+++ b/build/cpp/sdk_source_set.gni
@@ -15,6 +15,11 @@
 #     Publication level of the library in SDKs.
 #     See //build/sdk/sdk_atom.gni.
 #
+#   api (optional)
+#     Path to the file representing the API of this library.
+#     This file is used to ensure modifications to the library's API are
+#     explicitly acknowledged.
+#
 #   sdk_name (required)
 #     Name of the library in the SDK.
 #
@@ -38,6 +43,7 @@
     forward_variables_from(invoker,
                            "*",
                            [
+                             "api",
                              "category",
                              "include_base",
                              "sdk_name",
@@ -87,8 +93,9 @@
 
   # Determine destinations in the SDK for headers and sources.
   file_base = "pkg/${invoker.sdk_name}"
-  sdk_headers = []
-  sdk_sources = []
+  sdk_metadata_headers = []
+  sdk_metadata_sources = []
+  sdk_header_files = []
   sdk_files = []
   foreach(header, all_headers) {
     include_base = "include"
@@ -97,16 +104,17 @@
     }
     relative_destination = rebase_path(header, include_base)
     destination = "$file_base/include/$relative_destination"
-    sdk_headers += [ destination ]
-    sdk_files += [
+    sdk_metadata_headers += [ destination ]
+    sdk_header_files += [
       {
         source = header
         dest = destination
       },
     ]
   }
+  sdk_files += sdk_header_files
   foreach(source, all_sources) {
-    sdk_sources += [ "$file_base/$source" ]
+    sdk_metadata_sources += [ "$file_base/$source" ]
     sdk_files += [
       {
         source = source
@@ -138,8 +146,8 @@
       "$file_base/include",
     ]
     args += [ "--deps" ] + sdk_metas
-    args += [ "--sources" ] + sdk_sources
-    args += [ "--headers" ] + sdk_headers
+    args += [ "--sources" ] + sdk_metadata_sources
+    args += [ "--headers" ] + sdk_metadata_headers
 
     deps = sdk_deps
   }
@@ -154,6 +162,12 @@
     id = "sdk://pkg/${invoker.sdk_name}"
     category = invoker.category
 
+    if (defined(invoker.api)) {
+      api = invoker.api
+
+      api_contents = sdk_header_files
+    }
+
     meta = {
       source = metadata_file
       dest = "$file_base/meta.json"