Hi all,
An update on the "infamous" cmake segfault:
---8<---
Core was generated by `cmake'.
Program terminated with signal 11, Segmentation fault.
#0 0x0000032f500b0484 in strlen (str=0x32ec339fff8 "????????" <Address
0x32ec33a0000 out of bounds>) at /usr/src/lib/libc/string/strlen.c:39
39 for (s = str; *s; ++s)
(gdb) bt
#0 0x0000032f500b0484 in strlen (str=0x32ec339fff8 "????????" <Address
0x32ec33a0000 out of bounds>) at /usr/src/lib/libc/string/strlen.c:39
#1 0x0000032e6d7c1920 in basic_string (this=0x7f7fffff6768, __s=0x32ec339fff8
"????????" <Address 0x32ec33a0000 out of bounds>, __a=@0x7f7fffff6777)
at char_traits.h:258
#2 0x0000032c600e8a23 in cmTarget::GetLinkClosure (this=0x32f5500e028,
config=0x32ec339fff8 "????????" <Address 0x32ec33a0000 out of bounds>,
head=0x32f5500e028) at
/usr/ports/pobj/cmake-3.0.2/cmake-3.0.2/Source/cmTarget.cxx:2972
#3 0x0000032c601e91ba in cmComputeLinkInformation::GetRPath
(this=0x32e9b3e4800, runtimeDirs=@0x7f7fffff6ab0, for_install=false)
at
/usr/ports/pobj/cmake-3.0.2/cmake-3.0.2/Source/cmComputeLinkInformation.cxx:1982
#4 0x0000032c60063e47 in cmLocalGenerator::OutputLinkLibraries
(this=0x32eef94c000, linkLibraries=@0x32ef9052a28,
frameworkPath=@0x7f7fffff7398,
linkPath=@0x7f7fffff7390, tgt=@0x32e7da6f600, relink=false) at
/usr/ports/pobj/cmake-3.0.2/cmake-3.0.2/Source/cmLocalGenerator.cxx:1879
#5 0x0000032c6006130e in cmLocalGenerator::GetTargetFlags (this=0x32eef94c000,
linkLibs=@0x32ef9052a28, flags=@0x32f044e6128, linkFlags=@0x32f08c61c68,
frameworkPath=@0x7f7fffff7398, linkPath=@0x7f7fffff7390,
target=0x32e7da6f600)
at /usr/ports/pobj/cmake-3.0.2/cmake-3.0.2/Source/cmLocalGenerator.cxx:1697
#6 0x0000032c60148610 in cmNinjaNormalTargetGenerator::WriteLinkStatement
(this=0x32e69a52600)
at
/usr/ports/pobj/cmake-3.0.2/cmake-3.0.2/Source/cmNinjaNormalTargetGenerator.cxx:468
#7 0x0000032c6014cf01 in cmNinjaNormalTargetGenerator::Generate
(this=0x32e69a52600)
at
/usr/ports/pobj/cmake-3.0.2/cmake-3.0.2/Source/cmNinjaNormalTargetGenerator.cxx:96
#8 0x0000032c6013d78f in cmLocalNinjaGenerator::Generate (this=0x32eef94c000)
at
/usr/ports/pobj/cmake-3.0.2/cmake-3.0.2/Source/cmLocalNinjaGenerator.cxx:81
#9 0x0000032c60253c8a in cmGlobalGenerator::Generate (this=0x32f2f2e9000) at
/usr/ports/pobj/cmake-3.0.2/cmake-3.0.2/Source/cmGlobalGenerator.cxx:1243
#10 0x0000032c601375d3 in cmGlobalNinjaGenerator::Generate (this=0x32f2f2e9000)
at
/usr/ports/pobj/cmake-3.0.2/cmake-3.0.2/Source/cmGlobalNinjaGenerator.cxx:515
#11 0x0000032c60117983 in cmake::Generate (this=0x7f7fffff7950) at
/usr/ports/pobj/cmake-3.0.2/cmake-3.0.2/Source/cmake.cxx:1715
#12 0x0000032c60120f4e in cmake::Run (this=0x7f7fffff7950,
args=@0x7f7fffff7e10, noconfigure=false)
at /usr/ports/pobj/cmake-3.0.2/cmake-3.0.2/Source/cmake.cxx:1695
#13 0x0000032c600258e1 in do_cmake (ac=29, av=0x32f15b51100) at
/usr/ports/pobj/cmake-3.0.2/cmake-3.0.2/Source/cmakemain.cxx:317
#14 0x0000032c600261a9 in main (ac=29, av=0x32f15b51100) at
/usr/ports/pobj/cmake-3.0.2/cmake-3.0.2/Source/cmakemain.cxx:183
---8<---
Good news first: this bug has already been fixed upstream.
Bad news: the fix is not trivial. They went through a major overhaul[1]
of the string api. Backporting this work using local patches would
be a PITA.
[1]
http://www.cmake.org/gitweb?p=cmake.git&a=search&h=HEAD&st=commit&s=stringapi
Here're some additional infos with the help of my silly std::cout
debugging...
"config" should contain the value of CMAKE_BUILD_TYPE, i.e. it can
be empty or "Debug", "Release", "RelWithDebInfo", "MinSizeRel".
With cmake-3.0.x, you can see it's filled with all sort of garbage:
$ grep ^DEBUGGING *.log | grep -vi \=\=\release | grep -v config\ \=\=\$
kdelibs-4.13.3.log:DEBUGGING config ==:
kdelibs-4.13.3.log:DEBUGGING config ==:
kdelibs-4.13.3.log:DEBUGGING config ==:
kdelibs-4.13.3.log:DEBUGGING config ==CXX
kdelibs-4.13.3.log:DEBUGGING config ==CXX
kdelibs-4.13.3.log:DEBUGGING config ==CXX
kdelibs-4.13.3.log:DEBUGGING config ==CXX
kdelibs-4.13.3.log:DEBUGGING config ==CXX
kdelibs-4.13.3.log:DEBUGGING config ==CXX
kdelibs-4.13.3.log:DEBUGGING config ==CXX
kdelibs-4.13.3.log:DEBUGGING config ==CXX
kdelibs-4.13.3.log:DEBUGGING config ==CXX
kdelibs-4.13.3.log:DEBUGGING config ==CXX
kdelibs-4.13.3.log:DEBUGGING config ==CXX
kdelibs-4.13.3.log:DEBUGGING config ==CXX
kdelibs-4.13.3.log:DEBUGGING config ==CXX
kdelibs-4.13.3.log:DEBUGGING config ==CXX
kdelibs-4.13.3.log:DEBUGGING config ==:
kdelibs-4.13.3.log:DEBUGGING config ==:
kdelibs-4.13.3.log:DEBUGGING config ==:
kdelibs-4.13.3.log:DEBUGGING config ==:
kdelibs-4.13.3.log:DEBUGGING config ==.a
kdelibs-4.13.3.log:DEBUGGING config ==.a
kdelibs-4.13.3.log:DEBUGGING config ==.a
kdelibs-4.13.3.log:DEBUGGING config ==.a
kdelibs-4.13.3.log:DEBUGGING config ==.a
kdelibs-4.13.3.log:DEBUGGING config ==.a
kdelibs-4.13.3.log:DEBUGGING config ==.a
kdelibs-4.13.3.log:DEBUGGING config ==/lib
kdelibs-4.13.3.log:DEBUGGING config ==/lib
kdelibs-4.13.3.log:DEBUGGING config ==/lib
kdelibs-4.13.3.log:DEBUGGING config ==/lib
kdelibs-4.13.3.log:DEBUGGING config ==/lib
kdelibs-4.13.3.log:DEBUGGING config ==/lib
kdelibs-4.13.3.log:DEBUGGING config ==/lib
kdelibs-4.13.3.log:DEBUGGING config ==lib
kdelibs-4.13.3.log:DEBUGGING config ==lib
kdelibs-4.13.3.log:DEBUGGING config ==lib
kdelibs-4.13.3.log:DEBUGGING config ==lib
kdelibs-4.13.3.log:DEBUGGING config ==lib
kdelibs-4.13.3.log:DEBUGGING config ==lib
kdelibs-4.13.3.log:DEBUGGING config ==lib
kdelibs-4.13.3.log:DEBUGGING config ==lib
kdelibs-4.13.3.log:DEBUGGING config ==lib
kdelibs-4.13.3.log:DEBUGGING config ==lib
kdelibs-4.13.3.log:DEBUGGING config ==lib
kdelibs-4.13.3.log:DEBUGGING config ==lib
kdelibs-4.13.3.log:DEBUGGING config ==lib
kdelibs-4.13.3.log:DEBUGGING config ==lib
kdelibs-4.13.3.log:DEBUGGING config ==????????
kdelibs-4.13.3.log:DEBUGGING config ==????????
kdelibs-4.13.3.log:DEBUGGING config ==????????
kdelibs-4.13.3.log:DEBUGGING config ==????????
kdelibs-4.13.3.log:DEBUGGING config ==????????
kdelibs-4.13.3.log:DEBUGGING config ==????????
kdelibs-4.13.3.log:DEBUGGING config ==????????
kdelibs-4.13.3.log:DEBUGGING config ==.a
kdelibs-4.13.3.log:DEBUGGING config ==.a
kdelibs-4.13.3.log:DEBUGGING config ==.a
kdelibs-4.13.3.log:DEBUGGING config ==.a
kdelibs-4.13.3.log:DEBUGGING config ==.a
kdelibs-4.13.3.log:DEBUGGING config ==.a
kdelibs-4.13.3.log:DEBUGGING config ==.a
kdelibs-4.13.3.log:DEBUGGING config ==lib
kdelibs-4.13.3.log:DEBUGGING config ==lib
kdelibs-4.13.3.log:DEBUGGING config ==lib
kdelibs-4.13.3.log:DEBUGGING config ==lib
kdelibs-4.13.3.log:DEBUGGING config ==lib
kdelibs-4.13.3.log:DEBUGGING config ==lib
kdelibs-4.13.3.log:DEBUGGING config ==lib
kdelibs-4.13.3.log:DEBUGGING config ==.a
kdelibs-4.13.3.log:DEBUGGING config ==.a
kdelibs-4.13.3.log:DEBUGGING config ==.a
kdelibs-4.13.3.log:DEBUGGING config ==.a
kdelibs-4.13.3.log:DEBUGGING config ==.a
kdelibs-4.13.3.log:DEBUGGING config ==.a
kdelibs-4.13.3.log:DEBUGGING config ==.a
kdelibs-4.13.3.log:DEBUGGING config ==lib
kdelibs-4.13.3.log:DEBUGGING config ==lib
kdelibs-4.13.3.log:DEBUGGING config ==lib
kdelibs-4.13.3.log:DEBUGGING config ==lib
kdelibs-4.13.3.log:DEBUGGING config ==lib
kdelibs-4.13.3.log:DEBUGGING config ==lib
kdelibs-4.13.3.log:DEBUGGING config ==lib
kdelibs-4.13.3.log:DEBUGGING config ==CXX
kdelibs-4.13.3.log:DEBUGGING config ==CXX
kdelibs-4.13.3.log:DEBUGGING config ==CXX
kdelibs-4.13.3.log:DEBUGGING config ==CXX
kdelibs-4.13.3.log:DEBUGGING config ==CXX
kdelibs-4.13.3.log:DEBUGGING config ==CXX
kdelibs-4.13.3.log:DEBUGGING config ==CXX
kdelibs-4.13.3.log:DEBUGGING config ==.so
kdelibs-4.13.3.log:DEBUGGING config ==.so
kdelibs-4.13.3.log:DEBUGGING config ==.so
kdelibs-4.13.3.log:DEBUGGING config ==.so
kdelibs-4.13.3.log:DEBUGGING config ==.so
kdelibs-4.13.3.log:DEBUGGING config ==.so
kdelibs-4.13.3.log:DEBUGGING config ==.so
kdelibs-4.13.3.log:DEBUGGING config ==lib
kdelibs-4.13.3.log:DEBUGGING config ==lib
kdelibs-4.13.3.log:DEBUGGING config ==lib
kdelibs-4.13.3.log:DEBUGGING config ==lib
kdelibs-4.13.3.log:DEBUGGING config ==lib
kdelibs-4.13.3.log:DEBUGGING config ==lib
kdelibs-4.13.3.log:DEBUGGING config ==lib
kdelibs-4.13.3.log:DEBUGGING config ==CXX
kdelibs-4.13.3.log:DEBUGGING config ==CXX
kdelibs-4.13.3.log:DEBUGGING config ==CXX
kdelibs-4.13.3.log:DEBUGGING config ==CXX
kdelibs-4.13.3.log:DEBUGGING config ==CXX
kdelibs-4.13.3.log:DEBUGGING config ==CXX
kdelibs-4.13.3.log:DEBUGGING config ==CXX
kdelibs-4.13.3.log:DEBUGGING config ==-l
kdelibs-4.13.3.log:DEBUGGING config ==-l
kdelibs-4.13.3.log:DEBUGGING config ==-l
kdelibs-4.13.3.log:DEBUGGING config ==-l
kdelibs-4.13.3.log:DEBUGGING config ==-l
kdelibs-4.13.3.log:DEBUGGING config ==-l
kdelibs-4.13.3.log:DEBUGGING config ==-l
kdelibs-4.13.3.log:DEBUGGING config ==.so
kdelibs-4.13.3.log:DEBUGGING config ==.so
kdelibs-4.13.3.log:DEBUGGING config ==.so
kdelibs-4.13.3.log:DEBUGGING config ==.so
kdelibs-4.13.3.log:DEBUGGING config ==.so
kdelibs-4.13.3.log:DEBUGGING config ==.so
kdelibs-4.13.3.log:DEBUGGING config ==.so
kdelibs-4.13.3.log:DEBUGGING config ==estdc++
kdelibs-4.13.3.log:DEBUGGING config ==estdc++
kdelibs-4.13.3.log:DEBUGGING config ==estdc++
kdelibs-4.13.3.log:DEBUGGING config ==/lib32
kdelibs-4.13.3.log:DEBUGGING config ==/lib32
kdelibs-4.13.3.log:DEBUGGING config ==/lib32
kdelibs-4.13.3.log:DEBUGGING config ==c
kdelibs-4.13.3.log:DEBUGGING config ==c
kdelibs-4.13.3.log:DEBUGGING config ==c
kdelibs-4.13.3.log:DEBUGGING config ==.so
kdelibs-4.13.3.log:DEBUGGING config ==.so
kdelibs-4.13.3.log:DEBUGGING config ==.so
Newer CMake does it right:
$ grep ^DEBUGGING *.log | grep -vi \=\=\release | grep -v config\ \=\=\$
$
And, indeed, it survived w/o segfaults to:
$ for i in `jot 200` ; do make clean configure 2>&1 |
/usr/ports/infrastructure/bin/portslogger /usr/ports/x11/kde4/libs/log${i} ;
done
CMake 3.1 (the one with the improved string handling) is scheduled
for release on 2014-11-01.
Are you ok with just waiting?
Or should I ask upstream for possible workarounds that can be easily
applied to cmake-3.0.x?
Btw, I think I'm going to write a report on CMake's MantisBT, to
let them know...
Cheers!
David