Opened 7 years ago

Closed 6 years ago

#54242 closed defect (wontfix)

clang-3.8 build fails on 10.5 PPC due to fatal error: lipo: specifed architecture in libclang_rt.10.4.a does not match its cputype -- and workaround that allows build to succeed

Reported by: kencu (Ken) Owned by: jeremyhu (Jeremy Huddleston Sequoia)
Priority: Normal Milestone:
Component: ports Version:
Keywords: powerpc Cc: larryv (Lawrence Velázquez)
Port: clang-3.8

Description

During the build of clang-3.8 on 10.5 PPC, the following error is noted:

[ 14%] Generating ../../../../lib/clang/3.8.1/lib/darwin/libclang_rt.10.4.a
cd /opt/local/var/macports/build/_opt_LeopardPorts_lang_llvm-3.8/clang-3.8/work/build/projects/compiler-rt/lib/builtins && /opt/local/bin/cmake -E make_directory /opt/local/var/macports/build/_opt_LeopardPorts_lang_llvm-3.8/clang-3.8/work/build/./lib/clang/3.8.1/lib/darwin
cd /opt/local/var/macports/build/_opt_LeopardPorts_lang_llvm-3.8/clang-3.8/work/build/projects/compiler-rt/lib/builtins && lipo -output /opt/local/var/macports/build/_opt_LeopardPorts_lang_llvm-3.8/clang-3.8/work/build/./lib/clang/3.8.1/lib/darwin/libclang_rt.10.4.a -create -arch i386 /opt/local/var/macports/build/_opt_LeopardPorts_lang_llvm-3.8/clang-3.8/work/build/lib/libclang_rt.builtins_i386_10.4.a -arch x86_64 /opt/local/var/macports/build/_opt_LeopardPorts_lang_llvm-3.8/clang-3.8/work/build/lib/libclang_rt.builtins_x86_64_10.4.a
fatal error: lipo: specifed architecture type (i386) for file (/opt/local/var/macports/build/_opt_LeopardPorts_lang_llvm-3.8/clang-3.8/work/build/lib/libclang_rt.builtins_i386_10.4.a) does not match its cputype (18) and cpusubtype (0) (should be cputype (7) and cpusubtype (3))

This appears to be due to an error in the cmake build script for this library. See below for more analysis and a workaround that allows the build to succeed.

Attachments (3)

clang_rt on PPC fails to configure -- CMakeError.log (73.1 KB) - added by kencu (Ken) 7 years ago.
error log when cmake tries to test-compile ppc code during configuration
proj-compilerrt-lib-builtins- alternate incomplete CMakeLists.txt (2.5 KB) - added by kencu (Ken) 7 years ago.
alternate cmake build script for compiler_rt-lib-builtins that builds single-arch library
error in clang-3.8 cmake configure (959 bytes) - added by kencu (Ken) 7 years ago.
error noted during configuration of clang-3.8

Download all attachments as: .zip

Change History (9)

comment:1 Changed 7 years ago by kencu (Ken)

To generate the libclang_rt.builtins library for ppc, go into the build directory:

cd /opt/local/var/macports/build/_opt_LeopardPorts_lang_llvm-3.8/clang-3.8/work/build/projects/compiler-rt/lib/builtins

and manually make the file. Note that the name of the file suggests it's i386 code, but this is not right -- it's ppc code.

lipo -output /opt/local/var/macports/build/_opt_LeopardPorts_lang_llvm-3.8/clang-3.8/work/build/./lib/clang/3.8.1/lib/darwin/libclang_rt.10.4.a -create -arch ppc /opt/local/var/macports/build/_opt_LeopardPorts_lang_llvm-3.8/clang-3.8/work/build/lib/libclang_rt.builtins_i386_10.4.a
Last edited 7 years ago by kencu (Ken) (previous) (diff)

comment:2 Changed 7 years ago by mf2k (Frank Schima)

Cc: larryv added; jeremyhu removed
Owner: set to jeremyhu
Status: newassigned

comment:3 Changed 7 years ago by kencu (Ken)

The cmake logic in this file appears to contain the relevant code:

work/llvm-3.8.1.src/projects/compiler-rt/cmake/config-ix.cmake

