summaryrefslogtreecommitdiff
blob: d23458285ba1d54be046f6f89ef59a290f0ce86e (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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
# Copyright 1999-2007 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $

inherit eutils toolchain-funcs

DESCRIPTION="Low Level Virtual Machine"
HOMEPAGE="http://llvm.org/"
SRC_URI="http://llvm.org/releases/${PV}/llvm-${PV}.tar.gz"

LICENSE="LLVM"
# most part of LLVM fall under the "University of Illinois Open Source License"
# which doesn't seem to exist in portage yet, so I call it 'LLVM' for now.  it
# can be read from llvm/LICENSE.TXT in the source tarball.

# the directory llvm/runtime/GCCLibraries/libc contains a stripped down C
# library licensed under the LGPL 2.1 with some third party copyrights, see the
# two LICENCE* files in that directory.  Those parts do *not* get built, so
# we omit LGPL in ${LICENCE}

SLOT="0"

KEYWORDS="~x86 ~amd64 ~ppc"

IUSE="debug alltargets pic"
# 'jit' is not a flag anymore.  at least on x86, disabling it saves nothing
# at all, so having it always enabled for platforms that support it is fine

# we're not mirrored, fetch from homepage
RESTRICT="mirror"

DEPEND="dev-lang/perl
		>=sys-devel/make-3.79
		>=sys-devel/flex-2.5.4
		>=sys-devel/bison-1.28
		>=sys-devel/gcc-3.0
		"
RDEPEND="dev-lang/perl"
PDEPEND=""
# note that app-arch/pax is no longer a dependency

S="${WORKDIR}/llvm-${PV}"

MY_LLVM_GCC_PREFIX=/usr/lib/llvm-gcc
# this same variable is located in llvm-gcc's ebuild; keep them in sync

pkg_setup() {

	broken_gcc=( 3.2.2 3.2.3 3.3.2 4.1.1 )
	broken_gcc_x86=( 3.4.0 3.4.2 )
	broken_gcc_amd64=( 3.4.6 )

	gcc_vers=`gcc-fullversion`

	for version in ${broken_gcc[@]}
	do
		if [ "$gcc_vers" = "$version" ]; then
			elog "Your version of gcc is known to miscompile llvm"
			elog "check http://www.llvm.org/docs/GettingStarted.html for \
possible solutions"
			die "Your version of gcc is known to miscompile llvm"
		fi
	done

	if use x86; then
		for version in ${broken_gcc_x86[@]}
		do
			if [ "$gcc_vers" = "$version" ]; then
				elog "Your version of gcc is known to miscompile llvm in x86 \
architectures"
				elog "check http://www.llvm.org/docs/GettingStarted.html for \
possible solutions"
				die "Your version of gcc is known to miscompile llvm"
			fi
		done
	fi

	if use amd64; then
		for version in ${broken_gcc_amd64[@]}
		do
			if [ "$gcc_vers" = "$version" ]; then
				elog "Your version of gcc is known to miscompile llvm in amd64 \
architectures"
				elog "check http://www.llvm.org/docs/GettingStarted.html for \
possible solutions"
				die "Your version of gcc is known to miscompile llvm"
			fi
		done
	fi

	broken_bison=( 1.85 1.875 )

	for version in ${broken_bison[@]}
	do
		if [ $(bison --version | head -n1 | cut -f4 -d" ") = "$version" ]; then
			elog "Your version of Bison is known not to work with llvm, please \
upgrade to a newer version"
			die "Your version of Bison is known not to work with llvm"
		fi
	done


	buggy_ld=( 2.16 2.17 )

	for version in ${buggy_ld[@]}
	do
		if [ $(ld --version | head -n1 | cut -f5 -d" ") = "$version" ]; then
			ewarn "Your version of Binutils is known to be problematic with \
llvm -> llvm team recommends upgrading"
		fi
	done
}

src_unpack() {
	unpack ${A}
	cd "${S}"

	# unfortunately ./configure won't listen to --mandir and the-like, so take
	# care of this.
	einfo "Fixing install dirs"
	sed -e 's,^PROJ_docsdir.*,PROJ_docsdir := $(DESTDIR)$(PROJ_prefix)/share/doc/'${PF}, \
		-e 's,^PROJ_etcdir.*,PROJ_etcdir := $(DESTDIR)/etc/llvm,' \
		-i Makefile.config.in || die "sed failed"

	# fix gccld and gccas, which would otherwise point to the build directory
	einfo "Fixing gccld and gccas"
	sed -e 's,^TOOLDIR.*,TOOLDIR=/usr/bin,' \
		-i tools/gccld/gccld.sh tools/gccas/gccas.sh || die "sed failed"

	# all binaries get rpath'd to a dir in the temporary tree that doesn't
	# contain libraries anyway; can safely remove those to avoid QA warnings
	# (the exception would be if we build shared libraries, which we don't)
	einfo "Fixing rpath"
	sed -e 's,-rpath \$(ToolDir),,g' -i Makefile.rules || die "sed failed"

	epatch "${FILESDIR}"/llvm-2.3-dont-build-hello.patch
	epatch "${FILESDIR}"/llvm-2.3-disable-strip.patch

}


src_compile() {
	local CONF_FLAGS=""

	if use debug; then
		CONF_FLAGS="${CONF_FLAGS} --disable-optimized"
		einfo "Note: Compiling LLVM in debug mode will create huge and slow binaries"
		# ...and you probably shouldn't use tmpfs, unless it can hold 900MB
	else
		CONF_FLAGS="${CONF_FLAGS} --enable-optimized --disable-assertions \
--disable-expensive-checks"
	fi

	if use alltargets; then
		CONF_FLAGS="${CONF_FLAGS} --enable-targets=all"
	else
		CONF_FLAGS="${CONF_FLAGS} --enable-targets=host-only"
	fi

	if use amd64 && use pic; then
		CONF_FLAGS="${CONF_FLAGS} --enable-pic"
	fi

	# a few minor things would be built a bit differently depending on whether
	# llvm-gcc is already present on the system or not.  let's avoid that by
	# not letting it find llvm-gcc.  llvm-gcc isn't required for anything
	# anyway.  this dummy path will get spread to a few places, but none where
	# it really matters.
	CONF_FLAGS="${CONF_FLAGS} --with-llvmgccdir=/dev/null"

	econf ${CONF_FLAGS} || die "econf failed"
	emake tools-only || die "emake failed"
}

src_install()
{
	make DESTDIR="${D}" install || die "make install failed"

	# for some reason, LLVM creates a few .dir files.  remove them
	find "${D}" -name .dir -print0 | xargs -r0 rm

	# tblgen and stkrc do not get installed and wouldn't be very useful anyway,
	# so remove their man pages.  llvmgcc.1 and llvmgxx.1 are present here for
	# unknown reasons.  llvm-gcc will install proper man pages for itself, so
	# remove these strange thingies here.
	einfo "Removing unnecessary man pages"
	rm "${D}"/usr/share/man/man1/{tblgen,stkrc,llvmgcc,llvmgxx}.1

	# this also installed the man pages llvmgcc.1 and llvmgxx.1, which is a bit
	# a mistery because those binares are provided by llvm-gcc

}