The bundle_static function now detects the private static dependencies on the given target (in our case, always Halide) and uses the platform librarian tool to merge static dependencies into a static library. It picks which tool to use by checking, in order:
When targeting Windows, it looks for lib.exe.
When targeting macOS, it checks if libtool is the Apple libtool.
Whether ar is GNU ar and if so, generates an MRI script.
Otherwise, a FATAL_ERROR is issued.
To mark a static library for bundling, we link privately and use the $<BUILD_LOCAL_INTERFACE:...> generator expression. This prevents it from being exported, too.
With this PR, imported static dependencies besides LLVM (wabt, flatbuffers) can be bundled, too. Previously, they were only bundled when vendored via FetchContent.
The generator expression that implements this logic is quite complex. It involves meta-programming generator expressions during evaluation and then evaluating them. Even so, this saves a considerable amount of time unpacking LLVM into a temporary directory and adding the objects to the link line (the previous approach).
The
bundle_static
function now detects the private static dependencies on the given target (in our case, always Halide) and uses the platform librarian tool to merge static dependencies into a static library. It picks which tool to use by checking, in order:lib.exe
.libtool
is the Apple libtool.ar
is GNU ar and if so, generates an MRI script.FATAL_ERROR
is issued.To mark a static library for bundling, we link privately and use the
$<BUILD_LOCAL_INTERFACE:...>
generator expression. This prevents it from being exported, too.With this PR, imported static dependencies besides LLVM (wabt, flatbuffers) can be bundled, too. Previously, they were only bundled when vendored via FetchContent.
The generator expression that implements this logic is quite complex. It involves meta-programming generator expressions during evaluation and then evaluating them. Even so, this saves a considerable amount of time unpacking LLVM into a temporary directory and adding the objects to the link line (the previous approach).