File: windowmaker.m4

package info (click to toggle)
wmaker 0.96.0-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 15,332 kB
  • sloc: ansic: 99,482; sh: 7,068; perl: 3,423; makefile: 1,647; lisp: 219; python: 34
file content (321 lines) | stat: -rw-r--r-- 12,450 bytes parent folder | download
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
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
# windowmaker.m4 - General macros for Window Maker autoconf
#
# Copyright (c) 2004 Dan Pascu
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.


dnl Tell m4 to not allow stuff starting with "WM_" in the generated file
dnl because this is likely a problem of a macro that was not expanded as
dnl expected (with an exception for an already used variable name)
m4_pattern_forbid([^_?WM_])
m4_pattern_allow([^WM_OSDEP(_[A-Z]*)?$])


# WM_DENY_ARG_WITH(PACKAGE, ACTION-IF-GIVEN)
#
# Check if the argument "--with-PACKAGE" was used, and if it is the case
# execute ACTION-IF-GIVEN which is supposed to call AC_MSG_ERROR to
# stop any further processing and tell the user its arguments are bad
AC_DEFUN([WM_DENY_ARG_WITH],
[m4_divert_push([INIT_PREPARE])dnl
 AS_IF([test "${[with_]m4_translit([$1], [-+.], [___])+set}" = set], [$2])
 m4_divert_pop([INIT_PREPARE])])


# WM_CHECK_XFT_VERSION(MIN_VERSION, [ACTION-IF-FOUND [,ACTION-IF-NOT-FOUND]])
#
# $XFT_CFLAGS should be defined before calling this macro,
# else it will not be able to find Xft.h
#
AC_DEFUN([WM_CHECK_XFT_VERSION],
[m4_define([XFT_REQUIRED_VERSION],
    m4_eval(m4_bregexp($1, [^\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)],
                       [\1 * 10000 + \2 * 100 + \3]) ) )dnl
 AC_CACHE_CHECK([whether libXft is at least version $1], [ac_cv_lib_xft_version_ok],
    [CPPFLAGS_save="$CPPFLAGS"
     CPPFLAGS="$CPPFLAGS $XFT_CFLAGS $inc_search_path"
     AC_LINK_IFELSE(
[AC_LANG_PROGRAM([
#include <X11/Xlib.h>
#include <X11/Xft/Xft.h>
], [
#if !defined(XFT_VERSION) || XFT_VERSION < ]XFT_REQUIRED_VERSION[
#error libXft on this system is too old. Consider upgrading to at least $1
#endif
])], [ac_cv_lib_xft_version_ok=yes], [ac_cv_lib_xft_version_ok=no])
     CPPFLAGS="$CPPFLAGS_save"])
 m4_undefine([XFT_REQUIRED_VERSION])dnl
 AS_IF([test "x$ac_cv_lib_xft_version_ok" != "xyes"], [$3], [$2])dnl
])


# WM_CHECK_LIBPANGO
# -----------------
#
# If the support was not disabled by user, check for the pango library using
# pkg-config, and if found place the appropriate stuff in the variables
# PANGO_CFLAGS (for compiler) and PANGO_LIBS (for linker)
AC_DEFUN([WM_CHECK_LIBPANGO],
[AS_IF([test "x$enable_pango" != "xno"],
    [PKG_CHECK_MODULES([PANGO], [pangoxft],
        [AC_DEFINE([USE_PANGO], [1], [defined when the pango library is used in WINGs])
         pango="yes"],
        [pango="no"])
     AS_IF([test "x$enable_pango$pango" == "xyesno"],
        [AC_MSG_ERROR([Pango library was not found - $PANGO_PKG_ERRORS])])
    ],
    [pango="no"])
 AC_SUBST([PANGO_CFLAGS])dnl
 AC_SUBST([PANGO_LIBS])dnl
])


# _WM_LIB_CHECK_FUNCTS
# --------------------
# (internal shell functions)
#
# Create 2 shell functions:
#  wm_fn_imgfmt_try_link: try to link against library
#  wm_fn_imgfmt_try_compile: try to compile against header
#
AC_DEFUN_ONCE([_WM_LIB_CHECK_FUNCTS],
[@%:@ wm_fn_lib_try_link FUNCTION LFLAGS
@%:@ ----------------------------------
@%:@ Try linking against library in $LFLAGS using function named $FUNCTION
@%:@ Assumes that LIBS have been saved in 'wm_save_LIBS' by caller
wm_fn_lib_try_link ()
{
  LIBS="$wm_save_LIBS $[]2"
  AC_TRY_LINK_FUNC([$[]1],
    [wm_retval=0],
    [wm_retval=1])
  AS_SET_STATUS([$wm_retval])
}

@%:@ wm_fn_lib_try_compile HEADER GVARDEF FUNC_CALL CFLAGS
@%:@ -----------------------------------------------------
@%:@ Try to compile using header $HEADER and trying to call a function
@%:@ using the $FUNC_CALL expression and using extra $CFLAGS in the
@%:@ compiler's command line; GVARDEF can be used to include one line
@%:@ in the global context of the source.
@%:@ Assumes that CFLAGS have been saved in 'wm_save_CFLAGS' by caller
wm_fn_lib_try_compile ()
{
  CFLAGS="$wm_save_CFLAGS $[]4"
  AC_COMPILE_IFELSE(
    [AC_LANG_PROGRAM([@%:@include <$[]1>

$[]2], [  $[]3;])],
    [wm_retval=0],
    [wm_retval=1])
  AS_SET_STATUS([$wm_retval])
}
])


# WM_APPEND_ONCE
# --------------
#
# Append flags to a variable, but only if not already present
#
# Usage: WM_APPEND_ONCE([libflags], [variable])
#   $1 libflags: the list of flag to append
#   $2 variable: the variable, if unset use LIBS
AC_DEFUN([WM_APPEND_ONCE],
[AS_VAR_PUSHDEF([VAR], [m4_ifnblank([$2], [$2], [LIBS])])dnl
for wm_arg in $1 ; do
  AS_IF([echo " $VAR " | grep " $wm_arg " 2>&1 >/dev/null],
        [@%:@ Flag already present in VAR],
        [VAR="$VAR $wm_arg"])
done
AS_VAR_POPDEF([VAR])dnl
])


