summaryrefslogtreecommitdiffstats
path: root/gl/m4/getloadavg.m4
blob: 0918bcd21eca25a703918ac6df8d3d517ff99c16 (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
# getloadavg.m4
# serial 13
dnl Copyright (C) 1992-1996, 1999-2000, 2002-2003, 2006, 2008-2024 Free Software
dnl Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved.

# Check for getloadavg.

# Autoconf defines AC_FUNC_GETLOADAVG, but that is obsolescent.
# New applications should use gl_GETLOADAVG instead.

# gl_GETLOADAVG
# -------------
AC_DEFUN([gl_GETLOADAVG],
[AC_REQUIRE([gl_STDLIB_H_DEFAULTS])

# Persuade glibc <stdlib.h> to declare getloadavg().
AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])

gl_saved_LIBS=$LIBS

# getloadavg is present in libc on glibc >= 2.2, Mac OS X, FreeBSD >= 2.0,
# NetBSD >= 0.9, OpenBSD >= 2.0, Solaris >= 7.
HAVE_GETLOADAVG=1
gl_CHECK_FUNCS_ANDROID([getloadavg], [[#include <stdlib.h>]])
if test $ac_cv_func_getloadavg != yes; then
   case "$gl_cv_onwards_func_getloadavg" in
     future*) REPLACE_GETLOADAVG=1 ;;
   esac

   gl_func_getloadavg_done=no

   # Some systems with -lutil have (and need) -lkvm as well, some do not.
   # On Solaris, -lkvm requires nlist from -lelf, so check that first
   # to get the right answer into the cache.
   # For kstat on solaris, we need to test for libelf and libkvm to force the
   # definition of SVR4 below.
   if test $gl_func_getloadavg_done = no; then
     AC_CHECK_LIB([elf], [elf_begin], [LIBS="-lelf $LIBS"])
     AC_CHECK_LIB([kvm], [kvm_open], [LIBS="-lkvm $LIBS"])
     # Check for the 4.4BSD definition of getloadavg.
     AC_CHECK_LIB([util], [getloadavg],
       [LIBS="-lutil $LIBS" gl_func_getloadavg_done=yes])
   fi

   if test $gl_func_getloadavg_done = no; then
     # There is a commonly available library for RS/6000 AIX.
     # Since it is not a standard part of AIX, it might be installed locally.
     gl_getloadavg_LIBS=$LIBS
     if test $cross_compiling != yes; then
       LIBS="-L/usr/local/lib $LIBS"
     fi
     AC_CHECK_LIB([getloadavg], [getloadavg],
                  [LIBS="-lgetloadavg $LIBS" gl_func_getloadavg_done=yes],
                  [LIBS=$gl_getloadavg_LIBS])
   fi

   # Set up the replacement function if necessary.
   if test $gl_func_getloadavg_done = no; then
     HAVE_GETLOADAVG=0

     # Solaris has libkstat which does not require root.
     AC_CHECK_LIB([kstat], [kstat_open])
     test $ac_cv_lib_kstat_kstat_open = yes && gl_func_getloadavg_done=yes

     # AIX has libperfstat which does not require root
     if test $gl_func_getloadavg_done = no; then
       AC_CHECK_LIB([perfstat], [perfstat_cpu_total])
       test $ac_cv_lib_perfstat_perfstat_cpu_total = yes && gl_func_getloadavg_done=yes
     fi

     if test $gl_func_getloadavg_done = no; then
       AC_CHECK_HEADER([sys/dg_sys_info.h],
         [gl_func_getloadavg_done=yes
          AC_DEFINE([DGUX], [1], [Define to 1 for DGUX with <sys/dg_sys_info.h>.])
          AC_CHECK_LIB([dgc], [dg_sys_info])])
     fi
   fi
fi

if test "x$gl_saved_LIBS" = x; then
  GETLOADAVG_LIBS=$LIBS
else
  GETLOADAVG_LIBS=`echo "$LIBS" | sed "s!$gl_saved_LIBS!!"`
fi
LIBS=$gl_saved_LIBS

AC_SUBST([GETLOADAVG_LIBS])dnl

# Test whether the system declares getloadavg. Solaris has the function
# but declares it in <sys/loadavg.h>, not <stdlib.h>.
AC_CHECK_HEADERS([sys/loadavg.h])
if test $ac_cv_header_sys_loadavg_h = yes; then
  HAVE_SYS_LOADAVG_H=1
else
  HAVE_SYS_LOADAVG_H=0
fi
AC_CHECK_DECL([getloadavg], [], [HAVE_DECL_GETLOADAVG=0],
  [[#if HAVE_SYS_LOADAVG_H
    /* OpenIndiana has a bug: <sys/time.h> must be included before
       <sys/loadavg.h>.  */
    # include <sys/time.h>
    # include <sys/loadavg.h>
    #endif
    #include <stdlib.h>]])
])# gl_GETLOADAVG


# gl_PREREQ_GETLOADAVG
# --------------------
# Set up the AC_LIBOBJ replacement of 'getloadavg'.
AC_DEFUN([gl_PREREQ_GETLOADAVG],
[
# Figure out what our getloadavg.c needs.

AC_CHECK_HEADERS_ONCE([sys/param.h unistd.h])

# On HPUX9, an unprivileged user can get load averages this way.
if test $gl_func_getloadavg_done = no; then
  AC_CHECK_FUNCS([pstat_getdynamic], [gl_func_getloadavg_done=yes])
fi

# We cannot check for <dwarf.h>, because Solaris 2 does not use dwarf (it
# uses stabs), but it is still SVR4.  We cannot check for <elf.h> because
# Irix 4.0.5F has the header but not the library.
if test $gl_func_getloadavg_done = no && test "$ac_cv_lib_elf_elf_begin" = yes \
    && test "$ac_cv_lib_kvm_kvm_open" = yes; then
  gl_func_getloadavg_done=yes
  AC_DEFINE([SVR4], [1], [Define to 1 on System V Release 4.])
fi

if test $gl_func_getloadavg_done = no; then
  AC_CHECK_HEADER([inq_stats/cpustats.h],
  [gl_func_getloadavg_done=yes
   AC_DEFINE([UMAX], [1], [Define to 1 for Encore UMAX.])
   AC_DEFINE([UMAX4_3], [1],
             [Define to 1 for Encore UMAX 4.3 that has <inq_status/cpustats.h>
              instead of <sys/cpustats.h>.])])
fi

if test $gl_func_getloadavg_done = no; then
  AC_CHECK_HEADER([sys/cpustats.h],
  [gl_func_getloadavg_done=yes; AC_DEFINE([UMAX])])
fi

if test $gl_func_getloadavg_done = no; then
  AC_CHECK_HEADERS([mach/mach.h])
fi

AC_CHECK_HEADERS([nlist.h],
[AC_CHECK_MEMBERS([struct nlist.n_un.n_name],
                  [], [],
                  [#include <nlist.h>])
 AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <nlist.h>]],
                   [[struct nlist x;
                    #ifdef HAVE_STRUCT_NLIST_N_UN_N_NAME
                    x.n_un.n_name = "";
                    #else
                    x.n_name = "";
                    #endif]])],
                [AC_DEFINE([N_NAME_POINTER], [1],
                           [Define to 1 if the nlist n_name member is a pointer])])
])dnl
])# gl_PREREQ_GETLOADAVG