[MacPorts] #35253: cmake @2.8.8 fails to build with XCode 4.5 DP3 clang with -std=c++11 -stdlib=libc++
MacPorts
noreply at macports.org
Thu Jul 19 12:01:09 PDT 2012
#35253: cmake @2.8.8 fails to build with XCode 4.5 DP3 clang with -std=c++11
-stdlib=libc++
---------------------------------------+------------------------------------
Reporter: andrew.c.morrow@… | Owner: macports-tickets@…
Type: defect | Status: new
Priority: Normal | Milestone:
Component: ports | Version: 2.1.1
Keywords: | Port: cmake
---------------------------------------+------------------------------------
I've been experimenting with building a macports based dev environment
with clang and libc++. However, CMake fails to build correctly when
configure.compiler is 'clang', and when configure.cxxflags contains
'-stdlib=libc++'. More specifically:
building with clang++ -std=c++11 works
building with clang++ -std=c++11 -stdlib=libc++ does not.
I dont' know yet whether this is a problem with CMake, or a problem with
libc++. The build seems to fail because a linker response file is
incompletely consumed:
{{{
Linking C static library libcmcurl.a
ar: CMak: No such file or directory
make[2]: *** [Utilities/cmcurl/libcmcurl.a] Error 1
make[2]: Leaving directory
`/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_devel_cmake/cmake/work/cmake-2.8.8'
make[1]: *** [Utilities/cmcurl/CMakeFiles/cmcurl.dir/all] Error 2
make[1]: Leaving directory
`/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_devel_cmake/cmake/work/cmake-2.8.8'
make: *** [all] Error 2
make: Leaving directory
`/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_devel_cmake/cmake/work/cmake-2.8.8'
Command failed: cd
"/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_devel_cmake/cmake/work/cmake-2.8.8"
&& /usr/bin/make -w all
Exit code: 2
}}}
Notice the truncated file name 'CMak'
Digging in, we can manually try to invoke the makefile for libcmcurl.a:
{{{
find . -name libcmcurl.a | xargs sudo rm
acm-mac-pro:cmake-2.8.8 acm$ sudo make all VERBOSE=1
<snipped ...>
make -f Utilities/cmcurl/CMakeFiles/cmcurl.dir/build.make
Utilities/cmcurl/CMakeFiles/cmcurl.dir/build
Linking C static library libcmcurl.a
cd
/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_devel_cmake/cmake/work/cmake-2.8.8/Utilities/cmcurl
&&
/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_devel_cmake/cmake/work/cmake-2.8.8/Bootstrap.cmk/cmake
-P CMakeFiles/cmcurl.dir/cmake_clean_target.cmake
cd
/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_devel_cmake/cmake/work/cmake-2.8.8/Utilities/cmcurl
&&
/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_devel_cmake/cmake/work/cmake-2.8.8/Bootstrap.cmk/cmake
-E cmake_link_script CMakeFiles/cmcurl.dir/link.txt --verbose=1
/usr/bin/ar cr libcmcurl.a CMakeFiles/cmcurl.dir/base64.c.o
CMakeFiles/cmcurl.dir/connect.c.o
CMakeFiles/cmcurl.dir/content_encoding.c.o
CMakeFiles/cmcurl.dir/cookie.c.o CMakeFiles/cmcurl.dir/dict.c.o
CMakeFiles/cmcurl.dir/easy.c.o CMakeFiles/cmcurl.dir/escape.c.o
CMakeFiles/cmcurl.dir/file.c.o CMakeFiles/cmcurl.dir/formdata.c.o
CMakeFiles/cmcurl.dir/ftp.c.o CMakeFiles/cmcurl.dir/getenv.c.o
CMakeFiles/cmcurl.dir/getinfo.c.o CMakeFiles/cmcurl.dir/gtls.c.o
CMakeFiles/cmcurl.dir/hash.c.o CMakeFiles/cmcurl.dir/hostares.c.o
CMakeFiles/cmcurl.dir/hostasyn.c.o CMakeFiles/cmcurl.dir/hostip4.c.o
CMakeFiles/cmcurl.dir/hostip6.c.o CMakeFiles/cmcurl.dir/hostip.c.o
CMakeFiles/cmcurl.dir/hostsyn.c.o CMakeFiles/cmcurl.dir/hostthre.c.o
CMakeFiles/cmcurl.dir/http.c.o CMakeFiles/cmcurl.dir/http_chunks.c.o
CMakeFiles/cmcurl.dir/http_digest.c.o
CMakeFiles/cmcurl.dir/http_negotiate.c.o
CMakeFiles/cmcurl.dir/http_ntlm.c.o CMakeFiles/cmcurl.dir/if2ip.c.o
CMakeFiles/cmcurl.dir/inet_ntop.c.o CMakeFiles/cmcurl.dir/inet_pton.c.o
CMak
ar: CMak: No such file or directory
make[2]: *** [Utilities/cmcurl/libcmcurl.a] Error 1
make[1]: *** [Utilities/cmcurl/CMakeFiles/cmcurl.dir/all] Error 2
make: *** [all] Error 2
}}}
If you look at the invocation of 'ar' at the end and the list of files,
you can clearly see a truncated filename at the end.
And if we look at the link.txt file that was used to drive the link, it
*does not* contain truncated data:
{{{
$ cat
/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_devel_cmake/cmake/work/cmake-2.8.8/Utilities/cmcurl/CMakeFiles/cmcurl.dir/link.txt
/usr/bin/ar cr libcmcurl.a CMakeFiles/cmcurl.dir/base64.c.o
CMakeFiles/cmcurl.dir/connect.c.o
CMakeFiles/cmcurl.dir/content_encoding.c.o
CMakeFiles/cmcurl.dir/cookie.c.o CMakeFiles/cmcurl.dir/dict.c.o
CMakeFiles/cmcurl.dir/easy.c.o CMakeFiles/cmcurl.dir/escape.c.o
CMakeFiles/cmcurl.dir/file.c.o CMakeFiles/cmcurl.dir/formdata.c.o
CMakeFiles/cmcurl.dir/ftp.c.o CMakeFiles/cmcurl.dir/getenv.c.o
CMakeFiles/cmcurl.dir/getinfo.c.o CMakeFiles/cmcurl.dir/gtls.c.o
CMakeFiles/cmcurl.dir/hash.c.o CMakeFiles/cmcurl.dir/hostares.c.o
CMakeFiles/cmcurl.dir/hostasyn.c.o CMakeFiles/cmcurl.dir/hostip4.c.o
CMakeFiles/cmcurl.dir/hostip6.c.o CMakeFiles/cmcurl.dir/hostip.c.o
CMakeFiles/cmcurl.dir/hostsyn.c.o CMakeFiles/cmcurl.dir/hostthre.c.o
CMakeFiles/cmcurl.dir/http.c.o CMakeFiles/cmcurl.dir/http_chunks.c.o
CMakeFiles/cmcurl.dir/http_digest.c.o
CMakeFiles/cmcurl.dir/http_negotiate.c.o
CMakeFiles/cmcurl.dir/http_ntlm.c.o CMakeFiles/cmcurl.dir/if2ip.c.o
CMakeFiles/cmcurl.dir/inet_ntop.c.o CMakeFiles/cmcurl.dir/inet_pton.c.o
CMakeFiles/cmcurl.dir/krb4.c.o CMakeFiles/cmcurl.dir/ldap.c.o
CMakeFiles/cmcurl.dir/llist.c.o CMakeFiles/cmcurl.dir/md5.c.o
CMakeFiles/cmcurl.dir/mprintf.c.o CMakeFiles/cmcurl.dir/multi.c.o
CMakeFiles/cmcurl.dir/netrc.c.o CMakeFiles/cmcurl.dir/parsedate.c.o
CMakeFiles/cmcurl.dir/progress.c.o CMakeFiles/cmcurl.dir/security.c.o
CMakeFiles/cmcurl.dir/select.c.o CMakeFiles/cmcurl.dir/sendf.c.o
CMakeFiles/cmcurl.dir/share.c.o CMakeFiles/cmcurl.dir/socks.c.o
CMakeFiles/cmcurl.dir/speedcheck.c.o CMakeFiles/cmcurl.dir/splay.c.o
CMakeFiles/cmcurl.dir/ssh.c.o CMakeFiles/cmcurl.dir/sslgen.c.o
CMakeFiles/cmcurl.dir/ssluse.c.o CMakeFiles/cmcurl.dir/strdup.c.o
CMakeFiles/cmcurl.dir/strequal.c.o CMakeFiles/cmcurl.dir/strerror.c.o
CMakeFiles/cmcurl.dir/telnet.c.o CMakeFiles/cmcurl.dir/tftp.c.o
CMakeFiles/cmcurl.dir/timeval.c.o CMakeFiles/cmcurl.dir/transfer.c.o
CMakeFiles/cmcurl.dir/url.c.o CMakeFiles/cmcurl.dir/version.c.o
}}}
Interestingly, the length of the truncated command line that was actually
passed to ar comes out very close to exactly 1k:
{{{
$ echo -n /usr/bin/ar cr libcmcurl.a CMakeFiles/cmcurl.dir/base64.c.o
CMakeFiles/cmcurl.dir/connect.c.o
CMakeFiles/cmcurl.dir/content_encoding.c.o
CMakeFiles/cmcurl.dir/cookie.c.o CMakeFiles/cmcurl.dir/dict.c.o
CMakeFiles/cmcurl.dir/easy.c.o CMakeFiles/cmcurl.dir/escape.c.o
CMakeFiles/cmcurl.dir/file.c.o CMakeFiles/cmcurl.dir/formdata.c.o
CMakeFiles/cmcurl.dir/ftp.c.o CMakeFiles/cmcurl.dir/getenv.c.o
CMakeFiles/cmcurl.dir/getinfo.c.o CMakeFiles/cmcurl.dir/gtls.c.o
CMakeFiles/cmcurl.dir/hash.c.o CMakeFiles/cmcurl.dir/hostares.c.o
CMakeFiles/cmcurl.dir/hostasyn.c.o CMakeFiles/cmcurl.dir/hostip4.c.o
CMakeFiles/cmcurl.dir/hostip6.c.o CMakeFiles/cmcurl.dir/hostip.c.o
CMakeFiles/cmcurl.dir/hostsyn.c.o CMakeFiles/cmcurl.dir/hostthre.c.o
CMakeFiles/cmcurl.dir/http.c.o CMakeFiles/cmcurl.dir/http_chunks.c.o
CMakeFiles/cmcurl.dir/http_digest.c.o
CMakeFiles/cmcurl.dir/http_negotiate.c.o
CMakeFiles/cmcurl.dir/http_ntlm.c.o CMakeFiles/cmcurl.dir/if2ip.c.o
CMakeFiles/cmcurl.dir/inet_ntop.c.o CMakeFiles/cmcurl.dir/inet_pton.c.o
CMak | wc -c
1022
}}}
While the full length of link.txt is 1969 bytes:
{{{
$ wc -c
/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_devel_cmake/cmake/work/cmake-2.8.8/Utilities/cmcurl/CMakeFiles/cmcurl.dir/link.txt
1969
/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_devel_cmake/cmake/work/cmake-2.8.8/Utilities/cmcurl/CMakeFiles/cmcurl.dir/link.txt
}}}
If we run the bootstrap cmake command that causes this link under dtruss,
we can see that it reads the full lenth of link.txt, but only writes 1k
worth of it back to stdout.
{{{
sudo dtruss
/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_devel_cmake/cmake/work/cmake-2.8.8/Bootstrap.cmk/cmake
-E cmake_link_script CMakeFiles/cmcurl.dir/link.txt --verbose=1
<...snip...>
open_nocancel("CMakeFiles/cmcurl.dir/link.txt\0", 0x0, 0x1B6) =
3 0
fstat64(0x3, 0x7FFF67B0F3E8, 0x7FFF67B0F4AC) = 0 0
read_nocancel(0x3, "/usr/bin/ar cr libcmcurl.a
CMakeFiles/cmcurl.dir/base64.c.o CMakeFiles/cmcurl.dir/connect.c.o
CMakeFiles/cmcurl.dir/content_encoding.c.o
CMakeFiles/cmcurl.dir/cookie.c.o CMakeFiles/cmcurl.dir/dict.c.o
CMakeFiles/cmcurl.dir/easy.c.o CMakeFiles/cmcurl.dir/e", 0x1000)
= 1969 0
read_nocancel(0x3, "es/cmcurl.dir/http_digest.c.o
CMakeFiles/cmcurl.dir/http_negotiate.c.o
CMakeFiles/cmcurl.dir/http_ntlm.c.o CMakeFiles/cmcurl.dir/if2ip.c.o
CMakeFiles/cmcurl.dir/inet_ntop.c.o CMakeFiles/cmcurl.dir/inet_pton.c.o
CMakeFiles/cmcurl.dir/krb4.c.o CMakeFiles/cmc", 0x1000) = 0 0
fstat64(0x1, 0x7FFF67B0F7D8, 0x7FFF67B0F89C) = 0 0
ioctl(0x1, 0x4004667A, 0x7FFF67B0F874) = 0 0
write_nocancel(0x1, "/usr/bin/ar cr libcmcurl.a
CMakeFiles/cmcurl.dir/base64.c.o CMakeFiles/cmcurl.dir/connect.c.o
CMakeFiles/cmcurl.dir/content_encoding.c.o
CMakeFiles/cmcurl.dir/cookie.c.o CMakeFiles/cmcurl.dir/dict.c.o
CMakeFiles/cmcurl.dir/easy.c.o CMakeFiles/cmcurl.dir/e", 0x400)
= 1024 0
pipe(0x7FFF67B0F630, 0x0, 0xA8) = 4 0
}}}
At this point this is as far as I have been able to investigate, since I'm
unfamiliar with the CMake internals.
--
Ticket URL: <https://trac.macports.org/ticket/35253>
MacPorts <http://www.macports.org/>
Ports system for Mac OS
More information about the macports-tickets
mailing list