Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
P
Postgres FD Implementation
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Abuhujair Javed
Postgres FD Implementation
Commits
eee22892
Commit
eee22892
authored
Mar 12, 2007
by
Magnus Hagander
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Make a run with perltidy to format the code. Per request from Andrew Dunstan.
parent
576027bb
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
1376 additions
and
1089 deletions
+1376
-1089
src/tools/msvc/Project.pm
src/tools/msvc/Project.pm
+417
-326
src/tools/msvc/README
src/tools/msvc/README
+8
-0
src/tools/msvc/Solution.pm
src/tools/msvc/Solution.pm
+303
-245
src/tools/msvc/config.pl
src/tools/msvc/config.pl
+14
-14
src/tools/msvc/genbki.pl
src/tools/msvc/genbki.pl
+164
-127
src/tools/msvc/gendef.pl
src/tools/msvc/gendef.pl
+36
-31
src/tools/msvc/install.pl
src/tools/msvc/install.pl
+157
-123
src/tools/msvc/mkvcbuild.pl
src/tools/msvc/mkvcbuild.pl
+277
-223
No files found.
src/tools/msvc/Project.pm
View file @
eee22892
...
@@ -4,15 +4,16 @@ use Carp;
...
@@ -4,15 +4,16 @@ use Carp;
use
strict
;
use
strict
;
use
warnings
;
use
warnings
;
sub
new
{
sub
new
my
(
$junk
,
$name
,
$type
,
$solution
)
=
@_
;
{
my
(
$junk
,
$name
,
$type
,
$solution
)
=
@_
;
my
$good_types
=
{
my
$good_types
=
{
lib
=>
1
,
lib
=>
1
,
exe
=>
1
,
exe
=>
1
,
dll
=>
1
,
dll
=>
1
,
};
};
confess
("
Bad project type:
$type
\n
")
unless
exists
$good_types
->
{
$type
};
confess
("
Bad project type:
$type
\n
")
unless
exists
$good_types
->
{
$type
};
my
$self
=
{
my
$self
=
{
name
=>
$name
,
name
=>
$name
,
type
=>
$type
,
type
=>
$type
,
guid
=>
Win32::
GuidGen
(),
guid
=>
Win32::
GuidGen
(),
...
@@ -22,362 +23,444 @@ sub new {
...
@@ -22,362 +23,444 @@ sub new {
suffixlib
=>
[]
,
suffixlib
=>
[]
,
includes
=>
'',
includes
=>
'',
defines
=>
'
;
',
defines
=>
'
;
',
solution
=>
$solution
,
solution
=>
$solution
,
disablewarnings
=>
'
4018;4244;4273;4102
',
disablewarnings
=>
'
4018;4244;4273;4102
',
disablelinkerwarnings
=>
''
disablelinkerwarnings
=>
''
};
};
bless
$self
;
bless
$self
;
return
$self
;
return
$self
;
}
}
sub
AddFile
{
sub
AddFile
my
(
$self
,
$filename
)
=
@_
;
{
my
(
$self
,
$filename
)
=
@_
;
$self
->
{
files
}
->
{
$filename
}
=
1
;
$self
->
{
files
}
->
{
$filename
}
=
1
;
}
}
sub
AddFiles
{
sub
AddFiles
my
$self
=
shift
;
{
my
$dir
=
shift
;
my
$self
=
shift
;
my
$dir
=
shift
;
while
(
my
$f
=
shift
)
{
while
(
my
$f
=
shift
)
$self
->
{
files
}
->
{
$dir
.
"
\\
"
.
$f
}
=
1
;
{
}
$self
->
{
files
}
->
{
$dir
.
"
\\
"
.
$f
}
=
1
;
}
}
}
sub
ReplaceFile
{
sub
ReplaceFile
my
(
$self
,
$filename
,
$newname
)
=
@_
;
{
my
$re
=
"
\\\\
$filename
\
$
";
my
(
$self
,
$filename
,
$newname
)
=
@_
;
my
$re
=
"
\\\\
$filename
\
$
";
foreach
my
$file
(
keys
%
{
$self
->
{
files
}
}
)
{
foreach
my
$file
(
keys
%
{
$self
->
{
files
}
}
)
{
# Match complete filename
# Match complete filename
if
(
$filename
=~
/\\/
)
{
if
(
$filename
=~
/\\/
)
if
(
$file
eq
$filename
)
{
{
if
(
$file
eq
$filename
)
{
delete
$self
->
{
files
}{
$file
};
delete
$self
->
{
files
}{
$file
};
$self
->
{
files
}{
$newname
}
=
1
;
$self
->
{
files
}{
$newname
}
=
1
;
return
;
return
;
}
}
}
}
elsif
(
$file
=~
m/($re)/
)
{
elsif
(
$file
=~
m/($re)/
)
{
delete
$self
->
{
files
}{
$file
};
delete
$self
->
{
files
}{
$file
};
$self
->
{
files
}{
"
$newname
\\
$filename
"
}
=
1
;
$self
->
{
files
}{
"
$newname
\\
$filename
"
}
=
1
;
return
;
return
;
}
}
}
}
confess
("
Could not find file
$filename
to replace
\n
");
confess
("
Could not find file
$filename
to replace
\n
");
}
}
sub
RemoveFile
{
sub
RemoveFile
my
(
$self
,
$filename
)
=
@_
;
{
my
(
$self
,
$filename
)
=
@_
;
my
$orig
=
scalar
keys
%
{
$self
->
{
files
}
};
my
$orig
=
scalar
keys
%
{
$self
->
{
files
}
};
delete
$self
->
{
files
}
->
{
$filename
};
delete
$self
->
{
files
}
->
{
$filename
};
if
(
$orig
>
scalar
keys
%
{
$self
->
{
files
}}
)
{
if
(
$orig
>
scalar
keys
%
{
$self
->
{
files
}}
)
{
return
;
return
;
}
}
confess
("
Could not find file
$filename
to remove
\n
");
confess
("
Could not find file
$filename
to remove
\n
");
}
}
sub
AddReference
{
sub
AddReference
my
$self
=
shift
;
{
my
$self
=
shift
;
while
(
my
$ref
=
shift
)
{
while
(
my
$ref
=
shift
)
push
@
{
$self
->
{
references
}},
$ref
;
{
$self
->
AddLibrary
("
__CFGNAME__
\\
"
.
$ref
->
{
name
}
.
"
\\
"
.
$ref
->
{
name
}
.
"
.lib
");
push
@
{
$self
->
{
references
}},
$ref
;
}
$self
->
AddLibrary
("
__CFGNAME__
\\
"
.
$ref
->
{
name
}
.
"
\\
"
.
$ref
->
{
name
}
.
"
.lib
");
}
}
}
sub
AddLibrary
{
sub
AddLibrary
my
(
$self
,
$lib
,
$dbgsuffix
)
=
@_
;
{
my
(
$self
,
$lib
,
$dbgsuffix
)
=
@_
;
push
@
{
$self
->
{
libraries
}},
$lib
;
push
@
{
$self
->
{
libraries
}},
$lib
;
if
(
$dbgsuffix
)
{
if
(
$dbgsuffix
)
push
@
{
$self
->
{
suffixlib
}},
$lib
;
{
}
push
@
{
$self
->
{
suffixlib
}},
$lib
;
}
}
}
sub
AddIncludeDir
{
sub
AddIncludeDir
my
(
$self
,
$inc
)
=
@_
;
{
my
(
$self
,
$inc
)
=
@_
;
if
(
$self
->
{
includes
}
ne
'')
{
if
(
$self
->
{
includes
}
ne
'')
$self
->
{
includes
}
.=
'
;
';
{
}
$self
->
{
includes
}
.=
'
;
';
$self
->
{
includes
}
.=
$inc
;
}
$self
->
{
includes
}
.=
$inc
;
}
}
sub
AddDefine
{
sub
AddDefine
my
(
$self
,
$def
)
=
@_
;
{
my
(
$self
,
$def
)
=
@_
;
$def
=~
s/"/""/g
;
$def
=~
s/"/""/g
;
$self
->
{
defines
}
.=
$def
.
'
;
';
$self
->
{
defines
}
.=
$def
.
'
;
';
}
}
sub
FullExportDLL
{
sub
FullExportDLL
my
(
$self
,
$libname
)
=
@_
;
{
my
(
$self
,
$libname
)
=
@_
;
$self
->
{
builddef
}
=
1
;
$self
->
{
builddef
}
=
1
;
$self
->
{
def
}
=
"
.
\\
__CFGNAME__
\\
$self
->{name}
\\
$self
->{name}.def
";
$self
->
{
def
}
=
"
.
\\
__CFGNAME__
\\
$self
->{name}
\\
$self
->{name}.def
";
$self
->
{
implib
}
=
"
__CFGNAME__
\\
$self
->{name}
\\
$libname
";
$self
->
{
implib
}
=
"
__CFGNAME__
\\
$self
->{name}
\\
$libname
";
}
}
sub
UseDef
{
sub
UseDef
my
(
$self
,
$def
)
=
@_
;
{
my
(
$self
,
$def
)
=
@_
;
$self
->
{
def
}
=
$def
;
$self
->
{
def
}
=
$def
;
}
}
sub
AddDir
{
sub
AddDir
my
(
$self
,
$reldir
)
=
@_
;
{
my
$MF
;
my
(
$self
,
$reldir
)
=
@_
;
my
$MF
;
my
$t
=
$/
;
undef
$/
;
open
(
$MF
,"
$reldir
\\
Makefile
")
||
open
(
$MF
,"
$reldir
\\
GNUMakefile
")
||
croak
"
Could not open
$reldir
\\
Makefile
\n
";
my
$t
=
$/
;
my
$mf
=
<
$MF
>
;
undef
$/
;
close
(
$MF
);
open
(
$MF
,"
$reldir
\\
Makefile
")
||
open
(
$MF
,"
$reldir
\\
GNUMakefile
")
$mf
=~
s{\\\s*[\r\n]+}{}mg
;
||
croak
"
Could not open
$reldir
\\
Makefile
\n
";
if
(
$mf
=~
m{^(?:SUB)?DIRS[^=]*=\s*(.*)$}mg
)
{
my
$mf
=
<
$MF
>
;
foreach
my
$subdir
(
split
/\s+/
,
$1
)
{
close
(
$MF
);
next
if
$subdir
eq
"
\
$(top_builddir)/src/timezone
";
#special case for non-standard include
$self
->
AddDir
(
$reldir
.
"
\\
"
.
$subdir
);
$mf
=~
s{\\\s*[\r\n]+}{}mg
;
}
if
(
$mf
=~
m{^(?:SUB)?DIRS[^=]*=\s*(.*)$}mg
)
}
{
while
(
$mf
=~
m{^(?:EXTRA_)?OBJS[^=]*=\s*(.*)$}m
)
{
foreach
my
$subdir
(
split
/\s+/
,
$1
)
my
$s
=
$1
;
{
my
$filter_re
=
qr{\$\(filter ([^,]+),\s+\$\(([^\)]+)\)\)}
;
next
while
(
$s
=~
/$filter_re/
)
{
if
$subdir
eq
"
\
$(top_builddir)/src/timezone
";
#special case for non-standard include
# Process $(filter a b c, $(VAR)) expressions
$self
->
AddDir
(
$reldir
.
"
\\
"
.
$subdir
);
my
$list
=
$1
;
}
my
$filter
=
$2
;
}
$list
=~
s/\.o/\.c/g
;
while
(
$mf
=~
m{^(?:EXTRA_)?OBJS[^=]*=\s*(.*)$}m
)
my
@pieces
=
split
/\s+/
,
$list
;
{
my
$matches
=
"";
my
$s
=
$1
;
foreach
my
$p
(
@pieces
)
{
my
$filter_re
=
qr{\$\(filter ([^,]+),\s+\$\(([^\)]+)\)\)}
;
if
(
$filter
eq
"
LIBOBJS
")
{
while
(
$s
=~
/$filter_re/
)
if
(
grep
(
/$p/
,
@
main::
pgportfiles
)
==
1
)
{
{
$p
=~
s/\.c/\.o/
;
$matches
.=
$p
.
"
";
# Process $(filter a b c, $(VAR)) expressions
}
my
$list
=
$1
;
}
my
$filter
=
$2
;
else
{
$list
=~
s/\.o/\.c/g
;
confess
"
Unknown filter
$filter
\n
";
my
@pieces
=
split
/\s+/
,
$list
;
}
my
$matches
=
"";
}
foreach
my
$p
(
@pieces
)
$s
=~
s/$filter_re/$matches/
;
{
}
foreach
my
$f
(
split
/\s+/
,
$s
)
{
if
(
$filter
eq
"
LIBOBJS
")
next
if
$f
=~
/^\s*$/
;
{
next
if
$f
eq
"
\\
";
if
(
grep
(
/$p/
,
@
main::
pgportfiles
)
==
1
)
next
if
$f
=~
/\/SUBSYS.o$/
;
{
$f
=~
s/,$//
;
# Remove trailing comma that can show up from filter stuff
$p
=~
s/\.c/\.o/
;
next
unless
$f
=~
/.*\.o$/
;
$matches
.=
$p
.
"
";
$f
=~
s/\.o$/\.c/
;
}
if
(
$f
=~
/^\$\(top_builddir\)\/(.*)/
)
{
}
$f
=
$1
;
else
$f
=~
s/\//\\/g
;
{
$self
->
{
files
}
->
{
$f
}
=
1
;
confess
"
Unknown filter
$filter
\n
";
}
}
else
{
}
$f
=~
s/\//\\/g
;
$s
=~
s/$filter_re/$matches/
;
$self
->
{
files
}
->
{"
$reldir
\\
$f
"}
=
1
;
}
}
foreach
my
$f
(
split
/\s+/
,
$s
)
}
{
$mf
=~
s{OBJS[^=]*=\s*(.*)$}{}m
;
next
if
$f
=~
/^\s*$/
;
}
next
if
$f
eq
"
\\
";
next
if
$f
=~
/\/SUBSYS.o$/
;
# Match rules that pull in source files from different directories
$f
=~
s/,$//
;
# Remove trailing comma that can show up from filter stuff
my
$replace_re
=
qr{^([^:\n\$]+\.c)\s*:\s*(?:%\s*: )?\$(\([^\)]+\))\/(.*)\/[^\/]+$}
;
next
unless
$f
=~
/.*\.o$/
;
while
(
$mf
=~
m{$replace_re}m
)
{
$f
=~
s/\.o$/\.c/
;
my
$match
=
$1
;
if
(
$f
=~
/^\$\(top_builddir\)\/(.*)/
)
my
$top
=
$2
;
{
my
$target
=
$3
;
$f
=
$1
;
$target
=~
s{/}{\\}g
;
$f
=~
s/\//\\/g
;
my
@pieces
=
split
/\s+/
,
$match
;
$self
->
{
files
}
->
{
$f
}
=
1
;
foreach
my
$fn
(
@pieces
)
{
}
if
(
$top
eq
"
(top_srcdir)
")
{
else
eval
{
$self
->
ReplaceFile
(
$fn
,
$target
)
};
{
}
$f
=~
s/\//\\/g
;
elsif
(
$top
eq
"
(backend_src)
")
{
$self
->
{
files
}
->
{"
$reldir
\\
$f
"}
=
1
;
eval
{
$self
->
ReplaceFile
(
$fn
,
"
src
\\
backend
\\
$target
")
};
}
}
}
else
{
$mf
=~
s{OBJS[^=]*=\s*(.*)$}{}m
;
confess
"
Bad replacement top:
$top
, on line
$_
\n
";
}
}
}
# Match rules that pull in source files from different directories
$mf
=~
s{$replace_re}{}m
;
my
$replace_re
=
qr{^([^:\n\$]+\.c)\s*:\s*(?:%\s*: )?\$(\([^\)]+\))\/(.*)\/[^\/]+$}
;
}
while
(
$mf
=~
m{$replace_re}m
)
{
# See if this Makefile contains a description, and should have a RC file
my
$match
=
$1
;
if
(
$mf
=~
/^PGFILEDESC\s*=\s*\"([^\"]+)\"/m
)
{
my
$top
=
$2
;
my
$desc
=
$1
;
my
$target
=
$3
;
my
$ico
;
$target
=~
s{/}{\\}g
;
if
(
$mf
=~
/^PGAPPICON\s*=\s*(.*)$/m
)
{
$ico
=
$1
;
}
my
@pieces
=
split
/\s+/
,
$match
;
$self
->
AddResourceFile
(
$reldir
,
$desc
,
$ico
);
foreach
my
$fn
(
@pieces
)
}
{
$/
=
$t
;
if
(
$top
eq
"
(top_srcdir)
")
{
eval
{
$self
->
ReplaceFile
(
$fn
,
$target
)
};
}
elsif
(
$top
eq
"
(backend_src)
")
{
eval
{
$self
->
ReplaceFile
(
$fn
,
"
src
\\
backend
\\
$target
")
};
}
else
{
confess
"
Bad replacement top:
$top
, on line
$_
\n
";
}
}
$mf
=~
s{$replace_re}{}m
;
}
# See if this Makefile contains a description, and should have a RC file
if
(
$mf
=~
/^PGFILEDESC\s*=\s*\"([^\"]+)\"/m
)
{
my
$desc
=
$1
;
my
$ico
;
if
(
$mf
=~
/^PGAPPICON\s*=\s*(.*)$/m
)
{
$ico
=
$1
;
}
$self
->
AddResourceFile
(
$reldir
,
$desc
,
$ico
);
}
$/
=
$t
;
}
}
sub
AddResourceFile
{
sub
AddResourceFile
my
(
$self
,
$dir
,
$desc
,
$ico
)
=
@_
;
{
my
(
$self
,
$dir
,
$desc
,
$ico
)
=
@_
;
my
(
$sec
,
$min
,
$hour
,
$mday
,
$mon
,
$year
,
$wday
,
$yday
,
$isdst
)
=
localtime
(
time
);
my
$d
=
(
$year
-
100
)
.
"
$yday
";
my
(
$sec
,
$min
,
$hour
,
$mday
,
$mon
,
$year
,
$wday
,
$yday
,
$isdst
)
=
localtime
(
time
);
my
$d
=
(
$year
-
100
)
.
"
$yday
";
if
(
Solution::
IsNewer
("
$dir
\\
win32ver.rc
",'
src
\
port
\
win32ver.rc
'))
{
print
"
Generating win32ver.rc for
$dir
\n
";
if
(
Solution::
IsNewer
("
$dir
\\
win32ver.rc
",'
src
\
port
\
win32ver.rc
'))
open
(
I
,'
src
\
port
\
win32ver.rc
')
||
confess
"
Could not open win32ver.rc
";
{
open
(
O
,"
>
$dir
\\
win32ver.rc
")
||
confess
"
Could not write win32ver.rc
";
print
"
Generating win32ver.rc for
$dir
\n
";
my
$icostr
=
$ico
?"
IDI_ICON ICON
\"
src/port/
$ico
.ico
\"
":"";
open
(
I
,'
src
\
port
\
win32ver.rc
')
||
confess
"
Could not open win32ver.rc
";
while
(
<
I
>
)
{
open
(
O
,"
>
$dir
\\
win32ver.rc
")
||
confess
"
Could not write win32ver.rc
";
s/FILEDESC/"$desc"/gm
;
my
$icostr
=
$ico
?"
IDI_ICON ICON
\"
src/port/
$ico
.ico
\"
":"";
s/_ICO_/$icostr/gm
;
while
(
<
I
>
)
s/(VERSION.*),0/$1,$d/
;
{
if
(
$self
->
{
type
}
eq
"
dll
")
{
s/FILEDESC/"$desc"/gm
;
s/VFT_APP/VFT_DLL/gm
;
s/_ICO_/$icostr/gm
;
}
s/(VERSION.*),0/$1,$d/
;
print
O
;
if
(
$self
->
{
type
}
eq
"
dll
")
}
{
}
s/VFT_APP/VFT_DLL/gm
;
close
(
O
);
}
close
(
I
);
print
O
;
$self
->
AddFile
("
$dir
\\
win32ver.rc
");
}
}
close
(
O
);
close
(
I
);
$self
->
AddFile
("
$dir
\\
win32ver.rc
");
}
}
sub
DisableLinkerWarnings
{
sub
DisableLinkerWarnings
my
(
$self
,
$warnings
)
=
@_
;
{
my
(
$self
,
$warnings
)
=
@_
;
$self
->
{
disablelinkerwarnings
}
.=
'
;
'
unless
(
$self
->
{
disablelinkerwarnings
}
eq
'');
$self
->
{
disablelinkerwarnings
}
.=
'
;
'
unless
(
$self
->
{
disablelinkerwarnings
}
eq
'');
$self
->
{
disablelinkerwarnings
}
.=
$warnings
;
$self
->
{
disablelinkerwarnings
}
.=
$warnings
;
}
}
sub
Save
{
sub
Save
my
(
$self
)
=
@_
;
{
my
(
$self
)
=
@_
;
# If doing DLL and haven't specified a DEF file, do a full export of all symbols
# If doing DLL and haven't specified a DEF file, do a full export of all symbols
# in the project.
# in the project.
if
(
$self
->
{
type
}
eq
"
dll
"
&&
!
$self
->
{
def
})
{
if
(
$self
->
{
type
}
eq
"
dll
"
&&
!
$self
->
{
def
})
$self
->
FullExportDLL
(
$self
->
{
name
}
.
"
.lib
");
{
}
$self
->
FullExportDLL
(
$self
->
{
name
}
.
"
.lib
");
}
# Dump the project
# Dump the project
open
(
F
,
"
>
$self
->{name}.vcproj
")
||
croak
("
Could not write to
$self
->{name}.vcproj
\n
");
open
(
F
,
"
>
$self
->{name}.vcproj
")
||
croak
("
Could not write to
$self
->{name}.vcproj
\n
");
$self
->
WriteHeader
(
*
F
);
$self
->
WriteHeader
(
*
F
);
$self
->
WriteReferences
(
*
F
);
$self
->
WriteReferences
(
*
F
);
print
F
<<EOF;
print
F
<<EOF;
<Files>
<Files>
EOF
EOF
my
@dirstack
=
();
my
@dirstack
=
();
my
%
uniquefiles
;
my
%
uniquefiles
;
foreach
my
$f
(
sort
keys
%
{
$self
->
{
files
}
})
{
foreach
my
$f
(
sort
keys
%
{
$self
->
{
files
}
})
confess
"
Bad format filename '
$f
'
\n
"
unless
(
$f
=~
/^(.*)\\([^\\]+)\.[r]?[cyl]$/
);
{
my
$dir
=
$1
;
confess
"
Bad format filename '
$f
'
\n
"
unless
(
$f
=~
/^(.*)\\([^\\]+)\.[r]?[cyl]$/
);
my
$file
=
$2
;
my
$dir
=
$1
;
my
$file
=
$2
;
# Walk backwards down the directory stack and close any dirs we're done with
while
(
$#dirstack
>=
0
)
{
# Walk backwards down the directory stack and close any dirs we're done with
if
(
join
('
\
\'
,@dirstack) eq substr($dir, 0, length(join(
'
\\
'
,@dirstack)))) {
while
(
$#dirstack
>=
0
)
last if (length($dir) == length(join(
'
\\
'
,@dirstack)));
{
last if (substr($dir, length(join(
'
\\
'
,@dirstack)),1) eq
'
\\
'
);
if
(
join
('
\
\'
,@dirstack) eq substr($dir, 0, length(join(
'
\\
'
,@dirstack))))
}
{
print F
'
'
x $#dirstack . " </Filter>
\
n";
last if (length($dir) == length(join(
'
\\
'
,@dirstack)));
pop @dirstack;
last if (substr($dir, length(join(
'
\\
'
,@dirstack)),1) eq
'
\\
'
);
}
}
# Now walk forwards and create whatever directories are needed
print F
'
'
x $#dirstack . " </Filter>
\
n";
while (join(
'
\\
'
,@dirstack) ne $dir) {
pop @dirstack;
my $left = substr($dir, length(join(
'
\\
'
,@dirstack)));
}
$left =~ s/^
\\
//;
my @pieces = split /
\\
/, $left;
# Now walk forwards and create whatever directories are needed
push @dirstack, $pieces[0];
while (join(
'
\\
'
,@dirstack) ne $dir)
print F
'
'
x $#dirstack . " <Filter Name=
\
"$pieces[0]
\
" Filter=
\
"
\
">
\
n";
{
}
my $left = substr($dir, length(join(
'
\\
'
,@dirstack)));
$left =~ s/^
\\
//;
print F
'
'
x $#dirstack . " <File RelativePath=
\
"$f
\
"";
my @pieces = split /
\\
/, $left;
if ($f =~ /
\
.y$/) {
push @dirstack, $pieces[0];
my $of = $f;
print F
'
'
x $#dirstack . " <Filter Name=
\
"$pieces[0]
\
" Filter=
\
"
\
">
\
n";
$of =~ s/
\
.y$/.c/;
}
$of =~ s{^src
\\
pl
\\
plpgsql
\\
src
\\
gram.c$}{src
\\
pl
\\
plpgsql
\\
src
\\
pl_gram.c};
print F
'
>
'
. GenerateCustomTool(
'
Running
bison
on
'
. $f,
'
cmd
/V:ON /c
src
\
tools
\
msvc
\
pgbison
.
bat
'
. $f, $of) .
'
</
File
>
'
. "
\
n";
print F
'
'
x $#dirstack . " <File RelativePath=
\
"$f
\
"";
}
if ($f =~ /
\
.y$/)
elsif ($f =~ /
\
.l$/) {
{
my $of = $f;
my $of = $f;
$of =~ s/
\
.l$/.c/;
$of =~ s/
\
.y$/.c/;
$of =~ s{^src
\\
pl
\\
plpgsql
\\
src
\\
scan.c$}{src
\\
pl
\\
plpgsql
\\
src
\\
pl_scan.c};
$of =~ s{^src
\\
pl
\\
plpgsql
\\
src
\\
gram.c$}{src
\\
pl
\\
plpgsql
\\
src
\\
pl_gram.c};
print F
'
>
'
. GenerateCustomTool(
'
Running
flex
on
'
. $f,
'
src
\
tools
\
msvc
\
pgflex
.
bat
'
. $f,$of) .
'
</
File
>
'
. "
\
n";
print F
'
>
'
}
. GenerateCustomTool(
'
Running
bison
on
'
. $f,
elsif (defined($uniquefiles{$file})) {
'
cmd
/V:ON /c
src
\
tools
\
msvc
\
pgbison
.
bat
'
. $f, $of)
# File already exists, so fake a new name
.
'
</
File
>
'
. "
\
n";
my $obj = $dir;
}
$obj =~ s/
\\
/_/g;
elsif ($f =~ /
\
.l$/)
print F "><FileConfiguration Name=
\
"Debug|Win32
\
"><Tool Name=
\
"VCCLCompilerTool
\
" ObjectFile=
\
".
\\
debug
\\
$self->{name}
\\
$obj" . "_$file.obj
\
" /></FileConfiguration><FileConfiguration Name=
\
"Release|Win32
\
"><Tool Name=
\
"VCCLCompilerTool
\
" ObjectFile=
\
".
\\
release
\\
$self->{name}
\\
$obj" . "_$file.obj
\
" /></FileConfiguration></File>
\
n";
{
}
my $of = $f;
else {
$of =~ s/
\
.l$/.c/;
$uniquefiles{$file} = 1;
$of =~ s{^src
\\
pl
\\
plpgsql
\\
src
\\
scan.c$}{src
\\
pl
\\
plpgsql
\\
src
\\
pl_scan.c};
print F " />
\
n";
print F
'
>
'
}
. GenerateCustomTool(
'
Running
flex
on
'
. $f,
'
src
\
tools
\
msvc
\
pgflex
.
bat
'
. $f,$of)
}
.
'
</
File
>
'
. "
\
n";
while ($#dirstack >= 0) {
}
print F
'
'
x $#dirstack . " </Filter>
\
n";
elsif (defined($uniquefiles{$file}))
pop @dirstack;
{
}
$self->Footer(*F);
# File already exists, so fake a new name
close(F);
my $obj = $dir;
$obj =~ s/
\\
/_/g;
print F
"><FileConfiguration Name=
\
"Debug|Win32
\
"><Tool Name=
\
"VCCLCompilerTool
\
" ObjectFile=
\
".
\\
debug
\\
$self->{name}
\\
$obj"
. "_$file.obj
\
" /></FileConfiguration><FileConfiguration Name=
\
"Release|Win32
\
"><Tool Name=
\
"VCCLCompilerTool
\
" ObjectFile=
\
".
\\
release
\\
$self->{name}
\\
$obj"
. "_$file.obj
\
" /></FileConfiguration></File>
\
n";
}
else
{
$uniquefiles{$file} = 1;
print F " />
\
n";
}
}
while ($#dirstack >= 0)
{
print F
'
'
x $#dirstack . " </Filter>
\
n";
pop @dirstack;
}
$self->Footer(*F);
close(F);
}
}
sub GenerateCustomTool {
sub GenerateCustomTool
my ($desc, $tool, $output, $cfg) = @_;
{
if (!defined($cfg)) {
my ($desc, $tool, $output, $cfg) = @_;
return GenerateCustomTool($desc, $tool, $output,
'
Debug
'
) .
if (!defined($cfg))
GenerateCustomTool($desc, $tool, $output,
'
Release
'
);
{
}
return GenerateCustomTool($desc, $tool, $output,
'
Debug
'
)
return "<FileConfiguration Name=
\
"$cfg|Win32
\
"><Tool Name=
\
"VCCustomBuildTool
\
" Description=
\
"$desc
\
" CommandLine=
\
"$tool
\
" AdditionalDependencies=
\
"
\
" Outputs=
\
"$output
\
" /></FileConfiguration>";
.GenerateCustomTool($desc, $tool, $output,
'
Release
'
);
}
return
"<FileConfiguration Name=
\
"$cfg|Win32
\
"><Tool Name=
\
"VCCustomBuildTool
\
" Description=
\
"$desc
\
" CommandLine=
\
"$tool
\
" AdditionalDependencies=
\
"
\
" Outputs=
\
"$output
\
" /></FileConfiguration>";
}
}
sub WriteReferences {
sub WriteReferences
my ($self, $f) = @_;
{
print $f " <References>
\
n";
my ($self, $f) = @_;
foreach my $ref (@{$self->{references}}) {
print $f " <References>
\
n";
print $f " <ProjectReference ReferencedProjectIdentifier=
\
"$ref->{guid}
\
" Name=
\
"$ref->{name}
\
" />
\
n";
foreach my $ref (@{$self->{references}})
}
{
print $f " </References>
\
n";
print $f
" <ProjectReference ReferencedProjectIdentifier=
\
"$ref->{guid}
\
" Name=
\
"$ref->{name}
\
" />
\
n";
}
print $f " </References>
\
n";
}
}
sub WriteHeader {
sub WriteHeader
my ($self, $f) = @_;
{
my ($self, $f) = @_;
print $f <<EOF;
print $f <<EOF;
<?xml version="1.0" encoding="Windows-1252"?>
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject ProjectType="Visual C++" Version="8.00" Name="$self->{name}" ProjectGUID="$self->{guid}">
<VisualStudioProject ProjectType="Visual C++" Version="8.00" Name="$self->{name}" ProjectGUID="$self->{guid}">
<Platforms><Platform Name="Win32"/></Platforms>
<Platforms><Platform Name="Win32"/></Platforms>
<Configurations>
<Configurations>
EOF
EOF
$self->WriteConfiguration($f,
'
Debug
'
, { defs=>
'
_DEBUG
;
DEBUG
=
1
;'
, wholeopt=>0 , opt=>0, strpool=>
'
false
'
, runtime=>3 });
$self->WriteConfiguration($f,
'
Debug
'
,
$self->WriteConfiguration($f,
'
Release
'
, { defs=>
''
, wholeopt=>0, opt=>3, strpool=>
'
true
'
, runtime=>2 });
{ defs=>
'
_DEBUG
;
DEBUG
=
1
;'
, wholeopt=>0, opt=>0, strpool=>
'
false
'
, runtime=>3 });
print $f <<EOF;
$self->WriteConfiguration($f,
'
Release
'
,
{ defs=>
''
, wholeopt=>0, opt=>3, strpool=>
'
true
'
, runtime=>2 });
print $f <<EOF;
</Configurations>
</Configurations>
EOF
EOF
}
}
sub WriteConfiguration
sub WriteConfiguration
{
{
my ($self, $f, $cfgname, $p) = @_;
my ($self, $f, $cfgname, $p) = @_;
my $cfgtype = ($self->{type} eq "exe")?1:($self->{type} eq "dll"?2:4);
my $cfgtype = ($self->{type} eq "exe")?1:($self->{type} eq "dll"?2:4);
my $libcfg = (uc $cfgname eq "RELEASE")?"MD":"MDd";
my $libcfg = (uc $cfgname eq "RELEASE")?"MD":"MDd";
my $libs =
''
;
my $libs =
''
;
foreach my $lib (@{$self->{libraries}}) {
foreach my $lib (@{$self->{libraries}})
my $xlib = $lib;
{
foreach my $slib (@{$self->{suffixlib}}) {
my $xlib = $lib;
if ($slib eq $lib) {
foreach my $slib (@{$self->{suffixlib}})
$xlib =~ s/
\
.lib$/$libcfg.lib/;
{
last;
if ($slib eq $lib)
}
{
}
$xlib =~ s/
\
.lib$/$libcfg.lib/;
$libs .= $xlib . " ";
last;
}
}
$libs =~ s/ $//;
}
$libs =~ s/__CFGNAME__/$cfgname/g;
$libs .= $xlib . " ";
my $pth = $self->{solution}->{options}->{pthread};
}
$pth =
''
unless $pth;
$libs =~ s/ $//;
print $f <<EOF;
$libs =~ s/__CFGNAME__/$cfgname/g;
my $pth = $self->{solution}->{options}->{pthread};
$pth =
''
unless $pth;
print $f <<EOF;
<Configuration Name="$cfgname|Win32" OutputDirectory=".
\\
$cfgname
\\
$self->{name}" IntermediateDirectory=".
\\
$cfgname
\\
$self->{name}"
<Configuration Name="$cfgname|Win32" OutputDirectory=".
\\
$cfgname
\\
$self->{name}" IntermediateDirectory=".
\\
$cfgname
\\
$self->{name}"
ConfigurationType="$cfgtype" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="FALSE" CharacterSet="2" WholeProgramOptimization="$p->{wholeopt}">
ConfigurationType="$cfgtype" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="FALSE" CharacterSet="2" WholeProgramOptimization="$p->{wholeopt}">
<Tool Name="VCCLCompilerTool" Optimization="$p->{opt}"
<Tool Name="VCCLCompilerTool" Optimization="$p->{opt}"
...
@@ -386,7 +469,7 @@ sub WriteConfiguration
...
@@ -386,7 +469,7 @@ sub WriteConfiguration
StringPooling="$p->{strpool}"
StringPooling="$p->{strpool}"
RuntimeLibrary="$p->{runtime}" DisableSpecificWarnings="$self->{disablewarnings}"
RuntimeLibrary="$p->{runtime}" DisableSpecificWarnings="$self->{disablewarnings}"
EOF
EOF
print $f <<EOF;
print $f <<EOF;
AssemblerOutput="0" AssemblerListingLocation=".
\\
$cfgname
\\
$self->{name}
\\
" ObjectFile=".
\\
$cfgname
\\
$self->{name}
\\
"
AssemblerOutput="0" AssemblerListingLocation=".
\\
$cfgname
\\
$self->{name}
\\
" ObjectFile=".
\\
$cfgname
\\
$self->{name}
\\
"
ProgramDataBaseFileName=".
\\
$cfgname
\\
$self->{name}
\\
" BrowseInformation="0"
ProgramDataBaseFileName=".
\\
$cfgname
\\
$self->{name}
\\
" BrowseInformation="0"
WarningLevel="3" SuppressStartupBanner="TRUE" DebugInformationFormat="3" CompileAs="0"/>
WarningLevel="3" SuppressStartupBanner="TRUE" DebugInformationFormat="3" CompileAs="0"/>
...
@@ -398,55 +481,63 @@ EOF
...
@@ -398,55 +481,63 @@ EOF
GenerateMapFile="FALSE" MapFileName=".
\\
$cfgname
\\
$self->{name}
\\
$self->{name}.map"
GenerateMapFile="FALSE" MapFileName=".
\\
$cfgname
\\
$self->{name}
\\
$self->{name}.map"
SubSystem="1" TargetMachine="1"
SubSystem="1" TargetMachine="1"
EOF
EOF
if ($self->{disablelinkerwarnings}) {
if ($self->{disablelinkerwarnings})
print $f "
\
t
\
tAdditionalOptions=
\
"/ignore:$self->{disablelinkerwarnings}
\
"
\
n";
{
}
print $f "
\
t
\
tAdditionalOptions=
\
"/ignore:$self->{disablelinkerwarnings}
\
"
\
n";
if ($self->{implib}) {
}
my $l = $self->{implib};
if ($self->{implib})
$l =~ s/__CFGNAME__/$cfgname/g;
{
print $f "
\
t
\
tImportLibrary=
\
"$l
\
"
\
n";
my $l = $self->{implib};
}
$l =~ s/__CFGNAME__/$cfgname/g;
if ($self->{def}) {
print $f "
\
t
\
tImportLibrary=
\
"$l
\
"
\
n";
my $d = $self->{def};
}
$d =~ s/__CFGNAME__/$cfgname/g;
if ($self->{def})
print $f "
\
t
\
tModuleDefinitionFile=
\
"$d
\
"
\
n";
{
}
my $d = $self->{def};
$d =~ s/__CFGNAME__/$cfgname/g;
print $f "
\
t/>
\
n";
print $f "
\
t
\
tModuleDefinitionFile=
\
"$d
\
"
\
n";
print $f "
\
t<Tool Name=
\
"VCLibrarianTool
\
" OutputFile=
\
".
\\
$cfgname
\\
$self->{name}
\\
$self->{name}.lib
\
" IgnoreDefaultLibraryNames=
\
"libc
\
" />
\
n";
}
print $f "
\
t<Tool Name=
\
"VCResourceCompilerTool
\
" AdditionalIncludeDirectories=
\
"src
\\
include
\
" />
\
n";
if ($self->{builddef}) {
print $f "
\
t/>
\
n";
print $f "
\
t<Tool Name=
\
"VCPreLinkEventTool
\
" Description=
\
"Generate DEF file
\
" CommandLine=
\
"perl src
\\
tools
\\
msvc
\\
gendef.pl $cfgname
\\
$self->{name}
\
" />
\
n";
print $f
}
"
\
t<Tool Name=
\
"VCLibrarianTool
\
" OutputFile=
\
".
\\
$cfgname
\\
$self->{name}
\\
$self->{name}.lib
\
" IgnoreDefaultLibraryNames=
\
"libc
\
" />
\
n";
print $f <<EOF;
print $f
"
\
t<Tool Name=
\
"VCResourceCompilerTool
\
" AdditionalIncludeDirectories=
\
"src
\\
include
\
" />
\
n";
if ($self->{builddef})
{
print $f
"
\
t<Tool Name=
\
"VCPreLinkEventTool
\
" Description=
\
"Generate DEF file
\
" CommandLine=
\
"perl src
\\
tools
\\
msvc
\\
gendef.pl $cfgname
\\
$self->{name}
\
" />
\
n";
}
print $f <<EOF;
</Configuration>
</Configuration>
EOF
EOF
}
}
sub Footer {
sub Footer
my ($self, $f) = @_;
{
my ($self, $f) = @_;
print $f <<EOF;
print $f <<EOF;
</Files>
</Files>
<Globals/>
<Globals/>
</VisualStudioProject>
</VisualStudioProject>
EOF
EOF
}
}
# Utility function that loads a complete file
# Utility function that loads a complete file
sub read_file {
sub read_file
my $filename = shift;
{
my $F;
my $filename = shift;
my $t = $/;
my $F;
my $t = $/;
undef $/;
open($F, $filename) || croak "Could not open file $filename
\
n";
undef $/;
my $txt = <$F>;
open($F, $filename) || croak "Could not open file $filename
\
n";
close($F);
my $txt = <$F>;
$/ = $t;
close($F);
$/ = $t;
return $txt;
return $txt;
}
}
1;
1;
src/tools/msvc/README
View file @
eee22892
...
@@ -63,3 +63,11 @@ Get from http://www.zlib.net
...
@@ -63,3 +63,11 @@ Get from http://www.zlib.net
libxml2 and libxslt - required for XML support
libxml2 and libxslt - required for XML support
Get from http://www.zlatkovic.com/pub/libxml or build from source from
Get from http://www.zlatkovic.com/pub/libxml or build from source from
http://xmlsoft.org. Note that libxml2 requires iconv.
http://xmlsoft.org. Note that libxml2 requires iconv.
Code indention
--------------
If the perl code is modified, use perltidy on it since pgindent won't
touch perl code. Use the following commandline:
perltidy -b -bl -nsfs -naws -l=100 *.pl *.pm
src/tools/msvc/Solution.pm
View file @
eee22892
...
@@ -3,205 +3,243 @@ use Carp;
...
@@ -3,205 +3,243 @@ use Carp;
use
strict
;
use
strict
;
use
warnings
;
use
warnings
;
sub
new
{
sub
new
my
$junk
=
shift
;
{
my
$options
=
shift
;
my
$junk
=
shift
;
my
$self
=
{
my
$options
=
shift
;
my
$self
=
{
projects
=>
{},
projects
=>
{},
options
=>
$options
,
options
=>
$options
,
numver
=>
'',
numver
=>
'',
strver
=>
'',
strver
=>
'',
};
};
bless
$self
;
bless
$self
;
if
(
$options
->
{
xml
})
{
if
(
$options
->
{
xml
})
if
(
!
(
$options
->
{
xslt
}
&&
$options
->
{
iconv
}))
{
{
die
"
XML requires both XSLT and ICONV
\n
";
if
(
!
(
$options
->
{
xslt
}
&&
$options
->
{
iconv
}))
}
{
}
die
"
XML requires both XSLT and ICONV
\n
";
return
$self
;
}
}
return
$self
;
}
}
# Return 1 if $oldfile is newer than $newfile, or if $newfile doesn't exist.
# Return 1 if $oldfile is newer than $newfile, or if $newfile doesn't exist.
# Special case - if config.pl has changed, always return 1
# Special case - if config.pl has changed, always return 1
sub
IsNewer
{
sub
IsNewer
my
(
$newfile
,
$oldfile
)
=
@_
;
{
if
(
$oldfile
ne
'
src
\
tools
\
msvc
\
config.pl
')
{
my
(
$newfile
,
$oldfile
)
=
@_
;
return
1
if
IsNewer
(
$newfile
,
'
src
\
tools
\
msvc
\
config.pl
');
if
(
$oldfile
ne
'
src
\
tools
\
msvc
\
config.pl
')
}
{
return
1
if
(
!
(
-
e
$newfile
));
return
1
if
IsNewer
(
$newfile
,
'
src
\
tools
\
msvc
\
config.pl
');
my
@nstat
=
stat
(
$newfile
);
}
my
@ostat
=
stat
(
$oldfile
);
return
1
if
(
!
(
-
e
$newfile
));
return
1
if
(
$nstat
[
9
]
<
$ostat
[
9
]);
my
@nstat
=
stat
(
$newfile
);
return
0
;
my
@ostat
=
stat
(
$oldfile
);
return
1
if
(
$nstat
[
9
]
<
$ostat
[
9
]);
return
0
;
}
}
# Copy a file, *not* preserving date. Only works for text files.
# Copy a file, *not* preserving date. Only works for text files.
sub
copyFile
{
sub
copyFile
my
(
$src
,
$dest
)
=
@_
;
{
open
(
I
,
$src
)
||
croak
"
Could not open
$src
";
my
(
$src
,
$dest
)
=
@_
;
open
(
O
,"
>
$dest
")
||
croak
"
Could not open
$dest
";
open
(
I
,
$src
)
||
croak
"
Could not open
$src
";
while
(
<
I
>
)
{
open
(
O
,"
>
$dest
")
||
croak
"
Could not open
$dest
";
print
O
;
while
(
<
I
>
)
}
{
close
(
I
);
print
O
;
close
(
O
);
}
close
(
I
);
close
(
O
);
}
}
sub
GenerateFiles
{
sub
GenerateFiles
my
$self
=
shift
;
{
my
$self
=
shift
;
# Parse configure.in to get version numbers
# Parse configure.in to get version numbers
open
(
C
,"
configure.in
")
||
confess
("
Could not open configure.in for reading
\n
");
open
(
C
,"
configure.in
")
||
confess
("
Could not open configure.in for reading
\n
");
while
(
<
C
>
)
{
while
(
<
C
>
)
if
(
/^AC_INIT\(\[PostgreSQL\], \[([^\]]+)\]/
)
{
{
$self
->
{
strver
}
=
$1
;
if
(
/^AC_INIT\(\[PostgreSQL\], \[([^\]]+)\]/
)
if
(
$self
->
{
strver
}
!~
/^(\d+)\.(\d+)(?:\.(\d+))?/
)
{
{
confess
"
Bad format of version:
$self
->{strver}
\n
"
$self
->
{
strver
}
=
$1
;
}
if
(
$self
->
{
strver
}
!~
/^(\d+)\.(\d+)(?:\.(\d+))?/
)
$self
->
{
numver
}
=
sprintf
("
%d%02d%02d
",
$1
,
$2
,
$3
?
$3:0
);
{
$self
->
{
majorver
}
=
sprintf
("
%d.%d
",
$1
,
$2
);
confess
"
Bad format of version:
$self
->{strver}
\n
";
}
}
}
$self
->
{
numver
}
=
sprintf
("
%d%02d%02d
",
$1
,
$2
,
$3
?
$3:0
);
close
(
C
);
$self
->
{
majorver
}
=
sprintf
("
%d.%d
",
$1
,
$2
);
confess
"
Unable to parse configure.in for all variables!
"
}
if
(
$self
->
{
strver
}
eq
''
||
$self
->
{
numver
}
eq
'');
}
close
(
C
);
confess
"
Unable to parse configure.in for all variables!
"
if
(
$self
->
{
strver
}
eq
''
||
$self
->
{
numver
}
eq
'');
if
(
IsNewer
("
src
\\
include
\\
pg_config_os.h
","
src
\\
include
\\
port
\\
win32.h
"))
{
if
(
IsNewer
("
src
\\
include
\\
pg_config_os.h
","
src
\\
include
\\
port
\\
win32.h
"))
print
"
Copying pg_config_os.h...
\n
";
{
copyFile
("
src
\\
include
\\
port
\\
win32.h
","
src
\\
include
\\
pg_config_os.h
");
print
"
Copying pg_config_os.h...
\n
";
}
copyFile
("
src
\\
include
\\
port
\\
win32.h
","
src
\\
include
\\
pg_config_os.h
");
}
if
(
IsNewer
("
src
\\
include
\\
pg_config.h
","
src
\\
include
\\
pg_config.h.win32
"))
{
print
"
Generating pg_config.h...
\n
";
open
(
I
,"
src
\\
include
\\
pg_config.h.win32
")
||
confess
"
Could not open pg_config.h.win32
\n
";
open
(
O
,"
>src
\\
include
\\
pg_config.h
")
||
confess
"
Could not write to pg_config.h
\n
";
while
(
<
I
>
)
{
s{PG_VERSION "[^"]+"}{PG_VERSION "$self->{strver}
"
};
s{PG_VERSION_NUM
\
d+}{PG_VERSION_NUM
$self
->{numver}};
s{PG_VERSION_STR
"[
^
"
]+
"}{
__STRINGIFY
(
x
)
#x\n#define __STRINGIFY2(z) __STRINGIFY(z)\n#define PG_VERSION_STR "PostgreSQL $self->{strver}, compiled by Visual C++ build " __STRINGIFY2(_MSC_VER)};
print
O
;
}
print
O
"
/* defines added by config steps */
\n
";
print
O
"
#define USE_ASSERT_CHECKING 1
\n
"
if
(
$self
->
{
options
}
->
{
asserts
});
print
O
"
#define USE_INTEGER_DATETIMES 1
\n
"
if
(
$self
->
{
options
}
->
{
integer_datetimes
});
print
O
"
#define USE_LDAP 1
\n
"
if
(
$self
->
{
options
}
->
{
ldap
});
print
O
"
#define HAVE_LIBZ 1
\n
"
if
(
$self
->
{
options
}
->
{
zlib
});
print
O
"
#define USE_SSL 1
\n
"
if
(
$self
->
{
options
}
->
{
openssl
});
print
O
"
#define ENABLE_NLS 1
\n
"
if
(
$self
->
{
options
}
->
{
nls
});
print
O
"
#define LOCALEDIR
\"
/share/locale
\"\n
"
if
(
$self
->
{
options
}
->
{
nls
});
if
(
$self
->
{
options
}
->
{
xml
})
{
print
O
"
#define HAVE_LIBXML2
\n
";
print
O
"
#define USE_LIBXML
\n
";
}
if
(
$self
->
{
options
}
->
{
krb5
})
{
print
O
"
#define KRB5 1
\n
";
print
O
"
#define HAVE_KRB5_ERROR_TEXT_DATA 1
\n
";
print
O
"
#define HAVE_KRB5_TICKET_ENC_PART2 1
\n
";
print
O
"
#define PG_KRB_SRVNAM
\"
postgres
\"\n
";
}
close
(
O
);
close
(
I
);
}
if
(
IsNewer
("
src
\\
interfaces
\\
libpq
\\
libpqdll.def
","
src
\\
interfaces
\\
libpq
\\
exports.txt
"))
{
if
(
IsNewer
("
src
\\
include
\\
pg_config.h
","
src
\\
include
\\
pg_config.h.win32
"))
print
"
Generating libpqdll.def...
\n
";
{
open
(
I
,"
src
\\
interfaces
\\
libpq
\\
exports.txt
")
||
confess
("
Could not open exports.txt
\n
");
print
"
Generating pg_config.h...
\n
";
open
(
O
,"
>src
\\
interfaces
\\
libpq
\\
libpqdll.def
")
||
confess
("
Could not open libpqdll.def
\n
");
open
(
I
,"
src
\\
include
\\
pg_config.h.win32
")
||
confess
"
Could not open pg_config.h.win32
\n
";
print
O
"
LIBRARY LIBPQ
\n
EXPORTS
\n
";
open
(
O
,"
>src
\\
include
\\
pg_config.h
")
||
confess
"
Could not write to pg_config.h
\n
";
while
(
<
I
>
)
{
while
(
<
I
>
)
next
if
(
/^#/
);
{
my
(
$f
,
$o
)
=
split
;
s{PG_VERSION "[^"]+"}{PG_VERSION "$self->{strver}
"
};
print
O
"
$f
@
$o
\n
";
s{PG_VERSION_NUM
\
d+}{PG_VERSION_NUM
$self
->{numver}};
}
s{PG_VERSION_STR
"[
^
"
]+
"}{
__STRINGIFY
(
x
)
#x\n#define __STRINGIFY2(z) __STRINGIFY(z)\n#define PG_VERSION_STR "PostgreSQL $self->{strver}, compiled by Visual C++ build " __STRINGIFY2(_MSC_VER)};
close
(
O
);
print
O
;
close
(
I
);
}
}
print
O
"
/* defines added by config steps */
\n
";
print
O
"
#define USE_ASSERT_CHECKING 1
\n
"
if
(
$self
->
{
options
}
->
{
asserts
});
print
O
"
#define USE_INTEGER_DATETIMES 1
\n
"
if
(
$self
->
{
options
}
->
{
integer_datetimes
});
print
O
"
#define USE_LDAP 1
\n
"
if
(
$self
->
{
options
}
->
{
ldap
});
print
O
"
#define HAVE_LIBZ 1
\n
"
if
(
$self
->
{
options
}
->
{
zlib
});
print
O
"
#define USE_SSL 1
\n
"
if
(
$self
->
{
options
}
->
{
openssl
});
print
O
"
#define ENABLE_NLS 1
\n
"
if
(
$self
->
{
options
}
->
{
nls
});
print
O
"
#define LOCALEDIR
\"
/share/locale
\"\n
"
if
(
$self
->
{
options
}
->
{
nls
});
if
(
IsNewer
("
src
\\
backend
\\
utils
\\
fmgrtab.c
","
src
\\
include
\\
catalog
\\
pg_proc.h
"))
{
if
(
$self
->
{
options
}
->
{
xml
})
print
"
Generating fmgrtab.c and fmgroids.h...
\n
";
{
open
(
I
,"
src
\\
include
\\
catalog
\\
pg_proc.h
")
||
confess
"
Could not open pg_proc.h
";
print
O
"
#define HAVE_LIBXML2
\n
";
my
@fmgr
=
();
print
O
"
#define USE_LIBXML
\n
";
my
%
seenit
;
}
while
(
<
I
>
)
{
if
(
$self
->
{
options
}
->
{
krb5
})
next
unless
(
/^DATA/
);
{
s/^.*OID[^=]*=[^0-9]*//
;
print
O
"
#define KRB5 1
\n
";
s/\(//g
;
print
O
"
#define HAVE_KRB5_ERROR_TEXT_DATA 1
\n
";
s/[ \t]*\).*$//
;
print
O
"
#define HAVE_KRB5_TICKET_ENC_PART2 1
\n
";
my
@p
=
split
;
print
O
"
#define PG_KRB_SRVNAM
\"
postgres
\"\n
";
next
if
(
$p
[
4
]
ne
"
12
");
}
push
@fmgr
,{
close
(
O
);
close
(
I
);
}
if
(
IsNewer
("
src
\\
interfaces
\\
libpq
\\
libpqdll.def
","
src
\\
interfaces
\\
libpq
\\
exports.txt
"))
{
print
"
Generating libpqdll.def...
\n
";
open
(
I
,"
src
\\
interfaces
\\
libpq
\\
exports.txt
")
||
confess
("
Could not open exports.txt
\n
");
open
(
O
,"
>src
\\
interfaces
\\
libpq
\\
libpqdll.def
")
||
confess
("
Could not open libpqdll.def
\n
");
print
O
"
LIBRARY LIBPQ
\n
EXPORTS
\n
";
while
(
<
I
>
)
{
next
if
(
/^#/
);
my
(
$f
,
$o
)
=
split
;
print
O
"
$f
@
$o
\n
";
}
close
(
O
);
close
(
I
);
}
if
(
IsNewer
("
src
\\
backend
\\
utils
\\
fmgrtab.c
","
src
\\
include
\\
catalog
\\
pg_proc.h
"))
{
print
"
Generating fmgrtab.c and fmgroids.h...
\n
";
open
(
I
,"
src
\\
include
\\
catalog
\\
pg_proc.h
")
||
confess
"
Could not open pg_proc.h
";
my
@fmgr
=
();
my
%
seenit
;
while
(
<
I
>
)
{
next
unless
(
/^DATA/
);
s/^.*OID[^=]*=[^0-9]*//
;
s/\(//g
;
s/[ \t]*\).*$//
;
my
@p
=
split
;
next
if
(
$p
[
4
]
ne
"
12
");
push
@fmgr
,
{
oid
=>
$p
[
0
],
oid
=>
$p
[
0
],
proname
=>
$p
[
1
],
proname
=>
$p
[
1
],
prosrc
=>
$p
[
$#p
-
2
],
prosrc
=>
$p
[
$#p
-
2
],
nargs
=>
$p
[
12
],
nargs
=>
$p
[
12
],
strict
=>
$p
[
9
],
strict
=>
$p
[
9
],
retset
=>
$p
[
10
],
retset
=>
$p
[
10
],
};
};
}
}
close
(
I
);
close
(
I
);
open
(
H
,'
>
',
'
src
\
include
\
utils
\
fmgroids.h
')
||
open
(
H
,'
>
',
'
src
\
include
\
utils
\
fmgroids.h
')
confess
"
Could not open fmgroids.h
";
||
confess
"
Could not open fmgroids.h
";
print
H
"
/* fmgroids.h generated for Visual C++ */
\n
#ifndef FMGROIDS_H
\n
#define FMGROIDS_H
\n\n
";
print
H
open
(
T
,"
>src
\\
backend
\\
utils
\\
fmgrtab.c
")
||
confess
"
Could not open fmgrtab.c
";
"
/* fmgroids.h generated for Visual C++ */
\n
#ifndef FMGROIDS_H
\n
#define FMGROIDS_H
\n\n
";
print
T
"
/* fmgrtab.c generated for Visual C++ */
\n
#include
\"
postgres.h
\"\n
#include
\"
utils/fmgrtab.h
\"\n\n
";
open
(
T
,"
>src
\\
backend
\\
utils
\\
fmgrtab.c
")
||
confess
"
Could not open fmgrtab.c
";
foreach
my
$s
(
sort
{
$a
->
{
oid
}
<=>
$b
->
{
oid
}}
@fmgr
)
{
print
T
next
if
$seenit
{
$s
->
{
prosrc
}};
"
/* fmgrtab.c generated for Visual C++ */
\n
#include
\"
postgres.h
\"\n
#include
\"
utils/fmgrtab.h
\"\n\n
";
$seenit
{
$s
->
{
prosrc
}}
=
1
;
foreach
my
$s
(
sort
{
$a
->
{
oid
}
<=>
$b
->
{
oid
}}
@fmgr
)
print
H
"
#define F_
"
.
uc
$s
->
{
prosrc
}
.
"
$s
->{oid}
\n
";
{
print
T
"
extern Datum
$s
->{prosrc} (PG_FUNCTION_ARGS);
\n
";
next
if
$seenit
{
$s
->
{
prosrc
}};
}
$seenit
{
$s
->
{
prosrc
}}
=
1
;
print
H
"
\n
#endif
\n
/* FMGROIDS_H */
\n
";
print
H
"
#define F_
"
.
uc
$s
->
{
prosrc
}
.
"
$s
->{oid}
\n
";
close
(
H
);
print
T
"
extern Datum
$s
->{prosrc} (PG_FUNCTION_ARGS);
\n
";
print
T
"
const FmgrBuiltin fmgr_builtins[] = {
\n
";
}
my
%
bmap
;
print
H
"
\n
#endif
\n
/* FMGROIDS_H */
\n
";
$bmap
{'
t
'}
=
'
true
';
close
(
H
);
$bmap
{'
f
'}
=
'
false
';
print
T
"
const FmgrBuiltin fmgr_builtins[] = {
\n
";
foreach
my
$s
(
sort
{
$a
->
{
oid
}
<=>
$b
->
{
oid
}}
@fmgr
)
{
my
%
bmap
;
print
T
"
{
$s
->{oid},
\"
$s
->{prosrc}
\"
,
$s
->{nargs},
$bmap
{
$s
->{strict}},
$bmap
{
$s
->{retset}},
$s
->{prosrc} },
\n
";
$bmap
{'
t
'}
=
'
true
';
}
$bmap
{'
f
'}
=
'
false
';
foreach
my
$s
(
sort
{
$a
->
{
oid
}
<=>
$b
->
{
oid
}}
@fmgr
)
{
print
T
"
{
$s
->{oid},
\"
$s
->{prosrc}
\"
,
$s
->{nargs},
$bmap
{
$s
->{strict}},
$bmap
{
$s
->{retset}},
$s
->{prosrc} },
\n
";
}
print
T
print
T
"
{ 0, NULL, 0, false, false, NULL }
\n
};
\n\n
const int fmgr_nbuiltins = (sizeof(fmgr_builtins) / sizeof(FmgrBuiltin)) - 1;
\n
";
"
{ 0, NULL, 0, false, false, NULL }
\n
};
\n\n
const int fmgr_nbuiltins = (sizeof(fmgr_builtins) / sizeof(FmgrBuiltin)) - 1;
\n
";
close
(
T
);
close
(
T
);
}
}
if
(
IsNewer
('
src
\
interfaces
\
libpq
\
libpq.rc
','
src
\
interfaces
\
libpq
\
libpq.rc.in
'))
{
if
(
IsNewer
('
src
\
interfaces
\
libpq
\
libpq.rc
','
src
\
interfaces
\
libpq
\
libpq.rc.in
'))
print
"
Generating libpq.rc...
\n
";
{
my
(
$sec
,
$min
,
$hour
,
$mday
,
$mon
,
$year
,
$wday
,
$yday
,
$isdst
)
=
localtime
(
time
);
print
"
Generating libpq.rc...
\n
";
my
$d
=
(
$year
-
100
)
.
"
$yday
";
my
(
$sec
,
$min
,
$hour
,
$mday
,
$mon
,
$year
,
$wday
,
$yday
,
$isdst
)
=
localtime
(
time
);
open
(
I
,'
<
',
'
src
\
interfaces
\
libpq
\
libpq.rc.in
')
||
confess
"
Could not open libpq.rc.in
";
my
$d
=
(
$year
-
100
)
.
"
$yday
";
open
(
O
,'
>
',
'
src
\
interfaces
\
libpq
\
libpq.rc
')
||
confess
"
Could not open libpq.rc
";
open
(
I
,'
<
',
'
src
\
interfaces
\
libpq
\
libpq.rc.in
')
||
confess
"
Could not open libpq.rc.in
";
while
(
<
I
>
)
{
open
(
O
,'
>
',
'
src
\
interfaces
\
libpq
\
libpq.rc
')
||
confess
"
Could not open libpq.rc
";
s/(VERSION.*),0/$1,$d/
;
while
(
<
I
>
)
print
O
;
{
}
s/(VERSION.*),0/$1,$d/
;
close
(
I
);
print
O
;
close
(
O
);
}
}
close
(
I
);
close
(
O
);
}
if
(
IsNewer
('
src
\
bin
\
psql
\
sql_help.h
','
src
\
bin
\
psql
\
create_help.pl
'))
{
if
(
IsNewer
('
src
\
bin
\
psql
\
sql_help.h
','
src
\
bin
\
psql
\
create_help.pl
'))
print
"
Generating sql_help.h...
\n
";
{
chdir
('
src
\
bin
\
psql
');
print
"
Generating sql_help.h...
\n
";
system
("
perl create_help.pl ../../../doc/src/sgml/ref sql_help.h
");
chdir
('
src
\
bin
\
psql
');
chdir
('
..
\
..
\
..
');
system
("
perl create_help.pl ../../../doc/src/sgml/ref sql_help.h
");
}
chdir
('
..
\
..
\
..
');
}
if
(
IsNewer
('
src
\
interfaces
\
ecpg
\
include
\
ecpg_config.h
',
'
src
\
interfaces
\
ecpg
\
include
\
ecpg_config.h.in
'))
{
if
(
print
"
Generating ecpg_config.h...
\n
";
IsNewer
(
open
(
O
,'
>
','
src
\
interfaces
\
ecpg
\
include
\
ecpg_config.h
')
||
confess
"
Could not open ecpg_config.h
";
'
src
\
interfaces
\
ecpg
\
include
\
ecpg_config.h
',
print
O
<<EOF;
'
src
\
interfaces
\
ecpg
\
include
\
ecpg_config.h.in
'
)
)
{
print
"
Generating ecpg_config.h...
\n
";
open
(
O
,'
>
','
src
\
interfaces
\
ecpg
\
include
\
ecpg_config.h
')
||
confess
"
Could not open ecpg_config.h
";
print
O
<<EOF;
#if (_MSC_VER > 1200)
#if (_MSC_VER > 1200)
#define HAVE_LONG_LONG_INT_64
#define HAVE_LONG_LONG_INT_64
#endif
#endif
EOF
EOF
close
(
O
);
close
(
O
);
}
}
unless
(
-
f
"
src
\\
port
\\
pg_config_paths.h
")
{
unless
(
-
f
"
src
\\
port
\\
pg_config_paths.h
")
print
"
Generating pg_config_paths.h...
\n
";
{
open
(
O
,'
>
',
'
src
\
port
\
pg_config_paths.h
')
||
confess
"
Could not open pg_config_paths.h
";
print
"
Generating pg_config_paths.h...
\n
";
print
O
<<EOF;
open
(
O
,'
>
',
'
src
\
port
\
pg_config_paths.h
')
||
confess
"
Could not open pg_config_paths.h
";
print
O
<<EOF;
#define PGBINDIR "/bin"
#define PGBINDIR "/bin"
#define PGSHAREDIR "/share"
#define PGSHAREDIR "/share"
#define SYSCONFDIR "/etc"
#define SYSCONFDIR "/etc"
...
@@ -214,96 +252,112 @@ EOF
...
@@ -214,96 +252,112 @@ EOF
#define DOCDIR "/doc"
#define DOCDIR "/doc"
#define MANDIR "/man"
#define MANDIR "/man"
EOF
EOF
close
(
O
);
close
(
O
);
}
}
my
$mf
=
Project::
read_file
('
src
\
backend
\
catalog
\
Makefile
');
my
$mf
=
Project::
read_file
('
src
\
backend
\
catalog
\
Makefile
');
$mf
=~
s{\\s*[\r\n]+}{}mg
;
$mf
=~
s{\\s*[\r\n]+}{}mg
;
$mf
=~
/^POSTGRES_BKI_SRCS\s*:?=[^,]+,(.*)\)$/gm
||
croak
"
Could not find POSTGRES_BKI_SRCS in Makefile
\n
";
$mf
=~
/^POSTGRES_BKI_SRCS\s*:?=[^,]+,(.*)\)$/gm
my
@allbki
=
split
/\s+/
,
$1
;
||
croak
"
Could not find POSTGRES_BKI_SRCS in Makefile
\n
";
foreach
my
$bki
(
@allbki
)
{
my
@allbki
=
split
/\s+/
,
$1
;
next
if
$bki
eq
"";
foreach
my
$bki
(
@allbki
)
if
(
IsNewer
('
src/backend/catalog/postgres.bki
',
"
src/include/catalog/
$bki
"))
{
{
print
"
Generating postgres.bki...
\n
";
next
if
$bki
eq
"";
system
("
perl src/tools/msvc/genbki.pl
$self
->{majorver} src/backend/catalog/postgres
"
.
join
('
src/include/catalog/
',
@allbki
));
if
(
IsNewer
('
src/backend/catalog/postgres.bki
',
"
src/include/catalog/
$bki
"))
last
;
{
print
"
Generating postgres.bki...
\n
";
system
("
perl src/tools/msvc/genbki.pl
$self
->{majorver} src/backend/catalog/postgres
"
.
join
('
src/include/catalog/
',
@allbki
));
last
;
}
}
}
}
open
(
O
,
"
>doc/src/sgml/version.sgml
")
||
croak
"
Could not write to version.sgml
\n
";
open
(
O
,
"
>doc/src/sgml/version.sgml
")
||
croak
"
Could not write to version.sgml
\n
";
print
O
<<EOF;
print
O
<<EOF;
<!entity version "$self->{strver}">
<!entity version "$self->{strver}">
<!entity majorversion "$self->{majorver}">
<!entity majorversion "$self->{majorver}">
EOF
EOF
close
(
O
);
close
(
O
);
}
}
sub
AddProject
{
sub
AddProject
my
(
$self
,
$name
,
$type
,
$folder
,
$initialdir
)
=
@_
;
{
my
(
$self
,
$name
,
$type
,
$folder
,
$initialdir
)
=
@_
;
my
$proj
=
new
Project
(
$name
,
$type
,
$self
);
my
$proj
=
new
Project
(
$name
,
$type
,
$self
);
push
@
{
$self
->
{
projects
}
->
{
$folder
}},
$proj
;
push
@
{
$self
->
{
projects
}
->
{
$folder
}},
$proj
;
$proj
->
AddDir
(
$initialdir
)
if
(
$initialdir
);
$proj
->
AddDir
(
$initialdir
)
if
(
$initialdir
);
if
(
$self
->
{
options
}
->
{
zlib
})
{
if
(
$self
->
{
options
}
->
{
zlib
})
$proj
->
AddIncludeDir
(
$self
->
{
options
}
->
{
zlib
}
.
'
\
include
');
{
$proj
->
AddLibrary
(
$self
->
{
options
}
->
{
zlib
}
.
'
\
lib
\
zdll.lib
');
$proj
->
AddIncludeDir
(
$self
->
{
options
}
->
{
zlib
}
.
'
\
include
');
}
$proj
->
AddLibrary
(
$self
->
{
options
}
->
{
zlib
}
.
'
\
lib
\
zdll.lib
');
if
(
$self
->
{
options
}
->
{
openssl
})
{
}
$proj
->
AddIncludeDir
(
$self
->
{
options
}
->
{
openssl
}
.
'
\
include
');
if
(
$self
->
{
options
}
->
{
openssl
})
$proj
->
AddLibrary
(
$self
->
{
options
}
->
{
openssl
}
.
'
\
lib
\
VC
\
ssleay32.lib
',
1
);
{
$proj
->
AddLibrary
(
$self
->
{
options
}
->
{
openssl
}
.
'
\
lib
\
VC
\
libeay32.lib
',
1
);
$proj
->
AddIncludeDir
(
$self
->
{
options
}
->
{
openssl
}
.
'
\
include
');
}
$proj
->
AddLibrary
(
$self
->
{
options
}
->
{
openssl
}
.
'
\
lib
\
VC
\
ssleay32.lib
',
1
);
if
(
$self
->
{
options
}
->
{
nls
})
{
$proj
->
AddLibrary
(
$self
->
{
options
}
->
{
openssl
}
.
'
\
lib
\
VC
\
libeay32.lib
',
1
);
$proj
->
AddIncludeDir
(
$self
->
{
options
}
->
{
nls
}
.
'
\
include
');
}
$proj
->
AddLibrary
(
$self
->
{
options
}
->
{
nls
}
.
'
\
lib
\
intl.lib
');
if
(
$self
->
{
options
}
->
{
nls
})
}
{
if
(
$self
->
{
options
}
->
{
krb5
})
{
$proj
->
AddIncludeDir
(
$self
->
{
options
}
->
{
nls
}
.
'
\
include
');
$proj
->
AddIncludeDir
(
$self
->
{
options
}
->
{
krb5
}
.
'
\
inc
\
krb5
');
$proj
->
AddLibrary
(
$self
->
{
options
}
->
{
nls
}
.
'
\
lib
\
intl.lib
');
$proj
->
AddLibrary
(
$self
->
{
options
}
->
{
krb5
}
.
'
\
lib
\
i386
\
krb5_32.lib
');
}
$proj
->
AddLibrary
(
$self
->
{
options
}
->
{
krb5
}
.
'
\
lib
\
i386
\
comerr32.lib
');
if
(
$self
->
{
options
}
->
{
krb5
})
}
{
if
(
$self
->
{
options
}
->
{
xml
})
{
$proj
->
AddIncludeDir
(
$self
->
{
options
}
->
{
krb5
}
.
'
\
inc
\
krb5
');
$proj
->
AddIncludeDir
(
$self
->
{
options
}
->
{
xml
}
.
'
\
include
');
$proj
->
AddLibrary
(
$self
->
{
options
}
->
{
krb5
}
.
'
\
lib
\
i386
\
krb5_32.lib
');
$proj
->
AddIncludeDir
(
$self
->
{
options
}
->
{
iconv
}
.
'
\
include
');
$proj
->
AddLibrary
(
$self
->
{
options
}
->
{
krb5
}
.
'
\
lib
\
i386
\
comerr32.lib
');
$proj
->
AddLibrary
(
$self
->
{
options
}
->
{
xml
}
.
'
\
lib
\
libxml2.lib
');
}
}
if
(
$self
->
{
options
}
->
{
xml
})
return
$proj
;
{
$proj
->
AddIncludeDir
(
$self
->
{
options
}
->
{
xml
}
.
'
\
include
');
$proj
->
AddIncludeDir
(
$self
->
{
options
}
->
{
iconv
}
.
'
\
include
');
$proj
->
AddLibrary
(
$self
->
{
options
}
->
{
xml
}
.
'
\
lib
\
libxml2.lib
');
}
return
$proj
;
}
}
sub
Save
{
sub
Save
my
(
$self
)
=
@_
;
{
my
%
flduid
;
my
(
$self
)
=
@_
;
my
%
flduid
;
$self
->
GenerateFiles
();
$self
->
GenerateFiles
();
foreach
my
$fld
(
keys
%
{
$self
->
{
projects
}})
{
foreach
my
$fld
(
keys
%
{
$self
->
{
projects
}})
foreach
my
$proj
(
@
{
$self
->
{
projects
}
->
{
$fld
}})
{
{
$proj
->
Save
();
foreach
my
$proj
(
@
{
$self
->
{
projects
}
->
{
$fld
}})
}
{
}
$proj
->
Save
();
}
}
open
(
SLN
,"
>pgsql.sln
")
||
croak
"
Could not write to pgsql.sln
\n
";
open
(
SLN
,"
>pgsql.sln
")
||
croak
"
Could not write to pgsql.sln
\n
";
print
SLN
<<EOF;
print
SLN
<<EOF;
Microsoft Visual Studio Solution File, Format Version 9.00
Microsoft Visual Studio Solution File, Format Version 9.00
# Visual Studio 2005
# Visual Studio 2005
EOF
EOF
foreach
my
$fld
(
keys
%
{
$self
->
{
projects
}})
{
foreach
my
$fld
(
keys
%
{
$self
->
{
projects
}})
foreach
my
$proj
(
@
{
$self
->
{
projects
}
->
{
$fld
}})
{
{
print
SLN
<<EOF;
foreach
my
$proj
(
@
{
$self
->
{
projects
}
->
{
$fld
}})
{
print
SLN
<<EOF;
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "$proj->{name}", "$proj->{name}.vcproj", "$proj->{guid}"
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "$proj->{name}", "$proj->{name}.vcproj", "$proj->{guid}"
EndProject
EndProject
EOF
EOF
}
}
if
(
$fld
ne
"")
{
if
(
$fld
ne
"")
$flduid
{
$fld
}
=
Win32::
GuidGen
();
{
print
SLN
<<EOF;
$flduid
{
$fld
}
=
Win32::
GuidGen
();
print
SLN
<<EOF;
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "$fld", "$fld", "$flduid{$fld}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "$fld", "$fld", "$flduid{$fld}"
EndProject
EndProject
EOF
EOF
}
}
}
}
print
SLN
<<EOF;
print
SLN
<<EOF;
Global
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Debug|Win32 = Debug|Win32
...
@@ -312,18 +366,20 @@ Global
...
@@ -312,18 +366,20 @@ Global
GlobalSection(ProjectConfigurationPlatforms) = postSolution
GlobalSection(ProjectConfigurationPlatforms) = postSolution
EOF
EOF
foreach
my
$fld
(
keys
%
{
$self
->
{
projects
}})
{
foreach
my
$fld
(
keys
%
{
$self
->
{
projects
}})
foreach
my
$proj
(
@
{
$self
->
{
projects
}
->
{
$fld
}})
{
{
print
SLN
<<EOF;
foreach
my
$proj
(
@
{
$self
->
{
projects
}
->
{
$fld
}})
{
print
SLN
<<EOF;
$proj->{guid}.Debug|Win32.ActiveCfg = Debug|Win32
$proj->{guid}.Debug|Win32.ActiveCfg = Debug|Win32
$proj->{guid}.Debug|Win32.Build.0 = Debug|Win32
$proj->{guid}.Debug|Win32.Build.0 = Debug|Win32
$proj->{guid}.Release|Win32.ActiveCfg = Release|Win32
$proj->{guid}.Release|Win32.ActiveCfg = Release|Win32
$proj->{guid}.Release|Win32.Build.0 = Release|Win32
$proj->{guid}.Release|Win32.Build.0 = Release|Win32
EOF
EOF
}
}
}
}
print
SLN
<<EOF;
print
SLN
<<EOF;
EndGlobalSection
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
HideSolutionNode = FALSE
...
@@ -331,18 +387,20 @@ EOF
...
@@ -331,18 +387,20 @@ EOF
GlobalSection(NestedProjects) = preSolution
GlobalSection(NestedProjects) = preSolution
EOF
EOF
foreach
my
$fld
(
keys
%
{
$self
->
{
projects
}})
{
foreach
my
$fld
(
keys
%
{
$self
->
{
projects
}})
next
if
(
$fld
eq
"");
{
foreach
my
$proj
(
@
{
$self
->
{
projects
}
->
{
$fld
}})
{
next
if
(
$fld
eq
"");
print
SLN
"
\t\t
$proj
->{guid} =
$flduid
{
$fld
}
\n
";
foreach
my
$proj
(
@
{
$self
->
{
projects
}
->
{
$fld
}})
}
{
}
print
SLN
"
\t\t
$proj
->{guid} =
$flduid
{
$fld
}
\n
";
}
}
print
SLN
<<EOF;
print
SLN
<<EOF;
EndGlobalSection
EndGlobalSection
EndGlobal
EndGlobal
EOF
EOF
close
(
SLN
);
close
(
SLN
);
}
}
1
;
1
;
src/tools/msvc/config.pl
View file @
eee22892
...
@@ -3,20 +3,20 @@ use strict;
...
@@ -3,20 +3,20 @@ use strict;
use
warnings
;
use
warnings
;
our
$config
=
{
our
$config
=
{
asserts
=>
1
,
# --enable-cassert
asserts
=>
1
,
# --enable-cassert
integer_datetimes
=>
1
,
# --enable-integer-datetimes
integer_datetimes
=>
1
,
# --enable-integer-datetimes
nls
=>
undef
,
# --enable-nls=<path>
nls
=>
undef
,
# --enable-nls=<path>
tcl
=>
'
c:
\
tcl
',
# --with-tls=<path>
tcl
=>
'
c:
\
tcl
',
# --with-tls=<path>
perl
=>
'
c:
\
perl
',
# --with-perl
perl
=>
'
c:
\
perl
',
# --with-perl
python
=>
'
c:
\
python24
',
# --with-python=<path>
python
=>
'
c:
\
python24
',
# --with-python=<path>
krb5
=>
'
c:
\
prog
\
pgsql
\
depend
\
krb5
',
# --with-krb5=<path>
krb5
=>
'
c:
\
prog
\
pgsql
\
depend
\
krb5
',
# --with-krb5=<path>
ldap
=>
1
,
# --with-ldap
ldap
=>
1
,
# --with-ldap
openssl
=>
'
c:
\
openssl
',
# --with-ssl=<path>
openssl
=>
'
c:
\
openssl
',
# --with-ssl=<path>
pthread
=>
'
c:
\
prog
\
pgsql
\
depend
\
pthread
',
pthread
=>
'
c:
\
prog
\
pgsql
\
depend
\
pthread
',
xml
=>
'
c:
\
prog
\
pgsql
\
depend
\
libxml2
',
xml
=>
'
c:
\
prog
\
pgsql
\
depend
\
libxml2
',
xslt
=>
'
c:
\
prog
\
pgsql
\
depend
\
libxslt
',
xslt
=>
'
c:
\
prog
\
pgsql
\
depend
\
libxslt
',
iconv
=>
'
c:
\
prog
\
pgsql
\
depend
\
iconv
',
iconv
=>
'
c:
\
prog
\
pgsql
\
depend
\
iconv
',
zlib
=>
'
c:
\
prog
\
pgsql
\
depend
\
zlib
'
# --with-zlib=<path>
zlib
=>
'
c:
\
prog
\
pgsql
\
depend
\
zlib
'
# --with-zlib=<path>
};
};
1
;
1
;
src/tools/msvc/genbki.pl
View file @
eee22892
...
@@ -11,7 +11,7 @@
...
@@ -11,7 +11,7 @@
#
#
#
#
# IDENTIFICATION
# IDENTIFICATION
# $PostgreSQL: pgsql/src/tools/msvc/genbki.pl,v 1.
4 2007/02/19 14:05:42
mha Exp $
# $PostgreSQL: pgsql/src/tools/msvc/genbki.pl,v 1.
5 2007/03/12 19:10:50
mha Exp $
#
#
#-------------------------------------------------------------------------
#-------------------------------------------------------------------------
...
@@ -25,24 +25,28 @@ $version =~ /^(\d+\.\d+)/ || die "Bad format verison $version\n";
...
@@ -25,24 +25,28 @@ $version =~ /^(\d+\.\d+)/ || die "Bad format verison $version\n";
my
$majorversion
=
$1
;
my
$majorversion
=
$1
;
my
$pgext
=
read_file
("
src/include/pg_config_manual.h
");
my
$pgext
=
read_file
("
src/include/pg_config_manual.h
");
$pgext
=~
/^#define\s+NAMEDATALEN\s+(\d+)$/mg
||
die
"
Could not read NAMEDATALEN from pg_config_manual.h
\n
";
$pgext
=~
/^#define\s+NAMEDATALEN\s+(\d+)$/mg
||
die
"
Could not read NAMEDATALEN from pg_config_manual.h
\n
";
my
$namedatalen
=
$1
;
my
$namedatalen
=
$1
;
my
$pgauthid
=
read_file
("
src/include/catalog/pg_authid.h
");
my
$pgauthid
=
read_file
("
src/include/catalog/pg_authid.h
");
$pgauthid
=~
/^#define\s+BOOTSTRAP_SUPERUSERID\s+(\d+)$/mg
||
die
"
Could not read BOOTSTRAUP_SUPERUSERID from pg_authid.h
\n
";
$pgauthid
=~
/^#define\s+BOOTSTRAP_SUPERUSERID\s+(\d+)$/mg
||
die
"
Could not read BOOTSTRAUP_SUPERUSERID from pg_authid.h
\n
";
my
$bootstrapsuperuserid
=
$1
;
my
$bootstrapsuperuserid
=
$1
;
my
$pgnamespace
=
read_file
("
src/include/catalog/pg_namespace.h
");
my
$pgnamespace
=
read_file
("
src/include/catalog/pg_namespace.h
");
$pgnamespace
=~
/^#define\s+PG_CATALOG_NAMESPACE\s+(\d+)$/mg
||
die
"
Could not read PG_CATALOG_NAMESPACE from pg_namespace.h
\n
";
$pgnamespace
=~
/^#define\s+PG_CATALOG_NAMESPACE\s+(\d+)$/mg
||
die
"
Could not read PG_CATALOG_NAMESPACE from pg_namespace.h
\n
";
my
$pgcatalognamespace
=
$1
;
my
$pgcatalognamespace
=
$1
;
my
$indata
=
"";
my
$indata
=
"";
while
(
my
$f
=
shift
)
{
while
(
my
$f
=
shift
)
$indata
.=
read_file
(
$f
);
{
$indata
.=
"
\n
";
$indata
.=
read_file
(
$f
);
$indata
.=
"
\n
";
}
}
# Strip C comments, from perl FAQ 4.27
# Strip C comments, from perl FAQ 4.27
$indata
=~
s{/\*.*?\*/}{}gs
;
$indata
=~
s{/\*.*?\*/}{}gs
;
$indata
=~
s{;\s*$}{}gm
;
$indata
=~
s{;\s*$}{}gm
;
...
@@ -73,112 +77,143 @@ my $nc = 0;
...
@@ -73,112 +77,143 @@ my $nc = 0;
my
$inside
=
0
;
my
$inside
=
0
;
my
@attr
;
my
@attr
;
my
@types
;
my
@types
;
foreach
my
$line
(
split
/\n/
,
$indata
)
{
if
(
$line
=~
/^DATA\((.*)\)$/m
)
{
foreach
my
$line
(
split
/\n/
,
$indata
)
my
$data
=
$1
;
{
my
@fields
=
split
/\s+/
,
$data
;
if
(
$line
=~
/^DATA\((.*)\)$/m
)
if
(
$#fields
>=
4
&&
$fields
[
0
]
eq
"
insert
"
&&
$fields
[
1
]
eq
"
OID
"
&&
$fields
[
2
]
eq
"
=
")
{
{
$oid
=
$fields
[
3
];
my
$data
=
$1
;
}
my
@fields
=
split
/\s+/
,
$data
;
else
{
if
(
$#fields
>=
4
&&
$fields
[
0
]
eq
"
insert
"
&&
$fields
[
1
]
eq
"
OID
"
&&
$fields
[
2
]
eq
"
=
")
$oid
=
0
;
{
}
$oid
=
$fields
[
3
];
$data
=~
s/\s{2,}/ /g
;
}
$bki
.=
$data
.
"
\n
";
else
}
{
elsif
(
$line
=~
/^DESCR\("(.*)"\)$/m
){
$oid
=
0
;
if
(
$oid
!=
0
)
{
}
$desc
.=
sprintf
("
%d
\t
%s
\t
0
\t
%s
\n
",
$oid
,
$catalog
,
$1
);
$data
=~
s/\s{2,}/ /g
;
}
$bki
.=
$data
.
"
\n
";
}
}
elsif
(
$line
=~
/^SHDESCR\("(.*)"\)$/m
)
{
elsif
(
$line
=~
/^DESCR\("(.*)"\)$/m
)
if
(
$oid
!=
0
)
{
{
$shdesc
.=
sprintf
("
%d
\t
%s
\t
%s
\n
",
$oid
,
$catalog
,
$1
);
if
(
$oid
!=
0
)
}
{
}
$desc
.=
sprintf
("
%d
\t
%s
\t
0
\t
%s
\n
",
$oid
,
$catalog
,
$1
);
elsif
(
$line
=~
/^DECLARE_(UNIQUE_)?INDEX\((.*)\)$/m
)
{
}
if
(
$reln_open
)
{
}
$bki
.=
"
close
$catalog
\n
";
elsif
(
$line
=~
/^SHDESCR\("(.*)"\)$/m
)
$reln_open
=
0
;
{
}
if
(
$oid
!=
0
)
my
$u
=
$1
?"
unique
":"";
{
my
@fields
=
split
/,/
,
$2
,
3
;
$shdesc
.=
sprintf
("
%d
\t
%s
\t
%s
\n
",
$oid
,
$catalog
,
$1
);
$fields
[
2
]
=~
s/\s{2,}/ /g
;
}
$bki
.=
"
declare
$u
index
$fields
[0]
$fields
[1]
$fields
[2]
\n
";
}
}
elsif
(
$line
=~
/^DECLARE_(UNIQUE_)?INDEX\((.*)\)$/m
)
elsif
(
$line
=~
/^DECLARE_TOAST\((.*)\)$/m
)
{
{
if
(
$reln_open
)
{
if
(
$reln_open
)
$bki
.=
"
close
$catalog
\n
";
{
$reln_open
=
0
;
$bki
.=
"
close
$catalog
\n
";
}
$reln_open
=
0
;
my
@fields
=
split
/,/
,
$1
;
}
my
$u
=
$1
?"
unique
":"";
my
@fields
=
split
/,/
,
$2
,
3
;
$fields
[
2
]
=~
s/\s{2,}/ /g
;
$bki
.=
"
declare
$u
index
$fields
[0]
$fields
[1]
$fields
[2]
\n
";
}
elsif
(
$line
=~
/^DECLARE_TOAST\((.*)\)$/m
)
{
if
(
$reln_open
)
{
$bki
.=
"
close
$catalog
\n
";
$reln_open
=
0
;
}
my
@fields
=
split
/,/
,
$1
;
$bki
.=
"
declare toast
$fields
[1]
$fields
[2] on
$fields
[0]
\n
";
$bki
.=
"
declare toast
$fields
[1]
$fields
[2] on
$fields
[0]
\n
";
}
}
elsif
(
$line
=~
/^BUILD_INDICES/
)
{
elsif
(
$line
=~
/^BUILD_INDICES/
)
$bki
.=
"
build indices
\n
";
{
}
$bki
.=
"
build indices
\n
";
elsif
(
$line
=~
/^CATALOG\((.*)\)(.*)$/m
)
{
}
if
(
$reln_open
)
{
elsif
(
$line
=~
/^CATALOG\((.*)\)(.*)$/m
)
$bki
.=
"
close
$catalog
\n
";
{
$reln_open
=
0
;
if
(
$reln_open
)
}
{
my
$rest
=
$2
;
$bki
.=
"
close
$catalog
\n
";
my
@fields
=
split
/,/
,
$1
;
$reln_open
=
0
;
$catalog
=
$fields
[
0
];
}
$oid
=
$fields
[
1
];
my
$rest
=
$2
;
$bootstrap
=
$shared_relation
=
$without_oids
=
"";
my
@fields
=
split
/,/
,
$1
;
if
(
$rest
=~
/BKI_BOOTSTRAP/
)
{
$catalog
=
$fields
[
0
];
$bootstrap
=
"
bootstrap
";
$oid
=
$fields
[
1
];
}
$bootstrap
=
$shared_relation
=
$without_oids
=
"";
if
(
$rest
=~
/BKI_SHARED_RELATION/
)
{
if
(
$rest
=~
/BKI_BOOTSTRAP/
)
$shared_relation
=
"
shared_relation
";
{
}
$bootstrap
=
"
bootstrap
";
if
(
$rest
=~
/BKI_WITHOUT_OIDS/
)
{
}
$without_oids
=
"
without_oids
";
if
(
$rest
=~
/BKI_SHARED_RELATION/
)
}
{
$nc
++
;
$shared_relation
=
"
shared_relation
";
$inside
=
1
;
}
next
;
if
(
$rest
=~
/BKI_WITHOUT_OIDS/
)
}
{
if
(
$inside
==
1
)
{
$without_oids
=
"
without_oids
";
next
if
(
$line
=~
/{/
);
}
if
(
$line
=~
/}/
)
{
$nc
++
;
# Last line
$inside
=
1
;
$bki
.=
"
create
$bootstrap$shared_relation$without_oids$catalog
$oid
\n
(
\n
";
next
;
my
$first
=
1
;
}
for
(
my
$i
=
0
;
$i
<=
$#attr
;
$i
++
)
{
if
(
$inside
==
1
)
if
(
$first
==
1
)
{
{
$first
=
0
;
next
if
(
$line
=~
/{/
);
}
else
{
if
(
$line
=~
/}/
)
$bki
.=
"
,
\n
";
{
}
$bki
.=
"
"
.
$attr
[
$i
]
.
"
=
"
.
$types
[
$i
];
# Last line
}
$bki
.=
"
create
$bootstrap$shared_relation$without_oids$catalog
$oid
\n
(
\n
";
$bki
.=
"
\n
)
\n
";
my
$first
=
1
;
undef
(
@attr
);
for
(
my
$i
=
0
;
$i
<=
$#attr
;
$i
++
)
undef
(
@types
);
{
$reln_open
=
1
;
if
(
$first
==
1
)
$inside
=
0
;
{
if
(
$bootstrap
eq
"")
{
$first
=
0
;
$bki
.=
"
open
$catalog
\n
";
}
}
else
next
;
{
}
$bki
.=
"
,
\n
";
# inside catalog definition, so keep sucking up attributes
}
my
@fields
=
split
/\s+/
,
$line
;
$bki
.=
"
"
.
$attr
[
$i
]
.
"
=
"
.
$types
[
$i
];
if
(
$fields
[
1
]
=~
/(.*)\[.*\]/
)
{
#Array attribute
}
push
@attr
,
$1
;
$bki
.=
"
\n
)
\n
";
push
@types
,
$fields
[
0
]
.
'
[]
';
undef
(
@attr
);
}
undef
(
@types
);
else
{
$reln_open
=
1
;
push
@attr
,
$fields
[
1
];
$inside
=
0
;
push
@types
,
$fields
[
0
];
if
(
$bootstrap
eq
"")
}
{
next
;
$bki
.=
"
open
$catalog
\n
";
}
}
next
;
}
# inside catalog definition, so keep sucking up attributes
my
@fields
=
split
/\s+/
,
$line
;
if
(
$fields
[
1
]
=~
/(.*)\[.*\]/
)
{
#Array attribute
push
@attr
,
$1
;
push
@types
,
$fields
[
0
]
.
'
[]
';
}
else
{
push
@attr
,
$fields
[
1
];
push
@types
,
$fields
[
0
];
}
next
;
}
}
}
if
(
$reln_open
==
1
)
{
if
(
$reln_open
==
1
)
$bki
.=
"
close
$catalog
\n
";
{
$bki
.=
"
close
$catalog
\n
";
}
}
open
(
O
,"
>
$prefix
.bki
")
||
die
"
Could not write
$prefix
.bki
\n
";
open
(
O
,"
>
$prefix
.bki
")
||
die
"
Could not write
$prefix
.bki
\n
";
...
@@ -192,22 +227,24 @@ open(O,">$prefix.shdescription") || die "Could not write $prefix.shdescription\n
...
@@ -192,22 +227,24 @@ open(O,">$prefix.shdescription") || die "Could not write $prefix.shdescription\n
print
O
$shdesc
;
print
O
$shdesc
;
close
(
O
);
close
(
O
);
sub
Usage
{
sub
Usage
print
"
Usage: genbki.pl <version> <prefix> <input1> [<input2> <input3>...]
\n
";
{
exit
(
1
);
print
"
Usage: genbki.pl <version> <prefix> <input1> [<input2> <input3>...]
\n
";
exit
(
1
);
}
}
sub
read_file
{
sub
read_file
my
$filename
=
shift
;
{
my
$F
;
my
$filename
=
shift
;
my
$t
=
$/
;
my
$F
;
my
$t
=
$/
;
undef
$/
;
open
(
$F
,
$filename
)
||
die
"
Could not open file
$filename
\n
";
undef
$/
;
my
$txt
=
<
$F
>
;
open
(
$F
,
$filename
)
||
die
"
Could not open file
$filename
\n
";
close
(
$F
);
my
$txt
=
<
$F
>
;
$/
=
$t
;
close
(
$F
);
$/
=
$t
;
return
$txt
;
return
$txt
;
}
}
src/tools/msvc/gendef.pl
View file @
eee22892
...
@@ -3,36 +3,39 @@ my @def;
...
@@ -3,36 +3,39 @@ my @def;
die
"
Usage: gendef.pl <modulepath>
\n
"
unless
(
$ARGV
[
0
]
=~
/\\([^\\]+$)/
);
die
"
Usage: gendef.pl <modulepath>
\n
"
unless
(
$ARGV
[
0
]
=~
/\\([^\\]+$)/
);
my
$defname
=
uc
$1
;
my
$defname
=
uc
$1
;
if
(
-
f
"
$ARGV
[0]/
$defname
.def
")
{
if
(
-
f
"
$ARGV
[0]/
$defname
.def
")
print
"
Not re-generating
$defname
.DEF, file already exists.
\n
";
{
exit
(
0
);
print
"
Not re-generating
$defname
.DEF, file already exists.
\n
";
exit
(
0
);
}
}
print
"
Generating
$defname
.DEF from directory
$ARGV
[0]
\n
";
print
"
Generating
$defname
.DEF from directory
$ARGV
[0]
\n
";
while
(
<
$ARGV
[
0
]
/*.
obj
>
)
{
while
(
<
$ARGV
[
0
]
/*.
obj
>
)
{
print
"
.
";
print
"
.
";
system
("
dumpbin /symbols /out:symbols.out
$_
>NUL
")
&&
die
"
Could not call dumpbin
";
system
("
dumpbin /symbols /out:symbols.out
$_
>NUL
")
&&
die
"
Could not call dumpbin
";
open
(
F
,
"
<symbols.out
")
||
die
"
Could not open symbols.out for
$_
\n
";
open
(
F
,
"
<symbols.out
")
||
die
"
Could not open symbols.out for
$_
\n
";
while
(
<
F
>
)
{
while
(
<
F
>
)
s/\(\)//g
;
{
next
unless
/^\d/
;
s/\(\)//g
;
my
@pieces
=
split
;
next
unless
/^\d/
;
next
unless
$pieces
[
6
];
my
@pieces
=
split
;
next
if
(
$pieces
[
2
]
eq
"
UNDEF
");
next
unless
$pieces
[
6
];
next
unless
(
$pieces
[
4
]
eq
"
External
");
next
if
(
$pieces
[
2
]
eq
"
UNDEF
");
next
if
$pieces
[
6
]
=~
/^@/
;
next
unless
(
$pieces
[
4
]
eq
"
External
");
next
if
$pieces
[
6
]
=~
/^\(/
;
next
if
$pieces
[
6
]
=~
/^@/
;
next
if
$pieces
[
6
]
=~
/^__real/
;
next
if
$pieces
[
6
]
=~
/^\(/
;
next
if
$pieces
[
6
]
=~
/^__imp/
;
next
if
$pieces
[
6
]
=~
/^__real/
;
next
if
$pieces
[
6
]
=~
/NULL_THUNK_DATA$/
;
next
if
$pieces
[
6
]
=~
/^__imp/
;
next
if
$pieces
[
6
]
=~
/^__IMPORT_DESCRIPTOR/
;
next
if
$pieces
[
6
]
=~
/NULL_THUNK_DATA$/
;
next
if
$pieces
[
6
]
=~
/^__NULL_IMPORT/
;
next
if
$pieces
[
6
]
=~
/^__IMPORT_DESCRIPTOR/
;
next
if
$pieces
[
6
]
=~
/^__NULL_IMPORT/
;
push
@def
,
$pieces
[
6
];
push
@def
,
$pieces
[
6
];
}
}
close
(
F
);
close
(
F
);
unlink
("
symbols.out
");
unlink
("
symbols.out
");
}
}
print
"
\n
";
print
"
\n
";
...
@@ -40,13 +43,15 @@ open(DEF,">$ARGV[0]/$defname.def") || die "Could not write to $defname\n";
...
@@ -40,13 +43,15 @@ open(DEF,">$ARGV[0]/$defname.def") || die "Could not write to $defname\n";
print
DEF
"
EXPORTS
\n
";
print
DEF
"
EXPORTS
\n
";
my
$i
=
0
;
my
$i
=
0
;
my
$last
=
"";
my
$last
=
"";
foreach
my
$f
(
sort
@def
)
{
foreach
my
$f
(
sort
@def
)
next
if
(
$f
eq
$last
);
{
$last
=
$f
;
next
if
(
$f
eq
$last
);
$f
=~
s/^_//
;
$last
=
$f
;
$i
++
;
$f
=~
s/^_//
;
# print DEF " $f \@ $i\n"; # ordinaled exports?
$i
++
;
print
DEF
"
$f
\n
";
# print DEF " $f \@ $i\n"; # ordinaled exports?
print
DEF
"
$f
\n
";
}
}
close
(
DEF
);
close
(
DEF
);
print
"
Generated
$i
symbols
\n
";
print
"
Generated
$i
symbols
\n
";
src/tools/msvc/install.pl
View file @
eee22892
...
@@ -10,159 +10,193 @@ my $target = shift || Usage();
...
@@ -10,159 +10,193 @@ my $target = shift || Usage();
chdir
("
../../..
")
if
(
-
f
"
../../../configure
");
chdir
("
../../..
")
if
(
-
f
"
../../../configure
");
my
$conf
=
"";
my
$conf
=
"";
if
(
-
d
"
debug
")
{
if
(
-
d
"
debug
")
$conf
=
"
debug
";
{
$conf
=
"
debug
";
}
}
if
(
-
d
"
release
")
{
if
(
-
d
"
release
")
$conf
=
"
release
";
{
$conf
=
"
release
";
}
}
die
"
Could not find debug or release binaries
"
if
(
$conf
eq
"");
die
"
Could not find debug or release binaries
"
if
(
$conf
eq
"");
print
"
Installing for
$conf
\n
";
print
"
Installing for
$conf
\n
";
EnsureDirectories
('
bin
','
lib
','
share
','
share/timezonesets
');
EnsureDirectories
('
bin
','
lib
','
share
','
share/timezonesets
');
CopySolutionOutput
(
$conf
,
$target
);
CopySolutionOutput
(
$conf
,
$target
);
copy
(
$target
.
'
/lib/libpq.dll
',
$target
.
'
/bin/libpq.dll
');
copy
(
$target
.
'
/lib/libpq.dll
',
$target
.
'
/bin/libpq.dll
');
CopySetOfFiles
('
config files
',
"
*.sample
",
$target
.
'
/share/
');
CopySetOfFiles
('
config files
',
"
*.sample
",
$target
.
'
/share/
');
CopySetOfFiles
('
timezone names
',
'
src
\
timezone
\
tznames
\
*.txt
',
$target
.
'
/share/timezonesets/
');
CopySetOfFiles
('
timezone names
',
'
src
\
timezone
\
tznames
\
*.txt
',
$target
.
'
/share/timezonesets/
');
CopyFiles
('
timezone sets
',
$target
.
'
/share/timezonesets/
',
'
src/timezone/tznames/
',
'
Default
','
Australia
','
India
');
CopyFiles
(
'
timezone sets
',
$target
.
'
/share/timezonesets/
',
'
src/timezone/tznames/
',
'
Default
','
Australia
','
India
'
);
CopySetOfFiles
('
BKI files
',
"
src
\\
backend
\\
catalog
\\
postgres.*
",
$target
.
'
/share/
');
CopySetOfFiles
('
BKI files
',
"
src
\\
backend
\\
catalog
\\
postgres.*
",
$target
.
'
/share/
');
CopySetOfFiles
('
SQL files
',
"
src
\\
backend
\\
catalog
\\
*.sql
",
$target
.
'
/share/
');
CopySetOfFiles
('
SQL files
',
"
src
\\
backend
\\
catalog
\\
*.sql
",
$target
.
'
/share/
');
CopyFiles
('
Information schema data
',
$target
.
'
/share/
',
'
src/backend/catalog/
',
'
sql_features.txt
');
CopyFiles
(
'
Information schema data
',
$target
.
'
/share/
',
'
src/backend/catalog/
',
'
sql_features.txt
'
);
GenerateConversionScript
();
GenerateConversionScript
();
GenerateTimezoneFiles
();
GenerateTimezoneFiles
();
sub
Usage
{
sub
Usage
print
"
Usage: install.pl <targetdir>
\n
";
{
exit
(
1
);
print
"
Usage: install.pl <targetdir>
\n
";
exit
(
1
);
}
}
sub
EnsureDirectories
{
sub
EnsureDirectories
mkdir
$target
unless
-
d
(
$target
);
{
while
(
my
$d
=
shift
)
{
mkdir
$target
unless
-
d
(
$target
);
mkdir
$target
.
'
/
'
.
$d
unless
-
d
(
$target
.
'
/
'
.
$d
);
while
(
my
$d
=
shift
)
}
{
mkdir
$target
.
'
/
'
.
$d
unless
-
d
(
$target
.
'
/
'
.
$d
);
}
}
}
sub
CopyFiles
{
sub
CopyFiles
my
$what
=
shift
;
{
my
$target
=
shift
;
my
$what
=
shift
;
my
$basedir
=
shift
;
my
$target
=
shift
;
my
$basedir
=
shift
;
print
"
Copying
$what
";
while
(
my
$f
=
shift
)
{
print
"
Copying
$what
";
print
"
.
";
while
(
my
$f
=
shift
)
$f
=
$basedir
.
$f
;
{
die
"
No file
$f
\n
"
if
(
!
-
f
$f
);
print
"
.
";
copy
(
$f
,
$target
.
basename
(
$f
))
||
croak
"
Could not copy
$f
to
$target
"
.
basename
(
$f
)
.
"
to
$target
"
.
basename
(
$f
)
.
"
\n
";
$f
=
$basedir
.
$f
;
}
die
"
No file
$f
\n
"
if
(
!-
f
$f
);
print
"
\n
";
copy
(
$f
,
$target
.
basename
(
$f
))
||
croak
"
Could not copy
$f
to
$target
"
.
basename
(
$f
)
.
"
to
$target
"
.
basename
(
$f
)
.
"
\n
";
}
print
"
\n
";
}
}
sub
CopySetOfFiles
{
sub
CopySetOfFiles
my
$what
=
shift
;
{
my
$spec
=
shift
;
my
$what
=
shift
;
my
$target
=
shift
;
my
$spec
=
shift
;
my
$D
;
my
$target
=
shift
;
my
$D
;
print
"
Copying
$what
";
open
(
$D
,
"
dir /b /s
$spec
|
")
||
croak
"
Could not list
$spec
\n
";
print
"
Copying
$what
";
while
(
<
$D
>
)
{
open
(
$D
,
"
dir /b /s
$spec
|
")
||
croak
"
Could not list
$spec
\n
";
chomp
;
while
(
<
$D
>
)
next
if
/regress/
;
# Skip temporary install in regression subdir
{
my
$tgt
=
$target
.
basename
(
$_
);
chomp
;
print
"
.
";
next
if
/regress/
;
# Skip temporary install in regression subdir
copy
(
$_
,
$tgt
)
||
croak
"
Could not copy
$_
: $!
\n
";
my
$tgt
=
$target
.
basename
(
$_
);
}
print
"
.
";
close
(
$D
);
copy
(
$_
,
$tgt
)
||
croak
"
Could not copy
$_
: $!
\n
";
print
"
\n
";
}
close
(
$D
);
print
"
\n
";
}
}
sub
CopySolutionOutput
{
sub
CopySolutionOutput
my
$conf
=
shift
;
{
my
$target
=
shift
;
my
$conf
=
shift
;
my
$rem
=
qr{Project\("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}"\) = "([^"]+)"}
;
my
$target
=
shift
;
my
$rem
=
qr{Project\("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}"\) = "([^"]+)"}
;
my
$sln
=
read_file
("
pgsql.sln
")
||
croak
"
Could not open pgsql.sln
\n
";
print
"
Copying build output files...
";
my
$sln
=
read_file
("
pgsql.sln
")
||
croak
"
Could not open pgsql.sln
\n
";
while
(
$sln
=~
$rem
)
{
print
"
Copying build output files...
";
my
$pf
=
$1
;
while
(
$sln
=~
$rem
)
my
$dir
;
{
my
$ext
;
my
$pf
=
$1
;
my
$dir
;
$sln
=~
s/$rem//
;
my
$ext
;
my
$proj
=
read_file
("
$pf
.vcproj
")
||
croak
"
Could not open
$pf
.vcproj
\n
";
$sln
=~
s/$rem//
;
if
(
$proj
!~
qr{ConfigurationType="([^"]+)"}
)
{
croak
"
Could not parse
$pf
.vcproj
\n
";
my
$proj
=
read_file
("
$pf
.vcproj
")
||
croak
"
Could not open
$pf
.vcproj
\n
";
}
if
(
$proj
!~
qr{ConfigurationType="([^"]+)"}
)
if
(
$1
==
1
)
{
{
$dir
=
"
bin
";
croak
"
Could not parse
$pf
.vcproj
\n
";
$ext
=
"
exe
";
}
}
if
(
$1
==
1
)
elsif
(
$1
==
2
)
{
{
$dir
=
"
lib
";
$dir
=
"
bin
";
$ext
=
"
dll
";
$ext
=
"
exe
";
}
}
else
{
elsif
(
$1
==
2
)
# Static lib, such as libpgport, only used internally during build, don't install
{
next
;
$dir
=
"
lib
";
}
$ext
=
"
dll
";
copy
("
$conf
\\
$pf
\\
$pf
.
$ext
","
$target
\\
$dir
\\
$pf
.
$ext
")
||
croak
"
Could not copy
$pf
.
$ext
\n
";
}
print
"
.
";
else
}
{
print
"
\n
";
# Static lib, such as libpgport, only used internally during build, don't install
next
;
}
copy
("
$conf
\\
$pf
\\
$pf
.
$ext
","
$target
\\
$dir
\\
$pf
.
$ext
")
||
croak
"
Could not copy
$pf
.
$ext
\n
";
print
"
.
";
}
print
"
\n
";
}
}
sub
GenerateConversionScript
{
sub
GenerateConversionScript
my
$sql
=
"";
{
my
$F
;
my
$sql
=
"";
my
$F
;
print
"
Generating conversion proc script...
";
my
$mf
=
read_file
('
src/backend/utils/mb/conversion_procs/Makefile
');
print
"
Generating conversion proc script...
";
$mf
=~
s{\\\s*[\r\n]+}{}mg
;
my
$mf
=
read_file
('
src/backend/utils/mb/conversion_procs/Makefile
');
$mf
=~
/^CONVERSIONS\s*=\s*(.*)$/m
||
die
"
Could not find CONVERSIONS line in conversions Makefile
\n
";
$mf
=~
s{\\\s*[\r\n]+}{}mg
;
my
@pieces
=
split
/\s+/
,
$1
;
$mf
=~
/^CONVERSIONS\s*=\s*(.*)$/m
while
(
$#pieces
>
0
)
{
||
die
"
Could not find CONVERSIONS line in conversions Makefile
\n
";
my
$name
=
shift
@pieces
;
my
@pieces
=
split
/\s+/
,
$1
;
my
$se
=
shift
@pieces
;
while
(
$#pieces
>
0
)
my
$de
=
shift
@pieces
;
{
my
$func
=
shift
@pieces
;
my
$name
=
shift
@pieces
;
my
$obj
=
shift
@pieces
;
my
$se
=
shift
@pieces
;
$sql
.=
"
--
$se
-->
$de
\n
";
my
$de
=
shift
@pieces
;
$sql
.=
"
CREATE OR REPLACE FUNCTION
$func
(INTEGER, INTEGER, CSTRING, INTERNAL, INTEGER) RETURNS VOID AS '
\
$libdir
/
$obj
', '
$func
' LANGUAGE C STRICT;
\n
";
my
$func
=
shift
@pieces
;
$sql
.=
"
DROP CONVERSION pg_catalog.
$name
;
\n
";
my
$obj
=
shift
@pieces
;
$sql
.=
"
CREATE DEFAULT CONVERSION pg_catalog.
$name
FOR '
$se
' TO '
$de
' FROM
$func
;
\n
";
$sql
.=
"
--
$se
-->
$de
\n
";
}
$sql
.=
open
(
$F
,"
>
$target
/share/conversion_create.sql
")
||
die
"
Could not write to conversion_create.sql
\n
";
"
CREATE OR REPLACE FUNCTION
$func
(INTEGER, INTEGER, CSTRING, INTERNAL, INTEGER) RETURNS VOID AS '
\
$libdir
/
$obj
', '
$func
' LANGUAGE C STRICT;
\n
";
print
$F
$sql
;
$sql
.=
"
DROP CONVERSION pg_catalog.
$name
;
\n
";
close
(
$F
);
$sql
.=
"
CREATE DEFAULT CONVERSION pg_catalog.
$name
FOR '
$se
' TO '
$de
' FROM
$func
;
\n
";
print
"
\n
";
}
open
(
$F
,"
>
$target
/share/conversion_create.sql
")
||
die
"
Could not write to conversion_create.sql
\n
";
print
$F
$sql
;
close
(
$F
);
print
"
\n
";
}
}
sub
GenerateTimezoneFiles
{
sub
GenerateTimezoneFiles
my
$mf
=
read_file
("
src/timezone/Makefile
");
{
$mf
=~
s{\\\s*[\r\n]+}{}mg
;
my
$mf
=
read_file
("
src/timezone/Makefile
");
$mf
=~
/^TZDATA\s*:?=\s*(.*)$/m
||
die
"
Could not find TZDATA row in timezone makefile
\n
";
$mf
=~
s{\\\s*[\r\n]+}{}mg
;
my
@tzfiles
=
split
/\s+/
,
$1
;
$mf
=~
/^TZDATA\s*:?=\s*(.*)$/m
||
die
"
Could not find TZDATA row in timezone makefile
\n
";
unshift
@tzfiles
,'';
my
@tzfiles
=
split
/\s+/
,
$1
;
print
"
Generating timezone files...
";
unshift
@tzfiles
,'';
system
("
$conf
\\
zic
\\
zic -d
$target
/share/timezone
"
.
join
("
src/timezone/data/
",
@tzfiles
));
print
"
Generating timezone files...
";
print
"
\n
";
system
("
$conf
\\
zic
\\
zic -d
$target
/share/timezone
"
.
join
("
src/timezone/data/
",
@tzfiles
));
print
"
\n
";
}
}
sub
read_file
{
my
$filename
=
shift
;
my
$F
;
my
$t
=
$/
;
sub
read_file
{
undef
$/
;
my
$filename
=
shift
;
open
(
$F
,
$filename
)
||
die
"
Could not open file
$filename
\n
";
my
$F
;
my
$txt
=
<
$F
>
;
my
$t
=
$/
;
close
(
$F
);
$/
=
$t
;
undef
$/
;
return
$txt
;
open
(
$F
,
$filename
)
||
die
"
Could not open file
$filename
\n
";
my
$txt
=
<
$F
>
;
close
(
$F
);
$/
=
$t
;
return
$txt
;
}
}
src/tools/msvc/mkvcbuild.pl
View file @
eee22892
...
@@ -15,11 +15,11 @@ require 'src/tools/msvc/config.pl';
...
@@ -15,11 +15,11 @@ require 'src/tools/msvc/config.pl';
my
$solution
=
new
Solution
(
$config
);
my
$solution
=
new
Solution
(
$config
);
our
@pgportfiles
=
qw(
our
@pgportfiles
=
qw(
crypt.c fseeko.c getrusage.c inet_aton.c random.c srandom.c
crypt.c fseeko.c getrusage.c inet_aton.c random.c srandom.c
unsetenv.c getaddrinfo.c gettimeofday.c kill.c open.c rand.c
unsetenv.c getaddrinfo.c gettimeofday.c kill.c open.c rand.c
snprintf.c strlcat.c strlcpy.c copydir.c dirmod.c exec.c noblock.c path.c pipe.c
snprintf.c strlcat.c strlcpy.c copydir.c dirmod.c exec.c noblock.c path.c pipe.c
pgsleep.c pgstrcasecmp.c qsort.c qsort_arg.c sprompt.c thread.c
pgsleep.c pgstrcasecmp.c qsort.c qsort_arg.c sprompt.c thread.c
getopt.c getopt_long.c dirent.c rint.c win32error.c)
;
getopt.c getopt_long.c dirent.c rint.c win32error.c)
;
my
$libpgport
=
$solution
->
AddProject
('
libpgport
','
lib
','
misc
');
my
$libpgport
=
$solution
->
AddProject
('
libpgport
','
lib
','
misc
');
$libpgport
->
AddDefine
('
FRONTEND
');
$libpgport
->
AddDefine
('
FRONTEND
');
...
@@ -46,35 +46,46 @@ my $plpgsql = $solution->AddProject('plpgsql','dll','PLs','src\pl\plpgsql\src');
...
@@ -46,35 +46,46 @@ my $plpgsql = $solution->AddProject('plpgsql','dll','PLs','src\pl\plpgsql\src');
$plpgsql
->
AddFiles
('
src
\
pl
\
plpgsql
\
src
','
scan.l
','
gram.y
');
$plpgsql
->
AddFiles
('
src
\
pl
\
plpgsql
\
src
','
scan.l
','
gram.y
');
$plpgsql
->
AddReference
(
$postgres
);
$plpgsql
->
AddReference
(
$postgres
);
if
(
$solution
->
{
options
}
->
{
perl
})
{
if
(
$solution
->
{
options
}
->
{
perl
})
my
$plperl
=
$solution
->
AddProject
('
plperl
','
dll
','
PLs
','
src
\
pl
\
plperl
');
{
$plperl
->
AddIncludeDir
(
$solution
->
{
options
}
->
{
perl
}
.
'
/lib/CORE
');
my
$plperl
=
$solution
->
AddProject
('
plperl
','
dll
','
PLs
','
src
\
pl
\
plperl
');
$plperl
->
AddDefine
('
PLPERL_HAVE_UID_GID
');
$plperl
->
AddIncludeDir
(
$solution
->
{
options
}
->
{
perl
}
.
'
/lib/CORE
');
if
(
Solution::
IsNewer
('
src
\
pl
\
plperl
\
SPI.c
','
src
\
pl
\
plperl
\
SPI.xs
'))
{
$plperl
->
AddDefine
('
PLPERL_HAVE_UID_GID
');
print
'
Building src
\
pl
\
plperl
\
SPI.c...
'
.
"
\n
";
if
(
Solution::
IsNewer
('
src
\
pl
\
plperl
\
SPI.c
','
src
\
pl
\
plperl
\
SPI.xs
'))
system
(
$solution
->
{
options
}
->
{
perl
}
.
'
/bin/perl
'
.
$solution
->
{
options
}
->
{
perl
}
.
'
/lib/ExtUtils/xsubpp -typemap
'
.
$solution
->
{
options
}
->
{
perl
}
.
'
/lib/ExtUtils/typemap src
\
pl
\
plperl
\
SPI.xs >src
\
pl
\
plperl
\
SPI.c
');
{
if
((
!
(
-
f
'
src
\
pl
\
plperl
\
SPI.c
'))
||
-
z
'
src
\
pl
\
plperl
\
SPI.c
')
{
print
'
Building src
\
pl
\
plperl
\
SPI.c...
'
.
"
\n
";
unlink
('
src
\
pl
\
plperl
\
SPI.c
');
# if zero size
system
(
$solution
->
{
options
}
->
{
perl
}
die
'
Failed to create SPI.c
'
.
"
\n
";
.
'
/bin/perl
'
}
.
$solution
->
{
options
}
->
{
perl
}
}
.
'
/lib/ExtUtils/xsubpp -typemap
'
$plperl
->
AddReference
(
$postgres
);
.
$solution
->
{
options
}
->
{
perl
}
$plperl
->
AddLibrary
(
$solution
->
{
options
}
->
{
perl
}
.
'
\
lib
\
CORE
\
perl58.lib
');
.
'
/lib/ExtUtils/typemap src
\
pl
\
plperl
\
SPI.xs >src
\
pl
\
plperl
\
SPI.c
');
if
((
!
(
-
f
'
src
\
pl
\
plperl
\
SPI.c
'))
||
-
z
'
src
\
pl
\
plperl
\
SPI.c
')
{
unlink
('
src
\
pl
\
plperl
\
SPI.c
');
# if zero size
die
'
Failed to create SPI.c
'
.
"
\n
";
}
}
$plperl
->
AddReference
(
$postgres
);
$plperl
->
AddLibrary
(
$solution
->
{
options
}
->
{
perl
}
.
'
\
lib
\
CORE
\
perl58.lib
');
}
}
if
(
$solution
->
{
options
}
->
{
python
})
{
if
(
$solution
->
{
options
}
->
{
python
})
my
$plpython
=
$solution
->
AddProject
('
plpython
','
dll
','
PLs
','
src
\
pl
\
plpython
');
{
$plpython
->
AddIncludeDir
(
$solution
->
{
options
}
->
{
python
}
.
'
\
include
');
my
$plpython
=
$solution
->
AddProject
('
plpython
','
dll
','
PLs
','
src
\
pl
\
plpython
');
$solution
->
{
options
}
->
{
python
}
=~
/\\Python(\d{2})/i
||
croak
"
Could not determine python version from path
";
$plpython
->
AddIncludeDir
(
$solution
->
{
options
}
->
{
python
}
.
'
\
include
');
$plpython
->
AddLibrary
(
$solution
->
{
options
}
->
{
python
}
.
"
\\
Libs
\\
python$1.lib
");
$solution
->
{
options
}
->
{
python
}
=~
/\\Python(\d{2})/i
$plpython
->
AddReference
(
$postgres
);
||
croak
"
Could not determine python version from path
";
$plpython
->
AddLibrary
(
$solution
->
{
options
}
->
{
python
}
.
"
\\
Libs
\\
python$1.lib
");
$plpython
->
AddReference
(
$postgres
);
}
}
if
(
$solution
->
{
options
}
->
{
tcl
})
{
if
(
$solution
->
{
options
}
->
{
tcl
})
my
$pltcl
=
$solution
->
AddProject
('
pltcl
','
dll
','
PLs
','
src
\
pl
\
tcl
');
{
$pltcl
->
AddIncludeDir
(
$solution
->
{
options
}
->
{
tcl
}
.
'
\
include
');
my
$pltcl
=
$solution
->
AddProject
('
pltcl
','
dll
','
PLs
','
src
\
pl
\
tcl
');
$pltcl
->
AddReference
(
$postgres
);
$pltcl
->
AddIncludeDir
(
$solution
->
{
options
}
->
{
tcl
}
.
'
\
include
');
$pltcl
->
AddLibrary
(
$solution
->
{
options
}
->
{
tcl
}
.
'
\
lib
\
tcl84.lib
');
$pltcl
->
AddReference
(
$postgres
);
$pltcl
->
AddLibrary
(
$solution
->
{
options
}
->
{
tcl
}
.
'
\
lib
\
tcl84.lib
');
}
}
my
$libpq
=
$solution
->
AddProject
('
libpq
','
dll
','
interfaces
','
src
\
interfaces
\
libpq
');
my
$libpq
=
$solution
->
AddProject
('
libpq
','
dll
','
interfaces
','
src
\
interfaces
\
libpq
');
...
@@ -85,39 +96,42 @@ $libpq->AddLibrary('wldap32.lib') if ($solution->{options}->{ldap});
...
@@ -85,39 +96,42 @@ $libpq->AddLibrary('wldap32.lib') if ($solution->{options}->{ldap});
$libpq
->
UseDef
('
src
\
interfaces
\
libpq
\
libpqdll.def
');
$libpq
->
UseDef
('
src
\
interfaces
\
libpq
\
libpqdll.def
');
$libpq
->
ReplaceFile
('
src
\
interfaces
\
libpq
\
libpqrc.c
','
src
\
interfaces
\
libpq
\
libpq.rc
');
$libpq
->
ReplaceFile
('
src
\
interfaces
\
libpq
\
libpqrc.c
','
src
\
interfaces
\
libpq
\
libpq.rc
');
my
$pgtypes
=
$solution
->
AddProject
('
libpgtypes
','
dll
','
interfaces
','
src
\
interfaces
\
ecpg
\
pgtypeslib
');
my
$pgtypes
=
$solution
->
AddProject
('
libpgtypes
','
dll
','
interfaces
','
src
\
interfaces
\
ecpg
\
pgtypeslib
');
$pgtypes
->
AddDefine
('
FRONTEND
');
$pgtypes
->
AddDefine
('
FRONTEND
');
$pgtypes
->
AddReference
(
$postgres
,
$libpgport
);
$pgtypes
->
AddReference
(
$postgres
,
$libpgport
);
$pgtypes
->
AddIncludeDir
('
src
\
interfaces
\
ecpg
\
include
');
$pgtypes
->
AddIncludeDir
('
src
\
interfaces
\
ecpg
\
include
');
if
(
$config
->
{
pthread
})
{
if
(
$config
->
{
pthread
})
my
$libecpg
=
$solution
->
AddProject
('
libecpg
','
dll
','
interfaces
','
src
\
interfaces
\
ecpg
\
ecpglib
');
{
$libecpg
->
AddDefine
('
FRONTEND
');
my
$libecpg
=
$solution
->
AddProject
('
libecpg
','
dll
','
interfaces
','
src
\
interfaces
\
ecpg
\
ecpglib
');
$libecpg
->
AddIncludeDir
('
src
\
interfaces
\
ecpg
\
include
');
$libecpg
->
AddDefine
('
FRONTEND
');
$libecpg
->
AddIncludeDir
('
src
\
interfaces
\
libpq
');
$libecpg
->
AddIncludeDir
('
src
\
interfaces
\
ecpg
\
include
');
$libecpg
->
AddIncludeDir
('
src
\
port
');
$libecpg
->
AddIncludeDir
('
src
\
interfaces
\
libpq
');
$libecpg
->
AddLibrary
('
wsock32.lib
');
$libecpg
->
AddIncludeDir
('
src
\
port
');
$libecpg
->
AddLibrary
(
$config
->
{'
pthread
'}
.
'
\
pthreadVC2.lib
');
$libecpg
->
AddLibrary
('
wsock32.lib
');
$libecpg
->
AddReference
(
$libpq
,
$pgtypes
);
$libecpg
->
AddLibrary
(
$config
->
{'
pthread
'}
.
'
\
pthreadVC2.lib
');
$libecpg
->
AddReference
(
$libpq
,
$pgtypes
);
my
$libecpgcompat
=
$solution
->
AddProject
('
libecpg_compat
','
dll
','
interfaces
','
src
\
interfaces
\
ecpg
\
compatlib
');
$libecpgcompat
->
AddIncludeDir
('
src
\
interfaces
\
ecpg
\
include
');
my
$libecpgcompat
=
$libecpgcompat
->
AddIncludeDir
('
src
\
interfaces
\
libpq
');
$solution
->
AddProject
('
libecpg_compat
','
dll
','
interfaces
','
src
\
interfaces
\
ecpg
\
compatlib
');
$libecpgcompat
->
AddReference
(
$pgtypes
,
$libecpg
);
$libecpgcompat
->
AddIncludeDir
('
src
\
interfaces
\
ecpg
\
include
');
$libecpgcompat
->
AddIncludeDir
('
src
\
interfaces
\
libpq
');
my
$ecpg
=
$solution
->
AddProject
('
ecpg
','
exe
','
interfaces
','
src
\
interfaces
\
ecpg
\
preproc
');
$libecpgcompat
->
AddReference
(
$pgtypes
,
$libecpg
);
$ecpg
->
AddIncludeDir
('
src
\
interfaces
\
ecpg
\
include
');
$ecpg
->
AddIncludeDir
('
src
\
interfaces
\
libpq
');
my
$ecpg
=
$solution
->
AddProject
('
ecpg
','
exe
','
interfaces
','
src
\
interfaces
\
ecpg
\
preproc
');
$ecpg
->
AddFiles
('
src
\
interfaces
\
ecpg
\
preproc
','
pgc.l
','
preproc.y
');
$ecpg
->
AddIncludeDir
('
src
\
interfaces
\
ecpg
\
include
');
$ecpg
->
AddDefine
('
MAJOR_VERSION=4
');
$ecpg
->
AddIncludeDir
('
src
\
interfaces
\
libpq
');
$ecpg
->
AddDefine
('
MINOR_VERSION=2
');
$ecpg
->
AddFiles
('
src
\
interfaces
\
ecpg
\
preproc
','
pgc.l
','
preproc.y
');
$ecpg
->
AddDefine
('
PATCHLEVEL=1
');
$ecpg
->
AddDefine
('
MAJOR_VERSION=4
');
$ecpg
->
AddReference
(
$libpgport
);
$ecpg
->
AddDefine
('
MINOR_VERSION=2
');
$ecpg
->
AddDefine
('
PATCHLEVEL=1
');
$ecpg
->
AddReference
(
$libpgport
);
}
else
{
print
"
Not building ecpg due to lack of pthreads.
\n
";
}
}
else
{
print
"
Not building ecpg due to lack of pthreads.
\n
";
}
# src/bin
# src/bin
my
$initdb
=
AddSimpleFrontend
('
initdb
',
1
);
my
$initdb
=
AddSimpleFrontend
('
initdb
',
1
);
...
@@ -158,113 +172,130 @@ my $zic = $solution->AddProject('zic','exe','utils');
...
@@ -158,113 +172,130 @@ my $zic = $solution->AddProject('zic','exe','utils');
$zic
->
AddFiles
('
src
\
timezone
','
zic.c
','
ialloc.c
','
scheck.c
','
localtime.c
');
$zic
->
AddFiles
('
src
\
timezone
','
zic.c
','
ialloc.c
','
scheck.c
','
localtime.c
');
$zic
->
AddReference
(
$libpgport
);
$zic
->
AddReference
(
$libpgport
);
my
$contrib_defines
=
{
my
$contrib_defines
=
{'
refint
'
=>
'
REFINT_VERBOSE
'};
'
refint
'
=>
'
REFINT_VERBOSE
'
};
my
@contrib_uselibpq
=
('
dblink
',
'
oid2name
',
'
pgbench
',
'
vacuumlo
');
my
@contrib_uselibpq
=
('
dblink
',
'
oid2name
',
'
pgbench
',
'
vacuumlo
');
my
@contrib_uselibpgport
=
('
oid2name
',
'
pgbench
',
'
pg_standby
',
'
vacuumlo
');
my
@contrib_uselibpgport
=
('
oid2name
',
'
pgbench
',
'
pg_standby
',
'
vacuumlo
');
my
$contrib_extralibs
=
{
my
$contrib_extralibs
=
{'
pgbench
'
=>
['
wsock32.lib
']};
'
pgbench
'
=>
['
wsock32.lib
']
my
$contrib_extraincludes
=
{'
tsearch2
'
=>
['
contrib/tsearch2
']};
};
my
$contrib_extraincludes
=
{
'
tsearch2
'
=>
['
contrib/tsearch2
']
};
my
$contrib_extrasource
=
{
my
$contrib_extrasource
=
{
'
cube
'
=>
['
cubescan.l
','
cubeparse.y
'],
'
cube
'
=>
['
cubescan.l
','
cubeparse.y
'],
'
seg
'
=>
['
segscan.l
','
segparse.y
']
'
seg
'
=>
['
segscan.l
','
segparse.y
']
};
};
my
@contrib_excludes
=
('
pgcrypto
');
my
@contrib_excludes
=
('
pgcrypto
');
if
(
$solution
->
{
options
}
->
{
xml
})
{
if
(
$solution
->
{
options
}
->
{
xml
})
$contrib_extraincludes
->
{'
xml2
'}
=
[
$solution
->
{
options
}
->
{
xml
}
.
'
\
include
'
,
{
$solution
->
{
options
}
->
{
xslt
}
.
'
\
include
',
$contrib_extraincludes
->
{'
xml2
'}
=
[
$solution
->
{
options
}
->
{
iconv
}
.
'
\
include
'];
$solution
->
{
options
}
->
{
xml
}
.
'
\
include
',
$solution
->
{
options
}
->
{
xslt
}
.
'
\
include
',
$contrib_extralibs
->
{'
xml2
'}
=
[
$solution
->
{
options
}
->
{
xml
}
.
'
\
lib
\
libxml2.lib
',
$solution
->
{
options
}
->
{
iconv
}
.
'
\
include
'
$solution
->
{
options
}
->
{
xslt
}
.
'
\
lib
\
libxslt.lib
'];
];
$contrib_extralibs
->
{'
xml2
'}
=
[
$solution
->
{
options
}
->
{
xml
}
.
'
\
lib
\
libxml2.lib
',
$solution
->
{
options
}
->
{
xslt
}
.
'
\
lib
\
libxslt.lib
'
];
}
}
else
{
else
push
@contrib_excludes
,'
xml2
';
{
push
@contrib_excludes
,'
xml2
';
}
}
if
(
!
$solution
->
{
options
}
->
{
openssl
})
{
if
(
!
$solution
->
{
options
}
->
{
openssl
})
push
@contrib_excludes
,'
sslinfo
';
{
push
@contrib_excludes
,'
sslinfo
';
}
}
# Pgcrypto makefile too complex to parse....
# Pgcrypto makefile too complex to parse....
my
$pgcrypto
=
$solution
->
AddProject
('
pgcrypto
','
dll
','
crypto
');
my
$pgcrypto
=
$solution
->
AddProject
('
pgcrypto
','
dll
','
crypto
');
$pgcrypto
->
AddFiles
('
contrib
\
pgcrypto
','
pgcrypto.c
','
px.c
','
px-hmac.c
','
px-crypt.c
',
$pgcrypto
->
AddFiles
(
'
crypt-gensalt.c
','
crypt-blowfish.c
','
crypt-des.c
','
crypt-md5.c
','
mbuf.c
',
'
contrib
\
pgcrypto
','
pgcrypto.c
','
px.c
','
px-hmac.c
',
'
pgp.c
','
pgp-armor.c
','
pgp-cfb.c
','
pgp-compress.c
','
pgp-decrypt.c
','
pgp-encrypt.c
',
'
px-crypt.c
','
crypt-gensalt.c
','
crypt-blowfish.c
','
crypt-des.c
',
'
pgp-info.c
','
pgp-mpi.c
','
pgp-pubdec.c
','
pgp-pubenc.c
','
pgp-pubkey.c
','
pgp-s2k.c
',
'
crypt-md5.c
','
mbuf.c
','
pgp.c
','
pgp-armor.c
',
'
pgp-pgsql.c
');
'
pgp-cfb.c
','
pgp-compress.c
','
pgp-decrypt.c
','
pgp-encrypt.c
',
if
(
$solution
->
{
options
}
->
{
openssl
})
{
'
pgp-info.c
','
pgp-mpi.c
','
pgp-pubdec.c
','
pgp-pubenc.c
',
$pgcrypto
->
AddFiles
('
contrib
\
pgcrypto
',
'
openssl.c
','
pgp-mpi-openssl.c
');
'
pgp-pubkey.c
','
pgp-s2k.c
','
pgp-pgsql.c
'
);
if
(
$solution
->
{
options
}
->
{
openssl
})
{
$pgcrypto
->
AddFiles
('
contrib
\
pgcrypto
',
'
openssl.c
','
pgp-mpi-openssl.c
');
}
}
else
{
else
$pgcrypto
->
AddFiles
('
contrib
\
pgcrypto
',
'
md5.c
','
sha1.c
','
sha2.c
','
internal.c
','
internal-sha2.c
',
{
'
blf.c
','
rijndael.c
','
fortuna.c
','
random.c
','
pgp-mpi-internal.c
','
imath.c
');
$pgcrypto
->
AddFiles
(
'
contrib
\
pgcrypto
',
'
md5.c
','
sha1.c
','
sha2.c
',
'
internal.c
','
internal-sha2.c
','
blf.c
','
rijndael.c
',
'
fortuna.c
','
random.c
','
pgp-mpi-internal.c
','
imath.c
'
);
}
}
$pgcrypto
->
AddReference
(
$postgres
);
$pgcrypto
->
AddReference
(
$postgres
);
$pgcrypto
->
AddLibrary
('
wsock32.lib
');
$pgcrypto
->
AddLibrary
('
wsock32.lib
');
my
$D
;
my
$D
;
opendir
(
$D
,
'
contrib
')
||
croak
"
Could not opendir on contrib!
\n
";
opendir
(
$D
,
'
contrib
')
||
croak
"
Could not opendir on contrib!
\n
";
while
(
my
$d
=
readdir
(
$D
))
{
while
(
my
$d
=
readdir
(
$D
))
next
if
(
$d
=~
/^\./
);
{
next
unless
(
-
f
"
contrib/
$d
/Makefile
");
next
if
(
$d
=~
/^\./
);
next
if
(
grep
{
/^$d$/
}
@contrib_excludes
);
next
unless
(
-
f
"
contrib/
$d
/Makefile
");
AddContrib
(
$d
);
next
if
(
grep
{
/^$d$/
}
@contrib_excludes
);
AddContrib
(
$d
);
}
}
closedir
(
$D
);
closedir
(
$D
);
my
$mf
=
Project::
read_file
('
src
\
backend
\
utils
\
mb
\
conversion_procs
\
Makefile
');
my
$mf
=
Project::
read_file
('
src
\
backend
\
utils
\
mb
\
conversion_procs
\
Makefile
');
$mf
=~
s{\\s*[\r\n]+}{}mg
;
$mf
=~
s{\\s*[\r\n]+}{}mg
;
$mf
=~
m{DIRS\s*=\s*(.*)$}m
||
die
'
Could not match in conversion makefile
'
.
"
\n
";
$mf
=~
m{DIRS\s*=\s*(.*)$}m
||
die
'
Could not match in conversion makefile
'
.
"
\n
";
foreach
my
$sub
(
split
/\s+/
,
$1
)
{
foreach
my
$sub
(
split
/\s+/
,
$1
)
my
$mf
=
Project::
read_file
('
src
\
backend
\
utils
\
mb
\
conversion_procs
\
\'
. $sub .
'
\
Makefile
'
);
{
my $p = $solution->AddProject($sub,
'
dll
'
,
'
conversion
procs
'
);
my
$mf
=
Project::
read_file
('
src
\
backend
\
utils
\
mb
\
conversion_procs
\
\'
. $sub .
'
\
Makefile
'
);
$p->AddFile(
'
src
\
backend
\
utils
\
mb
\
conversion_procs
\\
'
. $sub .
'
\\
'
. $sub .
'
.
c
'
);
my $p = $solution->AddProject($sub,
'
dll
'
,
'
conversion
procs
'
);
if ($mf =~ m{^SRCS
\
s*
\
+=
\
s*(.*)$}m) {
$p->AddFile(
'
src
\
backend
\
utils
\
mb
\
conversion_procs
\\
'
. $sub .
'
\\
'
. $sub .
'
.
c
'
);
$p->AddFile(
'
src
\
backend
\
utils
\
mb
\
conversion_procs
\\
'
. $sub .
'
\\
'
. $1);
if ($mf =~ m{^SRCS
\
s*
\
+=
\
s*(.*)$}m)
}
{
$p->AddReference($postgres);
$p->AddFile(
'
src
\
backend
\
utils
\
mb
\
conversion_procs
\\
'
. $sub .
'
\\
'
. $1);
}
$p->AddReference($postgres);
}
}
$mf = Project::read_file(
'
src
\
bin
\
scripts
\
Makefile
'
);
$mf = Project::read_file(
'
src
\
bin
\
scripts
\
Makefile
'
);
$mf =~ s{
\\
s*[
\
r
\
n]+}{}mg;
$mf =~ s{
\\
s*[
\
r
\
n]+}{}mg;
$mf =~ m{PROGRAMS
\
s*=
\
s*(.*)$}m || die
'
Could
not
match
in
bin
\
scripts
\
Makefile
'
. "
\
n";
$mf =~ m{PROGRAMS
\
s*=
\
s*(.*)$}m || die
'
Could
not
match
in
bin
\
scripts
\
Makefile
'
. "
\
n";
foreach my $prg (split /
\
s+/,$1) {
foreach my $prg (split /
\
s+/,$1)
my $proj = $solution->AddProject($prg,
'
exe
'
,
'
bin
'
);
{
$mf =~ m{$prg
\
s*:
\
s*(.*)$}m || die
'
Could
not
find
script
define
for
$prg
'
. "
\
n";
my $proj = $solution->AddProject($prg,
'
exe
'
,
'
bin
'
);
my @files = split /
\
s+/,$1;
$mf =~ m{$prg
\
s*:
\
s*(.*)$}m || die
'
Could
not
find
script
define
for
$prg
'
. "
\
n";
foreach my $f (@files) {
my @files = split /
\
s+/,$1;
if ($f =~ /
\
/keywords
\
.o$/) {
foreach my $f (@files)
$proj->AddFile(
'
src
\
backend
\
parser
\
keywords
.
c
'
);
{
}
if ($f =~ /
\
/keywords
\
.o$/)
else {
{
$f =~ s/
\
.o$/
\
.c/;
$proj->AddFile(
'
src
\
backend
\
parser
\
keywords
.
c
'
);
if ($f eq
'
dumputils
.
c
'
) {
}
$proj->AddFile(
'
src
\
bin
\
pg_dump
\
dumputils
.
c
'
);
else
}
{
elsif ($f =~ /print
\
.c$/) { # Also catches mbprint.c
$f =~ s/
\
.o$/
\
.c/;
$proj->AddFile(
'
src
\
bin
\
psql
\\
'
. $f);
if ($f eq
'
dumputils
.
c
'
)
}
{
else {
$proj->AddFile(
'
src
\
bin
\
pg_dump
\
dumputils
.
c
'
);
$proj->AddFile(
'
src
\
bin
\
scripts
\\
'
. $f);
}
}
elsif ($f =~ /print
\
.c$/)
}
{ # Also catches mbprint.c
}
$proj->AddFile(
'
src
\
bin
\
psql
\\
'
. $f);
$proj->AddIncludeDir(
'
src
\
interfaces
\
libpq
'
);
}
$proj->AddIncludeDir(
'
src
\
bin
\
pg_dump
'
);
else
$proj->AddIncludeDir(
'
src
\
bin
\
psql
'
);
{
$proj->AddReference($libpq,$libpgport);
$proj->AddFile(
'
src
\
bin
\
scripts
\\
'
. $f);
$proj->AddResourceFile(
'
src
\
bin
\
scripts
'
,
'
PostgreSQL
Utility
'
);
}
}
}
$proj->AddIncludeDir(
'
src
\
interfaces
\
libpq
'
);
$proj->AddIncludeDir(
'
src
\
bin
\
pg_dump
'
);
$proj->AddIncludeDir(
'
src
\
bin
\
psql
'
);
$proj->AddReference($libpq,$libpgport);
$proj->AddResourceFile(
'
src
\
bin
\
scripts
'
,
'
PostgreSQL
Utility
'
);
}
}
# Regression DLL and EXE
# Regression DLL and EXE
my $regress = $solution->AddProject(
'
regress
'
,
'
dll
'
,
'
misc
'
);
my $regress = $solution->AddProject(
'
regress
'
,
'
dll
'
,
'
misc
'
);
$regress->AddFile(
'
src
\
test
\
regress
\
regress
.
c
'
);
$regress->AddFile(
'
src
\
test
\
regress
\
regress
.
c
'
);
...
@@ -284,101 +315,124 @@ $solution->Save();
...
@@ -284,101 +315,124 @@ $solution->Save();
#####################
#####################
# Add a simple frontend project (exe)
# Add a simple frontend project (exe)
sub AddSimpleFrontend {
sub AddSimpleFrontend
my $n = shift;
{
my $uselibpq= shift;
my $n = shift;
my $uselibpq= shift;
my $p = $solution->AddProject($n,
'
exe
'
,
'
bin
'
);
$p->AddDir(
'
src
\
bin
\\
'
. $n);
my $p = $solution->AddProject($n,
'
exe
'
,
'
bin
'
);
$p->AddDefine(
'
FRONTEND
'
);
$p->AddDir(
'
src
\
bin
\\
'
. $n);
$p->AddReference($libpgport);
$p->AddDefine(
'
FRONTEND
'
);
if ($uselibpq) {
$p->AddReference($libpgport);
$p->AddIncludeDir(
'
src
\
interfaces
\
libpq
'
);
if ($uselibpq)
$p->AddReference($libpq);
{
}
$p->AddIncludeDir(
'
src
\
interfaces
\
libpq
'
);
return $p;
$p->AddReference($libpq);
}
return $p;
}
}
# Add a simple contrib project
# Add a simple contrib project
sub AddContrib {
sub AddContrib
my $n = shift;
{
my $mf = Project::read_file(
'
contrib
\\
'
. $n .
'
\
Makefile
'
);
my $n = shift;
my $mf = Project::read_file(
'
contrib
\\
'
. $n .
'
\
Makefile
'
);
if ($mf =~ /^MODULE_big/mg) {
$mf =~ s{
\\\
s*[
\
r
\
n]+}{}mg;
if ($mf =~ /^MODULE_big/mg)
my $proj = $solution->AddProject($n,
'
dll
'
,
'
contrib
'
);
{
$mf =~ /^OBJS
\
s*=
\
s*(.*)$/gm || croak "Could not find objects in MODULE_big for $n
\
n";
$mf =~ s{
\\\
s*[
\
r
\
n]+}{}mg;
foreach my $o (split /
\
s+/, $1) {
my $proj = $solution->AddProject($n,
'
dll
'
,
'
contrib
'
);
$o =~ s/
\
.o$/.c/;
$mf =~ /^OBJS
\
s*=
\
s*(.*)$/gm || croak "Could not find objects in MODULE_big for $n
\
n";
$proj->AddFile(
'
contrib
\\
'
. $n .
'
\\
'
. $o);
foreach my $o (split /
\
s+/, $1)
}
{
$proj->AddReference($postgres);
$o =~ s/
\
.o$/.c/;
if ($mf =~ /^SUBDIRS
\
s*:?=
\
s*(.*)$/mg) {
$proj->AddFile(
'
contrib
\\
'
. $n .
'
\\
'
. $o);
foreach my $d (split /
\
s+/, $1) {
}
my $mf2 = Project::read_file(
'
contrib
\\
'
. $n .
'
\\
'
. $d .
'
\
Makefile
'
);
$proj->AddReference($postgres);
$mf2 =~ s{
\\\
s*[
\
r
\
n]+}{}mg;
if ($mf =~ /^SUBDIRS
\
s*:?=
\
s*(.*)$/mg)
$mf2 =~ /^SUBOBJS
\
s*=
\
s*(.*)$/gm || croak "Could not find objects in MODULE_big for $n, subdir $d
\
n";
{
foreach my $o (split /
\
s+/, $1) {
foreach my $d (split /
\
s+/, $1)
$o =~ s/
\
.o$/.c/;
{
$proj->AddFile(
'
contrib
\\
'
. $n .
'
\\
'
. $d .
'
\\
'
. $o);
my $mf2 = Project::read_file(
'
contrib
\\
'
. $n .
'
\\
'
. $d .
'
\
Makefile
'
);
}
$mf2 =~ s{
\\\
s*[
\
r
\
n]+}{}mg;
}
$mf2 =~ /^SUBOBJS
\
s*=
\
s*(.*)$/gm
}
|| croak "Could not find objects in MODULE_big for $n, subdir $d
\
n";
AdjustContribProj($proj);
foreach my $o (split /
\
s+/, $1)
return $proj;
{
}
$o =~ s/
\
.o$/.c/;
elsif ($mf =~ /^MODULES
\
s*=
\
s*(.*)$/mg) {
$proj->AddFile(
'
contrib
\\
'
. $n .
'
\\
'
. $d .
'
\\
'
. $o);
foreach my $mod (split /
\
s+/, $1) {
}
my $proj = $solution->AddProject($mod,
'
dll
'
,
'
contrib
'
);
}
$proj->AddFile(
'
contrib
\\
'
. $n .
'
\\
'
. $mod .
'
.
c
'
);
}
$proj->AddReference($postgres);
AdjustContribProj($proj);
AdjustContribProj($proj);
return $proj;
}
}
return undef;
elsif ($mf =~ /^MODULES
\
s*=
\
s*(.*)$/mg)
}
{
elsif ($mf =~ /^PROGRAM
\
s*=
\
s*(.*)$/mg) {
foreach my $mod (split /
\
s+/, $1)
my $proj = $solution->AddProject($1,
'
exe
'
,
'
contrib
'
);
{
$mf =~ /^OBJS
\
s*=
\
s*(.*)$/gm || croak "Could not find objects in MODULE_big for $n
\
n";
my $proj = $solution->AddProject($mod,
'
dll
'
,
'
contrib
'
);
foreach my $o (split /
\
s+/, $1) {
$proj->AddFile(
'
contrib
\\
'
. $n .
'
\\
'
. $mod .
'
.
c
'
);
$o =~ s/
\
.o$/.c/;
$proj->AddReference($postgres);
$proj->AddFile(
'
contrib
\\
'
. $n .
'
\\
'
. $o);
AdjustContribProj($proj);
}
}
AdjustContribProj($proj);
return undef;
return $proj;
}
}
elsif ($mf =~ /^PROGRAM
\
s*=
\
s*(.*)$/mg)
else {
{
croak "Could not determine contrib module type for $n
\
n";
my $proj = $solution->AddProject($1,
'
exe
'
,
'
contrib
'
);
}
$mf =~ /^OBJS
\
s*=
\
s*(.*)$/gm || croak "Could not find objects in MODULE_big for $n
\
n";
foreach my $o (split /
\
s+/, $1)
{
$o =~ s/
\
.o$/.c/;
$proj->AddFile(
'
contrib
\\
'
. $n .
'
\\
'
. $o);
}
AdjustContribProj($proj);
return $proj;
}
else
{
croak "Could not determine contrib module type for $n
\
n";
}
}
}
sub AdjustContribProj {
sub AdjustContribProj
my $proj = shift;
{
my $n = $proj->{name};
my $proj = shift;
my $n = $proj->{name};
if ($contrib_defines->{$n}) {
foreach my $d ($contrib_defines->{$n}) {
if ($contrib_defines->{$n})
$proj->AddDefine($d);
{
}
foreach my $d ($contrib_defines->{$n})
}
{
if (grep {/^$n$/} @contrib_uselibpq) {
$proj->AddDefine($d);
$proj->AddIncludeDir(
'
src
\
interfaces
\
libpq
'
);
}
$proj->AddReference($libpq);
}
}
if (grep {/^$n$/} @contrib_uselibpq)
if (grep {/^$n$/} @contrib_uselibpgport) {
{
$proj->AddReference($libpgport);
$proj->AddIncludeDir(
'
src
\
interfaces
\
libpq
'
);
}
$proj->AddReference($libpq);
if ($contrib_extralibs->{$n}) {
}
foreach my $l (@{$contrib_extralibs->{$n}}) {
if (grep {/^$n$/} @contrib_uselibpgport)
$proj->AddLibrary($l);
{
}
$proj->AddReference($libpgport);
}
}
if ($contrib_extraincludes->{$n}) {
if ($contrib_extralibs->{$n})
foreach my $i (@{$contrib_extraincludes->{$n}}) {
{
$proj->AddIncludeDir($i);
foreach my $l (@{$contrib_extralibs->{$n}})
}
{
}
$proj->AddLibrary($l);
if ($contrib_extrasource->{$n}) {
}
$proj->AddFiles(
'
contrib
\\
'
. $n, @{$contrib_extrasource->{$n}});
}
}
if ($contrib_extraincludes->{$n})
{
foreach my $i (@{$contrib_extraincludes->{$n}})
{
$proj->AddIncludeDir($i);
}
}
if ($contrib_extrasource->{$n})
{
$proj->AddFiles(
'
contrib
\\
'
. $n, @{$contrib_extrasource->{$n}});
}
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment