llvm / llvm-project

The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.
http://llvm.org
Other
27.63k stars 11.36k forks source link

Error building runtimes for llvm 18.1.0 on x86_64-apple-darwin23.3.0 #84221

Open hoyhoy opened 5 months ago

hoyhoy commented 5 months ago

I haven't seen this before... llvm 15, 16, and 17 all compiled for me.

CMake Error at /llvm-project-18.1.0.src/libc/cmake/modules/LLVMLibCObjectRules.cmake:703 (target_link_libraries):
  Target "libc.src.errno.errno" of type UTILITY may not be linked into
  another target.  One may link only to INTERFACE, OBJECT, STATIC or SHARED
  libraries, or to executables with the ENABLE_EXPORTS property set.
Call Stack (most recent call first):
  /llvm-project-18.1.0.src/libc/cmake/modules/LLVMLibCObjectRules.cmake:805 (create_entrypoint_object)
  /llvm-project-18.1.0.src/libc/cmake/modules/LLVMLibCObjectRules.cmake:883 (expand_flags_for_entrypoint_object)
  /llvm-project-18.1.0.src/libc/src/stdlib/CMakeLists.txt:34 (add_entrypoint_object)
llvmbot commented 5 months ago

@llvm/issue-subscribers-libc

Author: None (hoyhoy)

I haven't seen this before... llvm 15, 16, and 17 all compiled for me. ``` CMake Error at /llvm-project-18.1.0.src/libc/cmake/modules/LLVMLibCObjectRules.cmake:703 (target_link_libraries): Target "libc.src.errno.errno" of type UTILITY may not be linked into another target. One may link only to INTERFACE, OBJECT, STATIC or SHARED libraries, or to executables with the ENABLE_EXPORTS property set. Call Stack (most recent call first): /llvm-project-18.1.0.src/libc/cmake/modules/LLVMLibCObjectRules.cmake:805 (create_entrypoint_object) /llvm-project-18.1.0.src/libc/cmake/modules/LLVMLibCObjectRules.cmake:883 (expand_flags_for_entrypoint_object) /llvm-project-18.1.0.src/libc/src/stdlib/CMakeLists.txt:34 (add_entrypoint_object) ```
michaelrj-google commented 5 months ago

can you share the cmake command you used?

hoyhoy commented 5 months ago
#!/usr/local/bin/bash

BUILD_DIR=build
SOURCE_DIR=${HOME}/llvm-project-18.1.0.src

cd ${SOURCE_DIR}
rm -Rf ${BUILD_DIR}
mkdir ${BUILD_DIR}

LLVM_TRIPLE=x86_64-apple-darwin
XCODE15_BIN=/usr/bin
MACOS_MAJOR_VERSION="14.3"
MACOS_REVISION="1"
MACOS_FULL_VERSION="${MACOS_MAJOR_VERSION}.${MACOS_REVISION}"

CLANG_ROOT="/opt/llvm17"
CLANG_LIB="${CLANG_ROOT}/lib"
CLANG_BIN="${CLANG_ROOT}/bin"
export CCACHE_COMPILER="${CLANG_BIN}/clang-17"
export CCACHE_BIN="${CLANG_BIN}"
export CCACHE_HASHDIR="yes"
export CCACHE_CPP2="yes"
CLANG_BINARY_PREFIX=clang

export CC=${CLANG_BIN}/${CLANG_BINARY_PREFIX}
export CXX=${CLANG_BIN}/${CLANG_BINARY_PREFIX}++
export LD=${CLANG_BIN}/lld
export AS=${CLANG_BIN}/llvm-as
export AR=${CLANG_BIN}/llvm-ar
export NM=${CLANG_BIN}/llvm-nm
export RANLIB=${CLANG_BIN}/llvm-ranlib
export LINKER=${CLANG_BIN}/lld
export LLVM_DIR=${CLANG_ROOT}
export LLVM_PATH=${CLANG_BIN}

export FIPSLD_CC=${CC}
export FIPSLD_CXX=${CXX}

unset ASAN_OPTIONS
unset LD_LIBRARY_PATH
unset LIBPATH
unset LDFLAGS
unset LIBPATH
unset MSAN_OPTIONS
unset CPLUS_INCLUDE_PATH

export LD_LIBRARY_PATH="${CLANG_LIB}:${CLANG_LIB}/clang/17/lib/darwin"
export LDPATH="${LD_LIBRARY_PATH}"
export LIBRARY_PATH="${LD_LIBRARY_PATH}"
export LIBPATH="${LD_LIBRARY_PATH}"

export CPATH="${CLANG_ROOT}/include"