and checks for the 10.4 RT arches like this:

  # Figure out which arches to use for each OS
  darwin_get_toolchain_supported_archs(toolchain_arches)
  message(STATUS "Toolchain supported arches: ${toolchain_arches}")


 # Need to build a 10.4 compatible libclang_rt
    set(DARWIN_10.4_SYSROOT ${DARWIN_osx_SYSROOT})
    set(DARWIN_10.4_BUILTIN_MIN_VER 10.4)
    set(DARWIN_10.4_BUILTIN_MIN_VER_FLAG
        -mmacosx-version-min=${DARWIN_10.4_BUILTIN_MIN_VER})
    set(DARWIN_10.4_SKIP_CC_KEXT On)
    darwin_test_archs(10.4
      DARWIN_10.4_ARCHS
      ${toolchain_arches})
    message(STATUS "OSX 10.4 supported arches: ${DARWIN_10.4_ARCHS}")
    if(DARWIN_10.4_ARCHS)
      # don't include the Haswell slice in the 10.4 compatibility library
      list(REMOVE_ITEM DARWIN_10.4_ARCHS x86_64h)
      list(APPEND BUILTIN_SUPPORTED_OS 10.4)
    endif()

which calls darwin_get_toolchain_supported_archs which is in this file

work/llvm-3.8.1.src/projects/compiler-rt/cmake/Modules/CompilerRTDarwinUtils.cmake
function(darwin_get_toolchain_supported_archs output_var)
  execute_process(
    COMMAND ld -v
    ERROR_VARIABLE LINKER_VERSION)

  string(REGEX MATCH "configured to support archs: ([^\n]+)"
         ARCHES_MATCHED "${LINKER_VERSION}")
  if(ARCHES_MATCHED)
    set(ARCHES "${CMAKE_MATCH_1}")
    message(STATUS "Got ld supported ARCHES: ${ARCHES}")
    string(REPLACE " " ";" ARCHES ${ARCHES})
  else()
    # If auto-detecting fails, fall back to a default set
    message(WARNING "Detecting supported architectures from 'ld -v' failed. Returning default set.")
    set(ARCHES "i386;x86_64;armv7;armv7s;arm64")
  endif()
  
  set(${output_var} ${ARCHES} PARENT_SCOPE)
endfunction()

on 10.5 INTEL the ld test gives you proper archs:

 ld -v
@(#)PROGRAM:ld  PROJECT:ld64-127.2
configured to support archs: i386 x86_64 ppc ppc64 armv6 armv7
LTO support using: LLVM version 3.3

but on on 10.5 PPC you get this:

$ ld -v
@(#)PROGRAM:ld  PROJECT:ld64-127.2
LLVM version 3.3

so it goes to the defaults instead

    set(ARCHES "i386;x86_64;armv7;armv7s;arm64")

which are wrong for ppc. I generated a simple patch to allowed that test to return:

    set(ARCHES "i386;x86_64;ppc;ppc64;armv7;armv7s;arm64")

and I had hoped that might solve this error, but as you can see from the configuration listing above, even though it now returns the proper ARCHES from the ld test, the error still occurs, so the incorrect arch setting must be elsewhere.

Version 0, edited 7 years ago by kencu (Ken) (next)

comment:4 Changed 7 years ago by kencu (Ken)

-- this comment deleted as no longer helpful --

Last edited 7 years ago by kencu (Ken) (previous) (diff)

comment:5 Changed 7 years ago by kencu (Ken)

The cmake script that manages the building of libclang_rt.10.4.a looks at the supported arches to test

-- OSX 10.4 supported arches: i386;x86_64;ppc;ppc64

and then tries to run a test-compile with each using the build system. This build of clang-3.8 on 10.5 PPC is bootstrapping with gcc6 (no other choice). So with this gcc6 macports configuration, all the x86 code fails to build, and the system tries to build the ppc and ppc64 code. But all these test compiles fail to build as well for some reason (Cmake error log attached), soit defaults to i386 and x86_64. And herein comes the "lucky" quirk - when gcc6 on ppc gets asked to build -arch i386, it says it can't and then builds it -arch ppc instead. So that is how we wind up getting code out.

Last edited 7 years ago by kencu (Ken) (previous) (diff)

Changed 7 years ago by kencu (Ken)

error log when cmake tries to test-compile ppc code during configuration

Changed 7 years ago by kencu (Ken)

alternate cmake build script for compiler_rt-lib-builtins that builds single-arch library

Changed 7 years ago by kencu (Ken)

error noted during configuration of clang-3.8

comment:6 Changed 6 years ago by kencu (Ken)

Resolution: wontfix
Status: assignedclosed

closing this off, as it's not a fixable MacPorts item. For those interested, progress on clang-3.8+ on PPC is tracked here <https://trac.macports.org/ticket/53184>

Note: See TracTickets for help on using tickets.