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
|
# 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="~amd64 ~ppc ~x86"
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}"
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 || 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 does 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 them here
einfo "Removing unnecessary man pages"
rm "${D}"/usr/share/man/man1/{tblgen,llvmgcc,llvmgxx}.1
}
|