%bcond_without sys_llvm
%bcond_without check
%bcond_without toolchain_clang
%bcond_without bisheng_autotuner

%if %{with toolchain_clang}
%global toolchain clang
%endif

%global maj_ver 17
%global min_ver 0
%global patch_ver 6
%global mlir_version %{maj_ver}.%{min_ver}.%{patch_ver}
%global mlir_srcdir mlir-%{mlir_version}%{?rc_ver:rc%{rc_ver}}.src

%if %{with sys_llvm}
%global pkg_name mlir
%global install_prefix %{_prefix}
%global install_datadir %{_datadir}
%else
%global pkg_name mlir%{maj_ver}
%global install_prefix %{_libdir}/llvm%{maj_ver}
%global install_datadir %{install_prefix}/share
%endif

%global install_bindir %{install_prefix}/bin
%if 0%{?__isa_bits} == 64
%global install_libdir %{install_prefix}/lib64
%else
%global install_libdir %{install_prefix}/lib
%endif
%global install_includedir %{install_prefix}/include

Name:		%{pkg_name}
Version:	%{mlir_version}
Release:	3
Summary:	The MLIR project is a novel approach to building reusable and extensible compiler infrastructure.
License:	Apache 2.0
URL:		https://mlir.llvm.org/

Source0:	https://github.com/llvm/llvm-project/releases/download/llvmorg-%{mlir_version}/%{mlir_srcdir}.tar.xz
Source1:	https://github.com/llvm/llvm-project/releases/download/llvmorg-%{mlir_version}/%{mlir_srcdir}.tar.xz.sig

Patch0:		fedora-0001-mlir-python-Reuse-the-library-directory.patch

BuildRequires: clang
BuildRequires: gcc gcc-c++ cmake ninja-build zlib-devel python3-lit
%if %{with sys_llvm}
BuildRequires:  llvm-devel = %{version}
BuildRequires:  llvm-googletest = %{version}
BuildRequires:  llvm-test = %{version}
BuildRequires:  llvm-cmake-utils = %{version}
%else
BuildRequires:	llvm%{maj_ver}-devel = %{version}
BuildRequires:	llvm%{maj_ver}-googletest = %{version}
BuildRequires:	llvm%{maj_ver}-test = %{version}
BuildRequires:  llvm%{maj_ver}-cmake-utils = %{version}
%endif
BuildRequires: python3-devel
BuildRequires: python3-numpy
BuildRequires: python3-pybind11
BuildRequires: python3-pyyaml

%description
The MLIR project is a novel approach to building reusable and extensible compiler infrastructure.
MLIR aims to address software fragmentation, improve compilation for heterogeneous hardware,
significantly reduce the cost of building domain specific compilers, and aid in connecting
existing compilers together.

%package static
Summary: MLIR static files
Requires: %{name} = %{version}

%description static
MLIR static files.

%package devel
Summary: MLIR development files
Requires: %{name} = %{version}-%{release}
Requires: %{name}-static = %{version}-%{release}

%description devel
MLIR development files.

%package -n python3-%{name}
Summary: MLIR python bindings
Requires: python3
Requires: python3-numpy
 
%description -n python3-%{name}
%{summary}

%prep
%autosetup -n %{mlir_srcdir} -p2

%build
%cmake	-G Ninja \
	-DCMAKE_BUILD_TYPE=RelWithDebInfo \
	-DCMAKE_SKIP_RPATH=ON \
	-DLLVM_LINK_LLVM_DYLIB:BOOL=ON \
	-DLLVM_BUILD_LLVM_DYLIB=ON \
	-DCMAKE_PREFIX_PATH=%{install_libdir}/cmake/llvm/ \
	-DLLVM_EXTERNAL_LIT=%{install_bindir}/lit \
	-DLLVM_THIRD_PARTY_DIR=%{install_datadir}/llvm/src/utils \
	-DLLVM_COMMON_CMAKE_UTILS=%{install_datadir}/llvm/cmake \
	-DLLVM_BUILD_UTILS:BOOL=ON \
	-DLLVM_LIBRARY_OUTPUT_INTDIR="." \
	-DLLVM_SHLIB_OUTPUT_INTDIR="%{_builddir}/%{mlir_srcdir}/lib/ExecutionEngine/" \
	-DMLIR_INCLUDE_DOCS:BOOL=ON \
	-DMLIR_INCLUDE_TESTS:BOOL=ON \
	-DMLIR_INCLUDE_INTEGRATION_TESTS:BOOL=OFF \
	-DBUILD_SHARED_LIBS=OFF \
	-DMLIR_INSTALL_AGGREGATE_OBJECTS=OFF \
	-DMLIR_BUILD_MLIR_C_DYLIB=ON \
%if "%{toolchain}" == "clang"
	-DCMAKE_C_COMPILER=clang \
	-DCMAKE_CXX_COMPILER=clang++ \