# WM_LIB_CHECK
# ------------
#
# Check if a library exists (can be linked to) and check if its header can
# compile (using code in parameter to the macro), then update the appropriate
# stuff accordingly
#
# Usage: WM_LIB_CHECK([name], [lflaglist], [lfunc], [extralibs], [headercheck], [supvar], [libvar], [enable_var], [cond_name])
#   $1 name: name of the feature used in messages and in supvar
#   $2 lflaglist: the list of linker '-l' options to try, stopping on first success
#   $3 lfunc: the name of the function to look for when linking
#   $4 extralibs: optional, additional libraries included in the link check
#   $5 headercheck: the code that checks for the header
#   $6 supvar: if the library was found, append $name to this variable,
#              otherwise append $name to 'unsupported'
#   $7 libvar: if the library was found, append the working $lflag to this variable
#   $8 enable_var: variable to check for user's feature request, if empty we use "lowercase(enable_$1)"
#   $9 cond_name: name of the AC_DEFINE and the AM_CONDITIONAL
#                 if empty, use "uppercase(USE_$1)", if equals "-" same but do not create AM_CONDITIONAL
AC_DEFUN([WM_LIB_CHECK],
[AC_REQUIRE([_WM_LIB_CHECK_FUNCTS])
m4_pushdef([ENABLEVAR], [m4_ifnblank([$8], [$8], enable_[]m4_tolower($1))])dnl
m4_pushdef([CACHEVAR], [wm_cv_libchk_[]m4_tolower($1)])dnl
m4_pushdef([USEVAR], [m4_bmatch([$9], [^-?$], [USE_[]m4_toupper($1)], [$9])])dnl
AS_IF([test "x$ENABLEVAR" = "xno"],
    [unsupported="$unsupported $1"],
    [AC_CACHE_CHECK([for $1 support library], CACHEVAR,
        [CACHEVAR=no
         wm_save_LIBS="$LIBS"
         dnl
         dnl We check that the library is available
         m4_bmatch([$2], [ ], dnl Any space in 'lflaglist' means we have a list of flags
            [for wm_arg in $2 ; do
               AS_IF([wm_fn_lib_try_link "$3" "$4 $wm_arg"],
                 [CACHEVAR="$wm_arg" ; break])
             done],
            [AS_IF([wm_fn_lib_try_link "$3" "$4 $2"],
                [CACHEVAR="$2"]) ])
         LIBS="$wm_save_LIBS"
         AS_IF([test "x$ENABLEVAR$CACHEVAR" = "xyesno"],
            [AC_MSG_ERROR([explicit $1 support requested but no library found])])
         dnl
         dnl A library was found, check if header is available and compile
         AS_IF([test "x$CACHEVAR" != "xno"], [$5])
        ])
    AS_IF([test "x$CACHEVAR" = "xno"],
        [unsupported="$unsupported $1"
         ENABLEVAR="no"],
        [$6="$$6 $1"
         WM_APPEND_ONCE([$CACHEVAR], [$7])
         AC_DEFINE(USEVAR, [1],
            [defined when valid $1 library with header was found])])
    ])
m4_bmatch([$9], [^-$], [],
    [AM_CONDITIONAL(USEVAR, [test "x$ENABLEVAR" != "xno"])])dnl
m4_popdef([ENABLEVAR])dnl
m4_popdef([CACHEVAR])dnl
m4_popdef([USEVAR])dnl
])


