Build the resolver for your USD host#

No resolver wheels are published to PyPI or elsewhere for this release. Build the resolver from source for the application that owns OpenUSD. The ovstorage library publishes its own packages; installing ovstorage alone does not install this resolver.

Run the commands here from the resolver component root, the directory containing its CMakeLists.txt and README. In a combined checkout, first run cd ovstorage-usd-resolver. The sibling ../ovstorage is the storage component root; it contains ovstorage-c-source/.

Select the host SDK#

Current CMake integration requires NVIDIA Kit 25.11 nopy monolithic: PXR_VERSION must be 2511, the SDK must export usd_m, and its library name must match ov_25.11usd_ms. The pinned baseline is 0.25.11.kit.4-gl.21081; the compatibility matrix lists its Linux x86_64, Linux aarch64 and Windows x86_64 packages and hashes.

Other USD versions and stock split-library SDKs need build-system changes. Changing OVS_USD_SDK_ROOT alone does not enable them. Even another SDK that satisfies these layout checks needs validation against the actual host. Matching the USD version number alone does not establish ABI compatibility: use matching headers, library bytes, architecture, build configuration, compiler ABI and C++ runtime. Do not load a second incompatible USD runtime.

The acquisition helper downloads the pinned package for the native host:

python3 tools/dependencies/acquire_openusd_sdk.py --output .deps/openusd/25.11.kit.4-gl.21081

There is no pinned macOS SDK. macOS core/CLI portability tests do not establish support for a macOS OpenUSD plugin. See local verification for acquisition details, SDK layout and diagnostic checks.

Build and test#

Install CMake 3.22+, Python 3.10+ and a compiler accepted by the ovstorage bridge: GCC 13+, Clang 17+ or MSVC 19.40+. Compiler acceptance is not a guarantee that its runtime matches the host. Linux also needs the SDK’s OpenGL/X11 link dependencies; on Ubuntu these include libgl1-mesa-dev, libsm-dev, libice-dev, libx11-dev and libxext-dev.

Use the bundled ovstorage 0.3.0 sources or a matching standalone source/release layout. The resolver compiles the C API; provider plugins remain external and must match its plugin ABI. Obtain providers from the corresponding storage build or published ovstorage package, not an arbitrary newer version. The Python library exposes its provider directory as ovstorage.bundled_plugins_dir(). CMake registers provider-backed CTests only when it finds a provider directory at configure time. It uses <OVS_OVSTORAGE_SDK_ROOT>/plugins when that directory exists and falls back to <OVS_OVSTORAGE_SDK_ROOT>/dist/plugins only when it does not. Pointing a runtime at the Python package’s provider directory alone does not register those tests. Stage the matching providers into plugins/ first, then configure (or reconfigure) CMake. Do not rely on the dist/plugins fallback for a source-built storage distribution: it also holds test-only conformance plugins.

Use one of the following, run from the resolver component root. For a source-built storage distribution, build it with its own prerequisites, then copy only its runtime providers into a fresh plugins/:

make -C ../ovstorage dist
python3 tools/dependencies/stage_ovstorage_providers.py --ovstorage-root ../ovstorage

For the bundled storage 0.3.0 source, the prebuilt-provider alternative copies the published package’s providers instead, in a Python environment:

python3 -m pip install 'ovstorage==0.3.0'
python3 -c "import ovstorage, shutil; shutil.copytree(ovstorage.bundled_plugins_dir(), '../ovstorage/plugins')"

The make route assumes a POSIX shell with GNU Make; an MSVC developer shell does not provide make. On Windows, use the prebuilt-provider route, or build the storage distribution with the storage component’s own instructions and then run the same staging helper. Run the Python commands with python where python3 is unavailable.

Both methods stop with an error if plugins/ already exists, so they cannot silently mix provider versions. To restage or switch between them, delete ../ovstorage/plugins first, stage again, and reconfigure CMake. For a standalone checkout, replace ../ovstorage with the matching storage component root. See SDK layouts for fixture discovery and configuration for trusted runtime providers.

From the resolver component root in the combined checkout, on Linux:

CC=gcc-13 CXX=g++-13 cmake -S . -B build-host -DCMAKE_BUILD_TYPE=Release \
  -DOVS_USD_RESOLVER_BUILD_OPENUSD_PLUGIN=ON \
  -DOVS_USD_RESOLVER_BUILD_TESTS=ON \
  -DOVS_USD_RESOLVER_BUILD_EXAMPLES=ON \
  -DOVS_OVSTORAGE_REQUIRED=ON \
  -DOVS_USD_SDK_ROOT="$PWD/.deps/openusd/25.11.kit.4-gl.21081" \
  -DOVS_OVSTORAGE_SDK_ROOT="$PWD/../ovstorage"
cmake --build build-host --parallel
ctest --test-dir build-host --output-on-failure

In a standalone checkout, replace the storage path with the matching storage component root. On Windows, use a developer shell for the matching MSVC toolchain, a single-configuration generator such as Ninja, and absolute SDK paths with the same CMake options; omit the Unix compiler assignments.

Tests depend on available SDKs/providers, and the core suite alone does not prove provider-backed composition. List the registered tests with ctest --test-dir build-host -N. With providers staged and the default schemes, the list includes ovstorage_usd_resolver.embed_example, ovstorage_usd_resolver.cli_stack_config_doctor and ovstorage_usd_resolver.host_api_openusd; if they are missing, CMake did not find a provider directory. In the test output, live_* tests without their opt-in configuration report as skipped, not passed. Use the local verification guide to exercise loopback HTTP composition and the embedding example with matching providers. Live-provider tests are separate opt-in checks with their own configuration and evidence.

Scheme registration#

The resolver delegates storage operations to the configured ovstorage stack. To handle a URI scheme, advertise it to OpenUSD at build time and configure a corresponding ovstorage route. For example, a deployment with an az route can configure -DOVS_USD_RESOLVER_URI_SCHEMES="s3;http;https;hf;az". This changes registration, not the installed providers or stack configuration. Runtime remoteUriSchemes may narrow the compiled list but cannot widen it.

Available operations depend on the selected route’s capabilities. There is no special prohibition on omni or omniverse; they require the same registration and provider setup as other remote schemes. This is not a claim that any particular provider/host combination has been qualified. Keep a single resolver owner per scheme: duplicate OpenUSD registrations have no supported precedence contract. Local files continue through OpenUSD’s default filesystem resolver.

Install and integrate#

For a relocatable local CMake installation, enable OVS_USD_RESOLVER_INSTALL_NATIVE=ON in a separate build and follow native installation. This does not publish a package. The optional local Python package provides a ctypes bootstrap and has stricter pinned-SDK receipt requirements.

Register the built plugin metadata before the host’s first OpenUSD resolver use. For standalone processes, set PXR_PLUGINPATH_NAME to the built plugin’s plugInfo.json as shown in Standalone Usage. Supply the matching USD runtime loader paths, construct a storage-backed resolver runtime, and bind its context on threads performing USD work. Keep the runtime and provider lifetimes valid for the stages using them. Follow the embedding example and OpenUSD integration guide; verify remote composition in the actual host before claiming integration.