| # This file defines a template for using .export files. |
| # |
| # Parameters: |
| # exports_file (required) |
| # Path of the .exports file to use. |
| # |
| # Example use: |
| # symbol_exports("my_exports") { |
| # exports_file = "//foo/bar/my.exports" |
| # } |
| # ... |
| # shared_library("my_target") { |
| # deps = [ ":my_exports" ] # Adds correct ldflags. |
| # ... |
| # } |
| |
| # Corresponds to add_llvm_symbol_exports() in the CMake build. |
| template("symbol_exports") { |
| # Create a platform-appropriate name for the temporary file. |
| linker_file = get_path_info(invoker.exports_file, "name") |
| if (current_os == "mac") { |
| linker_file = linker_file + "_symbols.txt" |
| } else if (current_os == "win") { |
| linker_file = linker_file + ".def" |
| } else { |
| linker_file = linker_file + ".script" |
| } |
| linker_file = "$target_gen_dir/$linker_file" |
| rebased_linker_file = rebase_path(linker_file, root_build_dir) |
| |
| config_name = "${target_name}_config" |
| config(config_name) { |
| # FIXME: With this setup, targets are not relinked automatically |
| # when the input exports file is touched but nothing else changes. |
| # https://groups.google.com/a/chromium.org/g/gn-dev/c/sN09GYS1ufE |
| visibility = [ ":$target_name" ] |
| if (current_os == "mac") { |
| ldflags = [ "-Wl,-exported_symbols_list,$rebased_linker_file" ] |
| } else if (current_os == "win") { |
| ldflags = [ "/DEF:$rebased_linker_file" ] |
| } else { |
| ldflags = [ "-Wl,--version-script,$rebased_linker_file" ] |
| } |
| } |
| |
| action(target_name) { |
| forward_variables_from(invoker, [ "deps" ]) |
| script = "//llvm/utils/gn/build/symbol_exports.py" |
| inputs = [ invoker.exports_file ] |
| outputs = [ linker_file ] |
| args = [ |
| "--format=" + current_os, |
| rebase_path(inputs[0], root_build_dir), |
| rebased_linker_file, |
| ] |
| |
| # Let targets depending on this receive the right ldflags. |
| public_configs = [ ":$config_name" ] |
| } |
| } |