summaryrefslogtreecommitdiff
blob: 7a9ef09e4a5e8fafbfa652cb8a2922dba6722149 (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
# Copyright 1999-2005 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/dev-lang/gnat/gnat-3.15p.ebuild,v 1.1.1.1 2005/11/30 09:58:15 chriswhite Exp $
#
# Never replace this with the Ada compiler in the gcc tree. They are based
# on the same source but this is the official validated compiler from ACT.
# The one in gcc (3-branch) is currently broken!
# If you want to try that one install it under a different name and use
# gnatmake --GCC=othername (if you use gnatmake).
# The official statement from ACT is that they will continiue to release
# GNAT, so they will release a version based on gcc 3 when it is working.
#
# It is possible to at least install this on sparc too, I have seen
# unofficial bootstrap compilers for ppc as well. As I don't have access to
# a sparc or a ppc running linux I won't try to add support for them.
# If you have access to any of these it should be fairly easy to add support
# for it.
#

DESCRIPTION="GNAT Ada Compiler"
DEPEND="app-shells/tcsh"
RDEPEND=""
SRC_URI="http://gd.tuwien.ac.at/languages/ada/gnat/${PV}/${P}-src.tgz
	http://gd.tuwien.ac.at/languages/ada/gnat/${PV}/${P}-i686-pc-redhat71-gnu-bin.tar.gz
	ftp://gcc.gnu.org/pub/gcc/old-releases/gcc-2/gcc-2.8.1.tar.bz2"
HOMEPAGE="http://www.gnat.com/"

SLOT="GNAT-3.15p"
KEYWORDS="~x86"
LICENSE="GMGPL"
IUSE=""

S="${WORKDIR}/gcc-2.8.1"
GNATDIR="${WORKDIR}/${P}-src"
GNATBOOT="${WORKDIR}/boot"
GNATBOOTINST="${WORKDIR}/${P}-i686-pc-linux-gnu-bin"

src_unpack() {
	unpack ${A}

	# Install the bootstrap compiler
	cd "${GNATBOOTINST}"
	echo $'\n'3$'\n'${GNATBOOT}$'\n' | ./doconfig > doconfig.log 2>&1
	./doinstall

	# Prepare the gcc source directory
	cd "${S}"
	patch -p0 < "${GNATDIR}/src/gcc-281.dif"
	touch cstamp-h.in
	mv "${GNATDIR}/src/ada" "${S}"
	for i in `find ${S}/ada -name '*.ad[sb]'`; do \
		sed -i -e "s/\"gcc\"/\"gnatgcc\"/g" ${i}; \
	done
	cd "${S}/ada"
	touch treeprs.ads a-[es]info.h nmake.ad[bs]
}

src_compile() {
	# GCC 2.8.1 doesn't like fancy flags
	export CFLAGS="-O2"

	# Set some paths to our bootstrap compiler.
	export GCC_EXEC_PREFIX="${GNATBOOT}/lib/gcc-lib/i686-pc-linux-gnu/2.8.1"
	export ADA_INCLUDE_PATH="${GNATBOOT}/lib/gcc-lib/i686-pc-linux-gnu/2.8.1/adainclude"
	export ADA_OBJECTS_PATH="${GNATBOOT}/lib/gcc-lib/i686-pc-linux-gnu/2.8.1/adalib"
	OLDPATH="${PATH}"
	export PATH="${GNATBOOT}/bin:${PATH}"
	export LDFLAGS="-L${GNATBOOT}/lib/gcc-lib/i686-pc-linux-gnu/2.8.1 -L${GNATBOOTINST}"

	# Make $local_prefix point to $prefix
	sed -i -e "s/@local_prefix@/@prefix@/" "${S}/Makefile.in"

	# Configure gcc
	cd "${S}"
	./configure --prefix=/usr --program-prefix=gnat \
		--host="${CHOST}" --build="${CHOST}" --target="${CHOST}" \
		--infodir=/usr/share/info \
		--mandir=/usr/share/man || die "./configure failed"

	# Make sure we don't overwrite the existing gcc
	sed -i -e "s/\$(bindir)\/gcov/\$(bindir)\/gnatgcov/" "${S}/Makefile"
	sed -i -e "s/alias)-gcc/alias)-gnatgcc/g" "${S}/Makefile"

	# Compile it by first using the bootstrap compiler and then bootstrapping
	# our own version. Finally compile the libraries and tools.
	make CC="gcc" LANGUAGES="c ada gcov"
	make CC="gcc" LANGUAGES="c ada gcov" bootstrap
	make CC="gcc" GNATLIBCFLAGS="${CFLAGS}" gnatlib
	make CC="gcc" gnattools

}

src_install() {
	export PATH="${GNATBOOT}/bin:${PATH}"
	export LDFLAGS="-L${GNATBOOT}/lib/gcc-lib/i686-pc-linux-gnu/2.8.1 -L${GNATBOOTINST}"

	# Install gnatgcc, tools and native threads library
	make prefix="${D}/usr" LANGUAGES="c ada gcov" GCC_INSTALL_NAME=gnatgcc \
		install-common install-libgcc install-gnatlib install-driver || die
	touch "${D}/usr/lib/gcc-lib/${CHOST}/2.8.1/include/float.h"

	# Install the FSU threads library
	cd "${D}/usr/lib/gcc-lib/${CHOST}/2.8.1"
	mkdir rts-native
	mkdir rts-fsu

	# Copy the native threads library
	cp -r adalib rts-native
	cp -r adainclude rts-native
	#remove circular symlinks
	rm -f rts-native/adalib/{libgnarl.so,libgnat.so}
	cd "${S}"
	rm stamp-gnatlib1

	# Compile and install the FSU threads library
	make CC=gcc CFLAGS="-O2" GNATLIBCFLAGS="-fPIC -O2" THREAD_KIND=fsu gnatlib
	make prefix="${D}/usr" install-gnatlib
	cd "${D}/usr/lib/gcc-lib/${CHOST}/2.8.1"
	mv adalib adainclude rts-fsu
	rm -f rts-fsu/adalib/{libgnarl.so,libgnat.so}

	# Install the precompiled FSU library from the binary distribution
	cp "${GNATBOOTINST}/libgthreads.a" "${D}/usr/lib/gcc-lib/${CHOST}/2.8.1"
	cp "${GNATBOOTINST}/libmalloc.a" "${D}/usr/lib/gcc-lib/${CHOST}/2.8.1"

	cp "${GNATBOOTINST}/gnathtml.pl" "${D}/usr/bin"
	chmod +x "${D}/usr/bin"

	# Make native threads the default
	dosym /usr/lib/gcc-lib/${CHOST}/2.8.1/rts-native/adalib \
		/usr/lib/gcc-lib/${CHOST}/2.8.1/
	dosym /usr/lib/gcc-lib/${CHOST}/2.8.1/rts-native/adainclude \
		/usr/lib/gcc-lib/${CHOST}/2.8.1/
}

pkg_postinst() {
	# Notify the user what changed
	einfo ""
	einfo "Both the native-threads and the FSU-threads libraries have been"
	einfo "installed. The native-threads version is the default on linux."
	einfo "If you want to use FSU-threads (required if you are using Annex D)"
	einfo "you must set the following two environment variables:"
	einfo "ADA_INCLUDE_PATH=/usr/lib/gcc-lib/${CHOST}/2.8.1/rts-fsu/adainclude:\$ADA_INCLUDE_PATH"
	einfo "ADA_OBJECTS_PATH=/usr/lib/gcc-lib/${CHOST}/2.8.1/rts-fsu/adalib:\$ADA_OBJECTS_PATH"
	einfo "or use the -aI/usr/lib/gcc-lib/${CHOST}/2.8.1/rts-fsu/adainclude"
	einfo "-aO/usr/lib/gcc-lib/${CHOST}/2.8.1/rts-fsu/adalib"
	einfo "or you can give gnatmake the following switch: --RTS=fsu"
	einfo ""
	einfo "The compiler has been installed as gnatgcc, and the coverage testing"
	einfo "tool as gnatgcov."
	einfo ""
}