1 #
   2 # CDDL HEADER START
   3 #
   4 # The contents of this file are subject to the terms of the
   5 # Common Development and Distribution License (the "License").
   6 # You may not use this file except in compliance with the License.
   7 #
   8 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9 # or http://www.opensolaris.org/os/licensing.
  10 # See the License for the specific language governing permissions
  11 # and limitations under the License.
  12 #
  13 # When distributing Covered Code, include this CDDL HEADER in each
  14 # file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15 # If applicable, add the following below this CDDL HEADER, with the
  16 # fields enclosed by brackets "[]" replaced with your own identifying
  17 # information: Portions Copyright [yyyy] [name of copyright owner]
  18 #
  19 # CDDL HEADER END
  20 #
  21 # Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
  22 # Use is subject to license terms.
  23 # Copyright (c) 2013, Joyent, Inc.  All rights reserved.
  24 #
  25 
  26 VER =   gcc-4.4.4
  27 MPFR_VER =      mpfr-3.1.2
  28 GMP_VER =       gmp-5.1.1
  29 
  30 include ../Makefile.defs
  31 
  32 SEPARATE_BUILD =        yes
  33 
  34 GCC =   /opt/local/bin/gcc
  35 GXX =   /bin/false
  36 CFLAGS =        -nostdinc -isystem /usr/include -g -O2
  37 
  38 AUTOCONF_OPTS += \
  39         --with-ld=/usr/bin/ld \
  40         --without-gnu-ld \
  41         --with-gnu-as \
  42         --with-as=$(DESTDIR)/usr/gnu/bin/gas \
  43         --enable-languages="c,c++" \
  44         --enable-shared \
  45         --disable-nls
  46 
  47 AUTOCONF_ENV += \
  48         DESTDIR=$(DESTDIR) \
  49         MAKE=$(MAKE)
  50 
  51 OVERRIDES += \
  52         $(AUTOCONF_CFLAGS) \
  53         STAGE1_CFLAGS="$(CFLAGS)" \
  54         CFLAGS_FOR_TARGET="$(CFLAGS)"
  55 
  56 #
  57 # The runtime libraries that we build into proto.strap should be made to search
  58 # for their dependencies there as well, so that programs built to run on the
  59 # build machine (from proto.strap) find the correct copies of these libraries.
  60 #
  61 ifeq ($(STRAP),strap)
  62         STRAPFIX_LINKS= \
  63                 $(DESTDIR)/lib/64 \
  64                 $(DESTDIR)/usr/lib/64
  65         STRAPFIX_FILES_32 = \
  66                 $(DESTDIR)/usr/lib/libgcc_s.so.1 \
  67                 $(DESTDIR)/usr/lib/libstdc++.so.6
  68         STRAPFIX_FILES_64 = \
  69                 $(DESTDIR)/usr/lib/64/libgcc_s.so.1 \
  70                 $(DESTDIR)/usr/lib/64/libstdc++.so.6
  71         STRAPFIX_FILES = $(STRAPFIX_FILES_32) $(STRAPFIX_FILES_64)
  72 endif
  73 
  74 #
  75 # Unlike everything else, gcc is built to be a cross-compiler, really.  It
  76 # never runs on the target system, only the build system.  So it should not
  77 # be using the proto area's headers or libraries.  Its own libraries will be
  78 # built by the new compiler, and generally aren't using system headers anyway.
  79 # This is not really completely true; for example, libstdc++, and this will
  80 # need more work to be really right.  We only deliver the libraries.
  81 #
  82 AUTOCONF_CPPFLAGS =
  83 AUTOCONF_LIBS =
  84 GENLDFLAGS =
  85 
  86 PATCHES =       Patches/*
  87 ALL_TGT =       bootstrap
  88 
  89 include ../Makefile.targ
  90 include ../Makefile.targ.autoconf
  91 
  92 #
  93 # We could use the mpfr and gmp from the build system (since the compiler will
  94 # be run here), but there's no good way to make gcc build itself correctly if
  95 # we do.  There are two main problems:
  96 #
  97 # 1. Stage2 and later cc1 and company don't honour any combination of LDFLAGS,
  98 # LDFLAGS_FOR_TARGET, BOOT_LDFLAGS, STAGE2_LDFLAGS, etc.  So the only ways to
  99 # get these things built with -R/opt/local/lib are to use LD_OPTIONS which will
 100 # yield the wrong results for libraries or to hack configure.
 101 #
 102 # 2. Even if we could get -R/opt/local/lib into these programs without building
 103 # the libraries incorrectly, it would still be wrong.  The pkgsrc lib directory
 104 # on many systems contains libgcc_s.so.1; however, cc1 was built by the stage2
 105 # compiler and should find the libgcc that matches that compiler.  That happens
 106 # to be the one we just built, not the pkgsrc one.
 107 #
 108 # So Instead we have mpfr and gmp built as part of the gcc build itself.
 109 #
 110 $(AUTOCONF_OUT.32): | $(VER.32)/mpfr $(VER.32)/gmp
 111 
 112 $(VER.32)/mpfr: $(MPFR_VER).tar.gz | $(VER.32)
 113         -rm -rf $@
 114         mkdir -p .unpack32
 115         gtar x -C .unpack32 -z --no-same-owner -f $(MPFR_VER).tar.gz
 116         mv -f .unpack32/$(MPFR_VER) ./$@
 117         -rmdir .unpack32
 118         chmod 755 $@/configure
 119         touch $@/configure
 120 
 121 $(VER.32)/gmp: $(GMP_VER).tar.bz2 | $(VER.32)
 122         -rm -rf $@
 123         mkdir -p .unpack32
 124         gtar x -C .unpack32 -j --no-same-owner -f $(GMP_VER).tar.bz2
 125         mv -f .unpack32/$(GMP_VER) ./$@
 126         -rmdir .unpack32
 127         chmod 755 $@/configure
 128         touch $@/configure
 129 
 130 .PHONY: strapfix
 131 strapfix: $(STRAPFIX_LINKS) $(STRAPFIX_FILES) | install
 132         for f in $(STRAPFIX_FILES_32); do \
 133                 /usr/bin/elfedit -e \
 134                     'dyn:runpath $(DESTDIR)/lib:$(DESTDIR)/usr/lib' \
 135                     $$f; \
 136         done
 137         for f in $(STRAPFIX_FILES_64); do \
 138                 /usr/bin/elfedit -e \
 139                     'dyn:runpath $(DESTDIR)/lib/64:$(DESTDIR)/usr/lib/64' \
 140                     $$f; \
 141         done
 142 
 143 $(STRAPFIX_LINKS):
 144         ln -s amd64 $@