xref: /freebsd/sys/contrib/openzfs/config/ax_count_cpus.m4 (revision 184c1b943937986c81e1996d999d21626ec7a4ff)
1*184c1b94SMartin Matuska# ===========================================================================
2*184c1b94SMartin Matuska#      https://www.gnu.org/software/autoconf-archive/ax_count_cpus.html
3*184c1b94SMartin Matuska# ===========================================================================
4*184c1b94SMartin Matuska#
5*184c1b94SMartin Matuska# SYNOPSIS
6*184c1b94SMartin Matuska#
7*184c1b94SMartin Matuska#   AX_COUNT_CPUS([ACTION-IF-DETECTED],[ACTION-IF-NOT-DETECTED])
8*184c1b94SMartin Matuska#
9*184c1b94SMartin Matuska# DESCRIPTION
10*184c1b94SMartin Matuska#
11*184c1b94SMartin Matuska#   Attempt to count the number of logical processor cores (including
12*184c1b94SMartin Matuska#   virtual and HT cores) currently available to use on the machine and
13*184c1b94SMartin Matuska#   place detected value in CPU_COUNT variable.
14*184c1b94SMartin Matuska#
15*184c1b94SMartin Matuska#   On successful detection, ACTION-IF-DETECTED is executed if present. If
16*184c1b94SMartin Matuska#   the detection fails, then ACTION-IF-NOT-DETECTED is triggered. The
17*184c1b94SMartin Matuska#   default ACTION-IF-NOT-DETECTED is to set CPU_COUNT to 1.
18*184c1b94SMartin Matuska#
19*184c1b94SMartin Matuska# LICENSE
20*184c1b94SMartin Matuska#
21*184c1b94SMartin Matuska#   Copyright (c) 2014,2016 Karlson2k (Evgeny Grin) <k2k@narod.ru>
22*184c1b94SMartin Matuska#   Copyright (c) 2012 Brian Aker <brian@tangent.org>
23*184c1b94SMartin Matuska#   Copyright (c) 2008 Michael Paul Bailey <jinxidoru@byu.net>
24*184c1b94SMartin Matuska#   Copyright (c) 2008 Christophe Tournayre <turn3r@users.sourceforge.net>
25*184c1b94SMartin Matuska#
26*184c1b94SMartin Matuska#   Copying and distribution of this file, with or without modification, are
27*184c1b94SMartin Matuska#   permitted in any medium without royalty provided the copyright notice
28*184c1b94SMartin Matuska#   and this notice are preserved. This file is offered as-is, without any
29*184c1b94SMartin Matuska#   warranty.
30*184c1b94SMartin Matuska
31*184c1b94SMartin Matuska#serial 22
32*184c1b94SMartin Matuska
33*184c1b94SMartin Matuska  AC_DEFUN([AX_COUNT_CPUS],[dnl
34*184c1b94SMartin Matuska      AC_REQUIRE([AC_CANONICAL_HOST])dnl
35*184c1b94SMartin Matuska      AC_REQUIRE([AC_PROG_EGREP])dnl
36*184c1b94SMartin Matuska      AC_MSG_CHECKING([the number of available CPUs])
37*184c1b94SMartin Matuska      CPU_COUNT="0"
38*184c1b94SMartin Matuska
39*184c1b94SMartin Matuska      # Try generic methods
40*184c1b94SMartin Matuska
41*184c1b94SMartin Matuska      # 'getconf' is POSIX utility, but '_NPROCESSORS_ONLN' and
42*184c1b94SMartin Matuska      # 'NPROCESSORS_ONLN' are platform-specific
43*184c1b94SMartin Matuska      command -v getconf >/dev/null 2>&1 && \
44*184c1b94SMartin Matuska        CPU_COUNT=`getconf _NPROCESSORS_ONLN 2>/dev/null || getconf NPROCESSORS_ONLN 2>/dev/null` || CPU_COUNT="0"
45*184c1b94SMartin Matuska      AS_IF([[test "$CPU_COUNT" -gt "0" 2>/dev/null || ! command -v nproc >/dev/null 2>&1]],[[: # empty]],[dnl
46*184c1b94SMartin Matuska        # 'nproc' is part of GNU Coreutils and is widely available
47*184c1b94SMartin Matuska        CPU_COUNT=`OMP_NUM_THREADS='' nproc 2>/dev/null` || CPU_COUNT=`nproc 2>/dev/null` || CPU_COUNT="0"
48*184c1b94SMartin Matuska      ])dnl
49*184c1b94SMartin Matuska
50*184c1b94SMartin Matuska      AS_IF([[test "$CPU_COUNT" -gt "0" 2>/dev/null]],[[: # empty]],[dnl
51*184c1b94SMartin Matuska        # Try platform-specific preferred methods
52*184c1b94SMartin Matuska        AS_CASE([[$host_os]],dnl
53*184c1b94SMartin Matuska          [[*linux*]],[[CPU_COUNT=`lscpu -p 2>/dev/null | $EGREP -e '^@<:@0-9@:>@+,' -c` || CPU_COUNT="0"]],dnl
54*184c1b94SMartin Matuska          [[*darwin*]],[[CPU_COUNT=`sysctl -n hw.logicalcpu 2>/dev/null` || CPU_COUNT="0"]],dnl
55*184c1b94SMartin Matuska          [[freebsd*]],[[command -v sysctl >/dev/null 2>&1 && CPU_COUNT=`sysctl -n kern.smp.cpus 2>/dev/null` || CPU_COUNT="0"]],dnl
56*184c1b94SMartin Matuska          [[netbsd*]], [[command -v sysctl >/dev/null 2>&1 && CPU_COUNT=`sysctl -n hw.ncpuonline 2>/dev/null` || CPU_COUNT="0"]],dnl
57*184c1b94SMartin Matuska          [[solaris*]],[[command -v psrinfo >/dev/null 2>&1 && CPU_COUNT=`psrinfo 2>/dev/null | $EGREP -e '^@<:@0-9@:>@.*on-line' -c 2>/dev/null` || CPU_COUNT="0"]],dnl
58*184c1b94SMartin Matuska          [[mingw*]],[[CPU_COUNT=`ls -qpU1 /proc/registry/HKEY_LOCAL_MACHINE/HARDWARE/DESCRIPTION/System/CentralProcessor/ 2>/dev/null | $EGREP -e '^@<:@0-9@:>@+/' -c` || CPU_COUNT="0"]],dnl
59*184c1b94SMartin Matuska          [[msys*]],[[CPU_COUNT=`ls -qpU1 /proc/registry/HKEY_LOCAL_MACHINE/HARDWARE/DESCRIPTION/System/CentralProcessor/ 2>/dev/null | $EGREP -e '^@<:@0-9@:>@+/' -c` || CPU_COUNT="0"]],dnl
60*184c1b94SMartin Matuska          [[cygwin*]],[[CPU_COUNT=`ls -qpU1 /proc/registry/HKEY_LOCAL_MACHINE/HARDWARE/DESCRIPTION/System/CentralProcessor/ 2>/dev/null | $EGREP -e '^@<:@0-9@:>@+/' -c` || CPU_COUNT="0"]]dnl
61*184c1b94SMartin Matuska        )dnl
62*184c1b94SMartin Matuska      ])dnl
63*184c1b94SMartin Matuska
64*184c1b94SMartin Matuska      AS_IF([[test "$CPU_COUNT" -gt "0" 2>/dev/null || ! command -v sysctl >/dev/null 2>&1]],[[: # empty]],[dnl
65*184c1b94SMartin Matuska        # Try less preferred generic method
66*184c1b94SMartin Matuska        # 'hw.ncpu' exist on many platforms, but not on GNU/Linux
67*184c1b94SMartin Matuska        CPU_COUNT=`sysctl -n hw.ncpu 2>/dev/null` || CPU_COUNT="0"
68*184c1b94SMartin Matuska      ])dnl
69*184c1b94SMartin Matuska
70*184c1b94SMartin Matuska      AS_IF([[test "$CPU_COUNT" -gt "0" 2>/dev/null]],[[: # empty]],[dnl
71*184c1b94SMartin Matuska      # Try platform-specific fallback methods
72*184c1b94SMartin Matuska      # They can be less accurate and slower then preferred methods
73*184c1b94SMartin Matuska        AS_CASE([[$host_os]],dnl
74*184c1b94SMartin Matuska          [[*linux*]],[[CPU_COUNT=`$EGREP -e '^processor' -c /proc/cpuinfo 2>/dev/null` || CPU_COUNT="0"]],dnl
75*184c1b94SMartin Matuska          [[*darwin*]],[[CPU_COUNT=`system_profiler SPHardwareDataType 2>/dev/null | $EGREP -i -e 'number of cores:'|cut -d : -f 2 -s|tr -d ' '` || CPU_COUNT="0"]],dnl
76*184c1b94SMartin Matuska          [[freebsd*]],[[CPU_COUNT=`dmesg 2>/dev/null| $EGREP -e '^cpu@<:@0-9@:>@+: '|sort -u|$EGREP -e '^' -c` || CPU_COUNT="0"]],dnl
77*184c1b94SMartin Matuska          [[netbsd*]], [[CPU_COUNT=`command -v cpuctl >/dev/null 2>&1 && cpuctl list 2>/dev/null| $EGREP -e '^@<:@0-9@:>@+ .* online ' -c` || \
78*184c1b94SMartin Matuska                           CPU_COUNT=`dmesg 2>/dev/null| $EGREP -e '^cpu@<:@0-9@:>@+ at'|sort -u|$EGREP -e '^' -c` || CPU_COUNT="0"]],dnl
79*184c1b94SMartin Matuska          [[solaris*]],[[command -v kstat >/dev/null 2>&1 && CPU_COUNT=`kstat -m cpu_info -s state -p 2>/dev/null | $EGREP -c -e 'on-line'` || \
80*184c1b94SMartin Matuska                           CPU_COUNT=`kstat -m cpu_info 2>/dev/null | $EGREP -c -e 'module: cpu_info'` || CPU_COUNT="0"]],dnl
81*184c1b94SMartin Matuska          [[mingw*]],[AS_IF([[CPU_COUNT=`reg query 'HKLM\\Hardware\\Description\\System\\CentralProcessor' 2>/dev/null | $EGREP -e '\\\\@<:@0-9@:>@+$' -c`]],dnl
82*184c1b94SMartin Matuska                        [[: # empty]],[[test "$NUMBER_OF_PROCESSORS" -gt "0" 2>/dev/null && CPU_COUNT="$NUMBER_OF_PROCESSORS"]])],dnl
83*184c1b94SMartin Matuska          [[msys*]],[[test "$NUMBER_OF_PROCESSORS" -gt "0" 2>/dev/null && CPU_COUNT="$NUMBER_OF_PROCESSORS"]],dnl
84*184c1b94SMartin Matuska          [[cygwin*]],[[test "$NUMBER_OF_PROCESSORS" -gt "0" 2>/dev/null && CPU_COUNT="$NUMBER_OF_PROCESSORS"]]dnl
85*184c1b94SMartin Matuska        )dnl
86*184c1b94SMartin Matuska      ])dnl
87*184c1b94SMartin Matuska
88*184c1b94SMartin Matuska      AS_IF([[test "x$CPU_COUNT" != "x0" && test "$CPU_COUNT" -gt 0 2>/dev/null]],[dnl
89*184c1b94SMartin Matuska          AC_MSG_RESULT([[$CPU_COUNT]])
90*184c1b94SMartin Matuska          m4_ifvaln([$1],[$1],)dnl
91*184c1b94SMartin Matuska        ],[dnl
92*184c1b94SMartin Matuska          m4_ifval([$2],[dnl
93*184c1b94SMartin Matuska            AS_UNSET([[CPU_COUNT]])
94*184c1b94SMartin Matuska            AC_MSG_RESULT([[unable to detect]])
95*184c1b94SMartin Matuska            $2
96*184c1b94SMartin Matuska          ], [dnl
97*184c1b94SMartin Matuska            CPU_COUNT="1"
98*184c1b94SMartin Matuska            AC_MSG_RESULT([[unable to detect (assuming 1)]])
99*184c1b94SMartin Matuska          ])dnl
100*184c1b94SMartin Matuska        ])dnl
101*184c1b94SMartin Matuska      ])dnl
102