MAKE=${CLANG_BIN}/make
OBJCOPY=${CLANG_BIN}/llvm-objcopy
OBJDUMP=${CLANG_BIN}/llvm-objdump
READELF=${CLANG_BIN}/llvm-readelf
LIPO=${CLANG_BIN}/llvm-lipo
STRIP=${CLANG_BIN}/llvm-strip
LINKER=${CLANG_BIN}/lld

unset ASAN_OPTIONS
unset MSAN_OPTIONS
unset CPLUS_INCLUDE_PATH

export TERMCAP_LIB=libncurses.6
export LD_LIBRARY_PATH="${CLANG_LIB}:${CLANG_LIB}/darwin"
export LIBRARY_PATH=$LD_LIBRARY_PATH
export LIBPATH=$LD_LIBRARY_PATH

export CPATH="${CLANG_ROOT}/include"
export LDFLAGS="-L${CLANG_LIB} -fuse-ld=lld -Wl,-rpath,${CLANG_LIB}"

export LIBPATH=$LD_LIBRARY_PATH

export CFLAGS="-O3 -march=native -funroll-loops -finline-functions -mtune=native"
export CXXFLAGS="-O3 -march=native -funroll-loops -finline-functions -mtune=native"

export PATH="${HOME}/Library/Python/3.9/bin:/usr/local/bin:${HOME}/bin:${HOME}/.cargo/bin:/usr/local/go/bin:/usr/bin:/bin:/usr/sbin:/sbin"
INSTALL_PATH="/opt/llvm18"

CCACHE=/usr/local/bin/ccache

unset NINJA_STATUS

cmake_args=(
  -DCMAKE_BUILD_TYPE=Release
  -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;lldb;lld" 
  -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi;libc;compiler-rt;libunwind"
  # -DCOMPILER_RT_DEFAULT_TARGET_TRIPLE=x86_64-apple-macosx14.3.0
  # -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi;libc;compiler-rt" 
  # -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi;libc" 
  -DCLANG_CONFIG_FILE_SYSTEM_DIR="${INSTALL_PATH}/etc" 
  -DLLVM_LOCAL_RPATH="${INSTALL_PATH}/lib;${INSTALL_PATH}/darwin" 
  -DCLANG_CONFIG_FILE_SYSTEM_DIR="${INSTALL_PATH}/etc" 
  -DCMAKE_INSTALL_PREFIX="${INSTALL_PATH}" 
  -DCMAKE_INSTALL_RPATH="${INSTALL_PATH}/lib;${INSTALL_PATH}/lib/darwin" 
  -DCMAKE_C_COMPILER_LAUNCHER="${CCACHE}" 
  -DCMAKE_CXX_COMPILER_LAUNCHER="${CCACHE}" 
  -DCMAKE_C_COMPILER="${CC}" 
  -DCMAKE_CXX_COMPILER="${CXX}" 
  -DCLANG_INCLUDE_TESTS:BOOL=OFF 
  -DLLVM_INCLUDE_TESTS:BOOL=OFF 
  -DLLDB_ENABLE_SWIG:BOOL=ON 
  -DLLDB_ENABLE_LIBEDIT:BOOL=ON 
  -DLLDB_ENABLE_CURSES:BOOL=ON 
  -DDEFAULT_SYSROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk 
  -DLLVM_BUILD_TOOLS:BOOL=ON 
  -DLLVM_ENABLE_LIBCXX:BOOL=ON 
  -DLLVM_CCACHE_BUILD:BOOL=ON 
  -DLLVM_ENABLE_TERMINFO:BOOL=ON
  -DHAVE_CXX_ATOMICS64_WITHOUT_LIB=True 
  -DHAVE_CXX_ATOMICS_WITHOUT_LIB=True 
  -DSWIG_EXECUTABLE=${HOME}/Library/Python/3.9/bin/swig 
  -DLLDB_USE_SYSTEM_DEBUGSERVER:BOOL=ON 
  -DLLVM_PARALLEL_COMPILE_JOBS=8 
  -DLLVM_PARALLEL_LINK_JOBS=2 
  -DLLVM_ENABLE_LLD:BOOL=ON 
  -DLLVM_ENABLE_LIBCXX:BOOL=ON 
  -DCMAKE_C_FLAGS="${CFLAGS}" 
  -DCMAKE_CXX_FLAGS="${CXXFLAGS}" 
  -DCMAKE_EXE_LINKER_FLAGS="${LDFLAGS}"
  -DCMAKE_SHARED_LINKER_FLAGS="${LDFLAGS}"
  -DCMAKE_MODULE_LINKER_FLAGS="${LDFLAGS}"
  -DCMAKE_NM="${NM}" 
  -DCMAKE_AR="${AR}" 
  -DCMAKE_AR="${LD}" 
  -DCMAKE_LIPO="${LIPO}" 
  -DCMAKE_RANLIB="${RANLIB}" 
  -DCMAKE_OBJCOPY="${OBJCOPY}" 
  -DCMAKE_OBJDUMP="${OBJDUMP}" 
  -DCMAKE_STRIP="${STRIP}" 
  -DCMAKE_READELF="${READELF}" 
  -DCMAKE_LINKER="${LD}" 
  -DDEFAULT_SANITIZER_MIN_OSX_VERSION="${MACOS_MAJOR_VERSION}" 
  -DLLVM_RUNTIME_TARGETS="${LLVM_TRIPLE}" 
  -DCMAKE_C_COMPILER_TARGET="${LLVM_TRIPLE}" 
  -DCMAKE_CXX_COMPILER_TARGET="${LLVM_TRIPLE}" 
  -DLIBCXX_USE_COMPILER_RT:BOOL=ON
  -DLIBCXX_CXX_ABI=libcxxrt
  -DLIBCXXABI_USE_LLVM_UNWINDER:BOOL=ON
  -DLIBCXXABI_USE_COMPILER_RT=ON
  -DLIBUNWIND_ENABLE_SHARED:BOOL=OFF
  -DBUILD_SHARED_LIBS=OFF
  -DSANITIZER_IOS=0
  -DCOMPILER_RT_BUILD_BUILTINS:BOOL=ON 
  -DCOMPILER_RT_ENABLE_IOS:BOOL=OFF 
  -DCOMPILER_RT_ENABLE_WATCHOS:BOOL=OFF 
  -DCOMPILER_RT_ENABLE_TVOS:BOOL=OFF 
  -DCOMPILER_RT_ENABLE_MACCATALYST:BOOL=OFF 
  -DCOMPILER_RT_BUILD_LIBFUZZER:BOOL=ON 
  -DCOMPILER_RT_BUILD_MEMPROF:BOOL=ON 
  -DCOMPILER_RT_BUILD_PROFILE:BOOL=ON 
  -DCOMPILER_RT_BUILD_SANITIZERS:BOOL=ON 
  -DCOMPILER_RT_BUILD_XRAY:BOOL=ON 
  -DLLVM_TARGETS_TO_BUILD=X86 
  -DCOMPILER_RT_DEFAULT_TARGET_ARCH=x86_64 
  -DCOMPILER_RT_DEFAULT_TARGET_ONLY:BOOL=ON
  -DRUNTIMES_BUILD_ALLOW_DARWIN:BOOL=ON
)

