[Python-Dev] Windows build broken, Unix dweeb should fix

Tim Peters tim.one@home.com
Wed, 8 Aug 2001 02:21:05 -0400


First

....\Python\bltinmodule.c(595) : warning C4013: 'S_ISDIR' undefined;
   assuming extern returning int

on the last line here:

	/* Test for existence or directory. */
	if (!stat(filename, &s)) {
		if (S_ISDIR(s.st_mode))

and later it fails to link cuz S_ISDIR doesn't exist.

Now bltinmodule.c doesn't even include <sys/stat.h>, so I don't know why
we'd *expect* the new code to work (although I know why *I* would expect it
to work <wink> -- see below).

getpath.c does import sys/stat.h, then hides this stuff 100 lines later:

#ifndef S_ISREG
#define S_ISREG(x) (((x) & S_IFMT) == S_IFREG)
#endif

#ifndef S_ISDIR
#define S_ISDIR(x) (((x) & S_IFMT) == S_IFDIR)
#endif

import.c doesn't even trust S_IFMT to work:

#if defined(PYCC_VACPP)
/* VisualAge C/C++ Failed to Define MountType Field in sys/stat.h */
#define S_IFMT (S_IFDIR|S_IFCHR|S_IFREG)
#endif

#ifndef S_ISDIR
#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
#endif

Out-of-synch preprocessor-trick duplication like this is Major Evil, and I
don't want to see some bastard child of those duplicated into bltinmodule.c
too.  Windows doesn't define S_ISDIR, so at least that macro is needed.  The
only fellow doing an OS/2 port I know of now is Andrew MacIntyre, and I
happen to know that, as of Tuesday <wink>, he neither uses nor has access to
a VisualAge C compiler -- so no telling whether the PYCC_VACPP silliness is
still needed.  I'd drop it!

Who wants to move this crap into pyport.h?  I would, but I don't want to
break the Unix builds, or research 57 varieties of Unix spellings.  pyport.h
already #includes <sys/stat.h> on Windows, so for Windows it suffices to add
just the macros there (assuming these macros are worth the trouble of
defining at all -- S_ISDIR() is only used once in each of these files, and I
don't happen to find S_ISDIR(x) any clearer than its expansion).