使用Windows SDK v7.1从Windows 7上的源代码编译OpenJDK 6

使用Windows SDK v7.1从Windows 7上的源代码编译OpenJDK 6,windows,openjdk,winsock2,Windows,Openjdk,Winsock2,我试图从Windows7机器上的WindowsSDKV7.1源代码编译OpenJDK6 经过一些调整,我达到了一个点,我真的不知道什么是正确的事情做 这是文件- 第47行和第49行: static int POLLIN = 1; // line 47 static int POLLCONN = 2; static int POLLOUT = 4; // line 49 问题在于包含的文件winsock2.h具有以下代码: #if(_WIN32_WINNT >=

我试图从Windows7机器上的WindowsSDKV7.1源代码编译OpenJDK6

经过一些调整,我达到了一个点,我真的不知道什么是正确的事情做

这是文件-

第47行和第49行:

   static int POLLIN   = 1;  // line 47
   static int POLLCONN = 2;
   static int POLLOUT  = 4;  // line 49
问题在于包含的文件winsock2.h具有以下代码:

#if(_WIN32_WINNT >= 0x0600)

/* Event flag definitions for WSAPoll(). */

#define POLLRDNORM  0x0100
#define POLLRDBAND  0x0200
#define POLLIN      (POLLRDNORM | POLLRDBAND)
#define POLLPRI     0x0400

#define POLLWRNORM  0x0010
#define POLLOUT     (POLLWRNORM)
#define POLLWRBAND  0x0020

#define POLLERR     0x0001
#define POLLHUP     0x0002
#define POLLNVAL    0x0004

typedef struct pollfd {

    SOCKET  fd;
    SHORT   events;
    SHORT   revents;

} WSAPOLLFD, *PWSAPOLLFD, FAR *LPWSAPOLLFD;

#endif // (_WIN32_WINNT >= 0x0600)
请注意winsock2如何定义
POLLIN
POLLOUT
,而WindowsSelectorImpl.c将它们声明为常量。更糟糕的是,两者给出了不同的值:

OpenJDK:

POLLIN = 1
POLLOUT = 4
WinSock2(Windows SDK v7.1版):

显然,OpenJDK代码不应该在Windows7上编译

但是,我确实想在Windows7上编译它

其中一个选项是安装较旧的Windows SDK。另一个是更改WindowsSelectorImpl.c文件,问题是如何更改?我的意图是重命名常量,但我不禁想知道WinSock2#使用完全相同的名称定义常量,但不同的值

有什么建议吗

EDIT1

再想一想,也许我最好有条件地使用WinSock2中的值?我的意思是,值的变化可能意味着API的变化

WinSock2.h对pollfd的定义如下:

typedef struct pollfd {
    SOCKET  fd;
    SHORT   events;
    SHORT   revents;
} WSAPOLLFD, *PWSAPOLLFD, FAR *LPWSAPOLLFD;
vs WindowsSelectorImpl.c:

typedef struct {
    jint fd;
    jshort events;
} pollfd;
前者向后兼容后者(或多或少,撇开对齐不谈)

因此,WinSock2常量有可能是Windows 7的正确常量,但是如何处理
POLLCONN
?该代码将如何在Windows2003或XP上运行

EDIT2

情况甚至更糟,因为C实现在java-中有一个匹配的对应项,它使用与C代码相同的常量

我不明白。Windows 7上的winsock2是否会破坏为Windows 2003 SP1上的winsock2编写的任何代码

EDIT3

检查jdk7u源(和)。它使用重命名方法,这意味着即使Windows SDK v7.1使用不同的值声明POLLIN和POLLOUT,jdk7仍然坚持jdk6的实现


我真的不知道这意味着什么,但我在这里不会比教皇更天主教。

解决方案很简单,但很烦人-获取Visual Studio 2003并使用它编译OpenJDK。最困难的部分是获得VS2003本身,其余的都很容易

typedef struct {
    jint fd;
    jshort events;
} pollfd;