• Nico Weber's avatar
    gn: Add runtime_link_output to tool("solib") · e3398c19
    Nico Weber authored
    gn's tool("solink") has two settings for the output of the rule:
    link_output and depend_output. link_output is what targets depending
    on a shared_library are linked against, and depend_output is what
    is used for the ninja dependency.
    
    On POSIX, this is used to implement a component build optimization:
    If a shared library is linked but its public interface doesn't change, then
    it's not necessary to relink its downstream dependencies. To implement
    this, depend_output is set to a text file that contains a description of all
    public symbols of the shared library. The link step first links and then
    checks if the new public symbols are different from the old contents of
    the file, and only then does it overwrite the TOC file. This allows ninja's
    restat optimization to work.
    
    However, downstream dependencies need to link against the actual .so
    file on the link line `ld -o foo libinput.so`, so link_output needs to be set
    to the .so file.
    
    On Windows, link.exe writes a .lib and a .dll file when it creates a .dll file.
    The .lib is only written when needed with incremental links, so if
    depend_output is set to the .lib then the restat optimization works there
    too. And downstream dependencies also need to link to the .lib at
    link time, so in Windows both depend_output and link_output must
    be set the the .lib file.
    
    So far, so good. However, `gn desc runtime_deps` is used to print what files
    need to be copied to swarming bots to run an executable, and that currently
    looks at link_output. On POSIX that's ok, but on Windows that ends up
    copying the .lib instead of the .dll.
    
    This patch adds a third setting "runtime_link_output" which can be set
    to the output of the solink tool that must be present at runtime. It defaults
    to link_output (which does the right thing on POSIX), but it can be set to the
    .dll file to make `gn desc runtime_deps` do the right thing on Windows.
    
    This is needed to make swarming work in component builds on Windows.
    
    BUG=354261, 498033
    R=dpranke@chromium.org, scottmg@chromium.org
    
    Review URL: https://codereview.chromium.org/1690843002 .
    
    Cr-Commit-Position: refs/heads/master@{#374840}
    e3398c19
target_unittest.cc 28.5 KB