""" This is a simple windows_dll_library rule for builing a DLL Windows that can be depended on by other cc rules. Example usage: windows_dll_library( name = "hellolib", srcs = [ "hello-library.cpp", ], hdrs = ["hello-library.h"], # Define COMPILING_DLL to export symbols during compiling the DLL. copts = ["/DCOMPILING_DLL"], ) """ load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_import", "cc_library") def windows_dll_library( name, srcs = [], deps = [], hdrs = [], visibility = None, **kwargs): """A simple windows_dll_library rule for builing a DLL Windows.""" dll_name = name + ".dll" import_lib_name = name + "_import_lib" import_target_name = name + "_dll_import" # Build the shared library cc_binary( name = dll_name, srcs = srcs + hdrs, deps = deps, linkshared = 1, **kwargs ) # Get the import library for the dll native.filegroup( name = import_lib_name, srcs = [":" + dll_name], output_group = "interface_library", ) # Because we cannot directly depend on cc_binary from other cc rules in deps attribute, # we use cc_import as a bridge to depend on the dll. cc_import( name = import_target_name, interface_library = ":" + import_lib_name, shared_library = ":" + dll_name, ) # Create a new cc_library to also include the headers needed for the shared library cc_library( name = name, hdrs = hdrs, visibility = visibility, deps = deps + [ ":" + import_target_name, ], )