llvm17/llvm17.spec
Your Name e2d40bfcb9
Some checks failed
Run CI/CD... / main (push) Failing after 23m10s
%{maj_ver}.0.%{min_ver}
2025-02-22 09:02:50 +00:00

246 lines
7.7 KiB
RPMSpec

%global optflags %(echo %{optflags} | sed -e 's/-ffat-lto-objects//g' -e 's/-fvar-tracking-assignments//g' -e 's/-Wa,//g' -e 's/--compress-debug-sections//g' -e 's/-fno-devirtualize//g' )
%define oname llvm
%define _olibdir /usr/%{_lib}
%define _prefix /opt/%{name}
%define _bindir %{_prefix}/bin
%define _datadir %{_prefix}/share
%define _includedir %{_prefix}/include
%define _libdir %{_prefix}/%{_lib}
%define _libexecdir %{_prefix}/libexec
%define _mandir %{_prefix}/share/man
%define _disable_ld_no_undefined 1
%global optflags %{optflags} -fno-strict-aliasing
%global ldflags %{ldflags} -Wl,-rpath,%{_libdir}
%define compile_apidox 1
#{?_with_apidox: %{expand: %%global compile_apidox 1}}
%define maj_ver 17
%define min_ver 6
%define libname %mklibname llvm%{maj_ver}
%if %mdkversion == 201610
%bcond_without lldb
%else
%bcond_with lldb
%endif
%define _llvm_bs_ver 16
%define commit 434575c026c81319b393f64047025b54e69e24c2
%define commit_short %(echo %{commit} | head -c 6)
Summary: LLVM and Clang in %{_prefix}
# llvm16
Name: llvm%{maj_ver}
Version: %{maj_ver}.0.%{min_ver}
Release: 2
License: NCSA
Group: Development/Other
URL: https://llvm.org
#Source0: https://github.com/llvm/llvm-project/archive/%{version}/%{name}-%{version}.tar.gz
Source0: https://github.com/llvm/llvm-project/archive/llvmorg-%{version}/%{name}-%{version}.tar.gz
Source1000: llvm%{maj_ver}.rpmlintrc
# Adjust the search paths to match the OS, adjust the default compiler flags as well.
Patch1: clang-rosa.patch
BuildRequires: gcc
BuildRequires: stdc++-devel
# gcc is too old in rosa2016.1, llvm12 was buildable with it but llvm13 is already not
BuildRequires: llvm%{_llvm_bs_ver}
BuildRequires: binutils-devel
BuildRequires: bison
BuildRequires: chrpath
BuildRequires: cmake
BuildRequires: ninja
BuildRequires: flex
BuildRequires: graphviz
BuildRequires: groff
BuildRequires: libstdc++-devel
BuildRequires: stdc++-gcc10-devel
BuildRequires: libtool
BuildRequires: pkgconfig(libffi)
BuildRequires: pkgconfig(libtirpc)
# patchelf is for %%check
BuildRequires: patchelf
BuildRequires: python3-devel
BuildRequires: python38-devel
BuildRequires: sed
BuildRequires: tcl
BuildRequires: zip
BuildRequires: pkgconfig(x11)
%if %{compile_apidox}
BuildRequires: doxygen
%endif
#BuildRequires: clang
Requires: libstdc++-devel
Requires: stdc++-gcc10-devel
# Do not provide libraries rom /opt and do not try to depend from them
# ! Nothing must be linked with libllvm etc. from here!
AutoReq: 0
AutoProv: 0
# Require this manually instead of AutoReq
%if %rpm4
Requires: %(patchelf --print-soname /usr/%{_lib}/libffi.so || echo foo)%{_arch_tag_suffix}
%else
# _arch_tag_suffix in needed form does not exist in rpm5, make a more dirty hack
Requires: %{_lib}ffi%(patchelf --print-soname /usr/%{_lib}/libffi.so | rev | cut -d. -f1 | rev)
%endif
%description
LVM is a robust system, particularly well suited for developing new mid-level
language-independent analyses and optimizations of all sorts, including those
that require extensive interprocedural analysis. LLVM is also a great target
for front-end development for conventional or research programming languages,
including those which require compile-time, link-time, or run-time optimization
for effective implementation, proper tail calls or garbage collection.
This package contains LLVM and Clang in %{_prefix}.
%files
%{_prefix}
#----------------------------------------------------------------------------
%package -n %{libname}
Summary: LLVM %{maj_ver} shared library
Group: System/Libraries
AutoReq: 1
AutoProv: 1
%description -n %{libname}
LLVM %{maj_ver} shared library
%files -n %{libname}
%{_olibdir}/libLLVM-%{maj_ver}*.so
#----------------------------------------------------------------------------
%prep
%setup -qn llvm-project-llvmorg-%{version}
%build
# gcc is too old in rosa2016.1
#export CC=gcc
#export CXX=g++
export CC=/opt/llvm%{_llvm_bs_ver}/bin/clang
export CXX=/opt/llvm%{_llvm_bs_ver}/bin/clang++
export AR=/opt/llvm%{_llvm_bs_ver}/bin/llvm-ar
export NM=/opt/llvm%{_llvm_bs_ver}/bin/llvm-nm
%setup_compile_flags
# A couple more fixes from OMV + a workaround for a bug (?) in GCC 4.9:
# https://llvm.org/bugs/show_bug.cgi?id=20080 and
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61659
# (-fno-devirtualize)
#
# compiler-rt assumes off_t is 64 bits -- make sure this is true even on
# 32 bit OSes
%ifarch %ix86
# compiler-rt doesn't support ix86 with x<6 either
export CFLAGS="%{optflags} -march=i686 -D_LARGEFILE_SOURCE=1 -D_LARGEFILE64_SOURCE=1 -D_FILE_OFFSET_BITS=64 -g1"
export CXXFLAGS="%{optflags} -march=i686 -D_LARGEFILE_SOURCE=1 -D_LARGEFILE64_SOURCE=1 -D_FILE_OFFSET_BITS=64 -fno-devirtualize -g1 -Wno-redundant-move"
%else
export CXXFLAGS="%{optflags} -fno-devirtualize -g1 -Wno-redundant-move"
export CFLAGS="`echo %{optflags} | sed -e 's/-gdwarf-4//' -e 's/-fvar-tracking-assignments//' -e 's/-frecord-gcc-switches//' -e 's/-flto//g'`"
%endif
%ifarch %ix86
# Fix noexecstack
for i in compiler-rt/lib/builtins/i386/*.S; do
cat >>$i <<'EOF'
#if defined(__linux__) && defined(__ELF__)
.section .note.GNU-stack,"",%progbits
#endif
EOF
done
%endif
%if %{mdvver} == 201610
export PYTHONPATH=/usr/bin
export PATH=$PYTHONPATH:$PATH
%endif
export CXXFLAGS="$CFLAGS"
export READELF=readelf
export LDFLAGS="-lstdc++-gcc10"
#clang_gcc_wrapper
mkdir -p build
# We actually need only clang and lld to build chromium-browser-stable,
# other subprojects fail to build when using /opt/llvm12/bin/clang++,
# build OK when using gcc, but gcc is too old in rosa2016.1,
# so let's build clang and lld only for now.
# -DLLVM_ENABLE_PROJECTS='clang-tools-extra;libcxx;libcxxabi;%{!?with_lldb:lldb;}compiler-rt;lld;polly'
cmake -S llvm -B build -G Ninja \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DCMAKE_INSTALL_PREFIX:PATH=%{_prefix} \
-DCMAKE_BUILD_TYPE=Release \
-DLLVM_ENABLE_PROJECTS='clang;lld' \
-DBUILD_SHARED_LIBS:BOOL=OFF \
-DLLVM_BUILD_LLVM_DYLIB:BOOL=ON \
-DLLVM_VERSION_SUFFIX="" \
-DLLVM_INCLUDE_TESTS:BOOL=OFF \
-DLLVM_LIBDIR_SUFFIX=$(echo %{_lib} | sed -e 's,^lib,,') \
-DCLANG_LIBDIR_SUFFIX=$(echo %{_lib} | sed -e 's,^lib,,') \
-DCLANG_DEFAULT_CXX_STDLIB="libstdc++" \
-DCLANG_DEFAULT_RTLIB="libgcc" \
-DLLVM_ENABLE_FFI:BOOL=ON \
-DLLVM_ENABLE_RTTI:BOOL=ON \
-DOCAMLFIND=NOTFOUND \
%if %{mdvver} <= 201610
-DLLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN:BOOL=ON \
%endif
%if %{compile_apidox}
-DLLVM_INCLUDE_DOCS:BOOL=ON \
-DLLVM_BUILD_DOCS:BOOL=ON \
%endif
-DLLVM_OPTIMIZED_TABLEGEN=ON \
-DCMAKE_CXX_FLAGS="-nostdinc++ -I/usr/include/libstdc++-gcc10 -I/usr/include/libstdc++-gcc10/%{_host} -Wc++11-narrowing " \
-DCMAKE_C_FLAGS="-nostdinc++ -I/usr/include/libstdc++-gcc10 -I/usr/include/libstdc++-gcc10/%{_host} -Wc++11-narrowing "
cmake --build build
%install
DESTDIR=%{buildroot} cmake --install build
# [From OMV]
# Polly bits as described on
# http://polly.llvm.org/example_load_Polly_into_clang.html
cat >%{buildroot}%{_bindir}/pollycc <<'EOF'
#!/bin/sh
exec %{_bindir}/clang -O3 -Xclang -load -Xclang %{_libdir}/LLVMPolly.so "$@"
EOF
cat >%{buildroot}%{_bindir}/pollyc++ <<'EOF'
#!/bin/sh
exec %{_bindir}/clang++ -O3 -Xclang -load -Xclang %{_libdir}/LLVMPolly.so "$@"
EOF
chmod 0755 %{buildroot}%{_bindir}/pollycc %{buildroot}%{_bindir}/pollyc++
# Install libraries used for testing
cp -a build/%{_lib}/BugpointPasses.so %{buildroot}%{_libdir}
cp -a build/%{_lib}/LLVMHello.so %{buildroot}%{_libdir}
# Will be used in Mesa
mkdir -p %{buildroot}%{_olibdir}
install -m0755 %{buildroot}%{_libdir}/libLLVM-%{maj_ver}.so %{buildroot}%{_olibdir}
# RPATH to /opt/... is not needed here
patchelf --remove-rpath %{buildroot}%{_olibdir}/*.so*
# Versionize shebangs python
sed '1 s,^.*$,#!%{__python3},' -i %{buildroot}%{_bindir}/{hmaptool,scan-view}
%check
#atchelf --print-rpath %{buildroot}%{_bindir}/clang | grep -q %{_libdir}