# 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" ] } }