CMake: Add --exclude-libs flags to static thirdparty libraries

Matching makepanda, this avoids symbol conflicts and may have optimization benefits.

This is a temporary hack until CMake 3.24 is released, which offers a cleaner way of doing this.
This commit is contained in:
rdb 2022-03-09 14:54:27 +01:00
parent 6ea1e8d65c
commit c62d2319e0
10 changed files with 101 additions and 0 deletions

View File

@ -97,6 +97,11 @@ target_include_directories(p3dtoolbase PUBLIC
target_link_libraries(p3dtoolbase PKG::EIGEN PKG::THREADS PKG::MIMALLOC)
target_interrogate(p3dtoolbase ${P3DTOOLBASE_SOURCES} EXTENSIONS ${P3DTOOLBASE_IGATEEXT})
if(HAVE_MIMALLOC AND CMAKE_CXX_COMPILER_ID MATCHES "^(GNU|Clang)$")
# Do not re-export symbols from these libraries.
target_link_options(p3dtoolbase PRIVATE "LINKER:--exclude-libs,libmimalloc.a")
endif()
if(NOT BUILD_METALIBS)
install(TARGETS p3dtoolbase
EXPORT Core COMPONENT Core

View File

@ -94,6 +94,12 @@ if(ANDROID)
target_link_libraries(p3prc log)
endif()
if(HAVE_OPENSSL AND CMAKE_CXX_COMPILER_ID MATCHES "^(GNU|Clang)$")
# Do not re-export symbols from these libraries.
target_link_options(p3prc PRIVATE "LINKER:--exclude-libs,libssl.a")
target_link_options(p3prc PRIVATE "LINKER:--exclude-libs,libcrypto.a")
endif()
install(TARGETS p3prc
EXPORT Core COMPONENT Core
DESTINATION ${CMAKE_INSTALL_LIBDIR}

View File

@ -60,6 +60,11 @@ if(HAVE_OPENAL)
set_target_properties(p3openal_audio PROPERTIES DEFINE_SYMBOL BUILDING_OPENAL_AUDIO)
target_link_libraries(p3openal_audio panda PKG::OPENAL)
if(CMAKE_CXX_COMPILER_ID MATCHES "^(GNU|Clang)$")
# When statically linking OpenAL, keep its symbols private to this module.
target_link_options(p3openal_audio PRIVATE "LINKER:--exclude-libs,libopenal.a")
endif()
install(TARGETS p3openal_audio
EXPORT OpenAL COMPONENT OpenAL
DESTINATION ${CMAKE_INSTALL_LIBDIR}

View File

@ -26,12 +26,27 @@ set_target_properties(p3ffmpeg PROPERTIES DEFINE_SYMBOL BUILDING_FFMPEG)
target_link_libraries(p3ffmpeg panda
PKG::FFMPEG PKG::SWSCALE PKG::SWRESAMPLE)
# Do not re-export symbols from these libraries.
if(CMAKE_CXX_COMPILER_ID MATCHES "^(GNU|Clang)$")
target_link_options(p3ffmpeg PRIVATE "LINKER:--exclude-libs,libavcodec.a")
target_link_options(p3ffmpeg PRIVATE "LINKER:--exclude-libs,libavformat.a")
target_link_options(p3ffmpeg PRIVATE "LINKER:--exclude-libs,libavutil.a")
endif()
if(HAVE_SWSCALE)
target_compile_definitions(p3ffmpeg PRIVATE HAVE_SWSCALE)
if(CMAKE_CXX_COMPILER_ID MATCHES "^(GNU|Clang)$")
target_link_options(p3ffmpeg PRIVATE "LINKER:--exclude-libs,libswscale.a")
endif()
endif()
if(HAVE_SWRESAMPLE)
target_compile_definitions(p3ffmpeg PRIVATE HAVE_SWRESAMPLE)
if(CMAKE_CXX_COMPILER_ID MATCHES "^(GNU|Clang)$")
target_link_options(p3ffmpeg PRIVATE "LINKER:--exclude-libs,libswresample.a")
endif()
endif()
install(TARGETS p3ffmpeg

View File

@ -180,6 +180,11 @@ target_interrogate(p3gobj ALL EXTENSIONS ${P3GOBJ_IGATEEXT})
if(HAVE_SQUISH)
target_compile_definitions(p3gobj PRIVATE HAVE_SQUISH)
if(CMAKE_CXX_COMPILER_ID MATCHES "^(GNU|Clang)$")
# Keep symbols from libsquish internal.
target_link_options(p3gobj PRIVATE "LINKER:--exclude-libs,libsquish.a")
endif()
endif()
if(PHAVE_LOCKF)

View File

@ -51,6 +51,24 @@ target_link_libraries(p3movies p3pstatclient p3gobj p3pandabase pandaexpress
PKG::VORBIS PKG::OPUS)
target_interrogate(p3movies ALL)
if(CMAKE_CXX_COMPILER_ID MATCHES "^(GNU|Clang)$")
# Do not re-export symbols from these libraries.
if(HAVE_OPUS OR HAVE_VORBIS)
target_link_options(p3movies PRIVATE "LINKER:--exclude-libs,libogg.a")
endif()
if(HAVE_VORBIS)
target_link_options(p3movies PRIVATE "LINKER:--exclude-libs,libvorbis.a")
target_link_options(p3movies PRIVATE "LINKER:--exclude-libs,libvorbisenc.a")
target_link_options(p3movies PRIVATE "LINKER:--exclude-libs,libvorbisfile.a")
endif()
if(HAVE_OPUS)
target_link_options(p3movies PRIVATE "LINKER:--exclude-libs,libopus.a")
target_link_options(p3movies PRIVATE "LINKER:--exclude-libs,libopusfile.a")
endif()
endif()
if(NOT BUILD_METALIBS)
install(TARGETS p3movies
EXPORT Core COMPONENT Core

View File

@ -39,6 +39,35 @@ target_link_libraries(p3pnmimagetypes p3pnmimage
PKG::JPEG PKG::TIFF PKG::PNG PKG::OPENEXR)
set_target_properties(p3pnmimagetypes PROPERTIES CXX_EXCEPTIONS ON)
if(CMAKE_CXX_COMPILER_ID MATCHES "^(GNU|Clang)$")
# Do not re-export symbols from these libraries.
if(HAVE_JPEG)
target_link_options(p3pnmimagetypes PRIVATE "LINKER:--exclude-libs,libjpeg.a")
endif()
if(HAVE_TIFF)
target_link_options(p3pnmimagetypes PRIVATE "LINKER:--exclude-libs,libtiff.a")
endif()
if(HAVE_PNG)
target_link_options(p3pnmimagetypes PRIVATE "LINKER:--exclude-libs,libpng.a")
target_link_options(p3pnmimagetypes PRIVATE "LINKER:--exclude-libs,libpng16.a")
endif()
if(HAVE_OPENEXR)
target_link_options(p3pnmimagetypes PRIVATE "LINKER:--exclude-libs,libHalf.a")
target_link_options(p3pnmimagetypes PRIVATE "LINKER:--exclude-libs,libIex.a")
target_link_options(p3pnmimagetypes PRIVATE "LINKER:--exclude-libs,libIexMath.a")
target_link_options(p3pnmimagetypes PRIVATE "LINKER:--exclude-libs,libIlmImf.a")
target_link_options(p3pnmimagetypes PRIVATE "LINKER:--exclude-libs,libIlmImfUtil.a")
target_link_options(p3pnmimagetypes PRIVATE "LINKER:--exclude-libs,libIlmThread.a")
target_link_options(p3pnmimagetypes PRIVATE "LINKER:--exclude-libs,libImath.a")
target_link_options(p3pnmimagetypes PRIVATE "LINKER:--exclude-libs,libOpenEXR.a")
target_link_options(p3pnmimagetypes PRIVATE "LINKER:--exclude-libs,libOpenEXRCore.a")
target_link_options(p3pnmimagetypes PRIVATE "LINKER:--exclude-libs,libOpenEXRUtil.a")
endif()
endif()
if(NOT BUILD_METALIBS)
install(TARGETS p3pnmimagetypes
EXPORT Core COMPONENT Core

View File

@ -43,6 +43,12 @@ if(HAVE_FFMPEG)
target_compile_definitions(p3vision PRIVATE HAVE_FFMPEG)
endif()
if(HAVE_ARTOOLKIT AND CMAKE_CXX_COMPILER_ID MATCHES "^(GNU|Clang)$")
# Do not re-export symbols from these libraries.
target_link_options(p3vision PRIVATE "LINKER:--exclude-libs,libAR.a")
target_link_options(p3vision PRIVATE "LINKER:--exclude-libs,libARMulti.a")
endif()
install(TARGETS p3vision
EXPORT Vision COMPONENT Vision
DESTINATION ${CMAKE_INSTALL_LIBDIR}

View File

@ -37,6 +37,12 @@ target_interrogate(p3vrpn ALL)
set_target_properties(p3vrpn PROPERTIES CXX_EXCEPTIONS ON)
if(HAVE_VRPN AND CMAKE_CXX_COMPILER_ID MATCHES "^(GNU|Clang)$")
# Do not re-export symbols from these libraries.
target_link_options(p3vrpn PRIVATE "LINKER:--exclude-libs,libvrpn.a")
target_link_options(p3vrpn PRIVATE "LINKER:--exclude-libs,libquat.a")
endif()
install(TARGETS p3vrpn
EXPORT VRPN COMPONENT VRPN
DESTINATION ${CMAKE_INSTALL_LIBDIR}

View File

@ -26,6 +26,12 @@ set_target_properties(p3assimp PROPERTIES DEFINE_SYMBOL BUILDING_ASSIMP)
target_link_libraries(p3assimp PRIVATE p3pandatoolbase)
target_link_libraries(p3assimp PUBLIC PKG::ASSIMP)
if(CMAKE_CXX_COMPILER_ID MATCHES "^(GNU|Clang)$")
# Do not re-export symbols from these libraries.
target_link_options(p3assimp PRIVATE "LINKER:--exclude-libs,libassimp.a")
target_link_options(p3assimp PRIVATE "LINKER:--exclude-libs,libIrrXML.a")
endif()
if(BUILD_SHARED_LIBS)
# We can't install this if we're doing a static build, because it depends on
# a static library that isn't installed.