Skip to content
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

Allow to provide own locations for zlib, openssl etc #2474

Closed
wants to merge 3 commits into from

Conversation

kdekker
Copy link
Contributor

@kdekker kdekker commented Apr 9, 2018

Allow to provide own locations for zlib, openssl, libssh2, cares.

The link.exe /lib failed, because it added (Microsoft) dependencies. As create a static lib is just aggregating objects into an archive, use lib.exe instead.

As lib.exe does not perform optimizations nor linking, the optimizations and dependent windows libraries should not be provided as flags to the archiver.

Allow to provide own locations for zlib, openssl, libssh2, cares.

The link.exe /lib failed, because it added (Microsoft) dependencies. As create a static lib is just aggregating objects into an archive, use lib.exe instead.

As lib.exe does not perform optimizations nor linking, the optimizations and dependent windows libraries should not be provided as flags to the archiver.
@jay
Copy link
Member

jay commented Apr 9, 2018

Ref: #1201

@kdekker the variables you're adding need to be documented

@rodwiddowson can you give feedback on this pr please

@kdekker
Copy link
Contributor Author

kdekker commented Apr 10, 2018

First of all: the current approach differs from #1201. In the #1201, I added variables that manipulate CFLAGS en LFLAGS directly. In this approach, I provide e.g. ZLIB_PATH that points to a location where a include and lib subdirectory are expected. A somewhat (but that is my opinion) cleaner approach compared to previous one (but judging own changes is not an independent opinion..)

In addition to the comments mentioned in #1201, I cannot use nmake /E. That option only allowed to set environment variables, but these then need to be used/available in the makefile.

Prior to my PR, the MakefileBuild.vc only provided the WITH_DEVEL possibility. That variable lacks the possibility to take zlib, openssl, libssh2 (and what you need more) from different locations. WITH_DEVEL also requires first to copy all other includes/libs on a per user, per version basis. It is also against the common practice on UNIX/Linux, where you can provide a path to another lib/include.

As an example: if you write some C-code, using a #include directive, then the include file should be found by providing the right /I flags. Considering this way of working, the way how WITH_DEVEL works (copying instead of referencing a location) is IMO odd or special (or probably normal, based on what someone considered as 'normal', and depending on what your opinion is).

When we started using cURL (many years ago), the old nmake method also provided a possibility to define 'your own' locations for zlib, openssl etc. In our case, these libraries are stored in a read-only location. It is inefficient to rewrite our build process and need to copy (for each build, for each user) the other includes/libraries used together with cURL. Inefficient in terms of writing a different process, inefficient in terms of inflexibility if we need to test cURL with e.g. different openSSL versions.

I hope that I've convinced you for the need of the possibility to specify other locations. Please keep in mind that I did not change the default (../../deps directory).

Some additional information about my changes (the line numbers refer to the code as if my PR was applied):

  • around line 73:
    Now use lib.exe instead of link.exe /lib. The lib.exe is the Windows counterpart of the UNIX/Linux 'ar' archiver. Instead of using an undocumented link.exe /lib (I'm working with Visual Studio 2015, but did also not find any information on MSDN/microsoft.com about this command, nor link /? told about this option). Making a static library has nothing to do with optimizing or linking. That's why prior to my PR, the link.exe /lib raises warnings about optimizer flags (like /opt:ref,icf). When making an static library/archive, both optimization flags as well as Windows libraries should be omitted from the build command. These flags are solely needed when building an exe or DLL. In addition to switching to lib.exe, also $(LFLAGS) should not be passed to the $(LNK) command, when building a static library (see lines: 378, 402, 500).
  • line 102: a minor optimization. Re-use $(LFLAGS) in CURL_LFLAGS instead of specifying it twice.
  • line 121-126: if the ../../deps (or the directory specified in $(WITH_DEVEL)) does not exist, omit it from the build command.
  • line 146, : consequently use WIN_LIBS for Windows libraries. Prevent aggregating (other) static libraries in (static) libcurl.a
  • line 128-135, 173-180, 205-211, 243-250 : allow to specify per product a top location/directory that points to their include and lib sub directories respectively.
  • around line 464: removal of comments of unused release-ssh2-ssl-dll-zlib target + follow up on https://github.com/curl/curl/commit/858502652408d060c80e9626d7cf89183ebe6a94 where the clean target was moved, but a remaining line of comments accidentally still left over.

I hope that the above information clarifies the background of my changes. A few of them (the last bullet of previous comment) should probably get its own PR. I will try to do so next time...

With the original sources, building in it simpelst from results into warnings, that point to wrong commands. In my example below, I just extract the curl 7.59 sources, open a VS2016 x64 native command prompt and run:

nmake /f Makefile.vc mode=static DEBUG=no

That command will result in the following warnings, which are solved after my PR will be applied (due to the switch to lib.exe instead of link.exe and not passing Windows libraries to the build command):

wldap32.lib(WLDAP32.dll) : warning LNK4006: __NULL_IMPORT_DESCRIPTOR already defined in ws2_32.lib(WS2_32.dll); second definition ignored
wldap32.lib(WLDAP32.dll) : warning LNK4221: This object file does not define any previously undefined public symbols, so it will not be used by any link operation that consumes this library
advapi32.lib(ADVAPI32.dll) : warning LNK4006: __NULL_IMPORT_DESCRIPTOR already defined in ws2_32.lib(WS2_32.dll); second definition ignored
advapi32.lib(ADVAPI32.dll) : warning LNK4221: This object file does not define any previously undefined public symbols, so it will not be used by any link operation that consumes this library
Normaliz.lib(Normaliz.dll) : warning LNK4006: __NULL_IMPORT_DESCRIPTOR already defined in ws2_32.lib(WS2_32.dll); second definition ignored
Normaliz.lib(Normaliz.dll) : warning LNK4221: This object file does not define any previously undefined public symbols, so it will not be used by any link operation that consumes this library
Crypt32.lib(CRYPT32.dll) : warning LNK4006: __NULL_IMPORT_DESCRIPTOR already defined in ws2_32.lib(WS2_32.dll); second definition ignored
Crypt32.lib(CRYPT32.dll) : warning LNK4221: This object file does not define any previously undefined public symbols, so it will not be used by any link operation that consumes this library

The above warnings mean that the same symbol (from Windows system libraries) are added twice.
If wanted, I can also show the effects of using /opt (results in a warning).

@jay: I add documentation, but first like to await a response on this comments. I think I've to write some words in BUILD.WINDOW.txt and in the usage in the MakefileBuiild.vc. Is that sufficient for documentation?

@kdekker
Copy link
Contributor Author

kdekker commented Apr 11, 2018

@jay:
Q1: Do you like the documentation first or do you first perform a review?
Q2: See also previous comments: where do I need to write the documentation. Is updating the 2 mentioned files sufficient?

@jay
Copy link
Member

jay commented Apr 11, 2018

Please add the documentation in Makefile.vc and BUILD.WINDOWS. Add it at the end of section Building with Visual C++ (that section is basically mirrored in the makefile as usage). The users need to know the variables are available. At any time we'd welcome a review from one of our contributors who uses winbuild regularly. Also why did you remove release-ssh2-ssl-dll-zlib special section, was it unnecessary?

@kdekker
Copy link
Contributor Author

kdekker commented Apr 11, 2018

I will do so, and send an additional commit on my own repository (that will become visible automatically here if I understood the process) in a while (as soon as I've finished the change).

Removal of the release-ssh2-ssl-dll-zlib section was indeed not needed. I just saw commented out lines that did not match (IMO) with the remainder of the structure of the makefile. I did not see the benefits, and probably removed it too quickly. This is common practice in our own version control system, where 'code that is not used' is usually removed. Code that is not used, increases complexity and makes understanding more difficult (that's is also why I asked in another mail about dropping visual studio 6). Any code that exists, has a price. You will get nothing for free...But if you like that I leave this commented out lines, I will re-add them. However, some few words why these lines should exist, is probably a good idea.

Some new variables have been introduced to tell locations of dependencies, e.g. for OpenSSL.

Also removed a dangling URL that no longer worked. I was not able to find the IDN download at MSDN/microsoft.com, so it seems to be removed...
@kdekker
Copy link
Contributor Author

kdekker commented Apr 11, 2018

Filed a new commit that added the requested documentation. Will this commit (d4382e9) automatically become part of this PR? (I'm still not knowing enough of git to know this).

Also removed an URL (for IDN libs) that seems no longer to exist at MSDN/microsoft.com.
I've found a base page about IDN (https://msdn.microsoft.com/en-us/library/windows/desktop/dd318142(v=vs.85).aspx), but the download link provided there is also dangling.

@jay
Copy link
Member

jay commented Apr 12, 2018

Will this commit (d4382e9) automatically become part of this PR? (I'm still not knowing enough of git to know this).

Yes since you pushed it to the branch associated with this PR it is seen in the PR. Ideally something like this you'd squash it or amend it to the previous commit and then force push.

What happens if any of the _PATH options are used with WITH_DEVEL? can we just make them one liners like

ZLIB_PATH=<path to zlib>     - Custom zlib devel path
etc

@kdekker
Copy link
Contributor Author

kdekker commented Apr 12, 2018

If one of the _PATH variants is used WITH_DEVEL, only the xxx_PATH is used for product xxx and the remainder will use the default, of course respecting the value provided with WITH_DEVEL.

In terms of code:

!IFNDEF WITH_DEVEL
WITH_DEVEL   = ../../deps
!ENDIF
DEVEL_INCLUDE= $(WITH_DEVEL)/include
DEVEL_LIB    = $(WITH_DEVEL)/lib

combined with zlib as example

!IFDEF ZLIB_PATH
ZLIB_INC_DIR = $(ZLIB_PATH)\include
ZLIB_LIB_DIR = $(ZLIB_PATH)\lib
ZLIB_LFLAGS  = $(ZLIB_LFLAGS) "/LIBPATH:$(ZLIB_LIB_DIR)"
!ELSE
ZLIB_INC_DIR = $(DEVEL_INCLUDE)
ZLIB_LIB_DIR = $(DEVEL_LIB)
!ENDIF

will probably better explain my answer. As you can see, the one is set, and the xxx_PATH overrides, but only when provided. I don't understand how this can be reduced to one liners? We need both a path to include as well as to a library. And these need to be used in compiler and/or linker flags if a dedicate _PATH value was provided. If all includes and libs are in the WITH_DEVEL location (don't make difference if this value has its default value, or got a user specified value), then next trick is used to provide a single include and linker path (and thus, these need not to be speficied again in the else branch of the above piece of code):

!IF EXISTS("$(DEVEL_INCLUDE)")
CFLAGS       = $(CFLAGS) /I"$(DEVEL_INCLUDE)"
!ENDIF
!IF EXISTS("$(DEVEL_LIB)")
LFLAGS       = $(LFLAGS) "/LIBPATH:$(DEVEL_LIB)"
!ENDIF

@jay
Copy link
Member

jay commented Apr 12, 2018

Ok. I meant reduce the documentation for each variable to a one liner like in my example.

@kdekker
Copy link
Contributor Author

kdekker commented Apr 12, 2018

Ah, I did not understand that. But keep in mind that the _PATH variables were only added for 4 libraries. Not for all stuff (like WITH_NGHTTP2 and some others). When reducing the documentation to one line, it is still useful which libraries has a _PATH variable, isn't it?

@kdekker
Copy link
Contributor Author

kdekker commented Apr 16, 2018

@jay: Do I need to provide more information? Is the explanation clear, or do I need to change more things. I would really like to know whether this PR will be merged or whether I need to do something more.

@jay
Copy link
Member

jay commented Apr 16, 2018

I think we should support this for nghttp2 and mbedtls as well that way all the WITH_ options have a _PATH. For the doc what do you think about this:

CARES_PATH=<path to c-ares>  - Custom path for c-ares.
SSH2_PATH=<path to libSSH2>  - Custom path for libSSH2.
SSL_PATH=<path to OpenSSL>   - Custom path for OpenSSL.
ZLIB_PATH=<path to zlib>     - Custom path for zlib.

@kdekker
Copy link
Contributor Author

kdekker commented Apr 16, 2018

Perfect. Shall I make that change and make a commit in my own repo (for BUILD.WINDOWS.txt + usage information in makefile)?

If wanted, I can make the nghttp2 and mbedtls changes as well (in the makefile + documentation), but I'm not known with these. So testing becomes difficult for me. Who can test my changes then?

I already discovered that there is some inconsistency between e.g. USE_SSL and USE_NGHTTP2. In the first case, USE_SSL remains undef if not set, while USE_NGHTTP2 becomes 'false' (in Makefile.vc) + no /I directive is ever used for NGHTTP2. So additional testing is really needed, but actually out of my scope.

As requested by Jay Satiro: added similar possibility for remaining 2 left-overs (NGHTTP/2 and mbedTLS) similar to was done before for zlib, openssl, libssb2, cares.

Also applied proposed change to the documentation (including the 2 new xxx_PATH possibilities).
@kdekker
Copy link
Contributor Author

kdekker commented Apr 16, 2018

Made a commit. Makefile checked on syntax correctness, but did not build with NGHTTP/2 and/or mbedTLS.

Copy link
Contributor

@rodwiddowson rodwiddowson left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Data point. This file breaks my curl build as it currently stands,

I'm investigating.

I cannot use the new features since I also need control over the lib names which this change doesn't offer.

I'd appreciate it if we didn't get this into mainline until I u nderstand fully and either decide my build it bhroken or we can work out what will work.

My Breaking command line:

Nmake /f Makefile.vc mode=dll WITH_DEVEL=H:\Perforce\VS2017\openssl-1.1.0g\x86
WITH_SSL=dll WITH_ZLIB=dll ENABLE_WINSSL=no VC=15 MAKE="NMAKE e"
ZLIB_LFLAGS=/libpath:H:\Perforce\VS2017\zlib-1.2.11.\Release ZLIB_CFLAGS="/D
HAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ /IH:\Perforce\VS2017\zlib-1.2.11"
ZLIB_LIBS=zlib1.lib SSL_LIBS="libcrypto.lib libssl.lib" BASE_NAME=libcurl7_58
BASE_NAME_DEBUG=libcurl7_58d

@kdekker
Copy link
Contributor Author

kdekker commented Apr 16, 2018

@rodwiddowson: please show your directory structure and involved library names. There are a few IF EXISTS() constructs, e.g. to determine the naming of OpenSSL, but these existed before. I added a similar construct for zlib.

Do you use your own lib names, or are the used lib names default? Why is the check for e.g. openSSL not smart enough for you? Library names do not change that often (hopefully)?

Based on your build flags: the names of the openSSL libraries should be recognized, but will fail if you store multiple versions of OpenSSL in the WITH_DEVEL directory. Instead of it, use dedicate output directories for OpenSSL, and use SSL_PATH.

For the output result of cURL (you are using non-default names for BASE_NAME and BASE_NAME_DEBUG), I don't see a relationship with my changes...

So: for which library names do you need control for? Anything else than cURL is IMO 'dicatated' by the 'other-product' maintainers. And the cURL output itself can be controlled, as it could before. Or am I wrong?

@rodwiddowson
Copy link
Contributor

OK. My PEBKAC confirmed. I'm fine with this change. Sorry for the noise.

I may need to do some cleanup of our build processes to take full advantage of this (probably by adding an install target to our zlib build), but thats my problem, not libCurl.

Once again sorry about the noise.

@kdekker
Copy link
Contributor Author

kdekker commented Apr 16, 2018

LOL. Learning a new word (PEBKAC) 👍 (English is not my native language)

@jay jay closed this in 7921659 Apr 17, 2018
@jay
Copy link
Member

jay commented Apr 17, 2018

Thanks

@kdekker
Copy link
Contributor Author

kdekker commented Apr 17, 2018

Thanks Jay (and all others that were involved).

@p
Copy link
Contributor

p commented May 28, 2018

The link.exe /lib failed, because it added (Microsoft) dependencies. As create a static lib is just aggregating objects into an archive, use lib.exe instead.

I'm guessing this part broke pycurl build which links statically against libcurl and all of libcurl's dependencies. And if I am understanding this PR correctly, in order to bulid pycurl now it needs to know all of the library dependencies that libcurl has (like what c-ares's library is called), which is not at all ideal.

@bagder
Copy link
Member

bagder commented May 28, 2018

I'm guessing this part broke pycurl build

I suggest a less guessing and more fact-based approach.

if I am understanding this PR correctly, in order to build pycurl now it needs to know all of the library dependencies that libcurl has (like what c-ares's library is called),

If you wanted to build with a static libcurl you always needed that. This PR just made it possible for you to point to different install paths for a few different dependencies, which wasn't previously possible.

@p
Copy link
Contributor

p commented May 28, 2018

If you wanted to build with a static libcurl you always needed that.

This is not the case as 1) mentioned in the original description of this PR and 2) can be seen from https://github.com/pycurl/pycurl/blob/cad5d37b2365d5158839acf27f25bb40bbd17d06/winbuild.py.

My impression of how libraries (*.lib) on windows work is they can embed, in particular, references to other libraries which will be used during linking stage later. libcurl used (up until 7.59.0) to embed references to its dependencies like libcares.lib, and in 7.60.0 does not resulting in missing symbols at link time unless all of these libraries are manually specified during the build process of the program using libcurl.

@bagder
Copy link
Member

bagder commented May 29, 2018

Yes, thanks a lot @kdekker for the added explanation (I had missed that point).

@p
Copy link
Contributor

p commented May 29, 2018

For a static lib, on any platform, it is very uncommon IMO to add the system library dependencies at library level. I.e. on UNIX/Linux there is even no such possibility AFAIK.

Windows doesn't have pkg-config that takes care of this on Unix-like platforms.

Windows is an exception in this regard.

Well, yes. Most/all Unix-based projects that support building under MSVC have some kind of a homebuilt windows build system. Pycurl's one is up to 1100 lines, libcurl has one and all of libcurl's dependencies have their own. Are you saying that because libraries are not embedded on Unix they should not be embedded on Windows? If this was the sole motivation for the change in this PR I'm afraid it's not a very good one.

I looked through the comments here and in #1201 again and I don't understand what actual problem the link->lib change in this PR was solving. Warnings about duplicated libraries from MSVC? Are you building statically or dynamically? If statically, are you building all of the dependencies yourself so that they have the same exact build settings?

To me this PR is a significant usability regression for building software against libcurl on windows statically. It probably doesn't matter in dynamic builds. But I worked around this already and I am happy to wait for other affected parties to chime in, it is possible that I imagined all of the issues that this change caused in pycurl.

@kdekker
Copy link
Contributor Author

kdekker commented May 29, 2018

@p: I agree with you that 'making Windows as much as UNIX/Linux' behaves is not an end in itself, but it may help if it is more similar (for multi-platform developers).

I'm using static libs for all. The actual problem with link /lib is:

Although link /lib may work better for linking DLL lib (stubs), it does not work for static libs. In our case, zlib, curl, ssh2 and openssl (and much of our own libs) are static libs (built by ourselves). Adding references to DLL lib (stubs) is a good idea, but does not work (see details above of a post of 10th April, where the the build errors I got have been posted).

That's why I said: Either use the list of (configuration dependent) Windows DLL libs from MakefileBuild.vc or use #pragma lib in your own source code. Rolling back my changes results in build errors for me.

BTW: the primary goal of this PR was:

  • to be able to provide dedicate directories of e.g. openssl, zlib, libssh2 to curl, instead of one single directory (WITH_DEVEL) where all need to be copied to. We are working with a read-only software configuration management system, and e.g. openssl, zlib etc libs are stored in a fixed, read-only place.
  • solve strange build warnings and errors.

@p
Copy link
Contributor

p commented May 29, 2018

If you can repost those errors that would probably help understand the situation.

@kdekker
Copy link
Contributor Author

kdekker commented May 29, 2018

@p: I don't have the output of the original error anymore. But the error is already in this thread (see April 10 post).

@p
Copy link
Contributor

p commented May 29, 2018

I see a bunch of warnings in that post, where is the error?

It also occurred to me that if you are building statically against libcurl, unless you have https://github.com/pycurl/pycurl/blob/1258db7ccca677f48a0ab053a9fbce0a144000fb/winbuild/libcurl-fix-zlib-references.patch applied all of libcurl's dependencies specify /MD and libcurl specifies /MT, at which point you'd probably have two different CRTs referenced which will surely fail the build. The correct fix here is the patch linked though because otherwise you're building with the wrong flags.

@kdekker
Copy link
Contributor Author

kdekker commented May 29, 2018

I'm getting in doubt. Maybe it were only warnings. But anyhow: severe warnings. I need to spend more time (which I don't have now) to checkout what errors happened. From what I remember, next steps were performed (all static libs):

  • build zlib
  • build libssh2
  • build openssl
  • build curl with specifying WITH_ZLIB, WITH_LIBSSH2 etc, all static
  • see that the generated libcurl.lib aggregates all previously generated libs.

If I remember well, it is impossible to to include both openssl and curl libs when building a own binary.
If you are not able to reproduce the problem, or need more information, I will try to collect this next week.

But why should you prefer an obsolete/undocumented link /lib command? Such commands have a risk, and MS may remove support for it in a future version. IMO: using undocumented features is not the wat to go... (in any case)

And no, I'm not using the wrong runtime or mixing runtime flags. All is dynamic DLL. Based on curl 7.59.0. This is libcurl, not pycurl IMO. What is the relationship with that change? In general, using static RTL libs is a bad idea though (for a lot of other reasons).

@p
Copy link
Contributor

p commented May 29, 2018

If I remember well, it is impossible to to include both openssl and curl libs when building a own binary.

This is simply not an accurate statement.

But why should you prefer an obsolete/undocumented link /lib command?

It does not matter to me how libcurl.a gets all of its dependencies aggregated into it, just that it does. Perhaps this can be accomplished with lib.exe, which would be fine. On the other hand MS goes to extreme lengths to maintain compatibility and the existing usage of link.exe, even if presently undocumented, is probably well established and unlikely to disappear.

In general, using static RTL libs is a bad idea though (for a lot of other reasons).

Unless you patched libcurl not to request /MT in static builds that's what you will have going on. The patch referenced is a libcurl patch, please do look at it more carefully and do not let the name mislead you (it's there for historical reasons only).

@kdekker
Copy link
Contributor Author

kdekker commented May 29, 2018

This is simply not an accurate statement.

Why not? Please argue... Please understand that I don't have all details available on something that has changed almost 2 months ago. You can also do your own research and test work, based on what I have written down, isn't it?

It does not matter to me how libcurl.a gets all of its dependencies aggregated into it, just that it does.

Is that not short-sighted? If someone likes to know more about how MakefileBuild.vc has been setup, it is clear that finding references/documentation is not optional, but a must-have, isn't it?

Unless you patched libcurl not to request /MT in static builds that's what you will have going on.

I did not say anywhere that I did use static RTL libs (instead, I have said the opposite: I'm using dynamic RTL libs!). I don't see the effect of this patch if dynamic runtime libs are being used.

But instead of asking me to prove things, why do you not comment on any of the proposals I did? It is quite normal IMO to specify required Windows runtime DLL lib stubs when building your own binary or DLL. Just grab out WIN_LIBS value from MakefileBuild.vc, and you are fine when adding this value to your link command. What's wrong in doing so?

And until now, I'm not aware of other complaining guys (my fix has been incorporated into curl 7.60.0). You even did not tell which curl version is being used by you... (I assume it is 7.60.0).

@p
Copy link
Contributor

p commented May 29, 2018

Why not? Please argue...

pycurl has been built this way since 2015. Yesterday I built a libcurl_a.lib which incorporates cares+nghttp2+openssl+etc. static libs into it for libcurl 7.59.0 and it worked fine.

Is that not short-sighted? If someone likes to know more about how MakefileBuild.vc has been setup, it is clear that finding references/documentation is not optional, but a must-have, isn't it?

I do not understand your question. Is it shortsighted to use an incantation that probably originated 15+ years ago and hasn't been changed in at least this much, and works fine? Is it shortsighted to replace that incantation with a different incantation which is documented but doesn't perform the same function?

I'm using dynamic RTL libs

I assume in your program you do but so far the responses you are giving indicate that you are using libcurl's default configuration which references static MSVCRT in a static build.

why do you not comment on any of the proposals I did?

I only came across this PR after libcurl 7.60.0 broke pycurl's build process on windows.

Just grab out WIN_LIBS value from MakefileBuild.vc, and you are fine when adding this value to your link command. What's wrong in doing so?

This is called "abstraction leakage" or encapsulation violation. pycurl shouldn't need to know that libcurl is built against c-ares, libssh2, etc. pycurl's code is the same whether libcurl is built against those optional dependencies or is not. The only thing pycurl SHOULD need to specify is which libcurl to use.

You even did not tell which curl version is being used by you... (I assume it is 7.60.0).

Yes. See here:

libcurl used (up until 7.59.0) to embed references to its dependencies like libcares.lib, and in 7.60.0 does not resulting in missing symbols at link time unless all of these libraries are manually specified during the build process of the program using libcurl.

@p
Copy link
Contributor

p commented May 29, 2018

BTW: the primary goal of this PR was:

to be able to provide dedicate directories of e.g. openssl, zlib, libssh2 to curl, instead of one single directory (WITH_DEVEL) where all need to be copied to. We are working with a read-only software configuration management system, and e.g. openssl, zlib etc libs are stored in a fixed, read-only place.

This has been possible going back to at least libcurl 7.19.0 by specifying INCLUDE and LIB environment variables appropriately. See https://github.com/pycurl/pycurl/blob/c5ebff86aa7dfd67da62e2e4b94c3ef9d8b7e1c4/winbuild.py#L799 onward, this code works from 7.19.0 through 7.60.0.

The *_PATH variable additions in this PR simply add include and lib subdirectories of specified paths to CFLAGS and LDFLAGS. Which works for OP's build system but does not match how libcurl's dependencies build themselves out of the box:

So the only way to use these *_PATH options is to prepare dependencies to have this common include/lib structure, and if someone is capable of doing that they can also trivially set INCLUDE & LIB environment vars appropriately. Plus when setting INCLUDE and LIB the order is trivially controlled, whereas with these *_PATH variables the order is fixed by libcurl meaning if the user, say, has two openssl installations and wants to use a particular one they may or may not be successful in accomplishing this through *_PATH mechanism.

Now, you might be asking, what's the harm in having extra configuration options? The problem is they suggest themselves as the options to be used to, for example, specify where zlib is, and as we have established they don't work for default configurations of libcurl's dependencies nor are they particularly flexible. An unsuspecting user is very likely to spend a significant amount of time trying to figure out why nothing happens when they use ZLIB_PATH (and per #2580, specifying nonexistent directories or even existent directories that don't have include/lib in them is the same as not specifying the option at all - there are no diagnostics).

Hence my recommendation would be:

  1. Revert this PR as it is not needed to accomplish OP's stated goals of specifying different directories for different dependencies, and can easily cause confusion and waste time.
  2. Change libcurl to always link against MSVCRT DLL (/MD option), even in static builds, as do all of its dependencies. This should resolve errors that OP alluded to but not posted.

@kdekker
Copy link
Contributor Author

kdekker commented May 29, 2018

pycurl has been built this way since 2015. Yesterday I built a libcurl_a.lib which incorporates cares+nghttp2+openssl+etc. static libs into it for libcurl 7.59.0 and it worked fine.

We are using curl as of 2008. It worked fine when we were using nmake files (Makefile.vc). These files have been dropped by curl, and I had to move to something else. The Makefile[Build].vc approach was suggested as alternative. It was tightly bound around a single 'devel' directory, which was too inflexible for me. So I had to change things to get it working (and others provided feedback about the changed method). You are the first one (AFAIK) that is complaining about the different way of (not) incorporating system DLL/library dependencies.

I do not understand your question. Is it shortsighted to use an incantation that probably originated 15+ years ago and hasn't been changed in at least this much, and works fine? Is it shortsighted to replace that incantation with a different incantation which is documented but doesn't perform the same function?

The 'it has worked before' argument is probably valid (but may block any modernization, if needed), but 'you have to use supported and documented tools and options' is also feasible. At this time I don't know whether the lib.exe is not capable in adding the runtime dependencies. May be it is. You can check. I will try to check if I've time next week...

This is called "abstraction leakage" or encapsulation violation. pycurl shouldn't need to know that libcurl is built against c-ares, libssh2, etc. pycurl's code is the same whether libcurl is built against those optional dependencies or is not. The only thing pycurl SHOULD need to specify is which libcurl to use.

Hmm... really? I'm not sure to call this abstraction leakage, because the way how you build curl is up to you. So anyone can choose to build curl with/without a lot of options (ares, http2, openssl). It is obvious that using different options change the dependencies to system DLLs. So, I can't really imagine that the person who uses (or even built libcurl on his own) don't know what system DLL libs to add as dependency. You can add all Windows system libs in your build command. Visual Studio automatically omits any DLL not used. BTW. this is the common way how Visual Studio project/solution files have been setup. It always links e.g. user32.lib, gdi32.lib etc. It does not harm to add too much libs here. You only (once) need to figure out once the 'maximum' list of dependent system DLLs.

libcurl used (up until 7.59.0) to embed references to its dependencies like libcares.lib, and in 7.60.0 does not resulting in missing symbols at link time unless all of these libraries are manually specified during the build process of the program using libcurl.

I missed that one.

@p
Copy link
Contributor

p commented May 29, 2018

You can add all Windows system libs in your build command.

I can and I have, per the link to the commit I posted earlier. I also find this to be a bad developer experience, a point with which you seem to disagree.

@kdekker
Copy link
Contributor Author

kdekker commented May 29, 2018

Note that I've said before that we store our stuff on a read-only place in a SCM system. That directories do not necessarily have a relationship with the output directories of the mentioned product. My goal is just NOT to build everything any time (as we have multiple developers, who don't want to build the same thing each time), but only build something, if it has changed. And then put the results in a SCM system.

Trivially set INCLUDE/LIB was insufficient if I remember well. Please await my further testing next week.

BTW: always using /MD has a disadvantage if your are making debug builds. The difference between optimized and debug builds is still useful (so release builds should use /MD and debug builds /MDd). The /Mxxx flags should match with everything else what was built and uses libcurl. You cannot mix these flags. And that is probably why /MT and /MTd also exist (in libcurl makefile) as users may use it (regardless the fact that using static run time DLLs is a very bad idea).

Just FYI: my make command for libcurl is (expanded output from a solution/project file):

set CL=/D "WINVER=0x0601" /D "_WIN32_WINNT=0x0601"

@REM as per recommendation of Daniel Stenberg (cURL maintainer) use the stuff form the winbuild directory
@REM rely on cURL defaults for not listed options (SSPI, IPV6, IDN etc).
@REM Use sources from clearcase, and not from the object dir, as we do the same for the others (e.g. libssh2).
@REM The advantage is that cURL can be replaced, without requiring to build OpenSSL first.
nmake -f Makefile.vc mode=static WITH_SSL=static SSL_PATH=S:\common\thirdparty\OpenSSL\build\Windows\Win32 WITH_ZLIB=static ZLIB_PATH=S:\common\thirdparty\zlib\build\Windows\Win32 WITH_SSH2=static SSH2_PATH=S:\common\thirdparty\libssh2\build\Windows\Win32 GEN_PDB=yes DEBUG=%DEBUG% MACHINE=x86

Before my PR, generating PDB files also failed.

@kdekker
Copy link
Contributor Author

kdekker commented May 29, 2018

My PR was discussed by others as well. I like to hear their opinion.

@p
Copy link
Contributor

p commented May 29, 2018

Yes, debug builds should use /MDd.

@rodwiddowson
Copy link
Contributor

Since you asked: for me,. the problem start here

libcurl's dependencies build themselves out of the box

That's not sufficient for our situation where we require to be able to build 2 targets (architectures) and 2 configuration (debug/free) in an automated manner, and usually in a hurry if theres a secadv out.

Further we use the MS standard for file names (targets keep the same lib and dll names, configurations are distinguished). I'm not saying these are correct requirements and I won't defend them but they serve us well.

So I'm faced with having to intrude into our dependencies' build environments. I accept this and its costs. In some cases (zlib) and I can automate this, in others (OpenSSL) the intrusion is minimal. In a few cases (Xerces and Santuario) I can get away with black boxing it - everything is available as a supported parameter. Curl is 99% of the way (It's a black box, but I'm using what I consider are reserved behaviors via the MAKE="NMAKE /e" paradigm (which means I don't whine if they change - I knew I was at risk when I automated the build).

My memory is vague, but I'm pretty sure that when when I looked at this I didn't consider that INCLUDE and LIB to be a public API and/or that it wouldn't have helped my build. It wouldn't help with the lib/dll name thing either though so I'm always going have to be "unsupported". I liked @kdekker 's fix because it made me less unsupported.

But I'm not going to make a statement in favor one thing or another - this begins to get religious and I gave up religious wars about tech in the 80's.

OTOH will check every build change as it hits github to make sure it doesn't break me, and if it does look to see if it can be changed and if not make the changes I need. If curl ships a secadv and I have to scurry I don't need a broken build environment.

@kdekker
Copy link
Contributor Author

kdekker commented May 29, 2018

The thing I (but also @p) can check is re-add/change line 422 (based on curl/master on github) from:
LNK = $(LNKLIB) /out:$(LIB_DIROBJ)\$(TARGET)
to:
LNK = $(LNKLIB) $(WIN_LIBS) /out:$(LIB_DIROBJ)\$(TARGET)

It will then (most probably) not aggregate all (other) static libs, and it may (or may not) add Windows system DLL dependencies (and make libcurl more 'abstract'). I will try to check next week.

I'm not sure, but nmake /E option can be used to set e.g. SSL_INC_DIR/SSL_LIB_DIR if the output structure of (in this example a 3rd party SSL lib) does not patch SSL_PATH/include and SSL_PATH/lib.

@p
Copy link
Contributor

p commented May 31, 2018

The other problem that this change caused is the requirement to keep libraries of all of libcurl's dependencies around.

Prior to 7.60.0, in order to build software against libcurl one needed libcurl's headers and libraries produced by libcurl's build process, i.e. libcurl.lib or libcurl_a.lib. As of 7.60.0, libcurl_a.lib no longer contains the code that libcurl is statically built against, which means one must manually assemble all of the libraries that libcurl uses and keep those around indefinitely in order to build anything dependent on libcurl statically.

https://msdn.microsoft.com/en-us/library/e17b885t.aspx says:

This command creates a library from one or more input files. The files can be COFF object files, 32-bit OMF object files, or existing COFF libraries.

Hence the fix should be as simple as putting back all of the libcurl's dependent libraries on the lib.exe command line, which I can look into if there is agreement that this is the correct path forward.

@kdekker
Copy link
Contributor Author

kdekker commented May 31, 2018

Prior to 7.60.0, in order to build software against libcurl one needed libcurl's headers and libraries produced by libcurl's build process, i.e. libcurl.lib or libcurl_a.lib. As of 7.60.0, libcurl_a.lib no longer contains the code that libcurl is statically built against, which means one must manually assemble all of the libraries that libcurl uses and keep those around indefinitely in order to build anything dependent on libcurl statically.

Do you mean that aggregating is something that you want? I.e. if you build curl statically, using e.g. openssl, than also the openssl stuff should become part of static libcurl.lib?

If you meant that, I'm really surprised, as I don't know another example that is using that way of building. Aggregating other libraries in static libcurl.lib is very strange, as the used other libraries (e.g. libcrypto.lib and libssl.lib) still remain. Using them both with libcurl.lib will then result in duplicate symbols. This is violating separation of concerns as static libcurl.lib should not contain anything aggregated from the other parties. I will not make a PR for this. My PR intentionally removed this dependency to e.g. openssl. See also my comments in both this thread and in makefiles itself (about unwanted aggregation). It seems that you are disagreeing with that.

BTW: did you already try out my advise to add WIN_LIBS to the lib command? You can also try out things yourself.

@kdekker
Copy link
Contributor Author

kdekker commented May 31, 2018

I think the question is: should curl.lib be self-contained, including dependencies to Windows DLLs and incorporating any product configured?

For myself: if this is indeed what is wanted with the static curl library, I would be very surprised. There are at least two reasons not to want this:

  1. combining curl with various versions of the other products is difficult
  2. using generated pdb files is impossible, as Visual studio expects a pdb file per .lib file. Aggregating the lib is possible, but aggregating pdb files not. And pdb files are very useful in case of debugging and mandatory in case if you need to make a stacktrace (using StackWalk functions from dbghlp API).

When looking at other build methods (curl\projects\Windows\VCnn), as far as I can see (because Visual Studio does not add dependencies, since creating a lib does not contain a link step) no dependencies are added for libcurl. So the way you are supposing to be a 'normal' way is IMO very uncommon.

I'll await your response before spending more time to this issue.

@p
Copy link
Contributor

p commented Jun 1, 2018

You keep saying you are experiencing errors and are unable to do certain things, but in this entire time I haven't seen a single error quoted nor any sort of a build configuration. Lacking these details I am not able to respond to your concerns effectively.

@kdekker
Copy link
Contributor Author

kdekker commented Jun 4, 2018

You keep saying you are experiencing errors and are unable to do certain things, but in this entire time I haven't seen a single error quoted nor any sort of a build configuration. Lacking these details I am not able to respond to your concerns effectively.

Using 7.59.0 (i.e. prior to this commit), the build raised some warnings (not errors, my mistake), but the pdb files are incorrectly generated (=error).

Build procedure:

  1. extract curl lib
  2. copy headers and libs (in my case OpenSSL, zlib, libssh2) to a 'deps' directory (according build.windows.txt)
  3. perform build with (in a Visual Studio 2015 CMD x64 prompt): nmake -f makefile.vc mode=static WITH_DEVEL=....\deps WITH_SSL=static WITH_ZLIB=static WITH_SSH2=static GEN_PDB=yes DEBUG=yes MACHINE=x64

My directory layout of deps is:
include lib include\openssl lib\libcrypto.lib lib\libssl.lib lib\ossl_static.pdb lib\zlib.lib lib\zlib.pdb lib\libssh2.lib lib\vc140.pdb

I'm not listing the header files here. And note that the pdb files are copied here as well. As visual studio uses vc.pdb (where nnn is a version) as default, then you can see that only one such file can be stored (this one is of libssh2). That is at least one reason to need to have 'other deps in isolated directories'.

The output (I only show parts of interest) of the build command (step 3) is:


        cl /Od /D_DEBUG /RTC1 /Z7 /LDd /MDd /DCURL_STATICLIB /I. /I ../lib /I../include /nologo /W4 /wd4127 /EHsc /DWIN32 /FD /c /DBUILDING_LIBCURL /I"..\..\deps/include" /DUSE_OPENSSL /I"..\..\deps/include/openssl" /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ /DHAVE_LIBSSH2 /DHAVE_LIBSSH2_H /DLIBSSH2_WIN32 /DLIBSSH2_LIBRARY /DUSE_LIBSSH2 /I..\..\deps/include/libssh2  /DUSE_WIN32_IDN /DWANT_IDN_PROTOTYPES  /DUSE_IPV6  /DUSE_WINDOWS_SSPI /Zi /Fd"..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib\libcurl_a_debug.pdb" /Fo"..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/getinfo.obj"  ..\lib\getinfo.c
**cl : Command line warning D9025 : overriding '/Z7' with '/Zi'**
...
mbedtls.c
Using SSL: true
Using NGHTTP2: false
Using c-ares:
Using SSH2: true
Using ZLIB: true
Using IDN: true
Using IPv6: true
Using SSPI: true
Using WinSSL: false
CFLAGS: /I. /I ../lib /I../include /nologo /W4 /wd4127 /EHsc /DWIN32 /FD /c /DBUILDING_LIBCURL /I"..\..\deps/include" /DUSE_OPENSSL /I"..\..\deps/include/openssl" /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ /DHAVE_LIBSSH2 /DHAVE_LIBSSH2_H /DLIBSSH2_WIN32 /DLIBSSH2_LIBRARY /DUSE_LIBSSH2 /I..\..\deps/include/libssh2 /DUSE_WIN32_IDN /DWANT_IDN_PROTOTYPES /DUSE_IPV6 /DUSE_WINDOWS_SSPI /Zi /Fd"..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib\libcurl_a_debug.pdb"
LFLAGS: /nologo /machine:x64 "/LIBPATH:..\..\deps/lib" libssl.lib libcrypto.lib gdi32.lib user32.lib crypt32.lib zlib.lib libssh2.lib user32.lib /incremental:no /opt:ref,icf /DEBUG
GenPDB: true
Debug: yes
Machine: x64
        link.exe /lib ws2_32.lib wldap32.lib advapi32.lib Normaliz.lib /out:..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib\libcurl_a_debug.lib /nologo /machine:x64 "/LIBPATH:..\..\deps/lib"  libssl.lib libcrypto.lib gdi32.lib user32.lib crypt32.lib  zlib.lib  libssh2.lib user32.lib /incremental:no /opt:ref,icf /DEBUG ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/file.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/timeval.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/base64.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/hostip.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/progress.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/formdata.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/cookie.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/http.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/sendf.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/ftp.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/url.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/dict.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/if2ip.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/speedcheck.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/ldap.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/version.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/getenv.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/escape.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/mprintf.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/telnet.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/netrc.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/getinfo.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/transfer.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/strcase.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/easy.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/security.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_fnmatch.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/fileinfo.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/ftplistparser.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/wildcard.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/krb5.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/memdebug.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/http_chunks.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/strtok.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/connect.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/llist.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/hash.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/multi.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/content_encoding.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/share.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/http_digest.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/md4.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/md5.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/http_negotiate.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/inet_pton.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/strtoofft.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/strerror.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/amigaos.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/hostasyn.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/hostip4.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/hostip6.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/hostsyn.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/inet_ntop.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/parsedate.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/select.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/tftp.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/splay.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/strdup.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/socks.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/ssh.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/ssh-libssh.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_addrinfo.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/socks_gssapi.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/socks_sspi.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_sspi.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/slist.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/nonblock.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_memrchr.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/imap.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/pop3.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/smtp.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/pingpong.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/rtsp.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_threads.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/warnless.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/hmac.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_rtmp.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/openldap.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_gethostname.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/gopher.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/idn_win32.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/http_proxy.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/non-ascii.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/asyn-ares.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/asyn-thread.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_gssapi.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/http_ntlm.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_ntlm_wb.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_ntlm_core.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_sasl.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/rand.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_multibyte.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/hostcheck.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/conncache.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/pipeline.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/dotdot.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/x509asn1.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/http2.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/smb.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_endian.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_des.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/system_win32.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/mime.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/sha256.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/setopt.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_path.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_ctype.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_range.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vauth/vauth.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vauth/cleartext.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vauth/cram.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vauth/digest.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vauth/digest_sspi.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vauth/krb5_gssapi.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vauth/krb5_sspi.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vauth/ntlm.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vauth/ntlm_sspi.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vauth/oauth2.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vauth/spnego_gssapi.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vauth/spnego_sspi.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vtls/openssl.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vtls/gtls.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vtls/vtls.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vtls/nss.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vtls/polarssl.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vtls/polarssl_threadlock.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vtls/axtls.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vtls/cyassl.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vtls/schannel.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vtls/darwinssl.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vtls/gskit.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vtls/mbedtls.obj
LINK : warning LNK4044: unrecognized option '/incremental:no'; ignored
LINK : warning LNK4044: unrecognized option '/opt:ref,icf'; ignored
LINK : warning LNK4044: unrecognized option '/DEBUG'; ignored
wldap32.lib(WLDAP32.dll) : warning LNK4006: __NULL_IMPORT_DESCRIPTOR already defined in ws2_32.lib(WS2_32.dll); second definition ignored
wldap32.lib(WLDAP32.dll) : warning LNK4221: This object file does not define any previously undefined public symbols, so it will not be used by any link operation that consumes this library
advapi32.lib(ADVAPI32.dll) : warning LNK4006: __NULL_IMPORT_DESCRIPTOR already defined in ws2_32.lib(WS2_32.dll); second definition ignored
advapi32.lib(ADVAPI32.dll) : warning LNK4221: This object file does not define any previously undefined public symbols, so it will not be used by any link operation that consumes this library
Normaliz.lib(Normaliz.dll) : warning LNK4006: __NULL_IMPORT_DESCRIPTOR already defined in ws2_32.lib(WS2_32.dll); second definition ignored
Normaliz.lib(Normaliz.dll) : warning LNK4221: This object file does not define any previously undefined public symbols, so it will not be used by any link operation that consumes this library
libcrypto.lib(ebcdic.obj) : warning LNK4221: This object file does not define any previously undefined public symbols, so it will not be used by any link operation that consumes this library
libcrypto.lib(ecp_nistp224.obj) : warning LNK4221: This object file does not define any previously undefined public symbols, so it will not be used by any link operation that consumes this library
libcrypto.lib(ecp_nistp256.obj) : warning LNK4221: This object file does not define any previously undefined public symbols, so it will not be used by any link operation that consumes this library
libcrypto.lib(ecp_nistp521.obj) : warning LNK4221: This object file does not define any previously undefined public symbols, so it will not be used by any link operation that consumes this library
libcrypto.lib(ecp_nistputil.obj) : warning LNK4221: This object file does not define any previously undefined public symbols, so it will not be used by any link operation that consumes this library
libcrypto.lib(rand_egd.obj) : warning LNK4221: This object file does not define any previously undefined public symbols, so it will not be used by any link operation that consumes this library
gdi32.lib(GDI32.dll) : warning LNK4006: __NULL_IMPORT_DESCRIPTOR already defined in ws2_32.lib(WS2_32.dll); second definition ignored
gdi32.lib(GDI32.dll) : warning LNK4221: This object file does not define any previously undefined public symbols, so it will not be used by any link operation that consumes this library
user32.lib(USER32.dll) : warning LNK4006: __NULL_IMPORT_DESCRIPTOR already defined in ws2_32.lib(WS2_32.dll); second definition ignored
user32.lib(USER32.dll) : warning LNK4221: This object file does not define any previously undefined public symbols, so it will not be used by any link operation that consumes this library
crypt32.lib(CRYPT32.dll) : warning LNK4006: __NULL_IMPORT_DESCRIPTOR already defined in ws2_32.lib(WS2_32.dll); second definition ignored
crypt32.lib(CRYPT32.dll) : warning LNK4221: This object file does not define any previously undefined public symbols, so it will not be used by any link operation that consumes this library
libssh2.lib(channel.obj) : MSIL .netmodule or module compiled with /GL found; restarting link with /LTCG; add /LTCG to the link command line to improve linker performance
LINK : warning LNK4044: unrecognized option '/incremental:no'; ignored
LINK : warning LNK4044: unrecognized option '/opt:ref,icf'; ignored
LINK : warning LNK4044: unrecognized option '/DEBUG'; ignored
wldap32.lib(WLDAP32.dll) : warning LNK4006: __NULL_IMPORT_DESCRIPTOR already defined in ws2_32.lib(WS2_32.dll); second definition ignored
advapi32.lib(ADVAPI32.dll) : warning LNK4006: __NULL_IMPORT_DESCRIPTOR already defined in ws2_32.lib(WS2_32.dll); second definition ignored
Normaliz.lib(Normaliz.dll) : warning LNK4006: __NULL_IMPORT_DESCRIPTOR already defined in ws2_32.lib(WS2_32.dll); second definition ignored
gdi32.lib(GDI32.dll) : warning LNK4006: __NULL_IMPORT_DESCRIPTOR already defined in ws2_32.lib(WS2_32.dll); second definition ignored
user32.lib(USER32.dll) : warning LNK4006: __NULL_IMPORT_DESCRIPTOR already defined in ws2_32.lib(WS2_32.dll); second definition ignored
crypt32.lib(CRYPT32.dll) : warning LNK4006: __NULL_IMPORT_DESCRIPTOR already defined in ws2_32.lib(WS2_32.dll); second definition ignored

...

        link.exe /incremental:no /libpath:"..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi\lib" /nologo /out:..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi\bin\curl.exe /subsystem:console /machine:x64 libcurl_a_debug.lib ws2_32.lib wldap32.lib advapi32.lib Normaliz.lib ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl\tool_hugehelp.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl\nonblock.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl\strtoofft.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl\warnless.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl\curl_ctype.obj ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/slist_wc.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_binmode.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_bname.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_cb_dbg.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_cb_hdr.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_cb_prg.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_cb_rea.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_cb_see.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_cb_wrt.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_cfgable.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_convert.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_dirhie.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_doswin.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_easysrc.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_filetime.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_formparse.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_getparam.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_getpass.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_help.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_helpers.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_homedir.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_libinfo.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_main.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_metalink.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_msgs.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_operate.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_operhlp.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_panykey.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_paramhlp.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_parsecfg.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_strdup.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_setopt.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_sleep.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_urlglob.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_util.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_vms.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_writeout.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_xattr.obj   ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl\curl.res
libcurl_a_debug.lib(global.obj) : MSIL .netmodule or module compiled with /GL found; restarting link with /LTCG; add /LTCG to the link command line to improve linker performance
LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library
Generating code
Finished generating code

Notes:

  • I had to make a minor fix to be able to work with libssh2.lib instead of libssh2_a.lib.
  • Note the link.exe /lib command, including all windows libraries
  • Note the (IMO large number of unneeded) warnings (not errors)

But even worse, all is aggregated in curl static lib (and pdb) resulting in a huge (30MB+) lib:

$ ll */*/*.lib */*.lib */*.pdb */*/*.pdb |sort
  364 -rw-r--r-- 1 kdekker bea-tools   372736 Jun  4 08:21 libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi/lib/libcurl_a_debug.pdb
  364 -rw-r--r-- 1 kdekker bea-tools   372736 Jun  4 08:21 libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/libcurl_a_debug.pdb
 2796 -rwxr-xr-x 1 kdekker bea-tools  2863104 Jun  4 08:21 libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi/bin/curl.exe*
30812 -rw-r--r-- 1 kdekker bea-tools 31550708 Jun  4 08:21 libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi/lib/libcurl_a_debug.lib
30812 -rw-r--r-- 1 kdekker bea-tools 31550708 Jun  4 08:21 libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/libcurl_a_debug.lib

So, I hope that you agree that this is incorrect. The benefit for you is that libcurl.lib is 'self-contained', containing all references to anything that is used by curl, but at a price of a unusable pdb file, and a lot of compiler warnings.

Using curl 7.60.0, the story becomes different. The make command was kept the same for case of simplicity, same headers and libs of libssh2, zlib and openSSL have been used. The output now becomes:

        cl /Od /D_DEBUG /RTC1 /Z7 /LDd /MDd /DCURL_STATICLIB /I. /I ../lib /I../include /nologo /W4 /wd4127 /EHsc /DWIN32 /FD /c /DBUILDING_LIBCURL /I"..\..\deps/include" /DUSE_OPENSSL /I"..\..\deps/include\openssl" /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ /I"..\..\deps/include" /DHAVE_LIBSSH2 /DHAVE_LIBSSH2_H /DLIBSSH2_WIN32 /DLIBSSH2_LIBRARY /DUSE_LIBSSH2 /I..\..\deps/include/libssh2  /DUSE_WIN32_IDN /DWANT_IDN_PROTOTYPES  /DUSE_IPV6  /DUSE_WINDOWS_SSPI /Zi /Fd"..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib\libcurl_a_debug.pdb" /Fo"..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/getinfo.obj"  ..\lib\getinfo.c
cl : Command line warning D9025 : overriding '/Z7' with '/Zi'

...

Using SSL: true
Using NGHTTP2: false
Using c-ares:
Using SSH2: true
Using ZLIB: true
Using IDN: true
Using IPv6: true
Using SSPI: true
Using WinSSL: false
CFLAGS: /I. /I ../lib /I../include /nologo /W4 /wd4127 /EHsc /DWIN32 /FD /c /DBUILDING_LIBCURL /I"..\..\deps/include" /DUSE_OPENSSL /I"..\..\deps/include\openssl" /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ /I"..\..\deps/include" /DHAVE_LIBSSH2 /DHAVE_LIBSSH2_H /DLIBSSH2_WIN32 /DLIBSSH2_LIBRARY /DUSE_LIBSSH2 /I..\..\deps/include/libssh2 /DUSE_WIN32_IDN /DWANT_IDN_PROTOTYPES /DUSE_IPV6 /DUSE_WINDOWS_SSPI /Zi /Fd"..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib\libcurl_a_debug.pdb"
LFLAGS: /nologo /machine:x64 "/LIBPATH:..\..\deps/lib" libssl.lib libcrypto.lib zlib.lib libssh2.lib /incremental:no /opt:ref,icf /DEBUG
GenPDB: true
Debug: yes
Machine: x64
        lib.exe /out:..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib\libcurl_a_debug.lib ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/file.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/timeval.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/base64.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/hostip.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/progress.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/formdata.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/cookie.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/http.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/sendf.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/ftp.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/url.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/dict.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/if2ip.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/speedcheck.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/ldap.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/version.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/getenv.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/escape.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/mprintf.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/telnet.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/netrc.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/getinfo.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/transfer.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/strcase.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/easy.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/security.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_fnmatch.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/fileinfo.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/ftplistparser.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/wildcard.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/krb5.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/memdebug.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/http_chunks.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/strtok.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/connect.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/llist.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/hash.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/multi.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/content_encoding.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/share.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/http_digest.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/md4.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/md5.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/http_negotiate.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/inet_pton.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/strtoofft.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/strerror.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/amigaos.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/hostasyn.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/hostip4.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/hostip6.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/hostsyn.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/inet_ntop.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/parsedate.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/select.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/tftp.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/splay.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/strdup.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/socks.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/ssh.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/ssh-libssh.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_addrinfo.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/socks_gssapi.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/socks_sspi.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_sspi.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/slist.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/nonblock.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_memrchr.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/imap.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/pop3.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/smtp.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/pingpong.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/rtsp.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_threads.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/warnless.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/hmac.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_rtmp.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/openldap.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_gethostname.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/gopher.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/idn_win32.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/http_proxy.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/non-ascii.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/asyn-ares.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/asyn-thread.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_gssapi.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/http_ntlm.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_ntlm_wb.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_ntlm_core.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_sasl.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/rand.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_multibyte.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/hostcheck.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/conncache.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/pipeline.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/dotdot.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/x509asn1.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/http2.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/smb.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_endian.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_des.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/system_win32.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/mime.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/sha256.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/setopt.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_path.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_ctype.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_range.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vauth/vauth.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vauth/cleartext.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vauth/cram.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vauth/digest.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vauth/digest_sspi.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vauth/krb5_gssapi.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vauth/krb5_sspi.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vauth/ntlm.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vauth/ntlm_sspi.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vauth/oauth2.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vauth/spnego_gssapi.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vauth/spnego_sspi.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vtls/openssl.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vtls/gtls.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vtls/vtls.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vtls/nss.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vtls/polarssl.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vtls/polarssl_threadlock.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vtls/axtls.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vtls/cyassl.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vtls/schannel.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vtls/schannel_verify.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vtls/darwinssl.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vtls/gskit.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vtls/mbedtls.obj

...

        link.exe /incremental:no /libpath:"..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi\lib" /out:..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi\bin\curl.exe /subsystem:console /nologo /machine:x64 "/LIBPATH:..\..\deps/lib"  libssl.lib libcrypto.lib  zlib.lib  libssh2.lib /incremental:no /opt:ref,icf /DEBUG libcurl_a_debug.lib ws2_32.lib wldap32.lib advapi32.lib crypt32.lib gdi32.lib user32.lib crypt32.lib user32.lib Normaliz.lib ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl\tool_hugehelp.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl\nonblock.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl\strtoofft.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl\warnless.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl\curl_ctype.obj ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/slist_wc.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_binmode.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_bname.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_cb_dbg.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_cb_hdr.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_cb_prg.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_cb_rea.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_cb_see.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_cb_wrt.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_cfgable.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_convert.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_dirhie.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_doswin.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_easysrc.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_filetime.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_formparse.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_getparam.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_getpass.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_help.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_helpers.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_homedir.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_libinfo.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_main.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_metalink.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_msgs.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_operate.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_operhlp.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_panykey.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_paramhlp.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_parsecfg.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_strdup.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_setopt.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_sleep.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_urlglob.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_util.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_vms.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_writeout.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_xattr.obj   ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl\curl.res
libssh2.lib(global.obj) : MSIL .netmodule or module compiled with /GL found; restarting link with /LTCG; add /LTCG to the link command line to improve linker performance
MSVCRTD.lib(initializers.obj) : warning LNK4098: defaultlib 'msvcrt.lib' conflicts with use of other libs; use /NODEFAULTLIB:library
Generating code

Notes:

  1. The D9025 warning still exists (I missed that one, and forgot it to fix), but it can be easily fixed
  2. Note that the other warnings have gone. The LNK4098 is caused because I'm performing a debug libcurl build and using optimized libssh2/openssl/zlib libs.

And note that aggregation have gone. That's exactly what I want (and what I suppose to be as 'normal'). The generated library has much smaller output.

 364 -rw-r--r-- 1 kdekker bea-tools  372736 Jun  4 08:33 libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi/lib/libcurl_a_debug.pdb
 364 -rw-r--r-- 1 kdekker bea-tools  372736 Jun  4 08:33 libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/libcurl_a_debug.pdb
2805 -rwxr-xr-x 1 kdekker bea-tools 2872320 Jun  4 08:33 libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi/bin/curl.exe*
3120 -rw-r--r-- 1 kdekker bea-tools 3194212 Jun  4 08:33 libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi/lib/libcurl_a_debug.lib
3120 -rw-r--r-- 1 kdekker bea-tools 3194212 Jun  4 08:33 libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/libcurl_a_debug.lib
9180 -rw-r--r-- 1 kdekker bea-tools 9400320 Jun  4 08:33 libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi/bin/curl.pdb

Finally: Using 7.60.0, without adding $(WIN_LIBS) to the lib.exe command (Makefilebuild.vc:422) will result in a libcurl.lib that (of course) don't have dependencies to windows system DLLs. See:

dumpbin /dependents libcurl_a_debug.lib
Microsoft (R) COFF/PE Dumper Version 14.00.24215.1
Copyright (C) Microsoft Corporation.  All rights reserved.

Dump of file libcurl_a_debug.lib

File Type: LIBRARY

  Summary

         35D .bss
        CD3F .data
      183E54 .debug$S
        5F98 .debug$T
        18F0 .drectve
        39FC .pdata
        F580 .rdata
         330 .rtc$IMZ
         330 .rtc$TMZ
       91CD6 .text$mn
        2E30 .xdata

Note: curl.exe of course has dependencies to e.g. advapi32.dll.

Changing the lib.exe line in Makefilebuild.vc:422, results in a (static) cURL library that has dependencies, but also reintroduces compiler warnings, see below:

Using SSL: true
Using NGHTTP2: false
Using c-ares:
Using SSH2: true
Using ZLIB: true
Using IDN: true
Using IPv6: true
Using SSPI: true
Using WinSSL: false
CFLAGS: /I. /I ../lib /I../include /nologo /W4 /wd4127 /EHsc /DWIN32 /FD /c /DBUILDING_LIBCURL /I"..\..\deps/include" /DUSE_OPENSSL /I"..\..\deps/include\openssl" /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ /I"..\..\deps/include" /DHAVE_LIBSSH2 /DHAVE_LIBSSH2_H /DLIBSSH2_WIN32 /DLIBSSH2_LIBRARY /DUSE_LIBSSH2 /I..\..\deps/include/libssh2 /DUSE_WIN32_IDN /DWANT_IDN_PROTOTYPES /DUSE_IPV6 /DUSE_WINDOWS_SSPI /Zi /Fd"..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib\libcurl_a_debug.pdb"
LFLAGS: /nologo /machine:x64 "/LIBPATH:..\..\deps/lib" libssl.lib libcrypto.lib zlib.lib libssh2.lib /incremental:no /opt:ref,icf /DEBUG
GenPDB: true
Debug: yes
Machine: x64
        lib.exe ws2_32.lib wldap32.lib advapi32.lib crypt32.lib gdi32.lib user32.lib crypt32.lib user32.lib Normaliz.lib /out:..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib\libcurl_a_debug.lib ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/file.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/timeval.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/base64.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/hostip.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/progress.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/formdata.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/cookie.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/http.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/sendf.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/ftp.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/url.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/dict.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/if2ip.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/speedcheck.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/ldap.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/version.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/getenv.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/escape.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/mprintf.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/telnet.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/netrc.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/getinfo.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/transfer.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/strcase.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/easy.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/security.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_fnmatch.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/fileinfo.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/ftplistparser.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/wildcard.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/krb5.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/memdebug.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/http_chunks.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/strtok.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/connect.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/llist.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/hash.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/multi.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/content_encoding.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/share.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/http_digest.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/md4.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/md5.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/http_negotiate.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/inet_pton.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/strtoofft.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/strerror.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/amigaos.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/hostasyn.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/hostip4.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/hostip6.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/hostsyn.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/inet_ntop.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/parsedate.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/select.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/tftp.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/splay.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/strdup.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/socks.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/ssh.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/ssh-libssh.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_addrinfo.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/socks_gssapi.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/socks_sspi.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_sspi.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/slist.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/nonblock.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_memrchr.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/imap.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/pop3.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/smtp.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/pingpong.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/rtsp.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_threads.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/warnless.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/hmac.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_rtmp.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/openldap.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_gethostname.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/gopher.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/idn_win32.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/http_proxy.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/non-ascii.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/asyn-ares.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/asyn-thread.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_gssapi.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/http_ntlm.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_ntlm_wb.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_ntlm_core.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_sasl.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/rand.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_multibyte.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/hostcheck.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/conncache.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/pipeline.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/dotdot.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/x509asn1.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/http2.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/smb.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_endian.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_des.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/system_win32.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/mime.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/sha256.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/setopt.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_path.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_ctype.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/curl_range.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vauth/vauth.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vauth/cleartext.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vauth/cram.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vauth/digest.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vauth/digest_sspi.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vauth/krb5_gssapi.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vauth/krb5_sspi.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vauth/ntlm.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vauth/ntlm_sspi.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vauth/oauth2.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vauth/spnego_gssapi.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vauth/spnego_sspi.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vtls/openssl.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vtls/gtls.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vtls/vtls.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vtls/nss.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vtls/polarssl.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vtls/polarssl_threadlock.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vtls/axtls.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vtls/cyassl.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vtls/schannel.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vtls/schannel_verify.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vtls/darwinssl.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vtls/gskit.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-lib/vtls/mbedtls.obj
Microsoft (R) Library Manager Version 14.00.24215.1
Copyright (C) Microsoft Corporation.  All rights reserved.

wldap32.lib(WLDAP32.dll) : warning LNK4006: __NULL_IMPORT_DESCRIPTOR already defined in ws2_32.lib(WS2_32.dll); second definition ignored
wldap32.lib(WLDAP32.dll) : warning LNK4221: This object file does not define any previously undefined public symbols, so it will not be used by any link operation that consumes this library
advapi32.lib(ADVAPI32.dll) : warning LNK4006: __NULL_IMPORT_DESCRIPTOR already defined in ws2_32.lib(WS2_32.dll); second definition ignored
advapi32.lib(ADVAPI32.dll) : warning LNK4221: This object file does not define any previously undefined public symbols, so it will not be used by any link operation that consumes this library
crypt32.lib(CRYPT32.dll) : warning LNK4006: __NULL_IMPORT_DESCRIPTOR already defined in ws2_32.lib(WS2_32.dll); second definition ignored
crypt32.lib(CRYPT32.dll) : warning LNK4221: This object file does not define any previously undefined public symbols, so it will not be used by any link operation that consumes this library
gdi32.lib(GDI32.dll) : warning LNK4006: __NULL_IMPORT_DESCRIPTOR already defined in ws2_32.lib(WS2_32.dll); second definition ignored
gdi32.lib(GDI32.dll) : warning LNK4221: This object file does not define any previously undefined public symbols, so it will not be used by any link operation that consumes this library
user32.lib(USER32.dll) : warning LNK4006: __NULL_IMPORT_DESCRIPTOR already defined in ws2_32.lib(WS2_32.dll); second definition ignored
user32.lib(USER32.dll) : warning LNK4221: This object file does not define any previously undefined public symbols, so it will not be used by any link operation that consumes this library
Normaliz.lib(Normaliz.dll) : warning LNK4006: __NULL_IMPORT_DESCRIPTOR already defined in ws2_32.lib(WS2_32.dll); second definition ignored
Normaliz.lib(Normaliz.dll) : warning LNK4221: This object file does not define any previously undefined public symbols, so it will not be used by any link operation that consumes this library
Copying libs...
        link.exe /incremental:no /libpath:"..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi\lib" /out:..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi\bin\curl.exe /subsystem:console /nologo /machine:x64 "/LIBPATH:..\..\deps/lib"  libssl.lib libcrypto.lib  zlib.lib  libssh2.lib /incremental:no /opt:ref,icf /DEBUG libcurl_a_debug.lib ws2_32.lib wldap32.lib advapi32.lib crypt32.lib gdi32.lib user32.lib crypt32.lib user32.lib Normaliz.lib ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl\tool_hugehelp.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl\nonblock.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl\strtoofft.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl\warnless.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl\curl_ctype.obj ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/slist_wc.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_binmode.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_bname.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_cb_dbg.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_cb_hdr.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_cb_prg.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_cb_rea.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_cb_see.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_cb_wrt.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_cfgable.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_convert.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_dirhie.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_doswin.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_easysrc.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_filetime.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_formparse.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_getparam.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_getpass.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_help.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_helpers.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_homedir.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_libinfo.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_main.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_metalink.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_msgs.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_operate.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_operhlp.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_panykey.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_paramhlp.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_parsecfg.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_strdup.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_setopt.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_sleep.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_urlglob.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_util.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_vms.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_writeout.obj  ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl/tool_xattr.obj   ..\builds\libcurl-vc-x64-debug-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-obj-curl\curl.res
libssh2.lib(global.obj) : MSIL .netmodule or module compiled with /GL found; restarting link with /LTCG; add /LTCG to the link command line to improve linker performance
MSVCRTD.lib(initializers.obj) : warning LNK4098: defaultlib 'msvcrt.lib' conflicts with use of other libs; use /NODEFAULTLIB:library
Generating code
Finished generating code

Finally: I think my PR (almost) solved all of this. Your way of working (by adding system dependencies) to static libraries is - although not raising errors - still strange. I hope that I have convinced you.

@p
Copy link
Contributor

p commented Jun 4, 2018

And note that the pdb files are copied here as well.

According to what you posted, this is a deficiency of your build process. The final output you are showing contains only the pdb for libcurl - no pdb files for its dependencies - so if this is what you want, don't copy the dependencies' pdb files to your dependency aggregation directory. No changes in libcurl build process are needed.

That is at least one reason to need to have 'other deps in isolated directories'.

We already covered that libcurl supported dependencies in their own directories going back to 7.19.0.

LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library

This is bad regardless of whether it's a static/dynamic mix or release/debug. You should be referencing /MDd (but can still give /NDEBUG etc.) when building e.g. libssh2 that is used by a debug libcurl. And I'm guessing you do still have the static/dynamic mix in release builds.

Note the (IMO large number of unneeded) warnings (not errors)

Exactly, warnings. So far nothing indicates any need to repair them at the cost of making it difficult to work with libcurl.

But even worse, all is aggregated in curl static lib (and pdb) resulting in a huge (30MB+) lib:

  1. This is desired behavior as I already explained.
  2. 30 mb is huge? Maybe in 1995 it was but certainly not today.

but at a price of a unusable pdb file

I will address this again: if you don't need the other pdb files, don't copy them to where they get in the way. If you do need them, you can rename them since you are copying them. In either case no changes to build process of either libcurl or its dependencies are needed (though renaming pdb files may be handy, I don't know how to do that off the top of my head).

To summarize, what I see is you made libcurl's build process do the work that should be performed by you in your organization-specific steps. I understand that either way works for you but it really doesn't for other use cases.

@kdekker
Copy link
Contributor Author

kdekker commented Jun 4, 2018

According to what you posted, this is a deficiency of your build process. The final output you are showing contains only the pdb for libcurl - no pdb files for its dependencies - so if this is what you want, don't copy the dependencies' pdb files to your dependency aggregation directory. No changes in libcurl build process are needed.

If you don't know another example in Windows world, that works in this way, then I think that your build process has a deficiency. It has no sense in talking about yours or mines in this case, as the duplicate warnings clearly indicates that this way of working is strange.

This is bad regardless of whether it's a static/dynamic mix or release/debug. You should be referencing /MDd (but can still give /NDEBUG etc.) when building e.g. libssh2 that is used by a debug libcurl. And I'm guessing you do still have the static/dynamic mix in release builds.

Yes and no. In case if 3rd party (static) libs are being used, that come in one (=typical release) form, and you are building your own stuff in debug mode, then you always have this warning (which cannot be solved). It is indeed related to release/debug mode (of referenced msvcrd[d]), but it is typically Microsoft. Other (*NIX) plaforms do NOT need to tell in a own static (sic!) library what kind of runtime will be used. So this (LNK4098) warning can be ignored for this discussion. I don't know how to prevent this one.

Exactly, warnings. So far nothing indicates any need to repair them at the cost of making it difficult to work with libcurl.

Warnings are potentially bugs. So why do you like to ignore (LNK4006) warnings? Solely because it facilitates your build process? And please keep in mind that I've said before that link.exe /lib is undocumented. You should not use or rely on undocumented things neither leave warnings exist. It is IMO laziness to certain extend not to solve warnings. Warnings make noise, and may hide a real issue.

Finally: you are right that rolling back this PR also requires me to adjust my build process. But as - I'm repeating myself too often in this thread - none of the other Windows build approaches work in the same way as you are liking/wanting here, I think the current approach is better. I don't like to spend time to rolling back a fix that gives me only additional work to me. If you like to rollback this PR, just feel free to make your own PR and ask the community/maintainers whether they are willing to commit it on the main branch. Based on my feedback in this thread, I think it is strange to do so.

@p
Copy link
Contributor

p commented Jun 5, 2018

That is exactly what I proposed about a week ago.

@kdekker
Copy link
Contributor Author

kdekker commented Jun 5, 2018

For some reason, I believe you don't really listen. If you can find another example that works in the same way as you prefer, I would agree. But at this point, I would be very surprised if a maintainer of curl would accept a PR to rollback this fix. It is then contrary all logic (and IMO common sense). You do not really take my arguments into account (is my feeling).

BTW: Some addition about xxx_PATH variables (I forgot to comment on it): using xxx_PATH that points to lib/include subdirs, is quite common (compare with *NIX /usr/lib and /usr/include stuff). And most other products create a /lib and /include structure upon make install. I think the xxx_PATH approach is not that bad.

@p
Copy link
Contributor

p commented Jun 5, 2018

You of course understand my use case perfectly.

@lock lock bot locked as resolved and limited conversation to collaborators Sep 3, 2018
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
Development

Successfully merging this pull request may close these issues.

None yet

5 participants