# echo "cmake ${cmake_args[@]} -S llvm ${BUILD_DIR} -G Ninja"
cmake "${cmake_args[@]}" -S llvm "${BUILD_DIR}" -G Ninja

ninja -C "${BUILD_DIR}"
hoyhoy commented 5 months ago
cat /opt/llvm17/etc/x86_64-apple-darwin23.3.0-clang.cfg
-fuse-ld=lld -L/opt/llvm17/lib -L/opt/llvm17/lib/darwin -Wl,-rpath,/opt/llvm17/lib
hoyhoy commented 5 months ago

Maybe unset the LDFLAGS since it's in a clang.cfg file now. Why doesn't clang set the rpath by default on macOS?

hoyhoy commented 5 months ago

That actually doesn't work either. llvm-min-tblgen doesn't use the cfg...

FAILED: include/llvm/IR/IntrinsicsPowerPC.h /llvm-project-18.1.0.src/build/include/llvm/IR/IntrinsicsPowerPC.h 
cd /llvm-project-18.1.0.src/build && /llvm-project-18.1.0.src/build/bin/llvm-min-tblgen -gen-intrinsic-enums -intrinsic-prefix=ppc -I /llvm-project-18.1.0.src/llvm/include/llvm/IR -I/llvm-project-18.1.0.src/build/include -I/llvm-project-18.1.0.src/llvm/include /llvm-project-18.1.0.src/llvm/include/llvm/IR/Intrinsics.td --write-if-changed -o include/llvm/IR/IntrinsicsPowerPC.h -d include/llvm/IR/IntrinsicsPowerPC.h.d
dyld[75224]: Library not loaded: @rpath/libc++.1.dylib
  Referenced from: <4C4C4468-5555-3144-A177-D2B732114C04> /llvm-project-18.1.0.src/build/bin/llvm-min-tblgen
  Reason: no LC_RPATH's found
michaelrj-google commented 5 months ago

