We cannot get sysconf() from gnulib and the only thing we need it for is getting the page size. Therefore, of the various possible sysconf parameters we only define and implement _SC_PAGESIZE in our replacement.
Signed-off-by: Ulf Hermann <ulf.herm...@qt.io> --- ChangeLog | 6 ++++++ configure.ac | 20 ++++++++++++++++++++ libgnu/ChangeLog | 6 ++++++ libgnu/Makefile.am | 8 +++++++- libgnu/sysconf_win32.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 libgnu/sysconf_win32.c diff --git a/ChangeLog b/ChangeLog index 2c0e34d..71c73e5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2017-05-04 Ulf Hermann <ulf.herm...@qt.io> + * configure.ac: Check for sysconf() and GetSystemInfo(). Add a + declaration of sysconf to config.h if GetSystemInfo() is available, + but not sysconf(). + +2017-05-04 Ulf Hermann <ulf.herm...@qt.io> + * configure.ac: Check for sys/mman.h or alternatively MapViewOfFile(). 2017-05-03 Ulf Hermann <ulf.herm...@qt.io> diff --git a/configure.ac b/configure.ac index 6a2f991..2d3ad04 100644 --- a/configure.ac +++ b/configure.ac @@ -557,6 +557,26 @@ if test "x$ac_cv_header_sys_mman_h" != "xyes"; then fi AM_CONDITIONAL(USE_WIN32_MMAN, [test "x$ac_cv_have_decl_MapViewOfFile" = "xyes"]) +AC_CHECK_DECLS([sysconf], [], [], [[#include <unistd.h>]]) +AM_CONDITIONAL(HAVE_SYSCONF, [test "x$ac_cv_have_decl_sysconf" = "xyes"]) +if test "x$ac_cv_have_decl_sysconf" != "xyes"; then + AC_CHECK_DECLS([GetSystemInfo], [], [], [[#include <sysinfoapi.h>]]) +fi +AM_CONDITIONAL(USE_WIN32_SYSCONF, [test "x$ac_cv_have_decl_GetSystemInfo" = "xyes"]) + +if test "x$ac_cv_have_decl_GetSystemInfo" = "xyes"; then + AC_DEFINE([USE_WIN32_SYSCONF], [1], [Use sysconf replacement for win32]) +fi + +AH_VERBATIM([USE_WIN32_SYSCONF], + [/* Define sysconf(3) here if it is not available from a system header. */ +#undef USE_WIN32_SYSCONF +#ifdef USE_WIN32_SYSCONF +#define _SC_PAGESIZE 1 +long sysconf(int name); +#endif +]) + dnl Check if we have <linux/bpf.h> for EM_BPF disassembly. AC_CHECK_HEADERS(linux/bpf.h) AM_CONDITIONAL(HAVE_LINUX_BPF_H, [test "x$ac_cv_header_linux_bpf_h" = "xyes"]) diff --git a/libgnu/ChangeLog b/libgnu/ChangeLog index 60a049f..aa0e603 100644 --- a/libgnu/ChangeLog +++ b/libgnu/ChangeLog @@ -1,5 +1,11 @@ 2017-05-04 Ulf Hermann <ulf.herm...@qt.io> + * Makefile.am: If sysconf() is unavailable, but GetSystemInfo() is + available, compile the win32 version of sysconf. + * sysconf_win32.c: New file. + +2017-05-04 Ulf Hermann <ulf.herm...@qt.io> + * Makefile.am: If sys/mman.h is unavailable, but MapViewOfFile is, then use our own implementation of mmap and related functions. * mman_win32.c: New file. diff --git a/libgnu/Makefile.am b/libgnu/Makefile.am index 5af121a..05a8f61 100644 --- a/libgnu/Makefile.am +++ b/libgnu/Makefile.am @@ -35,7 +35,7 @@ noinst_LIBRARIES = MOSTLYCLEANFILES = MOSTLYCLEANDIRS = BUILT_SOURCES = -EXTRA_DIST = endian.in.h byteswap.in.h sys_mman.win32.h mman_win32.c +EXTRA_DIST = endian.in.h byteswap.in.h sys_mman.win32.h mman_win32.c sysconf_win32.c CLEANFILES = SUFFIXES = @@ -69,3 +69,9 @@ if USE_WIN32_MMAN libgnu_a_SOURCES += mman_win32.c endif endif + +if !HAVE_SYSCONF +if USE_WIN32_SYSCONF +libgnu_a_SOURCES += sysconf_win32.c +endif +endif diff --git a/libgnu/sysconf_win32.c b/libgnu/sysconf_win32.c new file mode 100644 index 0000000..34ddf4b --- /dev/null +++ b/libgnu/sysconf_win32.c @@ -0,0 +1,42 @@ +/* Replacement for sysconf() on windows + Copyright (C) 2017 The Qt Company Ltd. + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify + it under the terms of either + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at + your option) any later version + + or + + * 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 + + or both in parallel, as here. + + elfutils 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 copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see <http://www.gnu.org/licenses/>. */ + +#include <config.h> +#include <sysinfoapi.h> +#include <errno.h> + +long int sysconf(int name) { + if (name == _SC_PAGESIZE) { + SYSTEM_INFO info; + GetSystemInfo(&info); + return info.dwPageSize; + } else { + errno = EINVAL; + return -1; + } +} -- 2.1.4