More comments about individual changes below.
> add-ifndef-guard-around-gnu-source.patch
> diff --git a/config/hwloc.m4 b/config/hwloc.m4
> index f249713..855244d 100644
> --- a/config/hwloc.m4
> +++ b/config/hwloc.m4
> @@ -486,7 +486,9 @@ EOF])
> # program_invocation_name and __progname may be available but not
> exported in headers
> AC_MSG_CHECKING([for program_invocation_name])
> AC_TRY_LINK([
> - #define _GNU_SOURCE
> + #ifndef _GNU_SOURCE
> + # define _GNU_SOURCE
> + #endif
> #include <errno.h>
> #include <stdio.h>
> extern char *program_invocation_name;
> [...]
This one is applied (not pushed yet).
> use-ac-check-decl.patch
> diff --git a/config/hwloc.m4 b/config/hwloc.m4
> index 855244d..49955a6 100644
> --- a/config/hwloc.m4
> +++ b/config/hwloc.m4
> @@ -367,7 +367,7 @@ EOF])
> AC_CHECK_HEADERS([ctype.h])
>
> AC_CHECK_FUNCS([strncasecmp], [
> - _HWLOC_CHECK_DECL([strncasecmp], [
> + AC_CHECK_DECLS([strncasecmp], [
> AC_DEFINE([HWLOC_HAVE_DECL_STRNCASECMP], [1], [Define to 1 if function
> `strncasecmp' is declared by system headers])
> ])
> ])
> [...]
Samuel pushed a better fix (already in master, I'll backport to v1.11.x
after checking the configure logs on our regression platform)
> windows-compatibility-changes.patch
> diff --git a/config/hwloc.m4 b/config/hwloc.m4
> index 49955a6..12230e1 100644
> --- a/config/hwloc.m4
> +++ b/config/hwloc.m4
> @@ -362,7 +362,7 @@ EOF])
> #
>
> AC_CHECK_HEADERS([unistd.h])
> - AC_CHECK_HEADERS([dirent.h])
> + AC_CHECK_HEADERS([dirent.h], [hwloc_have_dirent=yes])
> AC_CHECK_HEADERS([strings.h])
> AC_CHECK_HEADERS([ctype.h])
I am dropping the dirent changes and just disabling hwloc-ps entirely on
Windows.
> + AC_CHECK_LIB([user32], [PostQuitMessage], [hwloc_have_user32="yes"])
>
The user32 part is applied.
> @@ -381,6 +381,21 @@ static __hwloc_inline int hwloc_strncasecmp(const char
> *s1, const char *s2, size
> #endif
> }
>
> +static __hwloc_inline int hwloc_strcasecmp(const char *s1, const char *s2)
> +{
> +#ifdef HWLOC_HAVE_DECL_STRCASECMP
> + return strcasecmp(s1, s2);
> +#else
> + while (1) {
> + char c1 = tolower(*s1), c2 = tolower(*s2);
> + if (!c1 || !c2 || c1 != c2)
> + return c1-c2;
> + s1++; s2++;
> + }
> + return 0;
> +#endif
> +}
> +
> static __hwloc_inline hwloc_obj_type_t
> hwloc_cache_type_by_depth_type(unsigned depth, hwloc_obj_cache_type_t type)
> {
> if (type == HWLOC_OBJ_CACHE_INSTRUCTION) {
> @@ -407,4 +422,25 @@ static __hwloc_inline int hwloc_obj_type_is_io
> (hwloc_obj_type_t type)
> return type >= HWLOC_OBJ_BRIDGE && type <= HWLOC_OBJ_OS_DEVICE;
> }
>
> +#ifdef HWLOC_WIN_SYS
> +# ifndef HAVE_SSIZE_T
> +typedef SSIZE_T ssize_t;
> +# endif
> +# ifndef HAVE_SNPRINTF
> +# define snprintf hwloc_snprintf
> +# endif
> +# if !HAVE_DECL_STRTOULL && !defined(HAVE_STRTOULL)
> +# define strtoull _strtoui64
> +# endif
> +# if !HAVE_DECL_S_ISREG
> +# define S_ISREG(mode) (mode & _S_IFREG)
> +# endif
> +# if !HAVE_DECL_S_ISDIR
> +# define S_ISDIR(mode) (mode & _S_IFDIR)
> +# endif
> +# ifndef HAVE_STRCASECMP
> +# define strcasecmp hwloc_strcasecmp
> +# endif
> +#endif
> +
> #endif /* HWLOC_PRIVATE_MISC_H */
Overall this looks OK.
In the MSVC project under contrib/windows/, we use a hardwired
hwloc_config.h which says:
typedef SSIZE_T ssize_t;
#define snprintf _snprintf
#define strcasecmp _stricmp
#define strncasecmp _strnicmp
#define strdup _strdup
#define strtoull _strtoui64
#define strtoll _strtoi64
#define S_ISREG(m) ((m)&_S_IFREG)
#define S_ISDIR( m ) (((m) & S_IFMT) == S_IFDIR)
#define putenv _putenv
strncasecmp and strtoll don't seem needed anymore.
For strdup and putenv, my MSVC fails with "The POSIX name for this item
is deprecated. Instead use the ISO C++ conformant name: _foo."
I wonder why you didn't have this problem?
Is _stricmp() OK instead of your code for hwloc_strcasecmp() ?
Don't you have S_IFMT and S_IFREG/DIR without _ prefix?
Brice