[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