| """ |
| This is a simple windows_dll_library rule for builing a DLL Windows |
| that can be depended on by other cc rules. |
| |
| Example useage: |
| 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, |
| ], |
| ) |