Some more info...
Thanks!
Jeff Clites wrote:
Hmm, strange indeed. Looking at the ICU code, it appears that it's not finding a data file it needs at this stage (the error message is misleading)--I wonder if something failed to create it, but 'make' continued on?same files, with l instead of b, as expected.
What ".icu" files are in that directory (icu/source/data/out/build) for you? I have these (and I'd expect you'd have "l" rather than "b" in your prefix [little v. big endian]):
% ls *.icu
icudt26b_cnvalias.icu icudt26b_tz.icu icudt26b_unames.icu
icudt26b_invuca.icu icudt26b_ucadata.icu icudt26b_unorm.icu
icudt26b_pnames.icu icudt26b_uidna.icu icudt26b_uprops.icu
I believe it's the "*_ucadata.icu" that it's failing to find.
So if that file's missing for you, we need to look for an earlier failure in the build. If it's there, then we can do some gdb investigating. Starting from the same directory as before:
It is there.% gdb ../../../tools/genrb/genrb
Here the breakpoints go. I pointed with >>> <<< some weird poitns...
Breakpoint 1, udata_pathiter_init (iter=0xbfffde78, path=0x814a050 ".", item=0x811bbc8 "cnvalias", suffix=0xbfffde78 "_cnvalias.icu", doCheckLastFour=0 '\0') at udata.c:357 357 if(path == NULL) { (gdb) c Continuing.
Breakpoint 1, udata_pathiter_init (iter=0xbfffd658, path=0x814a050 ".", item=0x8112f3a "ucadata", suffix=0xbfffd658 "_ucadata.icu", doCheckLastFour=0 '\0') at udata.c:357 357 if(path == NULL) { (gdb) c Continuing.
Hmm, that "item" should be set to "icudt26l", not "ucadata". But, since ICU is building optimized, it's possible that it will be set to the right thing by the time it's used. It looks like that value should be coming from a chain of #defines, so I think this may be the debugger misleading us, since it shouldn't be able to change between calls to udata_pathiter_init (at least, I think).
But, here's another idea: It looks like ultimately the file is getting memory-mapped, so maybe there's a problem there. It also looks like there are different implementations for different platforms, so maybe you're getting into the wrong one somehow. So, try breaking on "uprv_mapFile_2_6", or on "udata.c:977", and step into that function. The second time you hit it, it should look similar to this, with s/b/l/:
#0 uprv_mapFile_2_6 (pData=0xbfffe880, path=0xbfffdf94 "./icudt26b_ucadata.icu") at umapfile.c:175
If that path looks wrong, we need to look before this for where it built that string. If it's okay, then keep stepping and see if the stat() works, or if/where it finally fails. This will also tell us which implementation of the uprv_mapFile you are getting.
Also, check what U_HAVE_MMAP is being #define'd to in icu/source/common/unicode/platform.h. If it's 0, then try setting it to 1 and issuing "make" in the icu/source directory. This might all be a config error, sending you into code which has a bug but shouldn't be hit anyway.
Thanks for the debugging help! (It's a low-tech remote debugger.)
JEff