michael@320: ## michael@320: ## gcc.spec -- OpenPKG RPM Package Specification michael@320: ## Copyright (c) 2000-2010 OpenPKG Foundation e.V. michael@320: ## michael@320: ## Permission to use, copy, modify, and distribute this software for michael@320: ## any purpose with or without fee is hereby granted, provided that michael@320: ## the above copyright notice and this permission notice appear in all michael@320: ## copies. michael@320: ## michael@320: ## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED michael@320: ## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF michael@320: ## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. michael@320: ## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR michael@320: ## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, michael@320: ## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT michael@320: ## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF michael@320: ## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND michael@320: ## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, michael@320: ## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT michael@320: ## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF michael@320: ## SUCH DAMAGE. michael@320: ## michael@320: michael@320: # package version michael@332: %define V_full 4.6.0 michael@320: %define V_comp %nil michael@320: michael@320: # package information michael@320: Name: gcc michael@320: Summary: GNU Compiler Collection michael@320: URL: http://gcc.gnu.org/ michael@320: Vendor: Free Software Foundation michael@320: Packager: OpenPKG Foundation e.V. michael@320: Distribution: OpenPKG Community michael@320: Class: CORE michael@320: Group: Compiler michael@320: License: GPL michael@320: Version: %{V_full} michael@321: Release: 20110320 michael@320: michael@320: # package options michael@320: %option with_binutils yes michael@320: %option with_cxx yes michael@320: %option with_objc no michael@320: %option with_java no michael@320: %option with_fortran no michael@320: %option with_optimize yes michael@320: %option with_profile no michael@320: %option with_threads yes michael@320: %option with_multilib no michael@320: michael@320: # list of sources michael@320: Source0: ftp://gcc.gnu.org/pub/gcc/releases/gcc-%{V_full}/gcc-core-%{V_full}.tar.bz2 michael@320: Source1: ftp://gcc.gnu.org/pub/gcc/releases/gcc-%{V_full}/gcc-g++-%{V_full}.tar.bz2 michael@320: Source2: ftp://gcc.gnu.org/pub/gcc/releases/gcc-%{V_full}/gcc-objc-%{V_full}.tar.bz2 michael@320: Source3: ftp://gcc.gnu.org/pub/gcc/releases/gcc-%{V_full}/gcc-java-%{V_full}.tar.bz2 michael@320: Source4: ftp://gcc.gnu.org/pub/gcc/releases/gcc-%{V_full}/gcc-fortran-%{V_full}.tar.bz2 michael@320: Patch0: gcc.patch michael@320: michael@320: # build information michael@321: Prefix: %{l_prefix} michael@321: BuildRoot: %{l_buildroot} michael@332: BuildPreReq: OpenPKG, openpkg >= 20060823, make michael@322: PreReq: OpenPKG, openpkg >= 20060823 michael@332: BuildPreReq: mpc, mpfr, gmp michael@332: PreReq: mpc, mpfr, gmp michael@320: %if "%{with_binutils}" == "yes" michael@320: BuildPreReq: binutils >= 2.14 michael@320: PreReq: binutils >= 2.14 michael@320: %endif michael@320: %if "%{with_cxx}" == "yes" michael@320: BuildPreReq: libiconv michael@320: PreReq: libiconv michael@320: %endif michael@320: %if "%{with_java}" == "yes" michael@320: BuildPreReq: zlib michael@320: PreReq: zlib michael@320: %endif michael@321: AutoReq: no michael@321: AutoReqProv: no michael@320: michael@320: %description michael@320: The GNU Compiler Collection (GCC) provides standard conforming and michael@320: highly portable compilers for the ISO C, ISO C++, Objective-C, michael@320: Fortran and Java languages. michael@320: michael@320: %track michael@320: prog gcc = { michael@320: version = %{V_full} michael@320: url = ftp://gcc.gnu.org/pub/gcc/releases/ michael@320: regex = gcc-(4\.\d+\.\d+) michael@320: url = ftp://gcc.gnu.org/pub/gcc/releases/gcc-__NEWVER__/ michael@320: regex = gcc-core-(\d+\.\d+\.\d+)\.tar\.bz2 michael@320: } michael@320: michael@320: %prep michael@320: %setup -q michael@320: %if "%{with_cxx}" == "yes" michael@320: %setup -q -T -D -b 1 michael@320: %endif michael@320: %if "%{with_objc}" == "yes" michael@320: %setup -q -T -D -b 2 michael@320: %endif michael@320: %if "%{with_java}" == "yes" michael@320: %setup -q -T -D -b 3 michael@320: %endif michael@320: %if "%{with_fortran}" == "yes" michael@320: %setup -q -T -D -b 4 michael@320: %endif michael@320: %patch -p0 michael@332: %{l_shtool} subst \ michael@332: -e 's;\(instname="\$dir/\$name"\)i;\1;' \ michael@332: ltmain.sh michael@320: %{l_shtool} subst -v -s \ michael@328: -e 's;\(gmplibs="-lmpc\) \(-lmpfr -lgmp\);\1 -lm \2;' \ michael@328: configure michael@328: %{l_shtool} subst -v -s \ michael@320: -e 's;PREFIX_INCLUDE_DIR;PREFIX_INCLUDE_DIR_DISABLED;g' \ michael@320: gcc/configure michael@332: %{l_shtool} subst \ michael@332: -e 's;[ \t]*-W[a-zA-Z0-9_\-][a-zA-Z0-9_\-]*,*;;g' \ michael@332: lto-plugin/Makefile.in michael@332: %{l_shtool} subst \ michael@332: -e 's;-rpath *[^ \t][^ \t]*;;g' \ michael@332: -e 's;--tag=disable-static;--tag=disable-shared;g' \ michael@332: -e 's;\.\./libiberty/libiberty\.a;-L../libiberty -liberty;g' \ michael@332: -e 's;\.\./libiberty/pic/libiberty\.a;-L../libiberty/pic -liberty;g' \ michael@332: lto-plugin/Makefile.in michael@320: if [ ".%{V_comp}" != . ]; then michael@320: %{l_shtool} subst -v -s \ michael@320: -e 's;(libdir)/gcc/;(libdir)/gcc%{V_comp}/;' \ michael@320: `find . -name Makefile.in -type f -print` michael@320: fi michael@320: case "%{l_platform -t}" in michael@320: amd64*-linux* ) michael@320: %{l_shtool} subst \ michael@320: -e 's/GLIBCXX_IS_NATIVE=false/GLIBCXX_IS_NATIVE=true/g' \ michael@320: -e 's/test x.gcc_no_link = xyes/false/g' \ michael@320: libstdc++-v3/configure michael@320: ;; michael@320: esac michael@320: %{l_shtool} subst \ michael@320: -e 's;;"%{l_prefix}/include/iconv.h";' \ michael@320: libstdc++-v3/include/ext/codecvt_specializations.h michael@320: michael@320: %build michael@320: # create build sub-directory michael@320: %{l_shtool} mkdir -p obj michael@320: cd obj michael@320: michael@322: # solve strange compatability problems michael@328: %if "%{with_binutils}" == "yes" michael@328: # determine ld(1) and as(1) usage, allowing either michael@328: # one to be from the GNU distribution of binutils michael@328: LD=%{l_tool_locate ld ld} michael@328: AS=%{l_tool_locate as as} michael@322: %else michael@328: # locate ld(1) and as(1), using the GNU assembler michael@328: # but ignoring the presence of any OpenPKG linker michael@328: LD=`PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/ccs/bin:/opt/bin:/opt/sbin which ld` michael@328: AS=`PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/ccs/bin:/opt/bin:/opt/sbin which as` michael@322: %endif michael@320: l_with_gnu_ld_as="" michael@322: echo $LD | grep '^/' >/dev/null && l_with_gnu_ld_as="--with-ld=$LD" michael@320: echo $AS | grep '^/' >/dev/null && l_with_gnu_ld_as="${l_with_gnu_ld_as} --with-as=$AS" michael@322: $LD --version /dev/null | grep "^GNU ld " >/dev/null && l_with_gnu_ld_as="${l_with_gnu_ld_as} --with-gnu-ld" || l_with_gnu_ld_as="${l_with_gnu_ld_as} --without-gnu-ld" michael@322: $AS --version /dev/null | grep "^GNU assembler " >/dev/null && l_with_gnu_ld_as="${l_with_gnu_ld_as} --with-gnu-as" || l_with_gnu_ld_as="${l_with_gnu_ld_as} --without-gnu-as" michael@320: michael@320: # determine threads usage michael@320: %if "%{with_threads}" == "yes" michael@320: l_enable_threads="posix" michael@320: %else michael@320: l_enable_threads="single" michael@320: %endif michael@320: michael@320: # determine language usage michael@320: l_enable_languages="c" michael@320: %if "%{with_cxx}" == "yes" michael@320: l_enable_languages="${l_enable_languages},c++" michael@320: %endif michael@320: %if "%{with_objc}" == "yes" michael@320: l_enable_languages="${l_enable_languages},objc" michael@320: %endif michael@320: %if "%{with_java}" == "yes" michael@320: l_enable_languages="${l_enable_languages},java" michael@320: %endif michael@320: %if "%{with_fortran}" == "yes" michael@320: l_enable_languages="${l_enable_languages},f95" michael@320: %endif michael@320: michael@320: # disable GNU iconv usage michael@320: ( echo "am_cv_func_iconv=no" michael@320: echo "am_cv_lib_iconv=no" michael@320: ) >config.cache michael@320: michael@332: # platform specific config logic michael@332: case "%{l_platform -t}" in michael@332: *i?86-sunos* ) echo "gcc_cv_prog_cmp_skip=true" >>config.cache;; michael@332: esac michael@332: michael@320: # configure the package michael@322: LD="$LD" \ michael@322: AS="$AS" \ michael@320: CC="%{l_cc}" \ michael@320: CFLAGS="%{l_cflags}" \ michael@320: %if "%{with_java}" == "yes" || "%{with_fortran}" == "yes" || "%{with_cxx}" == "yes" michael@320: CPPFLAGS="%{l_cppflags}" \ michael@320: LDFLAGS="%{l_ldflags}" \ michael@320: %endif michael@320: CONFIG_SHELL="%{l_bash}" \ michael@332: GREP="%{l_bash}" \ michael@320: ../configure \ michael@320: --with-bugurl="http://openpkg.org/" \ michael@320: --with-pkgversion="%{l_openpkg_release -F "OpenPKG-%%t"}" \ michael@320: --cache-file=./config.cache \ michael@320: --srcdir=`pwd`/.. \ michael@320: --prefix=%{l_prefix} \ michael@320: --exec-prefix=%{l_prefix} \ michael@320: --mandir=%{l_prefix}/man \ michael@320: --infodir=%{l_prefix}/info \ michael@320: --includedir=%{l_prefix}/include/gcc%{V_comp} \ michael@320: --libexecdir=%{l_prefix}/libexec/gcc%{V_comp} \ michael@320: --with-gxx-include-dir=%{l_prefix}/include/g++%{V_comp} \ michael@320: --with-local-prefix=%{l_prefix}/lib/gcc%{V_comp} \ michael@320: --enable-languages="${l_enable_languages}" \ michael@320: --enable-threads="${l_enable_threads}" \ michael@320: --disable-maintainer-mode \ michael@320: --disable-shared \ michael@320: --disable-nls \ michael@320: %if "%{with_java}" == "yes" michael@320: --with-system-zlib \ michael@320: %endif michael@320: %if "%{with_multilib}" == "yes" michael@320: --enable-multilib \ michael@320: %else michael@320: --disable-multilib \ michael@320: %endif michael@320: %if "%{with_cxx}" == "yes" michael@320: --with-libiconv-prefix=%{l_prefix} \ michael@320: %endif michael@320: --with-gmp=%{l_prefix} \ michael@320: --with-mpfr=%{l_prefix} \ michael@320: --with-mpc=%{l_prefix} \ michael@320: ${l_with_gnu_ld_as} michael@320: michael@320: # determine build flags michael@320: l_ccisgcc=no michael@320: if [ ".`(%{l_cc} -v; %{l_cc} --version) &1 | grep -i 'gcc'`" != . ]; then michael@320: l_ccisgcc=yes michael@320: fi michael@320: l_cflags="" michael@320: l_cxxflags="" michael@320: l_boot_cflags="" michael@320: l_libcflags="-g" michael@320: l_libcxxflags="-g" michael@320: # at least GNU as from GNU binutils supports -pipe always michael@332: "$AS" --version /dev/null | grep "^GNU assembler" >/dev/null && { michael@320: l_boot_cflags="$l_boot_cflags -pipe" michael@320: l_libcxxflags="$l_libcxxflags -pipe" michael@320: } michael@320: %if "%{with_optimize}" == "yes" michael@332: if [ ".$l_ccisgcc" = .yes ]; then michael@332: l_ia32=native michael@332: else michael@332: l_ia32=pentium3 michael@332: fi michael@332: case "%{l_platform -t}" in michael@332: *i?86-* ) l_boot_cflags="$l_boot_cflags -mtune=$l_ia32" ;; michael@332: *sun4[uv]-* ) l_boot_cflags="$l_boot_cflags -mtune=v9" ;; michael@332: esac michael@332: l_cflags="$l_cflags -O" michael@332: l_boot_cflags="$l_boot_cflags -O3 -fomit-frame-pointer" michael@332: l_libcxxflags="$l_libcxxflags -O3 -fno-implicit-templates" michael@332: %else michael@332: %if "%{with_optimize}" == "port" michael@332: # conservatively optimize the generated program code for portable use, michael@332: # also _tune_ for particular CPUs, but _without_ requiring these CPUs! michael@332: case "%{l_platform -t}" in michael@332: *i?86-* ) l_boot_cflags="$l_boot_cflags -mtune=generic" ;; michael@332: *sun4[uv]-* ) l_boot_cflags="$l_boot_cflags -mtune=v8" ;; michael@332: esac michael@320: l_cflags="$l_cflags -O" michael@320: l_boot_cflags="$l_boot_cflags -O2 -fomit-frame-pointer" michael@320: l_libcxxflags="$l_libcxxflags -O2 -fno-implicit-templates" michael@320: %else michael@332: # do not optimize at all to avoid problems michael@320: l_boot_cflags="$l_boot_cflags -O0" michael@320: l_libcxxflags="$l_libcxxflags -O0" michael@320: %endif michael@332: %endif michael@332: maketarget="bootstrap" michael@320: %if "%{with_profile}" == "yes" michael@320: # GCC >= 3.4 supports a "profiledbootstrap" target to build an michael@320: # optimized version of itself through profiling. Because this michael@320: # requires a (bootstrapping) C compiler with 64-bit arithmetic, michael@320: # the whole approach is currently supported only if already michael@320: # building with GCC as the bootstrapping C compiler. michael@320: if [ ".$l_ccisgcc" = .yes ]; then michael@320: maketarget="profiledbootstrap" michael@332: else michael@332: ( echo "Building a profiled GCC requires GCC. Please install GCC" michael@332: echo "first and then build again with the profile option enabled." michael@332: ) | %{l_rpmtool} msg -b -t error michael@332: exit 1 michael@320: fi michael@320: %endif michael@320: case "%{l_platform -t}" in michael@332: *64-* ) l_cflags="$l_cflags -fPIC"; l_cxxflags="$l_cxxflags -fPIC" ;; michael@320: esac michael@320: %if "%{with_java}" == "yes" || "%{with_fortran}" == "yes" || "%{with_cxx}" == "yes" michael@320: l_cflags="$l_cflags %{l_cppflags}" michael@320: l_cxxflags="$l_cxxflags %{l_cppflags}" michael@320: l_libcflags="$l_libcflags %{l_cppflags}" michael@320: l_libcxxflags="$l_libcxxflags %{l_cppflags}" michael@320: %endif michael@320: michael@320: # build the package michael@332: MAKE="%{l_make} %{l_mflags -O}" \ michael@332: %{l_make} %{l_mflags -O} \ michael@332: GREP="grep" \ michael@332: MAKE="%{l_make} %{l_mflags -O}" \ michael@320: BOOT_CFLAGS="${l_boot_cflags}" \ michael@320: CFLAGS="${l_cflags}" \ michael@320: CXXFLAGS="${l_cxxflags}" \ michael@320: LIBCFLAGS="${l_libcflags}" \ michael@320: LIBCXXFLAGS="${l_libcxxflags}" \ michael@320: $maketarget michael@320: michael@320: %install michael@321: rm -rf $RPM_BUILD_ROOT michael@320: michael@320: # fetch GNU platform triple michael@320: triple=`./config.guess` michael@320: michael@320: # perform the standard installation procedure michael@320: ( cd obj michael@320: %{l_make} %{l_mflags} install DESTDIR=$RPM_BUILD_ROOT michael@320: ) || exit $? michael@320: michael@320: # cleanup installation tree michael@320: mv $RPM_BUILD_ROOT%{l_prefix}/lib/{lib*.a,*.spec} \ michael@320: $RPM_BUILD_ROOT%{l_prefix}/lib/gcc%{V_comp}/${triple}/[0-9]*/ \ michael@320: >/dev/null 2>&1 || true michael@320: mv $RPM_BUILD_ROOT%{l_prefix}/lib64/{lib*.a,*.spec} \ michael@320: $RPM_BUILD_ROOT%{l_prefix}/lib/gcc%{V_comp}/${triple}/[0-9]*/ \ michael@320: >/dev/null 2>&1 || true michael@320: dirs="" michael@320: for multilib in `$RPM_BUILD_ROOT%{l_prefix}/bin/gcc --print-multi-lib`; do michael@320: subdir=`echo "$multilib" | sed -e 's/;.*$//'` michael@320: [ ".$subdir" = .. ] && continue michael@320: mv $RPM_BUILD_ROOT%{l_prefix}/lib/$subdir/lib*.a \ michael@320: $RPM_BUILD_ROOT%{l_prefix}/lib/gcc%{V_comp}/${triple}/[0-9]*/$subdir/ \ michael@320: >/dev/null 2>&1 || true michael@320: mv $RPM_BUILD_ROOT%{l_prefix}/lib64/$subdir/lib*.a \ michael@320: $RPM_BUILD_ROOT%{l_prefix}/lib/gcc%{V_comp}/${triple}/[0-9]*/$subdir/ \ michael@320: >/dev/null 2>&1 || true michael@320: dirs="$dirs $subdir" michael@320: done michael@320: for subdir in $dirs; do michael@320: rm -rf $RPM_BUILD_ROOT%{l_prefix}/lib/$subdir >/dev/null 2>&1 || true michael@320: done michael@320: mv $RPM_BUILD_ROOT%{l_prefix}/${triple}/include/* \ michael@320: $RPM_BUILD_ROOT%{l_prefix}/lib/gcc%{V_comp}/${triple}/[0-9]*/include/ \ michael@320: >/dev/null 2>&1 || true michael@320: michael@332: # correct hardcoded paths michael@332: %{l_shtool} subst \ michael@332: -e "s;\(dependency_libs='[ \t]*-L\).*;\1%{l_prefix}/lib -L%{l_prefix}/lib/gcc%{V_comp}/${triple}/[0-9]* -liberty';" \ michael@332: $RPM_BUILD_ROOT%{l_prefix}/lib/gcc%{V_comp}/${triple}/[0-9]*/liblto_plugin.la michael@332: michael@320: # strip installation tree michael@320: rm -rf $RPM_BUILD_ROOT%{l_prefix}/${triple} michael@320: rm -f $RPM_BUILD_ROOT%{l_prefix}/info/dir michael@320: rm -rf $RPM_BUILD_ROOT%{l_prefix}/man/man7 >/dev/null 2>&1 || true michael@320: rm -f $RPM_BUILD_ROOT%{l_prefix}/lib/*.la >/dev/null 2>&1 || true michael@320: rm -rf $RPM_BUILD_ROOT%{l_prefix}/lib64 >/dev/null 2>&1 || true michael@320: rm -f $RPM_BUILD_ROOT%{l_prefix}/bin/*-gcc* >/dev/null 2>&1 || true michael@320: %if "%{with_cxx}" == "yes" michael@320: rm -f $RPM_BUILD_ROOT%{l_prefix}/bin/*-c++ >/dev/null 2>&1 || true michael@320: rm -f $RPM_BUILD_ROOT%{l_prefix}/bin/*-g++ >/dev/null 2>&1 || true michael@320: %endif michael@320: strip $RPM_BUILD_ROOT%{l_prefix}/bin/* >/dev/null 2>&1 || true michael@320: for prog in cc1 cc1plus collect2 cpp; do michael@320: strip $RPM_BUILD_ROOT%{l_prefix}/lib/gcc%{V_comp}/${triple}/[0-9]*/${prog} \ michael@320: >/dev/null 2>&1 || true michael@320: done michael@320: michael@320: # bump up installation tree michael@320: ln $RPM_BUILD_ROOT%{l_prefix}/bin/gcc \ michael@320: $RPM_BUILD_ROOT%{l_prefix}/bin/cc michael@320: ln $RPM_BUILD_ROOT%{l_prefix}/man/man1/gcc.1 \ michael@320: $RPM_BUILD_ROOT%{l_prefix}/man/man1/cc.1 michael@320: %if "%{with_cxx}" == "yes" michael@320: ln $RPM_BUILD_ROOT%{l_prefix}/man/man1/g++.1 \ michael@320: $RPM_BUILD_ROOT%{l_prefix}/man/man1/c++.1 michael@320: %endif michael@320: michael@320: # determine installation file list michael@320: %{l_rpmtool} files -v -ofiles -r$RPM_BUILD_ROOT %{l_files_std} michael@320: michael@320: %files -f files michael@320: michael@320: %clean michael@321: rm -rf $RPM_BUILD_ROOT michael@320: