Hi,

following several hours of investigation and discussion on IRC with danielsh, philipm and bert I believe there to be some issue in the build generator for Windows.

Running the python command:
python gen-make.py -t vcproj --with-zlib=..\zlib --with-apr=..\apr --with-apr-util=..\apr-util --vsnet-version=2010

followed by building (using VS 2010 SP1):
msbuild subversion_vcnet.sln /t:__ALL_TESTS__ /p:Configuration=Release

I get 8 project errors:
- libsvn_ra_dll: LINK : fatal error LNK1181: cannot open input file 'ssleay32.lib' [E:\[delete]SVNTest\SVN\src-trunk\build\win32\vcnet-vcproj\libsvn_ra_dll.vcxproj] - test_client: LINK : fatal error LNK1181: cannot open input file 'ssleay32.lib' [E:\[delete]SVNTest\SVN\src-trunk\build\win32\vcnet-vcproj\test_client.vcxproj] - conflict-data-test: LINK : fatal error LNK1181: cannot open input file 'ssleay32.lib' [E:\[delete]SVNTest\SVN\src-trunk\build\win32\vcnet-vcproj\test_conflict_data.vcxproj]
- some more tests - all with ssleay32.lib missing

ssleay32.lib is an OpenSSL library specified in build.conf in the openssl-section alongside libeay32.lib for the "msvc-libs"-option.

Looking at the generated libsvn_ra_dll.vcxproj-file actually shows the additional linker dependencies being set to:
[...]ssleay32.lib;libeay32.lib;secur32.lib[...]

IMHO this is wrong. I'm explicitly building without OpenSSL as well as without serf and still these OpenSSL/Serf librarie references are being generated in the project files.

Taken from build.conf:
libsvn_ra specifies "ra_libs" as a libs dependency and "ra-libs" specifies "libsvn_ra_serf" as a libs-dependency which then specifies "serf" as a lib-dependency which defines msvc-libs as secur32.lib. "serf" then also defines "openssl" as the dependency which in effect takes ssleay32.lib and libeay32.lib as the setting for msvc-libs.

gen_win.py:get_win_libs: takes the msvc-libs conditionless as the required dependencies *UNLESS* the target specifies msvc_static (in which case get_win_libs returns an empty array).

Originally my thought was that the generated dependency tree should be adjusted so it correctly reflects the build-parameter-state (aka: drop serf/openSSL completely) but danielsh clarified to me that he believes the issue rather to be in the part generating the project output since the dependency tree should simply reflect exactly what is specified in the build.conf-file.

So I guess that the issue is located in gen_win.py:get_win_libs() not omitting the libraries, if these are not specified by the gen-make commands.

I've tested the attached patch and with that applied, running the two build commands stated above succeed with no errors (also verified that the generated project files then no longer contain the lib-references). However, I'm not 100% convinced yet that this is the correct approach or whether some more generic solution would be more suitable (aka one which would handle any optional library not present and the corresponding entry in the build dependency tree). Given that there's already another special case command omitting the ra-serf-install target if "serf" is not found, I guess the patch might be acceptable though. Nevertheless, I think some SVN developer is better of with providing more input on this so to find the right solution.

(note: the issue also exists in 1.9 and currently results in the fact that building without OpenSSL fails on Windows - assuming this is not a problem in 1.8, it's a regression of 1.9 compared to 1.8).

Regards,
Stefan
Index: gen_win.py
===================================================================
--- gen_win.py  (revision 1691913)
+++ gen_win.py  (working copy)
@@ -886,6 +886,12 @@
           nondeplibs.append(lib.lib_name)
 
     for dep in self.get_win_depends(target, FILTER_LIBS):
+      if 'serf' not in self._libraries and dep.name == 'serf':
+        continue
+        
+      if 'openssl' not in self._libraries and dep.name == 'openssl':
+        continue
+        
       nondeplibs.extend(dep.msvc_libs)
 
       if dep.external_lib:

Reply via email to