diff --git a/CMakeLists.txt b/CMakeLists.txt
index 62671a7797a5335a35774baba4797c0ac8a01f59..378a029b1f42dd0097c9f26ffd78a1d0dd53e5af 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -44,9 +44,7 @@ add_subdirectory( fggl )
 target_compile_options( fggl PRIVATE -Wall -Wpedantic -Wextra -Wodr -fno-strict-aliasing -fno-strict-overflow )
 set_property(TARGET fggl PROPERTY INTERPROCEDURAL_OPTIMIZATION True)
 
-
-# 3rd party integrations
-add_subdirectory( integrations/bullet )
+# vendor dependencies
 add_subdirectory( integrations/entt )
 
 # Unit Tests
@@ -129,3 +127,6 @@ export(EXPORT "${PROJECT_NAME}Targets"
     NAMESPACE ${namespace}::
 )
 
+# 3rd party integrations
+add_subdirectory( integrations/bullet )
+
diff --git a/demo/CMakeLists.txt b/demo/CMakeLists.txt
index 8ef5eced8e90f07ae52934fdc6ef00816a4d8b53..71a00aa9db67410a967451a7d3339b5f33990091 100644
--- a/demo/CMakeLists.txt
+++ b/demo/CMakeLists.txt
@@ -15,7 +15,7 @@ target_include_directories(demo
             ${CMAKE_CURRENT_SOURCE_DIR}/include
 )
 
-target_link_libraries(demo fggl)
+target_link_libraries(demo fggl fgglbt)
 
 find_package(spdlog)
 target_link_libraries(demo spdlog::spdlog)
diff --git a/integrations/bullet/CMakeLists.txt b/integrations/bullet/CMakeLists.txt
index 28134aa0839382bb5b7f57f6e65c306c1d5c2476..1099d59efcae4a3d57f53d88f1369c736043ea83 100644
--- a/integrations/bullet/CMakeLists.txt
+++ b/integrations/bullet/CMakeLists.txt
@@ -5,32 +5,35 @@ if ( NOT Bullet_FOUND )
 else()
     message( STATUS "Bullet is poorly packaged, you might need to disable support for it" )
 
+    add_library(fgglbt STATIC)
+
     if ( MSVC )
         # see https://github.com/microsoft/vcpkg/issues/7877
-        target_link_libraries(fggl PUBLIC LinearMath Bullet3Common BulletDynamics BulletSoftBody BulletCollision BulletInverseDynamics)
+        target_link_libraries(fgglbt PUBLIC LinearMath Bullet3Common BulletDynamics BulletSoftBody BulletCollision BulletInverseDynamics)
     else()
         # FIXME: this shouldn't be necessary, for modern cmake, linking the libraries should be enough
-        target_compile_definitions(fggl PUBLIC ${BULLET_DEFINITIONS})
+        target_compile_definitions(fgglbt PUBLIC ${BULLET_DEFINITIONS})
 
         if ( BULLET_INCLUDE_DIRS STREQUAL "include/bullet" )
             message( STATUS "Bullet include path is relative - hard-coding" )
             # FIXME possible debian packing bug: path is relative in BulletConfig.cmake
             # FIXME debian packaging bug: BulletConfig.cmake lists BulletInverseDynamics, but that's packaged in bullet-extras
-            target_include_directories(fggl PUBLIC ${BULLET_ROOT_DIR}/${BULLET_INCLUDE_DIRS})
+            target_include_directories(fgglbt PUBLIC ${BULLET_ROOT_DIR}/${BULLET_INCLUDE_DIRS})
         else()
-            target_include_directories(fggl PUBLIC ${BULLET_INCLUDE_DIRS})
+            target_include_directories(fgglbt PUBLIC ${BULLET_INCLUDE_DIRS})
         endif()
-        target_link_libraries(fggl PUBLIC ${BULLET_LIBRARIES})
+        target_link_libraries(fgglbt PUBLIC ${BULLET_LIBRARIES})
     endif()
 
-    target_include_directories( fggl
+    target_link_libraries( fgglbt PUBLIC fggl )
+    target_include_directories( fgglbt
         PUBLIC
             $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>
             $<INSTALL_INTERFACE:include>
     )
 
     # bullet cpp files
-    target_sources( fggl
+    target_sources( fgglbt
         PRIVATE
             src/module.cpp
             src/simulation.cpp