Re: pg_regress updates for vc++ bulid
От | Magnus Hagander |
---|---|
Тема | Re: pg_regress updates for vc++ bulid |
Дата | |
Msg-id | 45A14F9C.4060607@hagander.net обсуждение исходный текст |
Ответ на | WIP: pg_regress updates for vc++ bulid (Magnus Hagander <magnus@hagander.net>) |
Ответы |
Re: pg_regress updates for vc++ bulid
Re: [PATCHES] pg_regress updates for vc++ bulid |
Список | pgsql-patches |
Magnus Hagander wrote: > Hello! > > Per some previous discussion that I can't really recall if it was on or > off list, here is a WIP patch to make pg_regress run completely outside > of msys on win32. > > The change needed is that the processing of files from input/ and > output/ into sql/ and expected/ is moved from the Makefile and into > pg_regress itself. > > I have tested on Win32 non-MSVC and on Linux (non-VPATH), and it appears > to work there. > > Still to be done is the "make install" part on MSVC build, currently > #ifdef:ed out. While working on that, I'd appreciate some comments on > the patch in general - if there are more things I need to fix before it > can be considered. Particularly I'm concerned around the VPATH stuff, > since I've never used that myself. Here's the patch without the WIP tag. It works for me per above, and also for a "check" (not just "installcheck") on msvc built without msys. Again, the vpath part is the one I'm most unsure about, but I'm sure there could be other parts. Hopefully this will make it possible to get the msvc build up on the buildfarm not too long from now. Also, as in the first patch but not noted, this one makes it possible to run the regression tests as an admin account "the proper way" on both mingw and msvc. //Magnus Index: src/include/port.h =================================================================== RCS file: c:/prog/cvsrepo/pgsql/pgsql/src/include/port.h,v retrieving revision 1.107 diff -c -r1.107 port.h *** src/include/port.h 5 Jan 2007 22:19:50 -0000 1.107 --- src/include/port.h 7 Jan 2007 15:11:12 -0000 *************** *** 46,51 **** --- 46,56 ---- extern bool get_home_path(char *ret_path); extern void get_parent_directory(char *path); + + /* port/dirmod.c */ + extern char **pgfnames(char *path); + extern void pgfnames_cleanup(char **filenames); + /* * is_absolute_path * Index: src/port/dirmod.c =================================================================== RCS file: c:/prog/cvsrepo/pgsql/pgsql/src/port/dirmod.c,v retrieving revision 1.46 diff -c -r1.46 dirmod.c *** src/port/dirmod.c 5 Jan 2007 22:20:02 -0000 1.46 --- src/port/dirmod.c 7 Jan 2007 15:13:27 -0000 *************** *** 287,298 **** /* ! * fnames * * return a list of the names of objects in the argument directory */ ! static char ** ! fnames(char *path) { DIR *dir; struct dirent *file; --- 287,298 ---- /* ! * pgfnames * * return a list of the names of objects in the argument directory */ ! char ** ! pgfnames(char *path) { DIR *dir; struct dirent *file; *************** *** 357,368 **** /* ! * fnames_cleanup * * deallocate memory used for filenames */ ! static void ! fnames_cleanup(char **filenames) { char **fn; --- 357,368 ---- /* ! * pgfnames_cleanup * * deallocate memory used for filenames */ ! void ! pgfnames_cleanup(char **filenames) { char **fn; *************** *** 394,400 **** * we copy all the names out of the directory before we start modifying * it. */ ! filenames = fnames(path); if (filenames == NULL) return false; --- 394,400 ---- * we copy all the names out of the directory before we start modifying * it. */ ! filenames = pgfnames(path); if (filenames == NULL) return false; *************** *** 415,421 **** if (!rmtree(filepath, true)) { /* we already reported the error */ ! fnames_cleanup(filenames); return false; } } --- 415,421 ---- if (!rmtree(filepath, true)) { /* we already reported the error */ ! pgfnames_cleanup(filenames); return false; } } *************** *** 433,439 **** goto report_and_fail; } ! fnames_cleanup(filenames); return true; report_and_fail: --- 433,439 ---- goto report_and_fail; } ! pgfnames_cleanup(filenames); return true; report_and_fail: *************** *** 444,449 **** fprintf(stderr, _("could not remove file or directory \"%s\": %s\n"), filepath, strerror(errno)); #endif ! fnames_cleanup(filenames); return false; } --- 444,449 ---- fprintf(stderr, _("could not remove file or directory \"%s\": %s\n"), filepath, strerror(errno)); #endif ! pgfnames_cleanup(filenames); return false; } Index: src/test/regress/GNUmakefile =================================================================== RCS file: c:/prog/cvsrepo/pgsql/pgsql/src/test/regress/GNUmakefile,v retrieving revision 1.63 diff -c -r1.63 GNUmakefile *** src/test/regress/GNUmakefile 5 Jan 2007 22:20:03 -0000 1.63 --- src/test/regress/GNUmakefile 7 Jan 2007 15:13:40 -0000 *************** *** 40,46 **** # stuff to pass into build of pg_regress EXTRADEFS = '-DHOST_TUPLE="$(host_tuple)"' \ '-DMAKEPROG="$(MAKE)"' \ ! '-DSHELLPROG="$(SHELL)"' ## ## Prepare for tests --- 40,47 ---- # stuff to pass into build of pg_regress EXTRADEFS = '-DHOST_TUPLE="$(host_tuple)"' \ '-DMAKEPROG="$(MAKE)"' \ ! '-DSHELLPROG="$(SHELL)"' \ ! '-DDLSUFFIX="$(DLSUFFIX)"' ## ## Prepare for tests *************** *** 83,96 **** rm -f $(NAME)$(DLSUFFIX) $(LN_S) $(shlib) $(NAME)$(DLSUFFIX) - # Build test input and expected files - - file_list := copy create_function_1 create_function_2 misc constraints tablespace - input_files := $(foreach file, $(file_list), sql/$(file).sql) - output_files := $(foreach file, $(file_list), expected/$(file).out) - - all: $(input_files) $(output_files) - ifneq ($(PORTNAME),win32) abs_srcdir := $(shell cd $(srcdir) && pwd) abs_builddir := $(shell pwd) --- 84,89 ---- *************** *** 99,120 **** abs_builddir := $(shell pwd -W) endif - testtablespace := $(abs_builddir)/testtablespace - - - define sed-command - sed -e 's,@abs_srcdir@,$(abs_srcdir),g' \ - -e 's,@abs_builddir@,$(abs_builddir),g' \ - -e 's,@testtablespace@,$(testtablespace),g' \ - -e 's/@DLSUFFIX@/$(DLSUFFIX)/g' $< >$@ - endef - - $(input_files): sql/%.sql: input/%.source - $(sed-command) - - $(output_files): expected/%.out: output/%.source - $(sed-command) - # When doing a VPATH build, copy over the remaining .sql and .out # files so that the driver script can find them. We have to use an # absolute path for the targets, because otherwise make will try to --- 92,97 ---- *************** *** 148,154 **** check: all -rm -rf ./testtablespace mkdir ./testtablespace ! ./pg_regress --temp-install=./tmp_check --top-builddir=$(top_builddir) --temp-port=$(TEMP_PORT) --schedule=$(srcdir)/parallel_schedule--multibyte=$(MULTIBYTE) --load-language=plpgsql $(MAXCONNOPT) $(NOLOCALE) installcheck: all -rm -rf ./testtablespace --- 125,131 ---- check: all -rm -rf ./testtablespace mkdir ./testtablespace ! ./pg_regress --temp-install=./tmp_check --top-builddir=$(top_builddir) --srcdir=$(abs_srcdir) --temp-port=$(TEMP_PORT)--schedule=$(srcdir)/parallel_schedule --multibyte=$(MULTIBYTE) --load-language=plpgsql $(MAXCONNOPT)$(NOLOCALE) installcheck: all -rm -rf ./testtablespace *************** *** 168,174 **** runtest-parallel: installcheck-parallel bigtest: ! ./pg_regress --psqldir=$(PSQLDIR) --schedule=$(srcdir)/serial_schedule --multibyte=$(MULTIBYTE) --load-language=plpgsql$(NOLOCALE) numeric_big bigcheck: ./pg_regress --temp-install=./tmp_check --top-builddir=$(top_builddir) --temp-port=$(TEMP_PORT) --schedule=$(srcdir)/parallel_schedule--multibyte=$(MULTIBYTE) --load-language=plpgsql $(MAXCONNOPT) $(NOLOCALE) numeric_big --- 145,151 ---- runtest-parallel: installcheck-parallel bigtest: ! ./pg_regress --psqldir=$(PSQLDIR) --schedule=$(srcdir)/serial_schedule --multibyte=$(MULTIBYTE) --load-language=plpgsql$(NOLOCALE) numeric_big bigcheck: ./pg_regress --temp-install=./tmp_check --top-builddir=$(top_builddir) --temp-port=$(TEMP_PORT) --schedule=$(srcdir)/parallel_schedule--multibyte=$(MULTIBYTE) --load-language=plpgsql $(MAXCONNOPT) $(NOLOCALE) numeric_big Index: src/test/regress/pg_regress.c =================================================================== RCS file: c:/prog/cvsrepo/pgsql/pgsql/src/test/regress/pg_regress.c,v retrieving revision 1.25 diff -c -r1.25 pg_regress.c *** src/test/regress/pg_regress.c 5 Jan 2007 22:20:03 -0000 1.25 --- src/test/regress/pg_regress.c 7 Jan 2007 15:13:41 -0000 *************** *** 67,73 **** --- 67,75 ---- static char *libdir = LIBDIR; static char *datadir = PGSHAREDIR; static char *host_platform = HOST_TUPLE; + #ifndef WIN32_ONLY_COMPILER static char *makeprog = MAKEPROG; + #endif #ifndef WIN32 /* not used in WIN32 case */ static char *shellprog = SHELLPROG; *************** *** 95,100 **** --- 97,103 ---- static char *hostname = NULL; static int port = -1; static char *user = NULL; + static char *srcdir = NULL; /* internal variables */ static const char *progname; *************** *** 111,116 **** --- 114,124 ---- static int fail_count = 0; static int fail_ignore_count = 0; + static bool + directory_exists(const char *dir); + static void + make_directory(const char *dir); + static void header(const char *fmt,...) /* This extension allows gcc to check the format string for consistency with *************** *** 152,157 **** --- 160,169 ---- #endif + #ifdef WIN32 + typedef BOOL(WINAPI * __CreateRestrictedToken) (HANDLE, DWORD, DWORD, PSID_AND_ATTRIBUTES, DWORD, PLUID_AND_ATTRIBUTES,DWORD, PSID_AND_ATTRIBUTES, PHANDLE); + #endif + /* * Add an item at the end of a stringlist. */ *************** *** 331,336 **** --- 343,468 ---- } /* + * Replace all occurances of a string in a string with a different stirng. + * NOTE: Assumes there is enough room in the target buffer! + */ + static void + replace_string(char *string, char *replace, char *replacement) + { + char *ptr; + + while ((ptr = strstr(string, replace)) != NULL) + { + char *dup = strdup(string); + + strncpy(string, dup, ptr-string); + string[ptr-string]=0; + strcat(string, replacement); + strcat(string, dup+(ptr-string)+strlen(replace)); + free(dup); + } + } + + /* + * Convert *.source in input/ and output/ into actual files used by the + * regression tests in sql/ and expected/. + */ + static void + convert_sourcefiles_in(char *source, char *dest, char *suffix) + { + char abs_srcdir[MAXPGPATH]; + char abs_builddir[MAXPGPATH]; + char testtablespace[MAXPGPATH]; + char **name; + char **names = pgfnames(source); + #ifdef WIN32 + char *c; + #endif + + if (!names) + /* Error logged in pgfnames */ + exit_nicely(2); + + if (!getcwd(abs_builddir, sizeof(abs_builddir))) + { + fprintf(stderr, _("%s: could not get current directory: %s\n"), + progname, strerror(errno)); + exit_nicely(2); + } + if (srcdir) + strcpy(abs_srcdir, srcdir); + else + strcpy(abs_srcdir, abs_builddir); + #ifdef WIN32 + for (c = abs_builddir; *c; c++) + if (*c == '\\') + *c = '/'; + for (c = abs_srcdir; *c; c++) + if (*c == '\\') + *c = '/'; + #endif + + + snprintf(testtablespace, sizeof(testtablespace), "%s/testtablespace", abs_builddir); + if (directory_exists(testtablespace)) + rmtree(testtablespace, true); + make_directory(testtablespace); + + for (name = names; *name; name++) + { + char srcfile[MAXPGPATH]; + char destfile[MAXPGPATH]; + FILE *infile, *outfile; + char line[1024]; + + if (strlen(*name) < 8) + continue; + if (strcmp(*name+strlen(*name)-7,".source")) + continue; + + strcpy(srcfile,source); + strcat(srcfile, *name); + strcpy(destfile,dest); + strncat(destfile, *name, strlen(*name)-6); + strcat(destfile,suffix); + + infile = fopen(srcfile,"r"); + if (!infile) + { + fprintf(stderr, _("%s: could not open file \"%s\" for reading: %s\n"), + progname, srcfile, strerror(errno)); + exit_nicely(2); + } + outfile = fopen(destfile,"w"); + if (!outfile) + { + fprintf(stderr, _("%s: could not open file \"%s\" for writing: %s\n"), + progname, destfile, strerror(errno)); + exit_nicely(2); + } + while (fgets(line, sizeof(line), infile)) + { + replace_string(line,"@abs_srcdir@", abs_srcdir); + replace_string(line,"@abs_builddir@", abs_builddir); + replace_string(line,"@testtablespace@", testtablespace); + replace_string(line,"@DLSUFFIX@", DLSUFFIX); + fputs(line, outfile); + } + fclose(infile); + fclose(outfile); + } + + pgfnames_cleanup(names); + } + + static void + convert_sourcefiles(void) + { + convert_sourcefiles_in("input/","sql/","sql"); + convert_sourcefiles_in("output/","expected/","out"); + } + + /* * Scan resultmap file to find which platform-specific expected files to use. * * The format of each line of the file is *************** *** 593,598 **** --- 725,731 ---- printf(_("(using postmaster on Unix socket, default port)\n")); } + convert_sourcefiles(); load_resultmap(); } *************** *** 690,705 **** return pid; #else char *cmdline2; STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); cmdline2 = malloc(strlen(cmdline) + 8); sprintf(cmdline2, "cmd /c %s", cmdline); ! if (!CreateProcess(NULL, cmdline2, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) { fprintf(stderr, _("could not start process for \"%s\": %lu\n"), cmdline2, GetLastError()); --- 823,898 ---- return pid; #else char *cmdline2; + BOOL b; STARTUPINFO si; PROCESS_INFORMATION pi; + HANDLE origToken; + HANDLE restrictedToken; + SID_IDENTIFIER_AUTHORITY NtAuthority = {SECURITY_NT_AUTHORITY}; + SID_AND_ATTRIBUTES dropSids[2]; + __CreateRestrictedToken _CreateRestrictedToken = NULL; + HANDLE Advapi32Handle; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); + Advapi32Handle = LoadLibrary("ADVAPI32.DLL"); + if (Advapi32Handle != NULL) + { + _CreateRestrictedToken = (__CreateRestrictedToken) GetProcAddress(Advapi32Handle, "CreateRestrictedToken"); + } + + if (_CreateRestrictedToken == NULL) + { + fprintf(stderr, "WARNING: Unable to create restricted tokens on this platform\n"); + if (Advapi32Handle != NULL) + FreeLibrary(Advapi32Handle); + return 0; + } + + /* Open the current token to use as a base for the restricted one */ + if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &origToken)) + { + fprintf(stderr, "Failed to open process token: %lu\n", GetLastError()); + return 0; + } + + /* Allocate list of SIDs to remove */ + ZeroMemory(&dropSids, sizeof(dropSids)); + if (!AllocateAndInitializeSid(&NtAuthority, 2, + SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, + 0, &dropSids[0].Sid) || + !AllocateAndInitializeSid(&NtAuthority, 2, + SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_POWER_USERS, 0, 0, 0, 0, 0, + 0, &dropSids[1].Sid)) + { + fprintf(stderr, "Failed to allocate SIDs: %lu\n", GetLastError()); + return 0; + } + + b = _CreateRestrictedToken(origToken, + DISABLE_MAX_PRIVILEGE, + sizeof(dropSids) / sizeof(dropSids[0]), + dropSids, + 0, NULL, + 0, NULL, + &restrictedToken); + + FreeSid(dropSids[1].Sid); + FreeSid(dropSids[0].Sid); + CloseHandle(origToken); + FreeLibrary(Advapi32Handle); + + if (!b) + { + fprintf(stderr, "Failed to create restricted token: %lu\n", GetLastError()); + return 0; + } + cmdline2 = malloc(strlen(cmdline) + 8); sprintf(cmdline2, "cmd /c %s", cmdline); ! if (!CreateProcessAsUser(restrictedToken, NULL, cmdline2, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) { fprintf(stderr, _("could not start process for \"%s\": %lu\n"), cmdline2, GetLastError()); *************** *** 1322,1327 **** --- 1515,1521 ---- printf(_(" --outputdir=DIR place output files in DIR (default \".\")\n")); printf(_(" --schedule=FILE use test ordering schedule from FILE\n")); printf(_(" (may be used multiple times to concatenate)\n")); + printf(_(" --srcdir=DIR absolute path to source directory (for VPATH builds)\n")); printf(_(" --temp-install=DIR create a temporary installation in DIR\n")); printf(_(" --no-locale use C locale\n")); printf(_("\n")); *************** *** 1369,1374 **** --- 1563,1569 ---- {"port", required_argument, NULL, 14}, {"user", required_argument, NULL, 15}, {"psqldir", required_argument, NULL, 16}, + {"srcdir", required_argument, NULL, 17}, {NULL, 0, NULL, 0} }; *************** *** 1461,1466 **** --- 1656,1664 ---- if (strlen(optarg)) psqldir = strdup(optarg); break; + case 17: + srcdir = strdup(optarg); + break; default: /* getopt_long already emitted a complaint */ fprintf(stderr, _("\nTry \"%s -h\" for more information.\n"), *************** *** 1520,1528 **** --- 1718,1732 ---- make_directory(buf); /* "make install" */ + #ifndef WIN32_ONLY_COMPILER snprintf(buf, sizeof(buf), SYSTEMQUOTE "\"%s\" -C \"%s\" DESTDIR=\"%s/install\" install with_perl=no with_python=no > \"%s/log/install.log\"2>&1" SYSTEMQUOTE, makeprog, top_builddir, temp_install, outputdir); + #else + snprintf(buf, sizeof(buf), + SYSTEMQUOTE "perl \"%s/src/tools/msvc/install.pl\" \"%s/install\" >\"%s/log/install.log\" 2>&1" SYSTEMQUOTE, + top_builddir, temp_install, outputdir); + #endif if (system(buf)) { fprintf(stderr, _("\n%s: installation failed\nExamine %s/log/install.log for the reason.\nCommand was: %s\n"),progname, outputdir, buf); Index: src/test/regress/resultmap =================================================================== RCS file: c:/prog/cvsrepo/pgsql/pgsql/src/test/regress/resultmap,v retrieving revision 1.83 diff -c -r1.83 resultmap *** src/test/regress/resultmap 3 Aug 2006 17:04:00 -0000 1.83 --- src/test/regress/resultmap 29 Dec 2006 19:51:45 -0000 *************** *** 1,8 **** --- 1,11 ---- float4/i.86-pc-mingw32=float4-exp-three-digits + float4/i.86-pc-win32vc=float4-exp-three-digits float8/i.86-.*-freebsd=float8-small-is-zero float8/i.86-.*-openbsd=float8-small-is-zero float8/i.86-.*-netbsd=float8-small-is-zero float8/m68k-.*-netbsd=float8-small-is-zero float8/i.86-pc-mingw32=float8-exp-three-digits-win32 + float8/i.86-pc-win32vc=float8-exp-three-digits-win32 float8/i.86-pc-cygwin=float8-small-is-zero int8/i.86-pc-mingw32=int8-exp-three-digits + int8/i.86-pc-win32vc=int8-exp-three-digits Index: src/tools/msvc/Solution.pm =================================================================== RCS file: c:/prog/cvsrepo/pgsql/pgsql/src/tools/msvc/Solution.pm,v retrieving revision 1.5 diff -c -r1.5 Solution.pm *** src/tools/msvc/Solution.pm 29 Dec 2006 16:49:02 -0000 1.5 --- src/tools/msvc/Solution.pm 1 Jan 2007 14:57:21 -0000 *************** *** 197,213 **** print "Generating pg_config_paths.h...\n"; open(O,'>', 'src\port\pg_config_paths.h') || confess "Could not open pg_config_paths.h"; print O <<EOF; ! #define PGBINDIR "/usr/local/pgsql/bin" ! #define PGSHAREDIR "/usr/local/pgsql/share" ! #define SYSCONFDIR "/usr/local/pgsql/etc" ! #define INCLUDEDIR "/usr/local/pgsql/include" ! #define PKGINCLUDEDIR "/usr/local/pgsql/include" ! #define INCLUDEDIRSERVER "/usr/local/pgsql/include/server" ! #define LIBDIR "/usr/local/pgsql/lib" ! #define PKGLIBDIR "/usr/local/pgsql/lib" ! #define LOCALEDIR "/usr/local/pgsql/share/locale" ! #define DOCDIR "/usr/local/pgsql/doc" ! #define MANDIR "/usr/local/pgsql/man" EOF close(O); } --- 197,213 ---- print "Generating pg_config_paths.h...\n"; open(O,'>', 'src\port\pg_config_paths.h') || confess "Could not open pg_config_paths.h"; print O <<EOF; ! #define PGBINDIR "/bin" ! #define PGSHAREDIR "/share" ! #define SYSCONFDIR "/etc" ! #define INCLUDEDIR "/include" ! #define PKGINCLUDEDIR "/include" ! #define INCLUDEDIRSERVER "/include/server" ! #define LIBDIR "/lib" ! #define PKGLIBDIR "/lib" ! #define LOCALEDIR "/share/locale" ! #define DOCDIR "/doc" ! #define MANDIR "/man" EOF close(O); } Index: src/tools/msvc/install.pl =================================================================== RCS file: c:/prog/cvsrepo/pgsql/pgsql/src/tools/msvc/install.pl,v retrieving revision 1.1 diff -c -r1.1 install.pl *** src/tools/msvc/install.pl 29 Nov 2006 19:49:31 -0000 1.1 --- src/tools/msvc/install.pl 1 Jan 2007 14:53:42 -0000 *************** *** 70,78 **** open($D, "dir /b /s $spec |") || croak "Could not list $spec\n"; while (<$D>) { chomp; my $tgt = $target . basename($_); print "."; ! copy($_, $tgt) || croak "Could not copy $_\n"; } close($D); print "\n"; --- 70,79 ---- open($D, "dir /b /s $spec |") || croak "Could not list $spec\n"; while (<$D>) { chomp; + next if /regress/; # Skip temporary install in regression subdir my $tgt = $target . basename($_); print "."; ! copy($_, $tgt) || croak "Could not copy $_: $!\n"; } close($D); print "\n"; Index: src/tools/msvc/mkvcbuild.pl =================================================================== RCS file: c:/prog/cvsrepo/pgsql/pgsql/src/tools/msvc/mkvcbuild.pl,v retrieving revision 1.8 diff -c -r1.8 mkvcbuild.pl *** src/tools/msvc/mkvcbuild.pl 21 Nov 2006 17:54:26 -0000 1.8 --- src/tools/msvc/mkvcbuild.pl 29 Dec 2006 19:50:59 -0000 *************** *** 255,264 **** } ! # Regression DLLs my $regress = $solution->AddProject('regress','dll','misc'); $regress->AddFile('src\test\regress\regress.c'); $regress->AddReference($postgres); $solution->Save(); --- 255,271 ---- } ! # Regression DLL and EXE my $regress = $solution->AddProject('regress','dll','misc'); $regress->AddFile('src\test\regress\regress.c'); $regress->AddReference($postgres); + + my $pgregress = $solution->AddProject('pg_regress','exe','misc'); + $pgregress->AddFile('src\test\regress\pg_regress.c'); + $pgregress->AddIncludeDir('src\port'); + $pgregress->AddDefine('HOST_TUPLE="i686-pc-win32vc"'); + $pgregress->AddDefine('FRONTEND'); + $pgregress->AddReference($libpgport); $solution->Save();
В списке pgsql-patches по дате отправления: