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