Browse Source

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.
rdb 3 years ago
parent
commit
c62d2319e0

+ 5 - 0
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_link_libraries(p3dtoolbase PKG::EIGEN PKG::THREADS PKG::MIMALLOC)
 target_interrogate(p3dtoolbase ${P3DTOOLBASE_SOURCES} EXTENSIONS ${P3DTOOLBASE_IGATEEXT})
 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)
 if(NOT BUILD_METALIBS)
   install(TARGETS p3dtoolbase
   install(TARGETS p3dtoolbase
     EXPORT Core COMPONENT Core
     EXPORT Core COMPONENT Core

+ 6 - 0
dtool/src/prc/CMakeLists.txt

@@ -94,6 +94,12 @@ if(ANDROID)
   target_link_libraries(p3prc log)
   target_link_libraries(p3prc log)
 endif()
 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
 install(TARGETS p3prc
   EXPORT Core COMPONENT Core
   EXPORT Core COMPONENT Core
   DESTINATION ${CMAKE_INSTALL_LIBDIR}
   DESTINATION ${CMAKE_INSTALL_LIBDIR}

+ 5 - 0
panda/src/audiotraits/CMakeLists.txt

@@ -60,6 +60,11 @@ if(HAVE_OPENAL)
   set_target_properties(p3openal_audio PROPERTIES DEFINE_SYMBOL BUILDING_OPENAL_AUDIO)
   set_target_properties(p3openal_audio PROPERTIES DEFINE_SYMBOL BUILDING_OPENAL_AUDIO)
   target_link_libraries(p3openal_audio panda PKG::OPENAL)
   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
   install(TARGETS p3openal_audio
     EXPORT OpenAL COMPONENT OpenAL
     EXPORT OpenAL COMPONENT OpenAL
     DESTINATION ${CMAKE_INSTALL_LIBDIR}
     DESTINATION ${CMAKE_INSTALL_LIBDIR}

+ 15 - 0
panda/src/ffmpeg/CMakeLists.txt

@@ -26,12 +26,27 @@ set_target_properties(p3ffmpeg PROPERTIES DEFINE_SYMBOL BUILDING_FFMPEG)
 target_link_libraries(p3ffmpeg panda
 target_link_libraries(p3ffmpeg panda
   PKG::FFMPEG PKG::SWSCALE PKG::SWRESAMPLE)
   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)
 if(HAVE_SWSCALE)
   target_compile_definitions(p3ffmpeg PRIVATE 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()
 endif()
 
 
 if(HAVE_SWRESAMPLE)
 if(HAVE_SWRESAMPLE)
   target_compile_definitions(p3ffmpeg PRIVATE 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()
 endif()
 
 
 install(TARGETS p3ffmpeg
 install(TARGETS p3ffmpeg

+ 5 - 0
panda/src/gobj/CMakeLists.txt

@@ -180,6 +180,11 @@ target_interrogate(p3gobj ALL EXTENSIONS ${P3GOBJ_IGATEEXT})
 
 
 if(HAVE_SQUISH)
 if(HAVE_SQUISH)
   target_compile_definitions(p3gobj PRIVATE 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()
 endif()
 
 
 if(PHAVE_LOCKF)
 if(PHAVE_LOCKF)

+ 18 - 0
panda/src/movies/CMakeLists.txt

@@ -51,6 +51,24 @@ target_link_libraries(p3movies p3pstatclient p3gobj p3pandabase pandaexpress
   PKG::VORBIS PKG::OPUS)
   PKG::VORBIS PKG::OPUS)
 target_interrogate(p3movies ALL)
 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)
 if(NOT BUILD_METALIBS)
   install(TARGETS p3movies
   install(TARGETS p3movies
     EXPORT Core COMPONENT Core
     EXPORT Core COMPONENT Core

+ 29 - 0
panda/src/pnmimagetypes/CMakeLists.txt

@@ -39,6 +39,35 @@ target_link_libraries(p3pnmimagetypes p3pnmimage
   PKG::JPEG PKG::TIFF PKG::PNG PKG::OPENEXR)
   PKG::JPEG PKG::TIFF PKG::PNG PKG::OPENEXR)
 set_target_properties(p3pnmimagetypes PROPERTIES CXX_EXCEPTIONS ON)
 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)
 if(NOT BUILD_METALIBS)
   install(TARGETS p3pnmimagetypes
   install(TARGETS p3pnmimagetypes
     EXPORT Core COMPONENT Core
     EXPORT Core COMPONENT Core

+ 6 - 0
panda/src/vision/CMakeLists.txt

@@ -43,6 +43,12 @@ if(HAVE_FFMPEG)
   target_compile_definitions(p3vision PRIVATE HAVE_FFMPEG)
   target_compile_definitions(p3vision PRIVATE HAVE_FFMPEG)
 endif()
 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
 install(TARGETS p3vision
   EXPORT Vision COMPONENT Vision
   EXPORT Vision COMPONENT Vision
   DESTINATION ${CMAKE_INSTALL_LIBDIR}
   DESTINATION ${CMAKE_INSTALL_LIBDIR}

+ 6 - 0
panda/src/vrpn/CMakeLists.txt

@@ -37,6 +37,12 @@ target_interrogate(p3vrpn ALL)
 
 
 set_target_properties(p3vrpn PROPERTIES CXX_EXCEPTIONS ON)
 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
 install(TARGETS p3vrpn
   EXPORT VRPN COMPONENT VRPN
   EXPORT VRPN COMPONENT VRPN
   DESTINATION ${CMAKE_INSTALL_LIBDIR}
   DESTINATION ${CMAKE_INSTALL_LIBDIR}

+ 6 - 0
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 PRIVATE p3pandatoolbase)
 target_link_libraries(p3assimp PUBLIC PKG::ASSIMP)
 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)
 if(BUILD_SHARED_LIBS)
   # We can't install this if we're doing a static build, because it depends on
   # We can't install this if we're doing a static build, because it depends on
   # a static library that isn't installed.
   # a static library that isn't installed.