forked from sagemath/sage
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsage_spkg_configure.m4
206 lines (189 loc) · 8.5 KB
/
sage_spkg_configure.m4
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
198
199
200
201
202
203
204
205
206
# SYNOPSIS
#
# SAGE_SPKG_CONFIGURE(PACKAGE-NAME,[CHECK],[REQUIRED-CHECK],[PRE],[POST])
# SAGE_SPKG_CONFIGURE_BASE(PACKAGE-NAME,[CHECK],[REQUIRED-CHECK],[PRE],[POST],[DEPS])
#
# DESCRIPTION
#
# This macro should be used in the build/<spkg>/spkg-configure.m4 templates
# for each SPKG (if defined) to specify how to check whether or not it is
# required to be installed, and whether or not it's already installed.
#
# The macro takes five arguments. The first, PACKAGE-NAME, is simply the
# base name of the SPKG. The first two arguments, both optional,
# implement two different kinds of checks (the first of which is more
# common).
#
# The next argument (which is less commonly needed) is an optional list of
# initialization instructions which should be performed by the configure
# script regardless whether or not the SPKG should be installed (e.g. setting
# up --with and --enable flags). The last argument is again commands that
# are always run, but after the checks are performed (or if they are not
# performed):
#
# - CHECK - this should implement a test for whether the package is already
# available on the system and/or meets any feature tests required for
# Sage. If this test fails it sets the shell variable
# sage_spkg_install_<packagename> to "yes". Otherwise it defaults to "no",
# i.e., SageMath may not need to install the package.
#
# - REQUIRED-CHECK - this checks whether or not the package is a required
# dependency of Sage at all, depending typically on the platform. Some
# packages (e.g. sqlite) are only dependencies in some circumstances
# and otherwise do not need to be checked for at all. If
# a REQUIRED-CHECK determines that the package is not required it sets
# sage_require_<packagename>="no".
#
# - PRE - always perform these actions even if the SPKG is already installed
#
# - POST - always pwerform these actions regardless whether the SPKG will
# be installed.
#
# - DEPS - to pass dependencies generated by SAGE_SPKG_CONFIGURE_BASE
#
AC_DEFUN([SAGE_SPKG_CONFIGURE_BASE], [
AC_DEFUN_ONCE([SAGE_SPKG_CONFIGURE_]m4_toupper($1), [
dnl The name of this SPKG
m4_pushdef([SPKG_NAME], [$1])
dnl Whether SageMath needs to install this package
m4_pushdef([SPKG_INSTALL], [sage_spkg_install_]SPKG_NAME)
dnl Whether SageMath requires this package to be present somehow
m4_pushdef([SPKG_REQUIRE], [sage_require_]SPKG_NAME)
dnl Whether we want the system to provide this package:
dnl * "yes", attempt to use the system package
dnl * "no", do not attempt to use the system package
dnl * "force", use the system package and fail if it was deemed not suitable
dnl * other values mean that we do not want to use the system package but
dnl indicate why
m4_pushdef([SPKG_USE_SYSTEM], [sage_use_system_]SPKG_NAME)
# BEGIN SAGE_SPKG_CONFIGURE_]m4_toupper($1)[
dnl Hide the output from Python (system site package) checks
dnl when --enable-system-site-packages was not given. This
dnl doesn't affect the test results but it minimizes the noise
dnl in the ./configure output. The config.log however retains
dnl everything.
dnl
dnl Open descriptor 9 as a copy of AS_MESSAGE_FD, so that it
dnl can later be used to restore AS_MESSAGE_FD. Afterwards,
dnl send AS_MESSAGE_FD to /dev/null. We'll restore it if this
dnl isn't a python package or if --enable-system-site-packages
dnl was given (or at the end of this macro, if nothing else).
exec 9<&AS_MESSAGE_FD
exec AS_MESSAGE_FD>/dev/null
AS_IF([test "${enable_system_site_packages}" = "yes"], [
dnl Python package checks are enabled, so restore AS_MESSAGE_FD
exec AS_MESSAGE_FD<&9
])
SPKG_CONFIGURE="${SAGE_ROOT}/build/pkgs/$1/spkg-configure.m4"
AS_IF([! grep -q [SAGE_PYTHON_PACKAGE_CHECK] "${SPKG_CONFIGURE}"],[
dnl Not a python package, so restore AS_MESSAGE_FD
exec AS_MESSAGE_FD<&9
])
echo "-----------------------------------------------------------------------------" >& AS_MESSAGE_FD
echo "Checking whether SageMath should install SPKG $1..." >& AS_MESSAGE_FD
AS_BOX([Checking whether SageMath should install SPKG $1...]) >& AS_MESSAGE_LOG_FD
AC_ARG_WITH([system-]SPKG_NAME,
AS_HELP_STRING(--with-system-SPKG_NAME={no|yes (default)|force (exit with an error if no usable version is found)},
[detect and use an existing system SPKG_NAME]),
[AS_VAR_SET(SPKG_USE_SYSTEM, [$withval])]
)
AS_VAR_SET([sage_spkg_name], SPKG_NAME)
dnl Default value for most packages
AS_VAR_SET_IF([SPKG_USE_SYSTEM], [], [AS_VAR_SET([SPKG_USE_SYSTEM], [yes])])
dnl The default is not to install a package, unless a check below finds that we should.
AS_VAR_SET(SPKG_INSTALL, [no])
dnl Run DEPS
$6
dnl Run PRE
$4
dnl If a version of this package is already installed in local/ we have no
dnl choice but to use it and we will actually also update it even if it is not
dnl required.
AS_IF([test -n "`ls "${SAGE_LOCAL}/var/lib/sage/installed/${sage_spkg_name}"-* 2>/dev/null`"], [
AC_MSG_NOTICE(m4_normalize(SPKG_NAME[ has already been installed by SageMath]))
AS_VAR_SET(SPKG_INSTALL, [yes])
AS_VAR_SET(SPKG_USE_SYSTEM, [installed])
])
dnl Perform REQUIRED-CHECK if present.
AS_VAR_SET_IF(SPKG_REQUIRE, [], [AS_VAR_SET(SPKG_REQUIRE, [yes])])
$3
AS_VAR_IF(SPKG_INSTALL, [no], [
AS_VAR_IF(SPKG_REQUIRE, [no], [
AC_MSG_NOTICE(m4_normalize([SPKG ]SPKG_NAME[ is not required on this system]))
], [
dnl If this is a required package and nothing before has found that we
dnl should install the SPKG, we run the checks to determine whether we
dnl can use a system package.
AS_VAR_IF(SPKG_USE_SYSTEM, [no], [
dnl We were asked not to use the system package, so no checks are needed
AS_VAR_SET(SPKG_INSTALL, [yes])
], [
m4_ifval([$2], [
dnl If there is a CHECK, run it to determine whether the system package is suitable
$2
AS_VAR_IF(SPKG_INSTALL, [no], [
dnl Since force did not make a difference, no need to report that force was used
AS_VAR_SET(SPKG_USE_SYSTEM, [yes])
AC_MSG_NOTICE(m4_normalize([will use system package and not install SPKG ]SPKG_NAME))
], [
AS_VAR_IF(SPKG_USE_SYSTEM, [force], [
AS_VAR_APPEND([SAGE_SPKG_ERRORS], ["
Given --with-system-]SPKG_NAME[=force, but no system package could be used.
That's an error. Please install the indicated package to continue.
(To override this error, use ./configure --without-system-]SPKG_NAME[)"])
], [
AC_MSG_NOTICE(m4_normalize([no suitable system package found for SPKG ]SPKG_NAME))
])
])
], [
dnl If there is no CHECK, install the SPKG unless forced not to
AS_VAR_IF(SPKG_USE_SYSTEM, [force], [
AC_MSG_NOTICE(m4_normalize([will use system package and not install SPKG ]SPKG_NAME))
AS_VAR_SET(SPKG_INSTALL, [no])
], [
AC_MSG_NOTICE(m4_normalize([no suitable system package found for SPKG ]SPKG_NAME))
AS_VAR_SET(SPKG_INSTALL, [yes])
])
])
])
])
])
dnl Run POST
$5
dnl Restore the message file descriptor that we clobbered earlier
dnl for the sake of hiding site package check noise. It's possible
dnl that we've already done this above, but it doesn't hurt to do
dnl it again, and we want everything "back to normal" at the end
dnl of this macro.
exec AS_MESSAGE_FD<&9
# END SAGE_SPKG_CONFIGURE_]m4_toupper($1)[
m4_popdef([SPKG_USE_SYSTEM])
m4_popdef([SPKG_REQUIRE])
m4_popdef([SPKG_INSTALL])
m4_popdef([SPKG_NAME])
])
])
AC_DEFUN([SAGE_SPKG_CONFIGURE], [
SAGE_SPKG_CONFIGURE_BASE([$1], [$2], [$3], [$4], [$5], [AC_REQUIRE([SAGE_SPKG_CONFIGURE_GCC])])
])
# SYNOPSIS
#
# SAGE_SPKG_DEPCHECK(PACKAGE-DEPENDENCIES, FURTHER-CHECK)
# $1 $2
#
# DESCRIPTION
# *** to be called from SAGE_SPKG_CONFIGURE* ***
# check for space-separated list of package dependencies $1 of package SPKG_NAME
# do $2 if successful
#
AC_DEFUN([SAGE_SPKG_DEPCHECK], [
m4_foreach_w([DEP], $1, [
AC_REQUIRE([SAGE_SPKG_CONFIGURE_]m4_toupper(DEP))])
AC_MSG_CHECKING([whether any of $1 is installed as or will be installed as SPKG])
AS_IF([test x = y m4_foreach_w([DEP], $1, [ -o [x$sage_spkg_install_]DEP = xyes])], [
AC_MSG_RESULT([yes; install SPKG_NAME as well])
[sage_spkg_install_]SPKG_NAME=yes], [
AC_MSG_RESULT([no])
$2
])
])