On July 18, 1:06 am Tom Lane <[EMAIL PROTECTED]> wrote: > "Magnus Hagander" <[EMAIL PROTECTED]> writes: > > Per discussion at the conference: > > In order to run the regression tests on Windows without msys, > > pg_regress needs to be reimplemnted in C. > > This has some minor portability issues (macros with ... aren't portable, > for instance) but I think it's something we need to do. Barring > objections I'm going to clean up and apply it.
I've sent Magnus a patch a few days ago (but he seems to be without internet connection already), maybe it can help you. I just fixed it such that it worked for my non-standard install path. I also did a small patch for the Makefile to compile and call pg_regress. I append both patches (and hence won't send this mail to -hackers) I also proposed to make pg_regress more modular some time ago: http://archives.postgresql.org/pgsql-patches/2006-06/msg00212.php A similar approach should be kept in mind as an enhancement to the C version. Joachim
diff -ur cvs/pgsql/src/test/regress/GNUmakefile cvs.build/pgsql/src/test/regress/GNUmakefile --- cvs/pgsql/src/test/regress/GNUmakefile 2006-03-24 08:11:21.000000000 +0100 +++ cvs.build/pgsql/src/test/regress/GNUmakefile 2006-07-15 00:30:33.000000000 +0200 @@ -42,18 +42,26 @@ all: pg_regress -pg_regress: pg_regress.sh GNUmakefile $(top_builddir)/src/Makefile.global - sed -e 's,@bindir@,$(bindir),g' \ - -e 's,@libdir@,$(libdir),g' \ - -e 's,@pkglibdir@,$(pkglibdir),g' \ - -e 's,@datadir@,$(datadir),g' \ - -e 's/@VERSION@/$(VERSION)/g' \ - -e 's/@host_tuple@/$(host_tuple)/g' \ - -e 's,@GMAKE@,$(MAKE),g' \ - -e 's/@enable_shared@/$(enable_shared)/g' \ - -e 's/@GCC@/$(GCC)/g' \ - $< >$@ - chmod a+x $@ +pg_regress: pg_regress.o + $(CC) $(CFLAGS) $(LDFLAGS) -o pg_regress pg_regress.o \ + $(top_builddir)/src/backend/utils/mb/wstrncmp.o \ + $(top_builddir)/src/backend/regex/regexec.o \ + $(top_builddir)/src/backend/regex/regcomp.o \ + $(top_builddir)/src/port/dirmod.o \ + $(top_builddir)/src/port/pgsleep.o + +#pg_regress: pg_regress.sh GNUmakefile $(top_builddir)/src/Makefile.global +# sed -e 's,@bindir@,$(bindir),g' \ +# -e 's,@libdir@,$(libdir),g' \ +# -e 's,@pkglibdir@,$(pkglibdir),g' \ +# -e 's,@datadir@,$(datadir),g' \ +# -e 's/@VERSION@/$(VERSION)/g' \ +# -e 's/@host_tuple@/$(host_tuple)/g' \ +# -e 's,@GMAKE@,$(MAKE),g' \ +# -e 's/@enable_shared@/$(enable_shared)/g' \ +# -e 's/@GCC@/$(GCC)/g' \ +# $< >$@ +# chmod a+x $@ install: pg_regress $(INSTALL_SCRIPT) pg_regress '$(DESTDIR)$(pgxsdir)/$(subdir)/pg_regress' @@ -67,7 +75,7 @@ NAME = regress SO_MAJOR_VERSION= 0 SO_MINOR_VERSION= 0 -OBJS = regress.o +OBJS = regress.o pg_regress.o SHLIB_LINK = $(BE_DLLLIBS) include $(top_srcdir)/src/Makefile.shlib @@ -141,9 +149,12 @@ ## check: all + echo bindir: $(bindir) + echo datadir: $(datadir) + echo libdir: $(libdir) -rm -rf ./testtablespace mkdir ./testtablespace - $(SHELL) ./pg_regress --temp-install --top-builddir=$(top_builddir) --temp-port=$(TEMP_PORT) --schedule=$(srcdir)/parallel_schedule --multibyte=$(MULTIBYTE) --load-language=plpgsql $(MAXCONNOPT) $(NOLOCALE) + ./pg_regress --temp-install --top-builddir=$(top_builddir) --temp-port=$(TEMP_PORT) --schedule=$(srcdir)/parallel_schedule --multibyte=$(MULTIBYTE) --load-language=plpgsql --platform=$(host_tuple) --bindir=$(bindir) --datadir=$(datadir) $(NOLOCALE) installcheck: all -rm -rf ./testtablespace
--- /tmp/pg_regress.c 2006-07-14 22:15:30.000000000 +0200 +++ pg_regress.c 2006-07-15 00:40:52.000000000 +0200 @@ -15,6 +15,9 @@ #define INVALID_PID -1 #endif + +#define DEFAULT_TEMP "./tmp_check" + #define header(t, ...) do { char tmp[128];sprintf(tmp, t, ##__VA_ARGS__);printf("============== %-38s ==============\n",tmp); fflush(stdout); } while (0); #define status(a, ...) do { printf(a, ##__VA_ARGS__); fflush(stdout); if(logfile) fprintf(logfile,a,##__VA_ARGS__); } while (0); #define status_end() do { printf("\n"); fflush(stdout); if (logfile) fprintf(logfile,"\n"); } while (0); @@ -29,6 +32,9 @@ static char *libdir = NULL; static char *bindir = ""; +static char *temp_install_bindir = ""; +static char *datadir = ""; +static char *temp_install_datadir = ""; static char *inputdir = "."; static char *outputdir = "."; static char *host_platform = NULL; @@ -175,6 +181,19 @@ putenv(newval); } +static bool +regress_exec_cmd(const char *cmd) +{ + int status; + + if (debug) + printf("executing: %s\n", cmd); + + status = WEXITSTATUS(system(cmd)); + + return status == 0; +} + static void initialize_environment(void) { @@ -204,12 +223,23 @@ if (temp_install) { /* setup bin and lib dirs for temp install */ - bindir = malloc(strlen(temp_install) + 32); - sprintf(bindir,"%s/install/usr/local/pgsql/bin/", temp_install); + temp_install_bindir = malloc(strlen(temp_install) + + strlen("/install/") + + strlen(bindir) + + 1); + sprintf(temp_install_bindir, "%s/install/%s", temp_install, bindir); + + + temp_install_datadir = malloc(strlen(temp_install) + + strlen("/install/") + + strlen(datadir) + + 1); + sprintf(temp_install_datadir, "%s/install/%s", temp_install, datadir); + + libdir = malloc(strlen(temp_install) + 32); sprintf(libdir,"%s/install/usr/local/pgsql/lib", temp_install); - add_to_path("LD_LIBRARY_PATH", ':', libdir); add_to_path("DYLD_LIBRARY_PATH", ':', libdir); #ifdef WIN32 @@ -244,7 +274,8 @@ vsprintf(query2, query, args); va_end(args); - sprintf(psql_cmd, "%spsql -X -c \"%s\" %s", bindir, query2, database); + sprintf(psql_cmd, "%s/psql -X -c \"%s\" %s", temp_install_bindir, + query2, database); p = popen(psql_cmd, "r"); if (!p) @@ -319,8 +350,8 @@ sprintf(infile, "%s/sql/%s.sql", inputdir, basefile); sprintf(outfile, "%s/results/%s.out", outputdir, basefile); - sprintf(psql_cmd, "%spsql -X -a -q -d %s <%s >%s 2>&1", - bindir, dbname, infile, outfile); + sprintf(psql_cmd, "%s/psql -X -a -q -d %s <%s >%s 2>&1", + temp_install_bindir, dbname, infile, outfile); return spawn_process(psql_cmd); } @@ -625,7 +656,8 @@ fclose(scf); if (temp_install) { - sprintf(scbuf, "\"%spg_ctl\" -D \"%s/data\" stop", bindir, temp_install); + sprintf(scbuf, "\"%s/pg_ctl\" -D \"%s/data\" stop", + temp_install_bindir, temp_install); system(scbuf); } @@ -712,7 +744,7 @@ {"multibyte", required_argument, NULL, 6}, {"outputdir", required_argument, NULL, 7}, {"schedule", required_argument, NULL, 8}, - {"temp-install", required_argument, NULL, 9}, + {"temp-install", optional_argument, NULL, 9}, {"no-locale", no_argument, NULL, 10}, {"top-builddir", required_argument, NULL, 11}, {"temp-port", required_argument, NULL, 12}, @@ -721,6 +753,7 @@ {"user", required_argument, NULL, 15}, {"platform", required_argument, NULL, 16}, {"bindir", required_argument, NULL, 17}, + {"datadir", required_argument, NULL, 18}, {NULL, 0, NULL, 0} }; @@ -765,6 +798,9 @@ schedule = strdup(optarg); break; case 9: + if (!optarg) + /* no temp_install path specified */ + optarg = DEFAULT_TEMP; if (optarg[0] == '/') temp_install = strdup(optarg); else @@ -804,6 +840,9 @@ case 17: bindir = strdup(optarg); break; + case 18: + datadir = strdup(optarg); + break; default: /* getopt_long already emitted a complaint */ fprintf(stderr,"\nTry \"%s -h\" for more information.\n",argv[0]); @@ -846,33 +885,35 @@ header("creating temporary installation"); sprintf(buf,"make -C \"%s\" DESTDIR=\"%s/install\" install with_perl=no with_python=no > \"%s/log/install.log\" 2>&1", - top_builddir, temp_install, outputdir); - if (WEXITSTATUS(system(buf)) != 0) + top_builddir, temp_install, temp_install); + if (!regress_exec_cmd(buf)) { - fprintf(stderr, "installation failed.\nExamine %s/log/install.log for the reason.\n", outputdir); + fprintf(stderr, "installation failed.\nExamine %s/log/install.log for the reason.\n", temp_install); exit(2); } header("initializing database system"); - sprintf(buf,"\"%sinitdb\" -D \"%s/data\" -L \"%s/install/usr/local/pgsql/share\" --noclean %s %s > %s/log/initdb.log 2>&1", - bindir, temp_install, temp_install, nolocale?"--no-locale":"", debug?"--debug":"", outputdir); - if (WEXITSTATUS(system(buf)) != 0) + sprintf(buf,"\"%s/initdb\" -D \"%s/data\" -L \"%s\" --noclean %s %s > %s/log/initdb.log 2>&1", + temp_install_bindir, temp_install, temp_install_datadir, + nolocale?"--no-locale":"", debug?"--debug":"", temp_install); + if (!regress_exec_cmd(buf) != 0) { - fprintf(stderr,"initdb failed.\nExamine %s/log/initdb.log for the reason.\n", outputdir); + fprintf(stderr,"initdb failed.\nExamine %s/log/initdb.log for the reason.\n", temp_install); exit(2); } header("starting postmaster"); - sprintf(buf,"\"%spostmaster\" -D \"%s/data\" -F %s -c listen_addresses=%s >\"%s/log/postmaster.log\" 2>&1", - bindir, temp_install, debug?"-d5":"", hostname?hostname:"", outputdir); + sprintf(buf,"\"%s/postmaster\" -D \"%s/data\" -F %s -c listen_addresses=%s >\"%s/log/postmaster.log\" 2>&1", + temp_install_bindir, temp_install, + debug?"-d5":"", hostname?hostname:"", temp_install); if (spawn_process(buf) == INVALID_PID) { - fprintf(stderr,"postmaster failed.\nExamine %s/log/postmaster.log for the reason\n", outputdir); + fprintf(stderr,"postmaster failed.\nExamine %s/log/postmaster.log for the reason\n", temp_install); exit(2); } - sprintf(buf,"\"%spsql\" -X -c \"SELECT 1;\" postgres >%s 2>&1", - bindir, DEVNULL); + sprintf(buf,"\"%s/psql\" -X -c \"SELECT 1;\" postgres >%s 2>&1", + temp_install_bindir, DEVNULL); for (i = 0; i < 60; i++) { int r = system(buf);
---------------------------(end of broadcast)--------------------------- TIP 6: explain analyze is your friend