if you just need cmake to work, then I'd recommend either removing libc from the list of runtimes or adding the following to line 19 of libc/config/darwin/x86_64/entrypoints.txt.

    # errno.h entrypoints
    libc.src.errno.errno

If you actually want to build the library, then you need to add these to your cmake options: -DLIBC_COMPILE_OPTIONS_DEFAULT="-DLIBC_COPT_USE_C_ASSERT" -DLIBC_WNO_ERROR=ON

We're not actively supporting x86_64 darwin for libc right now which is why the build is broken. Are you intending to actually use LLVM-libc on x86_64 darwin?

hoyhoy commented 5 months ago

Are you intending to actually use LLVM-libc on x86_64 darwin?

No. Can I just disable that? I'm only using libcxx. I (wrongly) thought libc was used automatically for clang C.

michaelrj-google commented 5 months ago

yes you can just disable that. It's not used for anything inside LLVM at the moment. Hopefully it will be in the future though :)

hoyhoy commented 5 months ago

OK, that worked, but now I'm seeing this...

llvm-lipo: error: /var/folders/sg/by4ymb_1491658nz5rdt1k940000gn/T/sanitizer_allocator-b4cc3b/sanitizer_allocator-x86_64.out and /var/folders/sg/by4ymb_1491658nz5rdt1k940000gn/T/sanitizer_allocator-2e2c5c/sanitizer_allocator-x86_64h.out have the same architecture x86_64 and therefore cannot be in the same universal binary
clang++: error: lipo command failed with exit code 1 (use -v to see invocation)
[1537/1748] /llvm-project-18.1.0.src/build/./bin/clang++ --target=x86_64-apple-darwin -DCOMPILER_RT_SHARED_LIB -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -Dclang_rt_lsan_osx_dynamic_EXPORTS -I/llvm-project-18.1.0.src/compiler-rt/lib/lsan/.. -O3 -march=native -funroll-loops -finline-functions -mtune=native -fPIC -fvisibility-inlines-hidden -Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion -Wmisleading-indentation -Wctad-maybe-unsupported -fdiagnostics-color -Wall -Wno-unused-parameter -O3 -DNDEBUG -std=c++17 -arch x86_64 -arch x8

The only way I could fix this with llvm 16 and 17 is by hand-editing out the x86_64h from build-config-ix.config... Is there a magic switch to disable "x86_64h"? I tried specifically saying, "ONLY BUILD THE x86_64" target with the various target settings.

hoyhoy commented 5 months ago
# build-config-ix.config
if(APPLE)
  set(ARM64 arm64 arm64e)
  set(ARM32 armv7 armv7k armv7s)
  set(X86_64 x86_64 x86_64h)
endif()

Probably need to remove x86_64h if COMPILER_RT_DEFAULT_TARGET_ONLY == ON

hoyhoy commented 5 months ago

The other weird issue is that ninja (or cmake) install only deploys the runtimes to ${PREFIX}/lib/clang/18/lib/darwin, but clang itself looks for libraries in ${PREFIX}/lib/darwin. So, I have to symlink ln -s ${PREFIX}/clang/17/lib/darwin ${PREFIX}/darwin after every installation.

michaelrj-google commented 5 months ago

this has gotten beyond libc, so I can't really help you now. It might be worthwhile to remove the libc label to see if someone else can help, or possibly posting on https://discourse.llvm.org/

hoyhoy commented 5 months ago

I got past those, but then got to

ld64.lld: error: undefined symbol: __gxx_personality_v0
>>> referenced by /var/folders/sg/by4ymb_1491658nz5rdt1k940000gn/T/cmake_bootstrap-749374.o:(symbol EH_Frame+0x13)
>>> referenced by /var/folders/sg/by4ymb_1491658nz5rdt1k940000gn/T/cmake_bootstrap-749374.o:(__compact_unwind+0x50)
clang++: error: linker command failed with exit code 1 (use -v to see invocation)

Which I encountered once before, but I don't recall how I fixed it. Attempting to compile with XCode 15 with minimal overrides at -O2 now. That usually works.

hoyhoy commented 5 months ago
#!/usr/local/bin/bash

CLANG_ROOT="/usr"
CLANG_BIN="${CLANG_ROOT}/bin"

export CC=${CLANG_BIN}/clang
export CXX=${CLANG_BIN}/clang++
export LD=${CLANG_BIN}/ld
export AS=${CLANG_BIN}/as
export AR=${CLANG_BIN}/ar
export NM=${CLANG_BIN}/nm
export RANLIB=${CLANG_BIN}/ranlib
export LINKER=${CLANG_BIN}/ld
export LLVM_DIR=${CLANG_ROOT}
export LLVM_PATH=${CLANG_BIN}
export LLVM_ROOT=${CLANG_ROOT}

