%global pkgvers 0 %global scdate0 20240507 %global sctags0 releases/gcc-14.1.0 %global scfilt0 releases/gcc.*^{} %global source0 https://github.com/gcc-mirror/gcc.git %global bootstrap 0 %define sysarch linux-gnu %define targets aarch64;or1k;ppc64le;riscv32;riscv64 Name: cross-%{sysarch}-gcc Version: %(curl -s https://raw.githubusercontent.com/gcc-mirror/gcc/%{sctags0}/gcc/BASE-VER) Release: %{scdate0}.%{pkgvers}%{?dist} Summary: GNU GCC for cross-compilation to cross targets License: GPLv2+ and GPLv3+ and LGPLv2+ and BSD URL: https://gcc.gnu.org %define maj_ver %(echo "%{version}" | cut -d'.' -f1) %define cpulist %(echo "%{targets}" | sed "s|%{_arch}||g") BuildRequires: git gcc-c++ flex bison texinfo BuildRequires: zlib-devel libzstd-devel libunwind-devel gmp-devel mpfr-devel libmpc-devel %if ! %{bootstrap} BuildRequires: isl-devel %endif %if ! (0%{?rhel} == 9) BuildRequires: autogen %endif %{lua: for target in string.gmatch(rpm.expand("%{cpulist}"), "[%w_-]+") do print("BuildRequires: "..target.."-linux-gnu-binutils\n") if (rpm.expand("%{bootstrap}") == "0") then print("Suggests: "..target.."-glibc\n") print("BuildRequires: "..target.."-libc\n") print("BuildRequires: "..target.."-kernel-headers\n") end end} %global __brp_strip_lto %{nil} %global __os_install_post /usr/lib/rpm/brp-compress %global __provides_exclude_from ^(%{_prefix}/.*-%{sysarch}/.*$|%{_prefix}/lib/gcc/.*-%{sysarch}/.*$) %global __requires_exclude_from ^(%{_prefix}/.*-%{sysarch}/.*$|%{_prefix}/lib/gcc/.*-%{sysarch}/.*$) %global optflags %(echo %{optflags} | sed 's|-Werror=format-security||') %description This is a Cross Compiling version of GNU GCC, which can be used to compile for the cross platform, instead of for the native platform. %{lua: for target in string.gmatch(rpm.expand("%{cpulist}"), "[%w_-]+") do print("%package -n "..target.."-"..rpm.expand("%{sysarch}").."-gcc\n") print("Summary: GNU GCC for cross-compilation to "..target.." target\n") print("Requires: "..target.."-"..rpm.expand("%{sysarch}").."-binutils\n") if (rpm.expand("%{bootstrap}") == "0") then print("Requires: "..target.."-libc\n") print("Suggests: "..target.."-glibc\n") end print(rpm.expand("Provides: "..target.."-gcc = %{version}\n")) print("%description -n "..target.."-"..rpm.expand("%{sysarch}").."-gcc\n") print("GNU GCC for cross-compilation to "..target.." target\n") print("\n") end} %if ! %{bootstrap} %{lua: for target in string.gmatch(rpm.expand("%{cpulist}"), "[%w_-]+") do print("%package -n "..target.."-"..rpm.expand("%{sysarch}").."-gcc-c++\n") print("Summary: GNU GCC C++ for cross-compilation to "..target.." target\n") print("Requires: "..target.."-"..rpm.expand("%{sysarch}").."-gcc\n") print(rpm.expand("Provides: "..target.."-gcc-c++ = %{version}\n")) print("%description -n "..target.."-"..rpm.expand("%{sysarch}").."-gcc-c++\n") print("GNU GCC C++ for cross-compilation to "..target.." target\n") end} %endif %prep %setup -T -c -n %{name} git clone --depth 1 -n -b %{sctags0} %{source0} . git fetch --depth 1 origin %{sctags0} git reset --hard %{sctags0} git --no-pager log --format=fuller %autosetup -D -p 0 -T -c -n %{name} %build contrib/gcc_update --touch for target in $(echo "%{cpulist}" | sed 's|;| |g'); do echo "Building for [$target]" mkdir -p build-$target-%{sysarch} pushd build-$target-%{sysarch} cargs="" case $target in ppc64le) cargs="$cargs --with-long-double-128" ;; riscv32) cargs="$cargs --with-multilib-list=ilp32d" ;; riscv64) cargs="$cargs --with-multilib-list=lp64d" ;; esac ../configure \ --prefix=%{_prefix} --mandir=%{_mandir} \ --libdir=%{_prefix}/lib --includedir=%{_includedir} \ --with-pkgversion="RedHat %{version}-%{release}" \ --infodir=%{_infodir} --target=$target-%{sysarch} \ --with-ld=%{_bindir}/$target-%{sysarch}-ld \ --with-sysroot=%{_prefix}/$target-%{sysarch} \ --with-build-sysroot=%{_prefix}/$target-%{sysarch} \ --with-local-prefix=%{_prefix}/$target-%{sysarch} \ --with-python-dir=share/$target-%{sysarch}/gcc-%{maj_ver}/python \ --with-linker-hash-style=gnu \ --with-gcc-major-version-only \ --with-zstd \ --with-system-zlib \ --with-system-libunwind \ --enable-tls \ --enable-lto \ --enable-plugins \ --enable-multilib \ --enable-interwork \ --enable-checking=release \ --enable-__cxa_atexit \ --enable-initfini-array \ --enable-linker-build-id \ --enable-libstdcxx-backtrace \ --enable-gnu-unique-object \ --enable-gnu-indirect-function \ --disable-gold \ --disable-libunwind-exceptions \ --disable-silent-rules \ --disable-sjlj-exceptions \ --disable-libgcj \ --disable-libmpx \ --disable-libssp \ --disable-libgomp \ --disable-libmudflap \ --disable-libquadmath \ --disable-nls \ --disable-threads \ %if %{bootstrap} --with-newlib \ --disable-shared \ --enable-languages=c,lto \ %else --without-newlib \ --enable-shared \ --enable-languages=c,c++,lto \ %endif $cargs %if %{bootstrap} make all-gcc all-target-libgcc %{?_smp_mflags} %else make %{?_smp_mflags} %endif popd done %install for target in $(echo "%{cpulist}" | sed 's|;| |g'); do echo "Installing for [$target]" pushd build-$target-%{sysarch} %if %{bootstrap} make install-gcc install-target-libgcc DESTDIR=%{buildroot} %else make install DESTDIR=%{buildroot} %endif popd # we don't want these as we are a cross version rm -r %{buildroot}%{_infodir} rm -r %{buildroot}%{_mandir}/man7 rm -f %{buildroot}%{_prefix}/lib/libiberty.a rm -f %{buildroot}%{_libdir}/libcc1* ||: # these directories are often empty rmdir %{buildroot}/%{_prefix}/$target-%{sysarch}/share/gcc-%{maj_ver} ||: rmdir %{buildroot}/%{_prefix}/$target-%{sysarch}/share ||: # remove library artefacts find %{buildroot}/%{_prefix}/$target-%{sysarch}/ -name '*.o' -o -name '*.la' -o -name '*.py' -exec rm {} + ||: # and these aren't usefull for embedded targets rm -r %{buildroot}%{_prefix}/lib*/gcc/$target-%{sysarch}/%{maj_ver}/install-tools ||: rm -r %{buildroot}%{_libexecdir}/gcc/$target-%{sysarch}/%{maj_ver}/install-tools ||: rm -f %{buildroot}%{_libexecdir}/gcc/$target-%{sysarch}/%{maj_ver}/*.la # move libgcc_s to main mv %{buildroot}%{_prefix}/$target-%{sysarch}/lib*/libgcc_s*.so* %{buildroot}%{_prefix}/lib/gcc/$target-%{sysarch}/%{maj_ver}/ ||: mv %{buildroot}%{_prefix}/$target-%{sysarch}/lib*/*/libgcc_s*.so* %{buildroot}%{_prefix}/lib/gcc/$target-%{sysarch}/%{maj_ver}/ ||: # move docs mkdir -p %{buildroot}/usr/$target-%{sysarch}/share/gcc-%{maj_ver}/ mv %{buildroot}/%{_datadir}/gcc-%{maj_ver}/* %{buildroot}/usr/$target-%{sysarch}/share/gcc-%{maj_ver}/ ||: rm -rf %{buildroot}/%{_datadir}/gcc-%{maj_ver} ||: rm -rf %{buildroot}%{_prefix}/$target-%{sysarch}%{_prefix}/lib ||: %if 0%{?rhel} == 8 if [ "$target" == "or1k" ]; then # no dwarf5 support in rpm find %{buildroot}%{_prefix}/$target-%{sysarch}/lib -name '*.so*' -exec or1k-linux-gnu-strip {} + ||: fi %endif done %{lua: for target in string.gmatch(rpm.expand("%{cpulist}"), "[%w_-]+") do print("%files -n "..target.."-"..rpm.expand("%{sysarch}").."-gcc\n") print("%license COPYING*\n") print("%doc README\n") print(rpm.expand("%{_bindir}").."/"..target.."-"..rpm.expand("%{sysarch}").."-*\n") print("%dir "..rpm.expand("%{_prefix}").."/lib/gcc/"..target.."-"..rpm.expand("%{sysarch}").."\n") print(rpm.expand("%{_prefix}").."/lib/gcc/"..target.."-"..rpm.expand("%{sysarch}").."/"..rpm.expand("%{maj_ver}").."\n") print("%dir "..rpm.expand("%{_libexecdir}").."/gcc/"..target.."-"..rpm.expand("%{sysarch}").."\n") print(rpm.expand("%{_libexecdir}").."/gcc/"..target.."-"..rpm.expand("%{sysarch}").."/"..rpm.expand("%{maj_ver}").."\n") if (rpm.expand("%{bootstrap}") == "0") then print("%exclude "..rpm.expand("%{_bindir}").."/"..target.."-"..rpm.expand("%{sysarch}").."-?++\n") print("%exclude "..rpm.expand("%{_prefix}").."/"..target.."-"..rpm.expand("%{sysarch}").."\n") print("%exclude "..rpm.expand("%{_libexecdir}").."/gcc/"..target.."-"..rpm.expand("%{sysarch}").."/"..rpm.expand("%{maj_ver}").."/cc1plus\n") print("%exclude "..rpm.expand("%{_mandir}").."/man1/"..target.."-"..rpm.expand("%{sysarch}").."-g++.1.gz\n") end print(rpm.expand("%{_mandir}").."/man1/"..target.."-*.1.gz\n") print("\n") end} %if ! %{bootstrap} %{lua: for target in string.gmatch(rpm.expand("%{cpulist}"), "[%w_-]+") do print("%files -n "..target.."-"..rpm.expand("%{sysarch}").."-gcc-c++\n") print(rpm.expand("%{_bindir}").."/"..target.."-"..rpm.expand("%{sysarch}").."-?++\n") print("%dir "..rpm.expand("%{_prefix}").."/"..target.."-"..rpm.expand("%{sysarch}").."\n") print(rpm.expand("%{_prefix}").."/"..target.."-"..rpm.expand("%{sysarch}").."/*\n") print("%dir "..rpm.expand("%{_datadir}").."/"..target.."-"..rpm.expand("%{sysarch}").."/gcc-"..rpm.expand("%{maj_ver}").."\n") print(rpm.expand("%{_datadir}").."/"..target.."-"..rpm.expand("%{sysarch}").."/gcc-"..rpm.expand("%{maj_ver}").."/python\n") print(rpm.expand("%{_libexecdir}").."/gcc/"..target.."-"..rpm.expand("%{sysarch}").."/"..rpm.expand("%{maj_ver}").."/cc1plus\n") print(rpm.expand("%{_mandir}").."/man1/"..target.."-"..rpm.expand("%{sysarch}").."-g++.1.gz\n") print("\n") end} %endif %changelog * Mon Jul 02 2018 Cristian Balint - git update releases