New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
cmake: add support for single libcurl compilation pass #11546
Conversation
I thought the whole libcurl.def thing was unneeded because we're using
__declspec(dllexport) on all the relevant exports.
|
It was removed the last time in commit 9bd7f00
|
We do use The file was deleted because it wasn't used. This time it will be used by two build systems. |
3e9189a
to
022ccf0
Compare
022ccf0
to
fdf9386
Compare
Stop dynamically generating `libcurl.def` with the next curl release, which provides it and uses it automatically in GNU Make builds. curl/curl@2ebc74c curl/curl#11546
2ebc74c curl#11546 introduced sharing libcurl objects for shared and static targets. The above automatically enabled for Windows builds, with an option to disable with `SHARE_LIB_OBJECT=OFF`. This patch extend this feature for all platforms as a manual option. You can enable it by setting `SHARE_LIB_OBJECT=ON`. Shared objects will be built in PIC mode, meaning the static lib will also have PIC code. EXPERIMENTAL. Closes #xxxxx
2ebc74c #11546 introduced sharing libcurl objects for shared and static targets. The above automatically enabled for Windows builds, with an option to disable with `SHARE_LIB_OBJECT=OFF`. This patch extend this feature to all platforms as a manual option. You can enable it by setting `SHARE_LIB_OBJECT=ON`. Then shared objects are built in PIC mode, meaning the static lib will also have PIC code. [EXPERIMENTAL] Closes #11627
Before this patch CMake builds used two separate compilation passes to build the shared and static libcurl respectively. This patch allows to reduce that to a single pass if the target platform and build settings allow it. This reduces CMake build times when building both static and shared libcurl at the same time, making these dual builds an almost zero-cost option. Enable this feature for Windows builds, where the difference between the two passes was the use of `__declspec(dllexport)` attribute for exported API functions for the shared builds. This patch replaces this method with the use of `libcurl.def` at DLL link time. Also update `Makefile.mk` to use `libcurl.def` to export libcurl API symbols on Windows. This simplifies (or fixes) this build method (e.g. in curl-for-win, which generated a `libcurl.def` from `.h` files using an elaborate set of transformations). `libcurl.def` has the maintenance cost of keeping the list of public libcurl API symbols up-to-date. This list seldom changes, so the cost is low. Closes curl#11546
2ebc74c curl#11546 introduced sharing libcurl objects for shared and static targets. The above automatically enabled for Windows builds, with an option to disable with `SHARE_LIB_OBJECT=OFF`. This patch extend this feature to all platforms as a manual option. You can enable it by setting `SHARE_LIB_OBJECT=ON`. Then shared objects are built in PIC mode, meaning the static lib will also have PIC code. [EXPERIMENTAL] Closes curl#11627
Before this patch CMake builds used two separate compilation passes to
build the shared and static libcurl respectively. This patch allows to
reduce that to a single pass if the target platform and build settings
allow it.
This reduces CMake build times when building both static and shared
libcurl at the same time, making these dual builds an almost zero-cost
option.
Enable this feature for Windows builds, where the difference between the
two passes was the use of
__declspec(dllexport)
attribute for exportedAPI functions for the shared builds. This patch replaces this method
with the use of
libcurl.def
at DLL link time.Also update
Makefile.mk
to uselibcurl.def
to export libcurl APIsymbols on Windows. This simplifies (or fixes) this build method (e.g.
in curl-for-win, which generated a
libcurl.def
from.h
files usingan elaborate set of transformations).
libcurl.def
has the maintenance cost of keeping the list of publiclibcurl API symbols up-to-date. This list seldom changes, so the cost
is low.
Closes #11546
curl previously had a
libcurl.def
placed in thelib
directory. I opted for the root directory, because inlib
it may be overwritten by.def
files generated by the DLL linker command when using certain build methods/options.single-pass libcurl builds can be freely extended to other platforms, if both shared/static libs have position-independent code enable and symbol exports can be fixed up via a linker option.
it might be an option to make
libcurl.def
an OS-agnostic raw list of public API symbols (= without the topEXPORTS
line) for re-use for other purposes. CMake could handle that with some extra lines. InMakefile.mk
less trivially, but also seems doable.