File DirectXShaderCompiler.spec of Package DirectXShaderCompiler
# spec file for package DirectXShaderCompiler
#
# Copyright (c) 2022 Matteo De Carlo
# Copyright (c) 2023 Sergey Kondakov <virtuousfox@gmail.com>
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
# upon. The license for this file, and modifications and additions to the
# file, is the same license as for the pristine package itself (unless the
# license for the pristine package is not an Open Source License, in which
# case the license is the MIT License). An "Open Source License" is a
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
%define __builder ninja
%global use_clang 1
%global use_lld 1
%ifarch x86_64
%define use_lto 1
%else
%define use_lto 0
%endif
%define so_ver 3_7
%define real_version 1.8.2502
Name: DirectXShaderCompiler
Version: 1.8.2505.1+0~git20250701.b106a961d
Release: 0
Summary: DirectX Shader Compiler
License: Apache-2.0 WITH LLVM-exception OR NCSA
Group: Development/Graphics
URL: https://github.com/microsoft/DirectXShaderCompiler/
Source0: %{name}-%{version}.tar.zst
BuildRoot: %{_tmppath}/%{name}-%{version}-build
%if "%{__builder}" == "ninja"
BuildRequires: ninja
%endif
%if 0%{?use_clang}
BuildRequires: clang-devel
#BuildRequires: npth-devel
%if 0%{?use_lld}
BuildRequires: lld
%else
BuildRequires: binutils-gold
BuildRequires: llvm-gold
%endif
%else
BuildRequires: binutils-gold
BuildRequires: gcc-c++
%endif
BuildRequires: cmake
BuildRequires: llvm-devel
BuildRequires: libxml2-devel
BuildRequires: ocaml
BuildRequires: git
BuildRequires: xz
Provides: directxshadercompiler = %{real_version}
Provides: dxc = %{real_version}
%description
The DirectX Shader Compiler project includes a compiler and related tools used to compile
High-Level Shader Language (HLSL) programs into DirectX Intermediate Language (DXIL) representation.
Applications that make use of DirectX for graphics, games, and computation can use it to generate shader programs.
%package devel
Summary: DirectX Shader Compiler development files
Group: Development/Graphics
Requires: %{name}
%description devel
DirectX Shader Compiler development files
%package libdxcompiler%{so_ver}
Summary: DirectX Shader Compiler library
Group: Development/Graphics
Provides: libdxcompiler = %{version}
Provides: dxc-libdxcompiler = %{real_version}
%description libdxcompiler%{so_ver}
DirectX Shader Compiler standalone dynamic library
%package libdxcompiler-devel
Summary: DirectX Shader Compiler library development files
Group: Development/Graphics
Requires: %{name}-libdxcompiler%{so_ver}
Provides: dxc-libdxcompiler-devel = %{real_version}
%description libdxcompiler-devel
DirectX Shader Compiler standalone dynamic library
%prep
%setup -q
# clean out hardcoding
%if 0%{?use_clang}
sed -i -e 's/ -fno-exceptions//g' -e 's/ -fno-rtti//g' -e '/add_compile_options(-fno-rtti)/d' \
external/SPIRV-Tools/CMakeLists.txt
sed -i -e '/"-Werror",/d' -e '/"-fno-exceptions",/d' -e '/"-fno-rtti",/d' \
external/SPIRV-Tools/build_defs.bzl
sed -i -e '/CmdArgs.push_back("-fno-exceptions");/d' -e '/CmdArgs.push_back("-fno-rtti");/d' -e '/CmdArgs.push_back("-fno-rtti-data");/d' \
tools/clang/lib/Driver/Tools.cpp
sed -i -e '/list(APPEND LLVM_COMPILE_FLAGS "-fno-exceptions")/d' \
-e '/list(APPEND LLVM_COMPILE_FLAGS "-fno-rtti")/d' \
-e '/set(LLVM_REQUIRES_RTTI OFF)/d' \
cmake/modules/AddLLVM.cmake
%endif
sed -i -e '/add_flag_if_supported("-flto" SUPPORST_FLTO)/d' cmake/modules/HandleLLVMOptions.cmake
%build
# this macro needs 'BuildRequires: memory-constraints'
#limit_build -m 3072
ulimit -Sn 4000
UCFLAGS="-fPIC -O3"
%ifarch x86_64
export UCFLAGS="${UCFLAGS} -march=x86-64 -mtune=generic -mssse3 -msse4 -msse4.1 -msse4.2 -mavx -maes -mpclmul"
%else
%ifarch %ix86
export UCFLAGS="${UCFLAGS} -march=x86-64 -mtune=i586 -mssse3 -msse4 -msse4.1 -msse4.2 -mavx -maes -mpclmul"
%endif
%endif
export ULDFLAGS="-fPIC -Wl,--gc-sections -Wl,-O1 -Wl,--icf=safe"
%if 0%{?use_lld}
export ULDFLAGS="${ULDFLAGS} -fuse-ld=lld"
%ifarch %ix86 %arm
export ULDFLAGS="${ULDFLAGS} -Wl,-z,notext"
%endif
export LD="lld"
alias ld=ld.lld
%else
export ULDFLAGS="${ULDFLAGS} -fuse-ld=gold -Wl,--sort-common -Wl,-O1"
export LD=ld.gold
alias ld=gold
%endif
%if 0%{?use_clang}
export CC=clang
export CXX=clang++
#export CPP='clang -E' LD=ld.lld AR=llvm-ar AS=llvm-as NM=llvm-nm OBJCOPY=llvm-objcopy OBJDUMP=llvm-objdump RANLIB=llvm-ranlib
export UCFLAGS="${UCFLAGS} -v -fbracket-depth=1024 -fconstexpr-depth=1024"
%ifarch x86_64
#export UCFLAGS="${UCFLAGS} -fglobal-isel"
%endif
#export UCFLAGS="${UCFLAGS} -relocatable-pch -D_GNU_SOURCE -fexceptions"
export UCXXFLAGS="${UCFLAGS} -fpermissive"
export UCXXFLAGS="${UCFLAGS} -fcxx-exceptions"
export HOST="$(${CC} -print-target-triple)"
%if 0%{?use_lto}
%if 0%{?use_lld}
%global _lto_cflags -flto=thin
%global _lto_ldlags -flto=thin -Wl,--plugin-opt=O3 %{?jobs:-Wl,--threads=%{jobs}}
%else
%global _lto_cflags -flto=thin
%global _lto_ldlags -flto=thin
%endif
%else
%global _lto_cflags %nil
%global _lto_ldlags %nil
%endif
%else
export CC=gcc
export CXX=g++
export UCFLAGS="${UCFLAGS} -ftree-parallelize-loops=16 -ftree-vectorize -fvect-cost-model=cheap -fpredictive-commoning"
export UCXXFLAGS="${UCFLAGS} -fpermissive"
export HOST="%{_target_platform}"
%if 0%{?use_lto}
%global _lto_cflags -fuse-linker-plugin %_lto_cflags -ffat-lto-objects -flto-odr-type-merging
%global _lto_ldlags -fuse-linker-plugin -flto=2
%else
%global _lto_cflags %nil
%global _lto_ldlags %nil
%endif
%endif
export TARGET="${HOST}"
export UCFLAGS="${UCFLAGS} %_lto_cflags"
export UCXXFLAGS="${UCXXFLAGS} %_lto_cflags"
export ULDFLAGS="${ULDFLAGS} %_lto_cflags %_lto_ldlags"
# override OBS defaults ?
export CFLAGS="${UCFLAGS}"
export CXXFLAGS="${UCXXFLAGS}"
export LDFLAGS="${ULDFLAGS}"
# -DCMAKE_CXX_FLAGS='-Wno-error=restrict -Wno-error=stringop-overflow='
# -DLLVM_USE_INTEL_JITEVENTS=ON \
# -DLLVM_USE_OPROFILE=ON
# -DCMAKE_BUILD_TYPE=MinSizeRel
# -DHLSL_OPTIONAL_PROJS_IN_DEFAULT=ON \
# -DLLVM_OPTIMIZED_TABLEGEN=ON \
# -DLLVM_ENABLE_ASSERTIONS=ON \
# -DENABLE_EXCEPTIONS=ON \
# see https://github.com/microsoft/DirectXShaderCompiler/issues/4480 for ass-backwards workarounds from cmake/caches/PredefinedParams.cmake
# LTO here makes AMDVLK screwy
mkdir build
cd build
cmake .. \
-G Ninja \
-DCMAKE_BUILD_TYPE=Release \
%if 0%{?use_lto}
-DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON \
-DSUPPORST_FLTO=ON \
-DLLVM_ENABLE_LTO=ON \
%else
-DCMAKE_INTERPROCEDURAL_OPTIMIZATION=OFF \
-DSUPPORST_FLTO=OFF \
-DLLVM_ENABLE_LTO=OFF \
%endif
%if 0%{?use_clang}
-DCMAKE_C_COMPILER="${CC}" \
-DCMAKE_CXX_COMPILER="${CXX}" \
-DCMAKE_LINKER="${LD}" \
%endif
-DCMAKE_C_FLAGS="${CFLAGS}" \
-DCMAKE_CXX_FLAGS="${CXXFLAGS}" \
-DCMAKE_EXE_LINKER_FLAGS="${LDFLAGS}" \
-DCMAKE_MODULE_LINKER_FLAGS="${LDFLAGS}" \
-DCMAKE_SHARED_LINKER_FLAGS="${LDFLAGS}" \
-DCMAKE_INSTALL_PREFIX="%{_prefix}" \
-DCMAKE_INSTALL_LIBEXEC="%{_libexecdir}" \
-DCMAKE_SKIP_RPATH=OFF \
-DCMAKE_INSTALL_RPATH="" \
-DCMAKE_BUILD_WITH_INSTALL_RPATH=OFF \
-DCMAKE_SKIP_INSTALL_RPATH=ON \
-DUSE_PCH=OFF -DENABLE_PCH=OFF \
-DENABLE_PRECOMPILED_HEADERS=OFF \
-DSKIP_PRECOMPILE_HEADERS=ON \
-DUSE_PRECOMPILED_HEADERS=OFF \
-C ../cmake/caches/PredefinedParams.cmake \
-DHLSL_OFFICIAL_BUILD=ON \
-DHLSL_OPTIONAL_PROJS_IN_DEFAULT=OFF \
-DHLSL_SUPPORT_QUERY_GIT_COMMIT_INFO=OFF \
-DLLVM_USE_FOLDERS=OFF \
-DLLVM_INSTALL_UTILS=OFF \
-DLLVM_INSTALL_TOOLCHAIN_ONLY=ON \
%if 0%{?use_clang}
-DLLVM_OPTIMIZED_TABLEGEN=ON \
-DLLVM_ENABLE_ASSERTIONS=ON \
-DLLVM_ENABLE_EXCEPTIONS=ON \
-DENABLE_EXCEPTIONS=ON \
%endif
-DBUILD_SHARED_LIBS=OFF \
-DBUILD_STATIC_LIBS=ON \
-DHLSL_INCLUDE_TESTS=ON \
-DSPIRV_BUILD_TESTS=OFF \
-DLLVM_USE_INTEL_JITEVENTS=ON
%cmake_build
%install
%cmake_install
mkdir -p %{buildroot}%{_includedir} || echo "whatever"
if [ ! -d "%{buildroot}%{_includedir}/dxc" ]; then
mv -v build/include/dxc %{buildroot}%{_includedir}/
fi
mkdir -p %{buildroot}/%{_libdir} || echo "whatever"
if [ ! -f "%{buildroot}/%{_libdir}/libdxcompiler.so" ]; then
mv -v build/lib*/libdxc* %{buildroot}/%{_libdir}/
fi
# fix correct lib folder
%ifarch x86_64
if [ -d "%{buildroot}/%{_exec_prefix}/lib" ]; then
mkdir -p %{buildroot}/%{_libdir} || echo "whatever"
mv -v %{buildroot}/%{_exec_prefix}/lib/* %{buildroot}/%{_libdir}/
rmdir %{buildroot}/%{_exec_prefix}/lib || echo "whatever"
fi
%endif
# Remove static libraries, don't think they are needed at all
#rm %{buildroot}/%{_libdir}/*.a
%files
%doc README.md
%license LICENSE.TXT
%{_bindir}/dx*
%files devel
%{_includedir}/*
%exclude %{_includedir}/dxc
#{_includedir}/llvm*
#{_datadir}/*
#{_bindir}/llvm-*
#{_bindir}/opt
%{_libdir}/*.a
%ifarch aarch64
%{_prefix}/lib/*.a
%endif
%exclude %{_libdir}/libdxclib.a
%files libdxcompiler%{so_ver}
%{_libdir}/libdxcompiler.so*
%ifarch aarch64
%{_prefix}/lib/libdxcompiler.so*
%endif
%files libdxcompiler-devel
%{_includedir}/dxc
#{_libdir}/libdxcompiler.so
%{_libdir}/libdxclib.a
%post libdxcompiler%{so_ver} -p /sbin/ldconfig
%postun libdxcompiler%{so_ver} -p /sbin/ldconfig
%changelog