summaryrefslogtreecommitdiff
blob: 3b95f3ddcb8994be8c419db0399daa242a7b9b95 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# Copyright 1999-2010 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/sys-devel/llvm-gcc/llvm-gcc-2.8.ebuild,v 1.1 2010/10/06 09:17:40 voyageur Exp $

EAPI=3
inherit libtool flag-o-matic gnuconfig multilib

LLVM_GCC_VERSION=4.2
MY_PV=${LLVM_GCC_VERSION}-${PV/_pre*}

DESCRIPTION="LLVM C front-end"
HOMEPAGE="http://llvm.org"
SRC_URI="http://llvm.org/releases/${PV}/${PN}-${MY_PV}.source.tgz"

LICENSE="GPL-2"
SLOT=0
KEYWORDS="~amd64 ~ppc ~x86 ~ppc-macos"
IUSE="bootstrap fortran multilib nls objc objc++ test"

RDEPEND=">=sys-devel/llvm-$PV"
DEPEND="${RDEPEND}
	>=sys-apps/texinfo-4.2-r4
	|| ( >=sys-devel/binutils-2.18 >=sys-devel/binutils-apple-3.2.3 )
	>=sys-devel/bison-1.875
	test? ( dev-util/dejagnu
		sys-devel/autogen )"

S=${WORKDIR}/llvm-gcc-${MY_PV}.source

src_prepare() {
	#we keep the directory structure suggested by README.LLVM,
	mkdir -p "${S}"/obj

	# From toolchain eclass
	elibtoolize --portage --shallow --no-uclibc
	gnuconfig_update

	# update configure files
	local f
	for f in $(grep -l 'autoconf version 2.13' $(find "${S}" -name configure)) ; do
		#ebegin "  Updating ${f/${S}\/} [LANG]"
		ebegin "  Updating \"${f/${S}\/}\" [LANG]"
		patch "${f}" "${FILESDIR}"/gcc-configure-LANG.patch >& "${T}"/configure-patch.log \
			|| eerror "Please file a bug about this"
		eend $?
	done
	sed -i 's|A-Za-z0-9|[:alnum:]|g' gcc/*.awk #215828

	if [[ -x contrib/gcc_update ]] ; then
		einfo "Touching generated files"
		./contrib/gcc_update --touch | \
			while read f ; do
				einfo "  ${f%%...}"
			done
	fi
}

src_configure() {
	gcc_do_filter_flags
	# Target options are handled by econf

	cd "${S}"/obj
	EXTRALANGS=""
	use fortran && EXTRALANGS="${EXTRALANGS},fortran"
	use objc && EXTRALANGS="${EXTRALANGS},objc"
	use objc++ && EXTRALANGS="${EXTRALANGS},obj-c++"

	ECONF_SOURCE="${S}" econf --prefix="${EPREFIX}"/usr/$(get_libdir)/${PN}-${MY_PV} \
		$(use_enable multilib) \
		--program-prefix=${PN}-${MY_PV}- \
		--enable-llvm="${EPREFIX}"/usr --enable-languages=c,c++${EXTRALANGS} \
		$(use prefix && echo "--with-local-prefix=${EPREFIX}/usr") \
		|| die "configure failed"
}

src_compile() {
	gcc_do_filter_flags
	cd "${S}"/obj
	BUILDOPTIONS="LLVM_VERSION_INFO=${MY_PV}"
	use bootstrap && BUILDOPTIONS="${BUILDOPTIONS} bootstrap"
	emake ${BUILDOPTIONS} || die "emake failed"
}

src_test() {
	cd "${S}"/obj
	emake -j1 -k check || ewarn "check failed and that sucks :("
}

src_install() {
	cd "${S}"/obj

	# Do allow symlinks in private gcc include dir as this can break the build
	find gcc/include*/ -type l -print0 | xargs -0 rm -f
	# Remove generated headers, as they can cause things to break
	# (ncurses, openssl, etc).
	for x in $(find gcc/include*/ -name '*.h') ; do
		grep -q 'It has been auto-edited by fixincludes from' "${x}" \
			&& rm -f "${x}"
	done

	emake DESTDIR="${D}" install || die "installation failed"
	rm -rf "${ED}"/usr/share/man/man7
	if ! use nls; then
		einfo "nls USE flag disabled, not installing locale files"
		rm -rf "${ED}"/usr/share/locale
	fi

	# Add some symlinks
	dodir /usr/bin
	cd "${ED}/usr/bin"
	for X in c++ g++ cpp gcc gcov gccbug ; do
		ln -s "${EPREFIX}"/usr/$(get_libdir)/${PN}-${MY_PV}/bin/${PN}-${MY_PV}-${X}  llvm-${X}
	done
	use fortran && \
		ln -s "${EPREFIX}"/usr/$(get_libdir)/${PN}-${MY_PV}/bin/${PN}-${MY_PV}-gfortran llvm-gfortran

	# Fix install_names on Darwin.  The build system is too complicated
	# to just fix this, so we correct it post-install
	if [[ ${CHOST} == *-darwin* ]] ; then
		local f=$(echo "${ED}"usr/$(get_libdir)/${PN}-${MY_PV}/lib/gcc/${CHOST}/${LLVM_GCC_VERSION}*/libstdc++.dylib)
		install_name_tool -id "/${f#${D}}" "${f}"
	fi
}

gcc_do_filter_flags() {
	strip-flags

	# In general gcc does not like optimization, and add -O2 where
	# it is safe.  This is especially true for gcc 3.3 + 3.4
	replace-flags -O? -O2

	# ... sure, why not?
	strip-unsupported-flags

	# dont want to funk ourselves
	filter-flags '-mabi*' -m31 -m32 -m64

	filter-flags '-mcpu=*'
}