# WM_CHECK_WEBREPODIR
# -------------------
#
# If the maintainer's option --with-web-repo was specified, check that the path provided is a valid
# existing directory and that it is a GIT repository that looks like Window Maker's Website repo.
AC_DEFUN_ONCE([WM_CHECK_WEBREPODIR],
[AS_IF([test "x$WEB_REPO_ROOT" != "x"],
    [AS_IF([test ! -d "$WEB_REPO_ROOT"],
         [AC_MSG_ERROR([The path "$with_web_repo" is not a directory, for --with-web-repo])])

     # Convert to an Absolute path in the case it is not
     WEB_REPO_ROOT=`cd "$WEB_REPO_ROOT" ; pwd`

     AS_IF([test ! -d "$WEB_REPO_ROOT/.git"],
         [AC_MSG_ERROR([The path "$WEB_REPO_ROOT" is not a GIT repository, for --with-web-repo])])
     AS_IF([test ! -f "$WEB_REPO_ROOT/_config.yml"],
         [AC_MSG_ERROR([The path "$WEB_REPO_ROOT" does not look like Window Maker's website repository, for --with-web-repo])])

     # This is used to convert MAN pages into HTML pages
     AC_CACHE_CHECK([how to convert man to html], [ac_cv_path_GROFF],
         [AC_PATH_PROGS_FEATURE_CHECK([GROFF], [groff],
             [echo '.TH dummy 0' | $ac_path_GROFF -man -Dutf8 -Thtml > /dev/null 2> /dev/null
              test $? -eq 0 && ac_cv_path_GROFF=$ac_path_GROFF ac_path_GROFF_found=:],
             [AC_MSG_ERROR([no working "groff" found -- If you have "groff-base" it is not enough for HTML support])]) ])
     AC_SUBST([GROFF], [$ac_cv_path_GROFF])
    ])
 AM_CONDITIONAL([WITH_WEB_REPO], [test "x$WEB_REPO_ROOT" != "x"])
 AC_SUBST([WEB_REPO_ROOT])
])


# WM_FUNC_SECURE_GETENV
# ---------------------
#
# Check if the function 'secure_getenv' is available
# If found, defines HAVE_SECURE_GETENV
AC_DEFUN_ONCE([WM_FUNC_SECURE_GETENV],
[AC_REQUIRE([_WM_LIB_CHECK_FUNCTS])
AC_CACHE_CHECK([for secure_getenv], [wm_cv_func_secure_getenv],
    [wm_cv_func_secure_getenv=no
     wm_save_CFLAGS="$CFLAGS"
     for wm_arg in "% yes" "-D_GNU_SOURCE"; do
         AS_IF([wm_fn_lib_try_compile "stdlib.h" "const char *h;" "h = secure_getenv(\"HOME\")" dnl
                    "`echo "$wm_arg" | sed -e 's, *%.*$,,' ` -Werror=implicit-function-declaration"],
             [wm_cv_func_secure_getenv="`echo "$wm_arg" | sed -e 's,^.*% *,,' `"
              break])
     done
     CFLAGS="$wm_save_CFLAGS"])
AS_IF([test "x$wm_cv_func_secure_getenv" != "xno"],
    [AS_IF([test "x$wm_cv_func_secure_getenv" != "xyes"],
         [WM_APPEND_ONCE([$wm_cv_func_secure_getenv], [CPPFLAGS])])
     AC_DEFINE([HAVE_SECURE_GETENV], [1],
         [defined when GNU's secure_getenv function is available])])
])


# WM_FUNC_OPEN_NOFOLLOW
# ---------------------
#
# Check if the flag 'O_NOFOLLOW' is supported, for the function 'open'
AC_DEFUN_ONCE([WM_FUNC_OPEN_NOFOLLOW],
[AC_CACHE_CHECK([for O_NOFOLLOW], [wm_cv_func_open_nofollow],
    [wm_cv_func_open_nofollow=no
     wm_save_CPPFLAGS="$CPPFLAGS"
     for wm_arg in dnl
"yes"  dnl natively supported, nothing to do
"-D_POSIX_C_SOURCE=200809L"  dnl the flag was officially added in POSIX.1-2008
"-D_XOPEN_SOURCE=700"  dnl for recent glibc
"-D_GNU_SOURCE"  dnl for older glibc
     ; do
         AS_IF([test "x$wm_arg" != "xyes"], [CPPFLAGS="$wm_save_CPPFLAGS $wm_arg"])
         AC_LINK_IFELSE([AC_LANG_PROGRAM([dnl
@%:@include <sys/types.h>
@%:@include <sys/stat.h>
@%:@include <fcntl.h>], [dnl
  int fd;

  fd = open("/dev/null", O_RDONLY | O_NOFOLLOW);
  return fd;])], [found=1], [found=0])
         AS_IF([test $found = 1],
             [wm_cv_func_open_nofollow="$wm_arg"
              break])
     done
     CPPFLAGS="$wm_save_CPPFLAGS"])
AS_CASE([$wm_cv_func_open_nofollow],
    [yes], [],
    [no],  [AC_DEFINE([O_NOFOLLOW], [0],
                [defined by configure if the attribute is not defined on your platform])
            AC_MSG_WARN([flag O_NOFOLLOW is not defined on your platform])],
    [CPPFLAGS="$CPPFLAGS $wm_cv_func_open_nofollow"])
])


# WM_TYPE_SIGNAL
# --------------
#
# Check the return type for the function 'signal'
# Autoconf now claims we can assume the type is 'void' as it is in the C89 standard,
# but as Window Maker is supposed to be lightweight enough for old machines, we
# prefer to keep the check for portability
AC_DEFUN_ONCE([WM_TYPE_SIGNAL],
[AC_CACHE_CHECK([return type of signal handlers], [wm_cv_type_signal],
    [AC_COMPILE_IFELSE(
        [AC_LANG_PROGRAM([#include <sys/types.h>
#include <signal.h>
],
            [return *(signal (0, 0)) (0) == 1;])],
        [wm_cv_type_signal=int],
        [wm_cv_type_signal=void])dnl
    ])
AC_DEFINE_UNQUOTED([RETSIGTYPE], [$wm_cv_type_signal],
    [Define as the return type of signal handlers (`int' or `void')])dnl
])