diff --git a/.gitignore b/.gitignore index dd191b234..d5845bde5 100644 --- a/.gitignore +++ b/.gitignore @@ -2,8 +2,10 @@ *.pyd *.o *.so +*.a *.dylib *.dll +*.lib build/ dist/ *.egg-info diff --git a/buildscripts/azure/azure-windows.yml b/buildscripts/azure/azure-windows.yml index 56c1edcaa..9d1261cbf 100644 --- a/buildscripts/azure/azure-windows.yml +++ b/buildscripts/azure/azure-windows.yml @@ -34,7 +34,7 @@ jobs: call conda remove --all -q -y -n %CONDA_ENV% call conda create -n %CONDA_ENV% -q -y python=%PYTHON% cmake call activate %CONDA_ENV% - call conda install -y -q -c numba/label/dev llvmdev="14.*" libxml2 + call conda install -y -q --override-channels -c mcollison llvmdev="14.*" displayName: 'Before Install' - script: | diff --git a/buildscripts/incremental/setup_conda_environment.cmd b/buildscripts/incremental/setup_conda_environment.cmd index e3b66574e..bc766b5ba 100644 --- a/buildscripts/incremental/setup_conda_environment.cmd +++ b/buildscripts/incremental/setup_conda_environment.cmd @@ -19,6 +19,9 @@ if %errorlevel% neq 0 exit /b %errorlevel% call activate %CONDA_ENV% if %errorlevel% neq 0 exit /b %errorlevel% +@rem Temporarily point to mcollison llvmdev +%CONDA_INSTALL% -c mcollison llvmdev="14.*" + @rem Install llvmdev -%CONDA_INSTALL% -c numba/label/dev llvmdev="14.*" +@%CONDA_INSTALL% -c numba/label/dev llvmdev="14.*" if %errorlevel% neq 0 exit /b %errorlevel% diff --git a/buildscripts/incremental/setup_conda_environment.sh b/buildscripts/incremental/setup_conda_environment.sh index 20008b264..ee51fd2d6 100755 --- a/buildscripts/incremental/setup_conda_environment.sh +++ b/buildscripts/incremental/setup_conda_environment.sh @@ -26,8 +26,18 @@ set +v source activate $CONDA_ENV set -v +#Install llvmdev from mcollison channel +#until it can be upload to Anaconda +if [ "$(uname -sm)" = "Linux aarch64" ]; then + $CONDA_INSTALL -c mcollison llvmdev="11.*" +else + $CONDA_INSTALL -c mcollison llvmdev="14.*" +fi + # Install llvmdev (separate channel, for now) -$CONDA_INSTALL -c numba/label/dev llvmdev="14.*" +# NOTE: Commented out until llvmdev with compiler-rt +# available +#$CONDA_INSTALL -c numba/label/dev llvmdev="14.*" # Install the compiler toolchain, for osx, bootstrapping needed # which happens in build.sh diff --git a/conda-recipes/llvmdev/bld.bat b/conda-recipes/llvmdev/bld.bat index 5426877f3..03d4d1d36 100644 --- a/conda-recipes/llvmdev/bld.bat +++ b/conda-recipes/llvmdev/bld.bat @@ -3,6 +3,8 @@ FOR /D %%d IN (llvm-*.src) DO (MKLINK /J llvm %%d if !errorlevel! neq 0 exit /b %errorlevel%) FOR /D %%d IN (lld-*.src) DO (MKLINK /J lld %%d if !errorlevel! neq 0 exit /b %errorlevel%) +FOR /D %%d IN (rt\compiler-rt-*.src) DO (MKLINK /J compiler-rt %%d +if !errorlevel! neq 0 exit /b %errorlevel%) FOR /D %%d IN (unwind\libunwind-*.src) DO (MKLINK /J libunwind %%d if !errorlevel! neq 0 exit /b %errorlevel%) @@ -34,13 +36,16 @@ REM the 64bit linker anyway. This must be passed in to certain generators as REM '-Thost x64'. set PreferredToolArchitecture=x64 -set MAX_INDEX_CMAKE_GENERATOR=0 +set MAX_INDEX_CMAKE_GENERATOR=1 set "CMAKE_GENERATOR[0]=Visual Studio 16 2019" +set "CMAKE_GENERATOR[1]=Visual Studio 17 2022" set "CMAKE_GENERATOR_ARCHITECTURE[0]=%GEN_ARCH%" +set "CMAKE_GENERATOR_ARCHITECTURE[1]=%GEN_ARCH%" set "CMAKE_GENERATOR_TOOLSET[0]=v142" +set "CMAKE_GENERATOR_TOOLSET[1]=v142" REM Reduce build times and package size by removing unused stuff REM BENCHMARKS (new for llvm8) don't build under Visual Studio 14 2015 @@ -54,6 +59,8 @@ set CMAKE_CUSTOM=-DLLVM_TARGETS_TO_BUILD="%LLVM_TARGETS_TO_BUILD%" ^ -DLLVM_USE_INTEL_JITEVENTS=ON ^ -DLLVM_INCLUDE_BENCHMARKS=OFF ^ -DLLVM_ENABLE_DIA_SDK=OFF ^ + -DLLVM_ENABLE_LIBXML2:BOOL=OFF ^ + -DCLANG_ENABLE_LIBXML=OFF ^ -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly REM try all compatible visual studio toolsets to find one that is installed @@ -93,3 +100,48 @@ REM enhanced unix-like shell which has functions like `grep` available. REM cd ..\test REM "%PYTHON%" "..\build\%BUILD_CONFIG%\bin\llvm-lit.py" -vv Transforms ExecutionEngine Analysis CodeGen/X86 REM if errorlevel 1 exit 1 + + +REM Build compiler-rt separately, because it fails on Windows with LLVM 14.0.6 +REM if built as an LLVM project. +REM See also: https://stackoverflow.com/questions/46108390/building-llvm-with-cmake-and-visual-stuidio-fails-to-install + +cd "%SRC_DIR%\compiler-rt" +mkdir build +cd build + +set CMAKE_CUSTOM=-DCOMPILER_RT_BUILD_BUILTINS:BOOL=ON ^ + -DCOMPILER_RT_BUILD_LIBFUZZER:BOOL=OFF ^ + -DCOMPILER_RT_BUILD_CRT:BOOL=OFF ^ + -DCOMPILER_RT_BUILD_MEMPROF:BOOL=OFF ^ + -DCOMPILER_RT_BUILD_PROFILE:BOOL=OFF ^ + -DCOMPILER_RT_BUILD_SANITIZERS:BOOL=OFF ^ + -DCOMPILER_RT_BUILD_XRAY:BOOL=OFF ^ + -DCOMPILER_RT_BUILD_GWP_ASAN:BOOL=OFF ^ + -DCOMPILER_RT_BUILD_ORC:BOOL=OFF ^ + -DCOMPILER_RT_INCLUDE_TESTS:BOOL=OFF ^ + -DLLVM_CONFIG_PATH="%SRC_DIR%\build\%BUILD_CONFIG%\bin\llvm-config.exe" + +REM try all compatible visual studio toolsets to find one that is installed +setlocal enabledelayedexpansion +for /l %%n in (0,1,%MAX_INDEX_CMAKE_GENERATOR%) do ( + cmake -G "!CMAKE_GENERATOR[%%n]!" ^ + -A "!CMAKE_GENERATOR_ARCHITECTURE[%%n]!" ^ + -T "!CMAKE_GENERATOR_TOOLSET[%%n]!" ^ + -DCMAKE_BUILD_TYPE="%BUILD_CONFIG%" ^ + -DCMAKE_PREFIX_PATH="%LIBRARY_PREFIX%" ^ + -DCMAKE_INSTALL_PREFIX:PATH="%LIBRARY_PREFIX%" ^ + %CMAKE_CUSTOM% .. + if not errorlevel 1 goto crt_configuration_successful + del CMakeCache.txt +) +if errorlevel 1 exit 1 + +:crt_configuration_successful +endlocal + +cmake --build . --config "%BUILD_CONFIG%" +if errorlevel 1 exit 1 + +cmake --build . --config "%BUILD_CONFIG%" --target install +if errorlevel 1 exit 1 diff --git a/conda-recipes/llvmdev/build.sh b/conda-recipes/llvmdev/build.sh old mode 100644 new mode 100755 index ecc3de4d6..fe813dcf5 --- a/conda-recipes/llvmdev/build.sh +++ b/conda-recipes/llvmdev/build.sh @@ -17,12 +17,13 @@ fi mv llvm-*.src llvm mv lld-*.src lld +mv rt/compiler-rt-*.src compiler-rt mv unwind/libunwind-*.src libunwind declare -a _cmake_config _cmake_config+=(-DCMAKE_INSTALL_PREFIX:PATH=${PREFIX}) _cmake_config+=(-DCMAKE_BUILD_TYPE:STRING=Release) -_cmake_config+=(-DLLVM_ENABLE_PROJECTS:STRING="lld") +_cmake_config+=(-DLLVM_ENABLE_PROJECTS:STRING="lld;compiler-rt") # The bootstrap clang I use was built with a static libLLVMObject.a and I trying to get the same here # _cmake_config+=(-DBUILD_SHARED_LIBS:BOOL=ON) _cmake_config+=(-DLLVM_ENABLE_ASSERTIONS:BOOL=ON) @@ -44,6 +45,16 @@ _cmake_config+=(-DLLVM_ENABLE_RTTI=OFF) _cmake_config+=(-DLLVM_TARGETS_TO_BUILD=${LLVM_TARGETS_TO_BUILD}) _cmake_config+=(-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly) _cmake_config+=(-DLLVM_INCLUDE_UTILS=ON) # for llvm-lit +_cmake_config+=(-DCOMPILER_RT_BUILD_BUILTINS:BOOL=ON) +_cmake_config+=(-DCOMPILER_RT_BUILD_LIBFUZZER:BOOL=OFF) +_cmake_config+=(-DCOMPILER_RT_BUILD_CRT:BOOL=OFF) +_cmake_config+=(-DCOMPILER_RT_BUILD_MEMPROF:BOOL=OFF) +_cmake_config+=(-DCOMPILER_RT_BUILD_PROFILE:BOOL=OFF) +_cmake_config+=(-DCOMPILER_RT_BUILD_SANITIZERS:BOOL=OFF) +_cmake_config+=(-DCOMPILER_RT_BUILD_XRAY:BOOL=OFF) +_cmake_config+=(-DCOMPILER_RT_BUILD_GWP_ASAN:BOOL=OFF) +_cmake_config+=(-DCOMPILER_RT_BUILD_ORC:BOOL=OFF) +_cmake_config+=(-DCOMPILER_RT_INCLUDE_TESTS:BOOL=OFF) _cmake_config+=(-DLLVM_INCLUDE_BENCHMARKS:BOOL=OFF) # doesn't build without the rest of LLVM project # TODO :: It would be nice if we had a cross-ecosystem 'BUILD_TIME_LIMITED' env var we could use to # disable these unnecessary but useful things. diff --git a/conda-recipes/llvmdev/meta.yaml b/conda-recipes/llvmdev/meta.yaml index 7676d234e..461008b25 100644 --- a/conda-recipes/llvmdev/meta.yaml +++ b/conda-recipes/llvmdev/meta.yaml @@ -3,6 +3,7 @@ {% set sha256_llvm = "050922ecaaca5781fdf6631ea92bc715183f202f9d2f15147226f023414f619a" %} {% set sha256_lld = "0c28ce0496934d37d20fec96591032dd66af8d10178a45762e0e75e85cf95ad3" %} {% set sha256_libunwind = "3bbe9c23c73259fe39c045dc87d0b283236ba6e00750a226b2c2aeac4a51d86b" %} +{% set sha256_compiler_rt = "88df303840ca8fbff944e15e61c141226fe79f5d2b8e89fb024264d77841a02e" %} {% set build_number = "3" %} package: @@ -17,6 +18,7 @@ source: - ../llvm14-clear-gotoffsetmap.patch - ../llvm14-remove-use-of-clonefile.patch - ../llvm14-svml.patch + - url: https://github.com/llvm/llvm-project/releases/download/llvmorg-{{ version }}/lld-{{ version }}.src.tar.xz fn: lld-{{ version }}.src.tar.xz sha256: {{ sha256_lld }} @@ -26,6 +28,10 @@ source: sha256: {{ sha256_libunwind }} folder: unwind + - url: https://github.com/llvm/llvm-project/releases/download/llvmorg-{{ version }}/compiler-rt-{{ version }}.src.tar.xz + fn: compiler-rt-{{ version }}.src.tar.xz + sha256: {{ sha256_compiler_rt }} + folder: rt build: number: {{ build_number }} script_env: diff --git a/conda-recipes/llvmdev_manylinux2014/build.sh b/conda-recipes/llvmdev_manylinux2014/build.sh old mode 100644 new mode 100755 index dc0af4074..07a5e38b5 --- a/conda-recipes/llvmdev_manylinux2014/build.sh +++ b/conda-recipes/llvmdev_manylinux2014/build.sh @@ -76,8 +76,8 @@ fi # _cmake_config+=(--trace-expand) # CPU_COUNT=1 -mkdir build -cd build +mkdir llvm/build +cd llvm/build cmake -G'Unix Makefiles' \ "${_cmake_config[@]}" \ @@ -94,3 +94,44 @@ make check-llvm-unit || exit $? # From: https://github.com/conda-forge/llvmdev-feedstock/pull/53 make install || exit $? + +# run the tests, skip some on linux-32 +cd ../test +if [[ $ARCH == 'i686' ]]; then + ../build/bin/llvm-lit -vv Transforms Analysis CodeGen/X86 +else + ../build/bin/llvm-lit -vv Transforms ExecutionEngine Analysis CodeGen/X86 +fi + +# Next, build compiler-rt + +declare -a _compiler_rt_cmake_config +_compiler_rt_cmake_config+=(-DCMAKE_INSTALL_PREFIX:PATH=${PREFIX}) +_compiler_rt_cmake_config+=(-DCMAKE_BUILD_TYPE:STRING=Release) +_compiler_rt_cmake_config+=(-DCOMPILER_RT_BUILD_BUILTINS:BOOL=ON) +_compiler_rt_cmake_config+=(-DCOMPILER_RT_BUILD_LIBFUZZER:BOOL=OFF) +_compiler_rt_cmake_config+=(-DCOMPILER_RT_BUILD_CRT:BOOL=OFF) +_compiler_rt_cmake_config+=(-DCOMPILER_RT_BUILD_MEMPROF:BOOL=OFF) +_compiler_rt_cmake_config+=(-DCOMPILER_RT_BUILD_PROFILE:BOOL=OFF) +_compiler_rt_cmake_config+=(-DCOMPILER_RT_BUILD_SANITIZERS:BOOL=OFF) +_compiler_rt_cmake_config+=(-DCOMPILER_RT_BUILD_XRAY:BOOL=OFF) +_compiler_rt_cmake_config+=(-DCOMPILER_RT_BUILD_GWP_ASAN:BOOL=OFF) +_compiler_rt_cmake_config+=(-DCOMPILER_RT_BUILD_ORC:BOOL=OFF) +_compiler_rt_cmake_config+=(-DCOMPILER_RT_INCLUDE_TESTS:BOOL=OFF) +_compiler_rt_cmake_config+=(-DLLVM_CONFIG_PATH=../../llvm/build/bin/llvm-config) + +cd ../../compiler-rt +mkdir build +cd build + +cmake -G'Unix Makefiles' \ + "${_compiler_rt_cmake_config[@]}" \ + .. + +if [ $ARCH == 'armv7l' ]; then # RPi need thread count throttling + make -j2 VERBOSE=1 +else + make -j${CPU_COUNT} VERBOSE=1 +fi + +make install diff --git a/conda-recipes/llvmdev_manylinux2014/meta.yaml b/conda-recipes/llvmdev_manylinux2014/meta.yaml index bcc1ca39a..a5be89e71 100644 --- a/conda-recipes/llvmdev_manylinux2014/meta.yaml +++ b/conda-recipes/llvmdev_manylinux2014/meta.yaml @@ -3,7 +3,8 @@ {% set sha256_llvm = "050922ecaaca5781fdf6631ea92bc715183f202f9d2f15147226f023414f619a" %} {% set sha256_lld = "0c28ce0496934d37d20fec96591032dd66af8d10178a45762e0e75e85cf95ad3" %} {% set sha256_libunwind = "3bbe9c23c73259fe39c045dc87d0b283236ba6e00750a226b2c2aeac4a51d86b" %} -{% set build_number = "1" %} +{% set sha256_compiler_rt = "88df303840ca8fbff944e15e61c141226fe79f5d2b8e89fb024264d77841a02e" %} +{% set build_number = "2" %} package: name: llvmdev @@ -13,19 +14,27 @@ source: - url: https://github.com/llvm/llvm-project/releases/download/llvmorg-{{ version }}/llvm-{{ version }}.src.tar.xz fn: llvm-{{ version }}.src.tar.xz sha256: {{ sha256_llvm }} + folder: llvm patches: - ../llvm14-clear-gotoffsetmap.patch - ../llvm14-remove-use-of-clonefile.patch - ../llvm14-svml.patch + - url: https://github.com/llvm/llvm-project/releases/download/llvmorg-{{ version }}/lld-{{ version }}.src.tar.xz fn: lld-{{ version }}.src.tar.xz sha256: {{ sha256_lld }} + folder: llvm/tools/lld - url: https://github.com/llvm/llvm-project/releases/download/llvmorg-{{ version }}/libunwind-{{ version }}.src.tar.xz fn: libunwind-{{ version }}.src.tar.xz sha256: {{ sha256_libunwind }} folder: unwind + - url: https://github.com/llvm/llvm-project/releases/download/llvmorg-{{ version }}/compiler-rt-{{ version }}.src.tar.xz + fn: compiler-rt-{{ version }}.src.tar.xz + sha256: {{ sha256_compiler_rt }} + folder: compiler-rt + build: number: {{ build_number }} string: "manylinux2014h{{ PKG_HASH }}" diff --git a/conda-recipes/llvmlite/meta.yaml b/conda-recipes/llvmlite/meta.yaml index 1583d43e8..3880fd479 100644 --- a/conda-recipes/llvmlite/meta.yaml +++ b/conda-recipes/llvmlite/meta.yaml @@ -34,7 +34,6 @@ requirements: - vs2015_runtime # [win] # llvmdev is built with libz compression support - zlib # [unix and not (armv6l or armv7l)] - # requires libxml2 - libxml2 # [win] run: - python >=3.8,<3.10 diff --git a/ffi/CMakeLists.txt b/ffi/CMakeLists.txt index e4ce2c12c..ce3e24c70 100755 --- a/ffi/CMakeLists.txt +++ b/ffi/CMakeLists.txt @@ -11,6 +11,7 @@ if(NOT MSVC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti -g") endif() + find_package(LLVM REQUIRED CONFIG) message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}") @@ -70,3 +71,22 @@ elseif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") set(LLVM_EXPORTED_SYMBOLS "-Wl,-exported_symbol,_LLVMPY_*") set_property(TARGET llvmlite APPEND_STRING PROPERTY LINK_FLAGS "${LLVM_EXPORTED_SYMBOLS}") endif() + +# Copy builtins archive + +if(${CMAKE_SYSTEM_PROCESSOR} MATCHES "AMD64") # for desktop + set(ARCH "x86_64") +else() + set(ARCH ${CMAKE_SYSTEM_PROCESSOR}) +endif() + +# TODO: will need to deal with other OSes but right now this file +# seems to be used only on Windows. +if (${CMAKE_SYSTEM_NAME} MATCHES "Windows") + file(COPY ${LLVM_LIBRARY_DIR}/windows/clang_rt.builtins-${ARCH}.lib + DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) + file(RENAME ${CMAKE_CURRENT_BINARY_DIR}/clang_rt.builtins-${ARCH}.lib + ${CMAKE_CURRENT_BINARY_DIR}/clang_rt.builtins.lib) +else() + message(SEND_ERROR "Copying of builtins archive not implemented on non-Windows systems") +endif() diff --git a/ffi/Makefile.freebsd b/ffi/Makefile.freebsd index 7b869e876..8068a1c81 100644 --- a/ffi/Makefile.freebsd +++ b/ffi/Makefile.freebsd @@ -5,6 +5,7 @@ CXX = clang++ -stdlib=libc++ CXX_FLTO_FLAGS ?= -flto LD_FLTO_FLAGS ?= -flto -Wl,--exclude-libs=ALL +ARCH := `uname -m` CXXFLAGS := $(CPPFLAGS) $(CXXFLAGS) $(LLVM_CXXFLAGS) $(CXX_FLTO_FLAGS) LDFLAGS := $(LDFLAGS) $(LLVM_LDFLAGS) $(LD_FLTO_FLAGS) LIBS = $(LLVM_LIBS) @@ -13,11 +14,19 @@ SRC = assembly.cpp bitcode.cpp core.cpp initfini.cpp module.cpp value.cpp \ executionengine.cpp transforms.cpp passmanagers.cpp targets.cpp dylib.cpp \ linker.cpp object_file.cpp OUTPUT = libllvmlite.so +BUILTINS_ARCHIVE = libclang_rt.builtins.a -all: $(OUTPUT) +all: $(OUTPUT) $(BUILTINS_ARCHIVE) $(OUTPUT): $(SRC) $(INCLUDE) $(CXX) -shared $(CXXFLAGS) $(SRC) -o $(OUTPUT) $(LDFLAGS) $(LIBS) +$(BUILTINS_ARCHIVE): + if [ -d "$(LLVM_LIBDIR)/clang" ]; then \ + cp $(LLVM_LIBDIR)/clang/*/lib/freebsd/libclang_rt.builtins-$(ARCH).a $(BUILTINS_ARCHIVE); \ + else \ + cp $(LLVM_LIBDIR)/freebsd/libclang_rt.builtins-$(ARCH).a $(BUILTINS_ARCHIVE); \ + fi + clean: - rm -rf test + rm -rf test $(BUILTINS_ARCHIVE) diff --git a/ffi/Makefile.linux b/ffi/Makefile.linux index c1df42dbb..3ddcae06b 100644 --- a/ffi/Makefile.linux +++ b/ffi/Makefile.linux @@ -7,6 +7,7 @@ LD_FLTO_FLAGS ?= -flto -Wl,--exclude-libs=ALL # -fPIC is required when compiling objects for a shared library CXX_FPIC_FLAGS ?= -fPIC +ARCH := `uname -m` CXXFLAGS := $(CPPFLAGS) $(CXXFLAGS) $(LLVM_CXXFLAGS) $(CXX_FLTO_FLAGS) $(CXX_FPIC_FLAGS) LDFLAGS := $(LDFLAGS) $(LLVM_LDFLAGS) $(LD_FLTO_FLAGS) LIBS = $(LLVM_LIBS) @@ -15,8 +16,9 @@ OBJ = assembly.o bitcode.o core.o initfini.o module.o value.o \ executionengine.o transforms.o passmanagers.o targets.o dylib.o \ linker.o object_file.o custom_passes.o orcjit.o OUTPUT = libllvmlite.so +BUILTINS_ARCHIVE = libclang_rt.builtins.a -all: $(OUTPUT) +all: $(OUTPUT) $(BUILTINS_ARCHIVE) .cpp.o: $(INCLUDE) $(CXX) -c $(CXXFLAGS) $< -o $@ @@ -26,5 +28,12 @@ $(OUTPUT): $(OBJ) # particular libstdc++ version. $(CXX) $(CXX_STATIC_LINK) -shared $(CXXFLAGS) $(OBJ) -o $(OUTPUT) $(LDFLAGS) $(LIBS) +$(BUILTINS_ARCHIVE): + if [ -d "$(LLVM_LIBDIR)/clang" ]; then \ + cp $(LLVM_LIBDIR)/clang/*/lib/linux/libclang_rt.builtins-$(ARCH).a $(BUILTINS_ARCHIVE); \ + else \ + cp $(LLVM_LIBDIR)/linux/libclang_rt.builtins-$(ARCH).a $(BUILTINS_ARCHIVE); \ + fi + clean: - rm -rf test $(OUTPUT) $(OBJ) + rm -rf test $(OUTPUT) $(OBJ) $(BUILTINS_ARCHIVE) diff --git a/ffi/Makefile.osx b/ffi/Makefile.osx index a0d06db4f..89c06cbac 100644 --- a/ffi/Makefile.osx +++ b/ffi/Makefile.osx @@ -10,10 +10,18 @@ SRC = assembly.cpp bitcode.cpp core.cpp initfini.cpp module.cpp value.cpp \ executionengine.cpp transforms.cpp passmanagers.cpp targets.cpp dylib.cpp \ linker.cpp object_file.cpp custom_passes.cpp orcjit.cpp OUTPUT = libllvmlite.dylib +BUILTINS_ARCHIVE = libclang_rt.builtins.a MACOSX_DEPLOYMENT_TARGET ?= 10.9 -all: $(SRC) $(INCLUDE) +all: $(SRC) $(INCLUDE) $(BUILTINS_ARCHIVE) MACOSX_DEPLOYMENT_TARGET=$(MACOSX_DEPLOYMENT_TARGET) $(CXX) -dynamiclib $(CXXFLAGS) $(SRC) -o $(OUTPUT) $(LDFLAGS) $(LIBS) +$(BUILTINS_ARCHIVE): + if [ -d "$(LLVM_LIBDIR)/clang" ]; then \ + cp $(LLVM_LIBDIR)/clang/*/lib/darwin/libclang_rt.osx.a $(BUILTINS_ARCHIVE); \ + else \ + cp $(LLVM_LIBDIR)/darwin/libclang_rt.osx.a $(BUILTINS_ARCHIVE); \ + fi + clean: - rm -rf test + rm -rf test $(BUILTINS_ARCHIVE) diff --git a/ffi/build.py b/ffi/build.py index e58a691e0..2603dd3da 100755 --- a/ffi/build.py +++ b/ffi/build.py @@ -72,9 +72,10 @@ def find_windows_generator(): ) generators.extend([ - # use VS2019 to match how llvmdev is built + ('Visual Studio 17 2022', ('x64' if is_64bit else 'Win32'), 'v142'), + # use VS2017 toolkit on VS2019 to match how llvmdev is built ('Visual Studio 16 2019', ('x64' if is_64bit else 'Win32'), 'v142'), - # # This is the generator configuration for VS2017 + # This is the generator configuration for VS2017 # ('Visual Studio 15 2017' + (' Win64' if is_64bit else ''), None, None) ]) for generator in generators: @@ -100,8 +101,16 @@ def main_windows(): # Run configuration step try_cmake(here_dir, build_dir, *generator) subprocess.check_call(['cmake', '--build', build_dir, '--config', config]) - shutil.copy(os.path.join(build_dir, config, 'llvmlite.dll'), target_dir) + try: + shutil.copy(os.path.join(build_dir, config, 'llvmlite.dll'), target_dir) + except shutil.SameFileError: + pass + + try: + shutil.copy(os.path.join(build_dir, 'clang_rt.builtins.lib'), target_dir) + except shutil.SameFileError: + pass def main_posix_cmake(kind, library_ext): generator = 'Unix Makefiles' @@ -178,6 +187,10 @@ def main_posix(kind, library_ext): # Normalize whitespace (trim newlines) os.environ['LLVM_LIBS'] = ' '.join(libs.split()) + # Get LLVM information for building + llvm_libdir = run_llvm_config(llvm_config, ["--libdir"]).strip() + os.environ['LLVM_LIBDIR'] = llvm_libdir + cxxflags = run_llvm_config(llvm_config, ["--cxxflags"]) # on OSX cxxflags has null bytes at the end of the string, remove them cxxflags = cxxflags.replace('\0', '') @@ -208,6 +221,7 @@ def main_posix(kind, library_ext): makeopts = os.environ.get('LLVMLITE_MAKEOPTS', default_makeopts).split() subprocess.check_call(['make', '-f', makefile] + makeopts) shutil.copy('libllvmlite' + library_ext, target_dir) + shutil.copy('libclang_rt.builtins.a', target_dir) def main(): diff --git a/llvmlite/utils.py b/llvmlite/utils.py index e07ecd370..73dafb6a9 100644 --- a/llvmlite/utils.py +++ b/llvmlite/utils.py @@ -19,11 +19,17 @@ def get_library_name(): return 'llvmlite.dll' +def get_builtins_archive_name(): + if os.name == 'nt': + return 'clang_rt.builtins.lib' + return 'libclang_rt.builtins.a' + + def get_library_files(): """ Return the names of shared library files needed for this platform. """ - files = [get_library_name()] + files = [get_library_name(), get_builtins_archive_name()] if os.name == 'nt': files.extend(['msvcr120.dll', 'msvcp120.dll']) return files diff --git a/setup.py b/setup.py index 3828b1038..ad7b1b905 100644 --- a/setup.py +++ b/setup.py @@ -139,7 +139,8 @@ def _rm_walk(self): else: for fname in files: if (fname.endswith('.pyc') or fname.endswith('.so') - or fname.endswith('.o')): + or fname.endswith('.o') or fname.endswith('.a') + or fname.endswith('.dll') or fname.endswith('.lib')): fpath = os.path.join(path, fname) os.remove(fpath) log.info("removing '%s'", fpath)