--- /dev/null
+++ BUILD.bazel
@@ -0,0 +1,347 @@
+load("@rules_license//rules:license.bzl", "license")
+
+package(
+    default_applicable_licenses = [":license"],
+    features = [
+        "layering_check",
+    ],
+)
+
+license(
+    name = "license",
+    package_name = "bullet",
+)
+
+licenses(["notice"])
+
+exports_files(["LICENSE"])
+
+cc_library(
+    name = "LinearMath",
+    srcs = glob(["src/LinearMath/*.cpp"]),
+    hdrs = glob([
+        "src/LinearMath/*.h",
+        "src/LinearMath/**/*.h",
+    ]),
+    copts = select({
+        "@platforms//os:windows": [],
+        "//conditions:default": [
+            "-Wno-reorder",
+        ],
+    }),
+    visibility = ["//visibility:public"],
+)
+
+cc_library(
+    name = "LinearMathDoublePrecision",
+    srcs = glob(["src/LinearMath/*.cpp"]),
+    hdrs = glob([
+        "src/LinearMath/*.h",
+        "src/LinearMath/**/*.h",
+    ]),
+    copts = select({
+        "@platforms//os:windows": [],
+        "//conditions:default": [
+            "-Wno-reorder",
+        ],
+    }),
+    defines = [
+        "BT_USE_DOUBLE_PRECISION",
+    ],
+    visibility = ["//visibility:public"],
+)
+
+cc_library(
+    name = "BulletCollision",
+    srcs = glob([
+        "src/BulletCollision/**/*.cpp",
+    ]),
+    hdrs = glob([
+        "src/BulletCollision/**/*.h",
+    ]) + ["src/btBulletCollisionCommon.h"],
+    copts = select({
+        "@platforms//os:windows": [],
+        "//conditions:default": [
+            "-Wno-sign-compare",
+            "-Wno-unused-but-set-variable",
+            "-Wno-unused-variable",
+        ],
+    }),
+    includes = ["src"],
+    deps = [":LinearMath"],
+    visibility = ["//visibility:public"],
+)
+
+cc_library(
+    name = "BulletCollisionDoublePrecision",
+    srcs = glob([
+        "src/BulletCollision/**/*.cpp",
+    ]),
+    hdrs = glob([
+        "src/BulletCollision/**/*.h",
+    ]) + ["src/btBulletCollisionCommon.h"],
+    copts = select({
+        "@platforms//os:windows": [],
+        "//conditions:default": [
+            "-Wno-sign-compare",
+            "-Wno-unused-but-set-variable",
+            "-Wno-unused-variable",
+        ],
+    }),
+    includes = ["src"],
+    defines = [
+        "BT_USE_DOUBLE_PRECISION",
+    ],
+    deps = [":LinearMathDoublePrecision"],
+    visibility = ["//visibility:public"],
+)
+
+cc_library(
+    name = "BulletDynamics",
+    srcs = glob([
+        "src/BulletDynamics/**/*.cpp",
+    ]),
+    hdrs = glob([
+        "src/BulletDynamics/**/*.h",
+    ]) + [
+        "src/btBulletDynamicsCommon.h",
+    ],
+    copts = select({
+        "@platforms//os:windows": [],
+        "//conditions:default": [
+            "-Wno-class-memaccess",
+            "-Wno-reorder",
+            "-Wno-unknown-warning-option",
+            "-Wno-unused-but-set-variable",
+            "-Wno-unused-function",
+            "-Wno-unused-variable",
+        ],
+    }),
+    includes = ["src"],
+    deps = [
+        ":BulletCollision",
+        ":LinearMath",
+    ],
+    visibility = ["//visibility:public"],
+)
+
+cc_library(
+    name = "BulletDynamicsDoublePrecision",
+    srcs = glob([
+        "src/BulletDynamics/**/*.cpp",
+    ]),
+    hdrs = glob([
+        "src/BulletDynamics/**/*.h",
+    ]) + [
+        "src/btBulletDynamicsCommon.h",
+    ],
+    copts = select({
+        "@platforms//os:windows": [],
+        "//conditions:default": [
+            "-Wno-class-memaccess",
+            "-Wno-reorder",
+            "-Wno-unknown-warning-option",
+            "-Wno-unused-but-set-variable",
+            "-Wno-unused-function",
+            "-Wno-unused-variable",
+        ],
+    }),
+    includes = ["src"],
+    defines = [
+        "BT_USE_DOUBLE_PRECISION",
+    ],
+    deps = [
+        ":BulletCollisionDoublePrecision",
+        ":LinearMathDoublePrecision",
+    ],
+    visibility = ["//visibility:public"],
+)
+
+cc_library(
+    name = "BulletSoftBody",
+    srcs = glob([
+        "src/BulletSoftBody/**/*.cpp",
+        "src/BulletSoftBody/*.cpp",
+    ]),
+    hdrs = glob([
+        "src/BulletSoftBody/**/*.h",
+        "src/BulletSoftBody/*.h",
+    ]),
+    copts = select({
+        "@platforms//os:windows": [],
+        "//conditions:default": [
+            "-Wno-class-memaccess",
+            "-Wno-implicit-const-int-float-conversion",
+            "-Wno-overloaded-virtual",
+            "-Wno-reorder",
+            "-Wno-sign-compare",
+            "-Wno-single-bit-bitfield-constant-conversion",
+            "-Wno-unknown-warning-option",
+            "-Wno-unused-but-set-variable",
+            "-Wno-unused-variable",
+        ],
+    }),
+    includes = ["src"],
+    deps = [
+        ":BulletCollision",
+        ":BulletDynamics",
+        ":LinearMath",
+    ],
+    visibility = ["//visibility:public"],
+)
+
+cc_library(
+    name = "BulletSoftBodyDoublePrecision",
+    srcs = glob([
+        "src/BulletSoftBody/**/*.cpp",
+        "src/BulletSoftBody/*.cpp",
+    ]),
+    hdrs = glob([
+        "src/BulletSoftBody/**/*.h",
+        "src/BulletSoftBody/*.h",
+    ]),
+    copts = select({
+        "@platforms//os:windows": [],
+        "//conditions:default": [
+            "-Wno-class-memaccess",
+            "-Wno-implicit-const-int-float-conversion",
+            "-Wno-overloaded-virtual",
+            "-Wno-reorder",
+            "-Wno-sign-compare",
+            "-Wno-single-bit-bitfield-constant-conversion",
+            "-Wno-unknown-warning-option",
+            "-Wno-unused-but-set-variable",
+            "-Wno-unused-variable",
+        ],
+    }),
+    includes = ["src"],
+    defines = [
+        "BT_USE_DOUBLE_PRECISION",
+    ],
+    deps = [
+        ":BulletCollisionDoublePrecision",
+        ":BulletDynamicsDoublePrecision",
+        ":LinearMathDoublePrecision",
+    ],
+    visibility = ["//visibility:public"],
+)
+
+cc_library(
+    name = "Bullet3Common",
+    srcs = glob(["src/Bullet3Common/*.cpp"]),
+    hdrs = glob([
+        "src/Bullet3Common/**/*.h",
+        "src/Bullet3Common/*.h",
+    ]),
+    includes = ["src"],
+)
+
+cc_library(
+    name = "BulletInverseDynamics",
+    srcs = glob([
+        "src/BulletInverseDynamics/**/*.cpp",
+        "src/BulletInverseDynamics/*.cpp",
+        "src/BulletInverseDynamics/**/*.hpp",
+        "src/BulletInverseDynamics/*.hpp",
+    ]),
+    includes = ["src"],
+    deps = [
+        ":BulletDynamics",
+        ":LinearMath",
+        ":Bullet3Common",
+    ],
+    copts = select({
+        "@platforms//os:windows": [],
+        "//conditions:default": [
+            "-Wno-unused-but-set-variable",
+        ],
+    }),
+    visibility = ["//visibility:public"],
+)
+
+cc_library(
+    name = "BulletInverseDynamicsDoublePrecision",
+    srcs = glob([
+        "src/BulletInverseDynamics/**/*.cpp",
+        "src/BulletInverseDynamics/*.cpp",
+        "src/BulletInverseDynamics/**/*.hpp",
+        "src/BulletInverseDynamics/*.hpp",
+    ]),
+    includes = ["src"],
+    deps = [
+        ":BulletDynamicsDoublePrecision",
+        ":LinearMathDoublePrecision",
+        ":Bullet3Common",
+    ],
+    copts = select({
+        "@platforms//os:windows": [],
+        "//conditions:default": [
+            "-Wno-unused-but-set-variable",
+        ],
+    }),
+    defines = [
+        "BT_USE_DOUBLE_PRECISION",
+    ],
+    visibility = ["//visibility:public"],
+)
+
+cc_library(
+    name = "Bullet3Geometry",
+    srcs = glob(["src/Bullet3Geometry/*.cpp"]),
+    hdrs = glob(["src/Bullet3Geometry/*.h"]),
+    includes = ["src"],
+    deps = [
+        ":Bullet3Common",
+    ],
+    visibility = ["//visibility:public"],
+)
+
+cc_library(
+    name = "Bullet3Collision",
+    srcs = glob(["src/Bullet3Collision/**/*.cpp"]),
+    hdrs = glob(["src/Bullet3Collision/**/*.h"]),
+    includes = ["src"],
+    deps = [
+        ":Bullet3Common",
+        ":Bullet3Geometry",
+    ],
+    visibility = ["//visibility:public"],
+)
+
+cc_library(
+    name = "Bullet3Dynamics",
+    srcs = glob([
+        "src/Bullet3Dynamics/**/*.cpp",
+        "src/Bullet3Dynamics/*.cpp",
+    ]),
+    hdrs = glob([
+        "src/Bullet3Dynamics/**/*.h",
+        "src/Bullet3Dynamics/*.h",
+    ]),
+    includes = ["src"],
+    deps = [
+        ":Bullet3Collision",
+        ":Bullet3Common",
+    ],
+    visibility = ["//visibility:public"],
+)
+
+cc_library(
+    name = "Bullet3Serialize",
+    srcs = glob(["src/Bullet3Serialize/**/*.cpp"]),
+    hdrs = glob(["src/Bullet3Serialize/**/*.h"]),
+    includes = ["src"],
+    copts = select({
+        "@platforms//os:windows": [],
+        "//conditions:default": [
+            "-Wno-class-memaccess",
+            "-Wno-unknown-warning-option",
+            "-Wno-unused-but-set-variable",
+            "-Wno-unused-variable",
+        ],
+    }),
+    deps = [
+        ":Bullet3Common",
+    ],
+    visibility = ["//visibility:public"],
+)
