diff options
author | Monty Brandenberg <monty@lindenlab.com> | 2014-04-15 22:48:52 +0000 |
---|---|---|
committer | Monty Brandenberg <monty@lindenlab.com> | 2014-04-15 22:48:52 +0000 |
commit | f8874d04b8ca238ee99dc464055295cff417a9b2 (patch) | |
tree | 74e277421da416ce6222664d9caee8e144940b53 | |
parent | 04404b68b56638171bc200f9a22a660257370d5d (diff) |
Linux/Win: Bad checksum on Windows package. Libz and libpng linking changes to find newest code.
Windows autobuild package had a bad checksum due to oddities in the build
system. On Linux I've been fighting with getting libz 1.2.8 and libpng
1.6.8 to be the definitive version in the viewer. Problem is the *massive*
library search tree we assemble. We find older shared library versions
first and so those dominated. By using --whole-archive with static libraries,
the packaged versions of these libraries are made definitive.
-rwxr-xr-x | autobuild.xml | 2 | ||||
-rwxr-xr-x | indra/cmake/OpenSSL.cmake | 2 | ||||
-rwxr-xr-x | indra/cmake/PNG.cmake | 13 | ||||
-rwxr-xr-x | indra/cmake/ZLIB.cmake | 21 | ||||
-rwxr-xr-x | indra/newview/CMakeLists.txt | 28 |
5 files changed, 59 insertions, 7 deletions
diff --git a/autobuild.xml b/autobuild.xml index ba358e88d3..d3ce7dde36 100755 --- a/autobuild.xml +++ b/autobuild.xml @@ -306,7 +306,7 @@ <key>archive</key> <map> <key>hash</key> - <string>396bc5bf0bd31a5e396ca0d11ce1a85f</string> + <string>c9261587a5711619df7db8441217dbeb</string> <key>url</key> <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3pl_3p-curl-update/rev/289005/arch/CYGWIN/installer/curl-7.34.0-windows-20140414.tar.bz2</string> </map> diff --git a/indra/cmake/OpenSSL.cmake b/indra/cmake/OpenSSL.cmake index 2704912eb5..4593821921 100755 --- a/indra/cmake/OpenSSL.cmake +++ b/indra/cmake/OpenSSL.cmake @@ -17,7 +17,7 @@ else (STANDALONE) endif (STANDALONE) if (LINUX) - set(CRYPTO_LIBRARIES crypto) + set(CRYPTO_LIBRARIES crypto dl) elseif (DARWIN) set(CRYPTO_LIBRARIES crypto) endif (LINUX) diff --git a/indra/cmake/PNG.cmake b/indra/cmake/PNG.cmake index d9afe772ae..9653591f67 100755 --- a/indra/cmake/PNG.cmake +++ b/indra/cmake/PNG.cmake @@ -15,6 +15,19 @@ else (STANDALONE) set(PNG_LIBRARIES png16) set(PNG_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/libpng16) else() + # + # When we have updated static libraries in competition with older + # shared libraries and we want the former to win, we need to do some + # extra work. The *_PRELOAD_ARCHIVES settings are invoked early + # and will pull in the entire archive to the binary giving it + # priority in symbol resolution. Beware of cmake moving the + # achive load itself to another place on the link command line. If + # that happens, you can try something like -Wl,-lpng16 here to hide + # the archive. Also be aware that the linker will not tolerate a + # second whole-archive load of the archive. See viewer's + # CMakeLists.txt for more information. + # + set(PNG_PRELOAD_ARCHIVES -Wl,--whole-archive png16 -Wl,--no-whole-archive) set(PNG_LIBRARIES png16) set(PNG_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/libpng16) endif() diff --git a/indra/cmake/ZLIB.cmake b/indra/cmake/ZLIB.cmake index 48e5130ad5..0470f3e797 100755 --- a/indra/cmake/ZLIB.cmake +++ b/indra/cmake/ZLIB.cmake @@ -13,10 +13,23 @@ else (STANDALONE) set(ZLIB_LIBRARIES debug zlibd optimized zlib) - else (WINDOWS) + elseif (LINUX) + # + # When we have updated static libraries in competition with older + # shared libraries and we want the former to win, we need to do some + # extra work. The *_PRELOAD_ARCHIVES settings are invoked early + # and will pull in the entire archive to the binary giving it + # priority in symbol resolution. Beware of cmake moving the + # achive load itself to another place on the link command line. If + # that happens, you can try something like -Wl,-lz here to hide + # the archive. Also be aware that the linker will not tolerate a + # second whole-archive load of the archive. See viewer's + # CMakeLists.txt for more information. + # + set(ZLIB_PRELOAD_ARCHIVES -Wl,--whole-archive z -Wl,--no-whole-archive) + set(ZLIB_LIBRARIES z) + elseif (DARWIN) set(ZLIB_LIBRARIES z) endif (WINDOWS) - if (WINDOWS OR LINUX) - set(ZLIB_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/zlib) - endif (WINDOWS OR LINUX) + set(ZLIB_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/zlib) endif (STANDALONE) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 10015b65f2..72c406c95b 100755 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -47,6 +47,8 @@ include(VisualLeakDetector) include(GLOD) include(CMakeCopyIfDifferent) include(LLAppearance) +include(PNG) +include(ZLIB) if (NOT HAVOK_TPV) # When using HAVOK_TPV, the library is precompiled, so no need for this @@ -1859,13 +1861,37 @@ else (WINDOWS) ) endif (WINDOWS) -# *NOTE - this list is very sensitive to ordering, test carefully on all +# *NOTE: - this list is very sensitive to ordering, test carefully on all # platforms if you change the releative order of the entries here. # In particular, cmake 2.6.4 (when buidling with linux/makefile generators) # appears to sometimes de-duplicate redundantly listed dependencies improperly. # To work around this, higher level modules should be listed before the modules # that they depend upon. -brad +# +# *NOTE: On mixing system shared libraries and updated static archives. +# We use a number of libraries that have an existence as system libraries, +# internal-use libraries and applications libraries. The most-referenced +# one of these being libz where you can find four or more versions in play +# at once. On Linux, libz can be found at link and run time via a number +# of paths: +# +# => -lfreetype +# => libz.so.1 (on install machine, not build) +# => -lSDL +# => libz.so.1 (on install machine, not build) +# => -lgdk-x11-2.0 +# => libz.so.1 +# => -lz +# +# We generally want the newest version of the library to provide all symbol +# resolution. To that end, when using static archives, the *_PRELOAD_ARCHIVES +# variables, PNG_PRELOAD_ARCHIVES and ZLIB_PRELOAD_ARCHIVES, get the archives +# dumped into the target binary and runtime lookup will find the most +# modern version. + target_link_libraries(${VIEWER_BINARY_NAME} + ${PNG_PRELOAD_ARCHIVES} + ${ZLIB_PRELOAD_ARCHIVES} ${UPDATER_LIBRARIES} ${GOOGLE_PERFTOOLS_LIBRARIES} ${LLAUDIO_LIBRARIES} |