nodejs/node · warning

icupkg: %s is not a pool bundle

Error message

icupkg: %s is not a pool bundle

What it means

Warning printed when a bundle's declared pool bundle has a format version <= 1, meaning it predates the pool bundle feature (introduced in format version 2). The pool bundle cannot provide shared keys/strings. The function returns without setting an error code — enumeration continues without pool bundle support.

Source

Thrown at deps/icu-small/source/tools/toolutil/pkgitems.cpp:407

    if(resData.usesPoolBundle) {
        char poolName[200];
        makeTargetName(itemName, "pool", 4, ".res", poolName, static_cast<int32_t>(sizeof(poolName)), pErrorCode);
        if(U_FAILURE(*pErrorCode)) {
            return;
        }
        check(context, itemName, poolName);
        int32_t index=pkg->findItem(poolName);
        if(index<0) {
            // We cannot work with a bundle if its pool resource is missing.
            // check() already printed a complaint.
            return;
        }
        // TODO: Cache the native version in the Item itself.
        nativePool.setItem(pkg->getItem(index), ures_swap);
        const UDataInfo *poolInfo=nativePool.getDataInfo();
        if(poolInfo->formatVersion[0]<=1) {
            fprintf(stderr, "icupkg: %s is not a pool bundle\n", poolName);
            return;
        }
        const int32_t* poolRoot = reinterpret_cast<const int32_t*>(nativePool.getBytes());
        const int32_t *poolIndexes=poolRoot+1;
        int32_t poolIndexLength=poolIndexes[URES_INDEX_LENGTH]&0xff;
        if(!(poolIndexLength>URES_INDEX_POOL_CHECKSUM &&
             (poolIndexes[URES_INDEX_ATTRIBUTES]&URES_ATT_IS_POOL_BUNDLE))
        ) {
            fprintf(stderr, "icupkg: %s is not a pool bundle\n", poolName);
            return;
        }
        if(resData.pRoot[1+URES_INDEX_POOL_CHECKSUM]==poolIndexes[URES_INDEX_POOL_CHECKSUM]) {
            resData.poolBundleKeys = reinterpret_cast<const char*>(poolIndexes + poolIndexLength);
            resData.poolBundleStrings = reinterpret_cast<const uint16_t*>(poolRoot + poolIndexes[URES_INDEX_KEYS_TOP]);
        } else {
            fprintf(stderr, "icupkg: %s has mismatched checksum for %s\n", poolName, itemName);
            return;
        }

View on GitHub (pinned to 1b2de5e052)

Solutions

  1. Regenerate pool.res and all dependent bundles with the same ICU version (at least 4.8+ for pool bundle support).
  2. Ensure the pool.res file referenced by the bundle is the one generated alongside it, not from an older ICU build.
  3. If working with old format data, rebuild the entire data package from source with the current genrb/icupkg.
Defensive patterns

Strategy: validation

Validate before calling

// Verify pool bundle format version before packaging
// Pool bundles must have formatVersion[0] >= 2
import subprocess
result = subprocess.run(['icuinfo', '-v', 'pool.res'], capture_output=True)
# Check that format version >= 2

Try / catch

// This is a warning, not fatal; check stderr
result = subprocess.run(['icupkg', 'bundle.dat'], capture_output=True)
if 'is not a pool bundle' in result.stderr.decode():
    print('Pool bundle format too old or missing — regenerate with current ICU')

Prevention

When it happens

Trigger: A .res bundle has usesPoolBundle=true; icupkg finds the pool.res via makeTargetName and pkg->findItem; nativePool is set up; poolInfo->formatVersion[0] is checked and found to be <= 1 at pkgitems.cpp:407.

Common situations: Mixing .res files from ICU versions before pool bundle support (ICU < 4.8) with newer bundles that expect pool bundles; using a stale or incorrectly generated pool.res; downgrading ICU data files without regenerating the pool.

Related errors


AI-assisted analysis of nodejs/node@1b2de5e052 (2026-08-13). Data as JSON: /api/errors/96c210bcad390b77. Report an issue: GitHub.