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
- Regenerate pool.res and all dependent bundles with the same ICU version (at least 4.8+ for pool bundle support).
- Ensure the pool.res file referenced by the bundle is the one generated alongside it, not from an older ICU build.
- 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
- Generate pool.res with genrb using ICU 4.8 or later.
- Build pool.res and all dependent bundles in the same build run.
- Don't reuse pool.res from older ICU builds.
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
- %s: cannot combine --formatVersion 1 with --writePoolBundle
- U_INVALID_FORMAT_ERROR
- icupkg: %s has mismatched checksum for %s
- %s: cannot combine --writePoolBundle and --usePoolBundle\n
- %s: unsupported --formatVersion %s\n
AI-assisted analysis of nodejs/node@1b2de5e052 (2026-08-13).
Data as JSON: /api/errors/96c210bcad390b77.
Report an issue: GitHub.