blob: 9fc4e24d5aa8c7f7243663f17979943c9dc09eac (
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
195
196
197
|
# This file adds the functions to build the MPFR library
# Copyright 2008 Yann E. MORIN
# Licensed under the GPL v2. See COPYING in the root of this package
do_mpfr_get() { :; }
do_mpfr_extract() { :; }
do_mpfr_for_build() { :; }
do_mpfr_for_host() { :; }
do_mpfr_for_target() { :; }
# Overide function depending on configuration
if [ "${CT_MPFR_TARGET}" = "y" -o "${CT_MPFR}" = "y" ]; then
# Download MPFR
do_mpfr_get() {
CT_Fetch MPFR
}
# Extract MPFR
do_mpfr_extract() {
CT_ExtractPatch MPFR
# TBD is it a problem with 2.4.x? The comment says it is not, yet the code is run
# OK, Gentoo have a sanity check that libtool.m4 and ltmain.sh have the
# same version number. Unfortunately, some tarballs of MPFR are not
# built sanely, and thus ./configure fails on Gentoo.
# See: http://sourceware.org/ml/crossgcc/2008-05/msg00080.html
# and: http://sourceware.org/ml/crossgcc/2008-06/msg00005.html
# This hack is not bad per se, but the MPFR guys would be better not to
# do that in the future...
# It seems that MPFR >= 2.4.0 do not need this...
case "${CT_MPFR_VERSION}" in
2.4.*)
CT_Pushd "${CT_SRC_DIR}/mpfr-${CT_MPFR_VERSION}"
if [ ! -f .autoreconf.ct-ng ]; then
CT_DoLog DEBUG "Running autoreconf"
CT_DoExecLog ALL autoreconf
touch .autoreconf.ct-ng
fi
CT_Popd
;;
esac
}
# Build MPFR for running on build
# - always build statically
# - install in build-tools prefix
do_mpfr_for_build() {
local -a mpfr_opts
case "${CT_TOOLCHAIN_TYPE}" in
native|cross) return 0;;
esac
CT_DoStep INFO "Installing MPFR for build"
CT_mkdir_pushd "${CT_BUILD_DIR}/build-mpfr-build-${CT_BUILD}"
mpfr_opts+=( "host=${CT_BUILD}" )
mpfr_opts+=( "prefix=${CT_BUILDTOOLS_PREFIX_DIR}" )
mpfr_opts+=( "cflags=${CT_CFLAGS_FOR_BUILD}" )
mpfr_opts+=( "ldflags=${CT_LDFLAGS_FOR_BUILD}" )
do_mpfr_backend "${mpfr_opts[@]}"
CT_Popd
CT_EndStep
}
# Build MPFR for running on host
do_mpfr_for_host() {
local -a mpfr_opts
CT_DoStep INFO "Installing MPFR for host"
CT_mkdir_pushd "${CT_BUILD_DIR}/build-mpfr-host-${CT_HOST}"
mpfr_opts+=( "host=${CT_HOST}" )
mpfr_opts+=( "prefix=${CT_HOST_COMPLIBS_DIR}" )
mpfr_opts+=( "cflags=${CT_CFLAGS_FOR_HOST}" )
mpfr_opts+=( "ldflags=${CT_LDFLAGS_FOR_HOST}" )
do_mpfr_backend "${mpfr_opts[@]}"
CT_Popd
CT_EndStep
}
if [ "${CT_MPFR_TARGET}" = "y" ]; then
do_mpfr_for_target() {
local -a mpfr_opts
CT_DoStep INFO "Installing MPFR for target"
CT_mkdir_pushd "${CT_BUILD_DIR}/build-mpfr-target-${CT_HOST}"
mpfr_opts+=( "host=${CT_TARGET}" )
case "${CT_TARGET}" in
*-*-mingw*)
prefix="/mingw"
;;
*)
prefix="/usr"
;;
esac
mpfr_opts+=( "cflags=${CT_ALL_TARGET_CFLAGS}" )
mpfr_opts+=( "prefix=${prefix}" )
mpfr_opts+=( "destdir=${CT_SYSROOT_DIR}" )
do_mpfr_backend "${mpfr_opts[@]}"
CT_Popd
CT_EndStep
}
fi
# Build MPFR
# Parameter : description : type : default
# host : machine to run on : tuple : (none)
# prefix : prefix to install into : dir : (none)
# cflags : cflags to use : string : (empty)
# ldflags : ldflags to use : string : (empty)
# destdir : install destination : dir : (none)
do_mpfr_backend() {
local host
local prefix
local cflags
local ldflags
local destdir
local arg
local -a extra_config
for arg in "$@"; do
eval "${arg// /\\ }"
done
# Under Cygwin, we can't build a thread-safe library
case "${CT_HOST}" in
*cygwin*) extra_config+=( --disable-thread-safe );;
*mingw*) extra_config+=( --disable-thread-safe );;
*darwin*) extra_config+=( --disable-thread-safe );;
*) extra_config+=( --enable-thread-safe );;
esac
if [ "${CT_CC_LANG_JIT}" = "y" ]; then
extra_config+=("--with-pic")
fi
CT_DoLog EXTRA "Configuring MPFR"
CT_DoExecLog CFG \
CC="${host}-gcc" \
CFLAGS="${cflags}" \
LDFLAGS="${ldflags}" \
${CONFIG_SHELL} \
"${CT_SRC_DIR}/mpfr/configure" \
--build=${CT_BUILD} \
--host=${host} \
--prefix="${prefix}" \
"${extra_config[@]}" \
--with-gmp="${destdir}${prefix}" \
--disable-shared \
--enable-static
# If "${destdir}${prefix}" != "${prefix}" then it means that native MPFR
# is being built. In this case libgmp.la must be moved away while
# building MPFR. Otherwise libmpfr.la will contain this:
#
# dependency_libs=' -L<path-to-build-dir>/lib /usr/lib/libgmp.la'
#
# Build system then tries to link MPFR with host's libgmp.a. It happens
# because libgmp.a and libmpfr.a are built with --prefix=/usr while
# cross-compiling for target and MPFR depends on GMP. In this case
# libtool thinks that GMP resides in /usr/lib and uses wrong path.
# The only way to avoid such behavior is to replace libgmp.la
# temporarily to force libtool using -lgmp option instead wrong one.
if [ "${destdir}${prefix}" != "${prefix}" ]; then
if [ -f ${destdir}${prefix}/lib/libgmp.la ]; then
mv ${destdir}${prefix}/lib/libgmp.la ${destdir}${prefix}/lib/libgmp.la.bk
fi
fi
CT_DoLog EXTRA "Building MPFR"
CT_DoExecLog ALL make ${CT_JOBSFLAGS}
if [ -f ${destdir}${prefix}/lib/libgmp.la.bk ]; then
mv ${destdir}${prefix}/lib/libgmp.la.bk ${destdir}${prefix}/lib/libgmp.la
fi
if [ "${CT_COMPLIBS_CHECK}" = "y" ]; then
if [ "${host}" = "${CT_BUILD}" ]; then
CT_DoLog EXTRA "Checking MPFR"
CT_DoExecLog ALL make ${CT_JOBSFLAGS} -s check
else
# Cannot run host binaries on build in a canadian cross
CT_DoLog EXTRA "Skipping check for MPFR on the host"
fi
fi
CT_DoLog EXTRA "Installing MPFR"
CT_DoExecLog ALL make install DESTDIR="${destdir}"
}
fi # CT_MPFR
|