%endif
%if %{with bisheng_autotuner}
	-DLLVM_ENABLE_AUTOTUNER=ON \
%endif
%ifarch aarch64 %ix86 ppc64le x86_64
	-DLLVM_PARALLEL_LINK_JOBS=1 \
%endif
%ifarch %ix86
	-DMLIR_RUN_X86VECTOR_TESTS:BOOL=OFF \
%endif
	-DMLIR_ENABLE_BINDINGS_PYTHON:BOOL=ON \
%if 0%{?__isa_bits} == 64
	-DLLVM_LIBDIR_SUFFIX=64 \
%else
	-DLLVM_LIBDIR_SUFFIX=
%endif
%ifarch %ix86 x86_64
	-DLLVM_TARGETS_TO_BUILD="X86"
%endif
%ifarch aarch64
	-DLLVM_TARGETS_TO_BUILD="AArch64"
%endif

%ninja_build

%install
%ninja_install

mkdir -p %{buildroot}/%{python3_sitearch}
mv %{buildroot}/usr/python_packages/mlir_core/mlir %{buildroot}/%{python3_sitearch}
# These directories should be empty now.
rmdir %{buildroot}/usr/python_packages/mlir_core %{buildroot}/usr/python_packages
# Unneeded files.
rm -rf %{buildroot}/usr/src/python

%check
%if %{with check}
# TODO: Investigate the following issues.
rm -rf test/mlir-pdll-lsp-server/compilation_database.test
rm -rf test/mlir-pdll-lsp-server/completion.test
rm -rf test/mlir-pdll-lsp-server/definition-split-file.test
rm -rf test/mlir-pdll-lsp-server/definition.test
rm -rf test/mlir-pdll-lsp-server/document-links.test
rm -rf test/mlir-pdll-lsp-server/document-symbols.test
rm -rf test/mlir-pdll-lsp-server/exit-eof.test
rm -rf test/mlir-pdll-lsp-server/exit-with-shutdown.test
rm -rf test/mlir-pdll-lsp-server/exit-without-shutdown.test
rm -rf test/mlir-pdll-lsp-server/hover.test
rm -rf test/mlir-pdll-lsp-server/initialize-params-invalid.test
rm -rf test/mlir-pdll-lsp-server/initialize-params.test
rm -rf test/mlir-pdll-lsp-server/inlay-hints.test
rm -rf test/mlir-pdll-lsp-server/references.test
rm -rf test/mlir-pdll-lsp-server/signature-help.test
rm -rf test/mlir-pdll-lsp-server/textdocument-didchange.test
rm -rf test/mlir-pdll-lsp-server/view-output.test

rm -rf test/mlir-tblgen/directive-common.td
rm -rf test/mlir-tblgen/llvm-intrinsics.td
rm -rf test/tblgen-lsp-server/document-links.test
rm -rf test/tblgen-lsp-server/hover.test

# build process .exe tools normally use rpath or static linkage
export LD_LIBRARY_PATH=%{buildroot}/%{_libdir}:%{buildroot}/%{python3_sitearch}/mlir/_mlir_libs
export PYTHONPATH=%{buildroot}/%{python3_sitearch}
%ninja_build check-mlir
%endif

%files
%license LICENSE.TXT
%{install_libdir}/libMLIR*.so.*
%{install_libdir}/libmlir_runner_utils.so.*
%{install_libdir}/libmlir_c_runner_utils.so.*
%{install_libdir}/libmlir_float16_utils.so.%{maj_ver}*
%{install_libdir}/libmlir_async_runtime.so.*

%files static
%{install_libdir}/libMLIR*.a

%files devel
%{install_bindir}/mlir-tblgen
%{install_bindir}/mlir-pdll
%{install_libdir}/libMLIR*.so
%{install_libdir}/libmlir_runner_utils.so
%{install_libdir}/libmlir_c_runner_utils.so
%{install_libdir}/libmlir_float16_utils.so
%{install_libdir}/libmlir_async_runtime.so
%{install_includedir}/mlir	
%{install_includedir}/mlir-c	
%{install_libdir}/cmake/mlir

%files -n python3-%{name}
%{python3_sitearch}/mlir/

%changelog
* Tue Aug 20 2024 liyunfei <liyunfei33@huawei.com> - 17.0.6-3
- Add BiSheng Autotuner support.

* Fri Jul 5 2024 liyunfei <liyunfei33@huawei.com> - 17.0.6-2
- Add toolchain_clang build support

* Sun Jun 25 2023 zhoujing <zhoujing106@huawei.com> - 17.0.6-1
- Update to 17.0.6

* Sun Jun 25 2023 cf-zhao <zhaochuanfeng@huawei.com> - 15.0.7-1
- Update to 15.0.7

* Wed Nov 16 2022 liyancheng <412998149@qq.com> - 12.0.1-0
- Type:Init
- ID:NA
- SUG:NA
- DESC:Init llvm-mlir repository
