From c62d2319e0f0cb4e6b193d7def55624788e2ac7a Mon Sep 17 00:00:00 2001 From: rdb Date: Wed, 9 Mar 2022 14:54:27 +0100 Subject: [PATCH] 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. --- dtool/src/dtoolbase/CMakeLists.txt | 5 +++++ dtool/src/prc/CMakeLists.txt | 6 ++++++ panda/src/audiotraits/CMakeLists.txt | 5 +++++ panda/src/ffmpeg/CMakeLists.txt | 15 +++++++++++++ panda/src/gobj/CMakeLists.txt | 5 +++++ panda/src/movies/CMakeLists.txt | 18 ++++++++++++++++ panda/src/pnmimagetypes/CMakeLists.txt | 29 ++++++++++++++++++++++++++ panda/src/vision/CMakeLists.txt | 6 ++++++ panda/src/vrpn/CMakeLists.txt | 6 ++++++ pandatool/src/assimp/CMakeLists.txt | 6 ++++++ 10 files changed, 101 insertions(+) diff --git a/dtool/src/dtoolbase/CMakeLists.txt b/dtool/src/dtoolbase/CMakeLists.txt index f69125f6b4..72d69b7e07 100644 --- a/dtool/src/dtoolbase/CMakeLists.txt +++ b/dtool/src/dtoolbase/CMakeLists.txt @@ -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 diff --git a/dtool/src/prc/CMakeLists.txt b/dtool/src/prc/CMakeLists.txt index 2a97c4665a..f5731e9e0f 100644 --- a/dtool/src/prc/CMakeLists.txt +++ b/dtool/src/prc/CMakeLists.txt @@ -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} diff --git a/panda/src/audiotraits/CMakeLists.txt b/panda/src/audiotraits/CMakeLists.txt index c90b9dcbae..419bc66a88 100644 --- a/panda/src/audiotraits/CMakeLists.txt +++ b/panda/src/audiotraits/CMakeLists.txt @@ -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} diff --git a/panda/src/ffmpeg/CMakeLists.txt b/panda/src/ffmpeg/CMakeLists.txt index a78a3d2cdc..494289f5a7 100644 --- a/panda/src/ffmpeg/CMakeLists.txt +++ b/panda/src/ffmpeg/CMakeLists.txt @@ -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 diff --git a/panda/src/gobj/CMakeLists.txt b/panda/src/gobj/CMakeLists.txt index 1835ffe3f8..c8cfd64b8f 100644 --- a/panda/src/gobj/CMakeLists.txt +++ b/panda/src/gobj/CMakeLists.txt @@ -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) diff --git a/panda/src/movies/CMakeLists.txt b/panda/src/movies/CMakeLists.txt index 30e01d254a..fc61423d18 100644 --- a/panda/src/movies/CMakeLists.txt +++ b/panda/src/movies/CMakeLists.txt @@ -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 diff --git a/panda/src/pnmimagetypes/CMakeLists.txt b/panda/src/pnmimagetypes/CMakeLists.txt index 84c8ceeab7..2045b7130d 100644 --- a/panda/src/pnmimagetypes/CMakeLists.txt +++ b/panda/src/pnmimagetypes/CMakeLists.txt @@ -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 diff --git a/panda/src/vision/CMakeLists.txt b/panda/src/vision/CMakeLists.txt index 284e764807..c1505ad950 100644 --- a/panda/src/vision/CMakeLists.txt +++ b/panda/src/vision/CMakeLists.txt @@ -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} diff --git a/panda/src/vrpn/CMakeLists.txt b/panda/src/vrpn/CMakeLists.txt index 11e5a5fc61..47010a9d79 100644 --- a/panda/src/vrpn/CMakeLists.txt +++ b/panda/src/vrpn/CMakeLists.txt @@ -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} diff --git a/pandatool/src/assimp/CMakeLists.txt b/pandatool/src/assimp/CMakeLists.txt index 536d15ec39..5b88e0eff6 100644 --- a/pandatool/src/assimp/CMakeLists.txt +++ b/pandatool/src/assimp/CMakeLists.txt @@ -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.