unset LD_LIBRARY_PATH
unset LIBPATH
unset CXXFLAGS
unset CFLAGS
unset LDFLAGS
unset LIBPATH
unset MSAN_OPTIONS
unset CPLUS_INCLUDE_PATH

unset LD_LIBRARY_PATH
unset LIBRARY_PATH
unset LIBPATH
unset LDFLAGS

BUILD_DIR=build
SOURCE_DIR=${HOME}/llvm-project-18.1.0.src

cd ${SOURCE_DIR}
rm -Rf ${BUILD_DIR}
mkdir ${BUILD_DIR}

unset ASAN_OPTIONS
unset MSAN_OPTIONS
unset CPLUS_INCLUDE_PATH

export PATH="${HOME}/Library/Python/3.9/bin:/usr/bin:/usr/local/bin:${HOME}/bin:${HOME}/.cargo/bin:/usr/local/go/bin:/bin:/usr/sbin:/sbin"

INSTALL_PATH="/opt/llvm18"

CCACHE=/usr/local/bin/ccache

unset NINJA_STATUS

export CFLAGS="-O2"
export CXXFLAGS="-O2"

cmake_args=(
  -DCMAKE_BUILD_TYPE=Release
  -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;lldb;lld" 
  -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi;compiler-rt"
  -DCLANG_CONFIG_FILE_SYSTEM_DIR="${INSTALL_PATH}/etc" 
  -DLLVM_LOCAL_RPATH="${INSTALL_PATH}/lib;${INSTALL_PATH}/darwin" 
  -DCLANG_CONFIG_FILE_SYSTEM_DIR="${INSTALL_PATH}/etc" 
  -DCMAKE_INSTALL_PREFIX="${INSTALL_PATH}" 
  -DCMAKE_INSTALL_RPATH="${INSTALL_PATH}/lib;${INSTALL_PATH}/lib/darwin" 
  -DCMAKE_C_COMPILER_LAUNCHER="${CCACHE}" 
  -DCMAKE_CXX_COMPILER_LAUNCHER="${CCACHE}" 
  -DCLANG_INCLUDE_TESTS:BOOL=OFF 
  -DLLVM_INCLUDE_TESTS:BOOL=OFF 
  -DLLDB_ENABLE_LIBEDIT:BOOL=ON 
  -DLLDB_ENABLE_CURSES:BOOL=ON 
  -DDEFAULT_SYSROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk 
  -DLLVM_BUILD_TOOLS:BOOL=ON 
  -DLLVM_ENABLE_LIBCXX:BOOL=ON 
  -DLLVM_CCACHE_BUILD:BOOL=ON 
  -DLLVM_ENABLE_TERMINFO:BOOL=ON
  -DHAVE_CXX_ATOMICS64_WITHOUT_LIB=True 
  -DHAVE_CXX_ATOMICS_WITHOUT_LIB=True 
  -DLLDB_USE_SYSTEM_DEBUGSERVER:BOOL=ON 
  -DLLVM_PARALLEL_COMPILE_JOBS=8 
  -DLLVM_PARALLEL_LINK_JOBS=2 
  -DLLVM_ENABLE_LLD:BOOL=ON 
  -DLLVM_ENABLE_LIBCXX:BOOL=ON 
  -DLIBCXXABI_USE_COMPILER_RT=ON
  -DCOMPILER_RT_BUILD_BUILTINS:BOOL=ON 
  -DCOMPILER_RT_ENABLE_IOS:BOOL=OFF 
  -DCOMPILER_RT_ENABLE_WATCHOS:BOOL=OFF 
  -DCOMPILER_RT_ENABLE_TVOS:BOOL=OFF 
  -DCOMPILER_RT_ENABLE_MACCATALYST:BOOL=OFF 
  -DCOMPILER_RT_BUILD_LIBFUZZER:BOOL=ON 
  -DCOMPILER_RT_BUILD_MEMPROF:BOOL=ON 
  -DCOMPILER_RT_BUILD_PROFILE:BOOL=ON 
  -DCOMPILER_RT_BUILD_SANITIZERS:BOOL=ON 
  -DCOMPILER_RT_BUILD_XRAY:BOOL=ON 
  -DRUNTIMES_BUILD_ALLOW_DARWIN:BOOL=ON
)

# echo "cmake ${cmake_args[@]} -S llvm ${BUILD_DIR} -G Ninja"

/usr/local/bin/cmake "${cmake_args[@]}" -S llvm "${BUILD_DIR}" -G Ninja

ninja -C "${BUILD_DIR}"