# Copyright 2019 The Dawn Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import("//build_overrides/build.gni") import("dawn_features.gni") import("dawn_overrides_with_defaults.gni") ############################################################################### # Template to produce a component for one of Dawn's libraries. ############################################################################### # Template that produces static and shared versions of the same library as well # as a target similar to Chromium's component targets. # - The shared version exports symbols and has dependent import the symbols # as libname.so with target name libname_shared # - The static library doesn't export symbols nor make dependents import them # - The libname target is similar to a Chromium component and is an alias for # either the static or the shared library. # # The DEFINE_PREFIX must be provided and must match the respective "_export.h" # file. # # Example usage: # # dawn_component("my_library") { # // my_library_export.h must use the MY_LIBRARY_IMPLEMENTATION and # // MY_LIBRARY_SHARED_LIBRARY macros. # DEFINE_PREFIX = "MY_LIBRARY" # # sources = [...] # deps = [...] # configs = [...] # } # # executable("foo") { # deps = [ ":my_library_shared" ] // or :my_library for the same effect # } template("dawn_component") { # Copy the target_name in the local scope so it doesn't get shadowed in the # definition of targets. name = target_name # The config that will apply to dependents of the shared library so they know # they should "import" the symbols config("${name}_shared_public_config") { defines = [ "${invoker.DEFINE_PREFIX}_SHARED_LIBRARY" ] # Executable needs an rpath to find our shared libraries on OSX and Linux if (is_mac) { ldflags = [ "-rpath", "@executable_path/", ] } if (is_linux) { configs = [ "//build/config/gcc:rpath_for_built_shared_libraries" ] } } shared_library("${name}_shared") { # The "tool" for creating shared libraries will automatically add the "lib" prefix output_name = name # Copy all variables except "configs", which has a default value forward_variables_from(invoker, "*", [ "configs" ]) if (defined(invoker.configs)) { configs += invoker.configs } # Tell dependents where to find this shared library if (is_mac) { ldflags = [ "-install_name", "@rpath/lib${name}.dylib", ] } # Use the config that makes the ${DEFINE_PREFIX}_EXPORT macro do something if (!defined(public_configs)) { public_configs = [] } public_configs += [ ":${name}_shared_public_config" ] # Tell sources of this library to export the symbols (and not import) if (!defined(defines)) { defines = [] } defines += [ "${invoker.DEFINE_PREFIX}_IMPLEMENTATION" ] # Chromium adds a config that uses a special linker script that removes # all symbols except JNI ones. Remove this config so that our # shared_library symbols are visible. This matches what Chromium's # component template does. if (build_with_chromium && is_android) { configs -= [ "//build/config/android:hide_all_but_jni_onload" ] } } static_library("${name}_static") { output_name = name + "_static" complete_static_lib = dawn_complete_static_libs # Copy all variables except "configs", which has a default value forward_variables_from(invoker, "*", [ "configs" ]) if (defined(invoker.configs)) { configs += invoker.configs } } group(name) { if (is_component_build) { public_deps = [ ":${name}_shared", ] } else { public_deps = [ ":${name}_static", ] } } }