1
0
mirror of https://github.com/postgres/postgres.git synced 2025-11-28 11:44:57 +03:00

Generate pg_config.h from pg_config.h.in on Windows

Previously, the Windows MSVC build generated pg_config.h from a
hard-coded pg_config.h.win32 with some ad hoc postprocessing.  The
pg_config.h.win32 file required manual maintenance and was as a result
frequently out of date.

Instead, have the MSVC build scripts emulate what configure and
config.status do: collect a list of defines and then create
pg_config.h from pg_config.h.in by changing the appropriate lines.

The previous setup was made to support old Windows build systems that
didn't have any text processing capabilities, but the current system
has Perl, so it's not a problem.  pg_config.h.win32 is removed.

In order to try to keep the Windows side of things more up to date in
the future, we now also require that all symbols found in
pg_config.h.in are defined in the MSVC build system.  So if there is a
change in configure that results in a new symbol, an update in
Solution.pm will be required.

The other headers managed by AC_CONFIG_HEADERS in configure, namely
src/include/pg_config_ext.h and
src/interfaces/ecpg/include/ecpg_config.h, get the same treatment, so
this removes even more ad hoc code in the MSVC build scripts.

Reviewed-by: Michael Paquier <michael@paquier.xyz>
Discussion: https://www.postgresql.org/message-id/flat/1441b834-f434-e0bf-46ed-9c4d5c29c2d4%402ndquadrant.com
This commit is contained in:
Peter Eisentraut
2019-12-20 08:54:42 +01:00
parent df7fe9e2d7
commit 8f4fb4c648
4 changed files with 433 additions and 859 deletions

View File

@@ -20,7 +20,6 @@ sub _new
projects => {},
options => $options,
numver => '',
strver => '',
VisualStudioVersion => undef,
MinimumVisualStudioVersion => undef,
vcver => undef,
@@ -140,16 +139,22 @@ sub GenerateFiles
{
my $self = shift;
my $bits = $self->{platform} eq 'Win32' ? 32 : 64;
my $package_name;
my $package_version;
my $package_bugreport;
# Parse configure.in to get version numbers
open(my $c, '<', "configure.in")
|| confess("Could not open configure.in for reading\n");
while (<$c>)
{
if (/^AC_INIT\(\[PostgreSQL\], \[([^\]]+)\]/)
if (/^AC_INIT\(\[([^\]]+)\], \[([^\]]+)\], \[([^\]]+)\]/)
{
$self->{strver} = $1;
if ($self->{strver} !~ /^(\d+)(?:\.(\d+))?/)
$package_name = $1;
$package_version = $2;
$package_bugreport = $3;
if ($package_version !~ /^(\d+)(?:\.(\d+))?/)
{
confess "Bad format of version: $self->{strver}\n";
}
@@ -159,7 +164,10 @@ sub GenerateFiles
}
close($c);
confess "Unable to parse configure.in for all variables!"
if ($self->{strver} eq '' || $self->{numver} eq '');
if ( $package_name eq ''
|| $package_version eq ''
|| $self->{numver} eq ''
|| $package_bugreport eq '');
if (IsNewer("src/include/pg_config_os.h", "src/include/port/win32.h"))
{
@@ -167,100 +175,369 @@ sub GenerateFiles
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 configuration headers...\n";
my $extraver = $self->{options}->{extraver};
$extraver = '' unless defined $extraver;
my $port = $self->{options}->{"--with-pgport"} || 5432;
# Every symbol in pg_config.h.in must be accounted for here. Set
# to undef if the symbol should not be defined.
my %define = (
ACCEPT_TYPE_ARG1 => 'unsigned int',
ACCEPT_TYPE_ARG2 => 'struct sockaddr *',
ACCEPT_TYPE_ARG3 => 'int',
ACCEPT_TYPE_RETURN => 'unsigned int PASCAL',
ALIGNOF_DOUBLE => 8,
ALIGNOF_INT => 4,
ALIGNOF_LONG => 4,
ALIGNOF_LONG_LONG_INT => 8,
ALIGNOF_PG_INT128_TYPE => undef,
ALIGNOF_SHORT => 2,
AC_APPLE_UNIVERSAL_BUILD => undef,
BLCKSZ => 1024 * $self->{options}->{blocksize},
DEF_PGPORT => $port,
DEF_PGPORT_STR => qq{"$port"},
ENABLE_GSS => $self->{options}->{gss} ? 1 : undef,
ENABLE_NLS => $self->{options}->{nls} ? 1 : undef,
ENABLE_THREAD_SAFETY => 1,
FLEXIBLE_ARRAY_MEMBER => '/**/',
GETTIMEOFDAY_1ARG => undef,
HAVE_APPEND_HISTORY => undef,
HAVE_ASN1_STRING_GET0_DATA => undef,
HAVE_ATOMICS => 1,
HAVE_ATOMIC_H => undef,
HAVE_BACKTRACE_SYMBOLS => undef,
HAVE_BIO_GET_DATA => undef,
HAVE_BIO_METH_NEW => undef,
HAVE_CBRT => undef,
HAVE_CLASS => undef,
HAVE_CLOCK_GETTIME => undef,
HAVE_COMPUTED_GOTO => undef,
HAVE_COPYFILE => undef,
HAVE_COPYFILE_H => undef,
HAVE_CRTDEFS_H => undef,
HAVE_CRYPTO_LOCK => undef,
HAVE_DECL_FDATASYNC => 0,
HAVE_DECL_F_FULLFSYNC => 0,
HAVE_DECL_LLVMCREATEGDBREGISTRATIONLISTENER => undef,
HAVE_DECL_LLVMCREATEPERFJITEVENTLISTENER => undef,
HAVE_DECL_LLVMGETHOSTCPUNAME => 0,
HAVE_DECL_LLVMGETHOSTCPUFEATURES => 0,
HAVE_DECL_LLVMORCGETSYMBOLADDRESSIN => 0,
HAVE_DECL_POSIX_FADVISE => undef,
HAVE_DECL_RTLD_GLOBAL => 0,
HAVE_DECL_RTLD_NOW => 0,
HAVE_DECL_STRLCAT => undef,
HAVE_DECL_STRLCPY => undef,
HAVE_DECL_STRNLEN => 1,
HAVE_DECL_STRTOLL => 1,
HAVE_DECL_STRTOULL => 1,
HAVE_DLOPEN => undef,
HAVE_EDITLINE_HISTORY_H => undef,
HAVE_EDITLINE_READLINE_H => undef,
HAVE_EXECINFO_H => undef,
HAVE_EXPLICIT_BZERO => undef,
HAVE_FDATASYNC => undef,
HAVE_FLS => undef,
HAVE_FPCLASS => undef,
HAVE_FP_CLASS => undef,
HAVE_FP_CLASS_D => undef,
HAVE_FP_CLASS_H => undef,
HAVE_FSEEKO => 1,
HAVE_FUNCNAME__FUNC => undef,
HAVE_FUNCNAME__FUNCTION => 1,
HAVE_GCC__ATOMIC_INT32_CAS => undef,
HAVE_GCC__ATOMIC_INT64_CAS => undef,
HAVE_GCC__SYNC_CHAR_TAS => undef,
HAVE_GCC__SYNC_INT32_CAS => undef,
HAVE_GCC__SYNC_INT32_TAS => undef,
HAVE_GCC__SYNC_INT64_CAS => undef,
HAVE_GETADDRINFO => undef,
HAVE_GETHOSTBYNAME_R => undef,
HAVE_GETIFADDRS => undef,
HAVE_GETOPT => undef,
HAVE_GETOPT_H => undef,
HAVE_GETOPT_LONG => undef,
HAVE_GETPEEREID => undef,
HAVE_GETPEERUCRED => undef,
HAVE_GETPWUID_R => undef,
HAVE_GETRLIMIT => undef,
HAVE_GETRUSAGE => undef,
HAVE_GETTIMEOFDAY => undef,
HAVE_GSSAPI_GSSAPI_H => undef,
HAVE_GSSAPI_H => undef,
HAVE_HISTORY_H => undef,
HAVE_HISTORY_TRUNCATE_FILE => undef,
HAVE_IEEEFP_H => undef,
HAVE_IFADDRS_H => undef,
HAVE_INET_ATON => undef,
HAVE_INT_TIMEZONE => 1,
HAVE_INT64 => undef,
HAVE_INT8 => undef,
HAVE_INTPTR_T => undef,
HAVE_INTTYPES_H => undef,
HAVE_INT_OPTERR => undef,
HAVE_INT_OPTRESET => undef,
HAVE_IPV6 => 1,
HAVE_ISINF => 1,
HAVE_I_CONSTRAINT__BUILTIN_CONSTANT_P => undef,
HAVE_LANGINFO_H => undef,
HAVE_LDAP_H => undef,
HAVE_LDAP_INITIALIZE => undef,
HAVE_LIBCRYPTO => undef,
HAVE_LIBLDAP => undef,
HAVE_LIBLDAP_R => undef,
HAVE_LIBM => undef,
HAVE_LIBPAM => undef,
HAVE_LIBREADLINE => undef,
HAVE_LIBSELINUX => undef,
HAVE_LIBSSL => undef,
HAVE_LIBWLDAP32 => undef,
HAVE_LIBXML2 => undef,
HAVE_LIBXSLT => undef,
HAVE_LIBZ => $self->{options}->{zlib} ? 1 : undef,
HAVE_LOCALE_T => 1,
HAVE_LONG_INT_64 => undef,
HAVE_LONG_LONG_INT_64 => 1,
HAVE_MBARRIER_H => undef,
HAVE_MBSTOWCS_L => 1,
HAVE_MEMMOVE => 1,
HAVE_MEMORY_H => 1,
HAVE_MEMSET_S => undef,
HAVE_MINIDUMP_TYPE => 1,
HAVE_MKDTEMP => undef,
HAVE_NETINET_TCP_H => undef,
HAVE_NET_IF_H => undef,
HAVE_OPENSSL_INIT_SSL => undef,
HAVE_OSSP_UUID_H => undef,
HAVE_PAM_PAM_APPL_H => undef,
HAVE_POLL => undef,
HAVE_POLL_H => undef,
HAVE_POSIX_FADVISE => undef,
HAVE_POSIX_FALLOCATE => undef,
HAVE_PPC_LWARX_MUTEX_HINT => undef,
HAVE_PPOLL => undef,
HAVE_PREAD => undef,
HAVE_PSTAT => undef,
HAVE_PS_STRINGS => undef,
HAVE_PTHREAD => undef,
HAVE_PTHREAD_IS_THREADED_NP => undef,
HAVE_PTHREAD_PRIO_INHERIT => undef,
HAVE_PWRITE => undef,
HAVE_RANDOM => undef,
HAVE_READLINE_H => undef,
HAVE_READLINE_HISTORY_H => undef,
HAVE_READLINE_READLINE_H => undef,
HAVE_READLINK => undef,
HAVE_RINT => 1,
HAVE_RL_COMPLETION_APPEND_CHARACTER => undef,
HAVE_RL_COMPLETION_MATCHES => undef,
HAVE_RL_FILENAME_COMPLETION_FUNCTION => undef,
HAVE_RL_RESET_SCREEN_SIZE => undef,
HAVE_SECURITY_PAM_APPL_H => undef,
HAVE_SETPROCTITLE => undef,
HAVE_SETPROCTITLE_FAST => undef,
HAVE_SETSID => undef,
HAVE_SHM_OPEN => undef,
HAVE_SPINLOCKS => 1,
HAVE_SRANDOM => undef,
HAVE_STDBOOL_H => 1,
HAVE_STDINT_H => undef,
HAVE_STDLIB_H => 1,
HAVE_STRCHRNUL => undef,
HAVE_STRERROR_R => undef,
HAVE_STRINGS_H => undef,
HAVE_STRING_H => 1,
HAVE_STRLCAT => undef,
HAVE_STRLCPY => undef,
HAVE_STRNLEN => 1,
HAVE_STRSIGNAL => undef,
HAVE_STRTOF => 1,
HAVE_STRTOLL => 1,
HAVE_STRTOQ => undef,
HAVE_STRTOULL => 1,
HAVE_STRTOUQ => undef,
HAVE_STRUCT_ADDRINFO => 1,
HAVE_STRUCT_CMSGCRED => undef,
HAVE_STRUCT_OPTION => undef,
HAVE_STRUCT_SOCKADDR_SA_LEN => undef,
HAVE_STRUCT_SOCKADDR_STORAGE => 1,
HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY => 1,
HAVE_STRUCT_SOCKADDR_STORAGE_SS_LEN => undef,
HAVE_STRUCT_SOCKADDR_STORAGE___SS_FAMILY => undef,
HAVE_STRUCT_SOCKADDR_STORAGE___SS_LEN => undef,
HAVE_STRUCT_TM_TM_ZONE => undef,
HAVE_SYNC_FILE_RANGE => undef,
HAVE_SYMLINK => 1,
HAVE_SYSLOG => undef,
HAVE_SYS_EPOLL_H => undef,
HAVE_SYS_IPC_H => undef,
HAVE_SYS_PRCTL_H => undef,
HAVE_SYS_PROCCTL_H => undef,
HAVE_SYS_PSTAT_H => undef,
HAVE_SYS_RESOURCE_H => undef,
HAVE_SYS_SELECT_H => undef,
HAVE_SYS_SEM_H => undef,
HAVE_SYS_SHM_H => undef,
HAVE_SYS_SOCKIO_H => undef,
HAVE_SYS_STAT_H => 1,
HAVE_SYS_TAS_H => undef,
HAVE_SYS_TYPES_H => 1,
HAVE_SYS_UCRED_H => undef,
HAVE_SYS_UN_H => undef,
HAVE_TERMIOS_H => undef,
HAVE_TYPEOF => undef,
HAVE_UCRED_H => undef,
HAVE_UINT64 => undef,
HAVE_UINT8 => undef,
HAVE_UINTPTR_T => undef,
HAVE_UNION_SEMUN => undef,
HAVE_UNISTD_H => 1,
HAVE_UNIX_SOCKETS => undef,
HAVE_UNSETENV => undef,
HAVE_USELOCALE => undef,
HAVE_UTIME => 1,
HAVE_UTIMES => undef,
HAVE_UTIME_H => 1,
HAVE_UUID_BSD => undef,
HAVE_UUID_E2FS => undef,
HAVE_UUID_OSSP => undef,
HAVE_UUID_H => undef,
HAVE_UUID_UUID_H => undef,
HAVE_WINLDAP_H => undef,
HAVE_WCHAR_H => 1,
HAVE_WCSTOMBS_L => 1,
HAVE_WCTYPE_H => 1,
HAVE_X509_GET_SIGNATURE_NID => 1,
HAVE_X86_64_POPCNTQ => undef,
HAVE__BOOL => undef,
HAVE__BUILTIN_BSWAP16 => undef,
HAVE__BUILTIN_BSWAP32 => undef,
HAVE__BUILTIN_BSWAP64 => undef,
HAVE__BUILTIN_CLZ => undef,
HAVE__BUILTIN_CONSTANT_P => undef,
HAVE__BUILTIN_CTZ => undef,
HAVE__BUILTIN_OP_OVERFLOW => undef,
HAVE__BUILTIN_POPCOUNT => undef,
HAVE__BUILTIN_TYPES_COMPATIBLE_P => undef,
HAVE__BUILTIN_UNREACHABLE => undef,
HAVE__CONFIGTHREADLOCALE => 1,
HAVE__CPUID => 1,
HAVE__GET_CPUID => undef,
HAVE__STATIC_ASSERT => undef,
HAVE___STRTOLL => undef,
HAVE___STRTOULL => undef,
INT64_MODIFIER => qq{"ll"},
LOCALE_T_IN_XLOCALE => undef,
MAXIMUM_ALIGNOF => 8,
MEMSET_LOOP_LIMIT => 1024,
PACKAGE_BUGREPORT => qq{"$package_bugreport"},
PACKAGE_NAME => qq{"$package_name"},
PACKAGE_STRING => qq{"$package_name $package_version"},
PACKAGE_TARNAME => lc qq{"$package_name"},
PACKAGE_URL => undef,
PACKAGE_VERSION => qq{"$package_version"},
PG_INT128_TYPE => undef,
PG_INT64_TYPE => 'long long int',
PG_KRB_SRVNAM => qq{"postgres"},
PG_MAJORVERSION => qq{"$self->{majorver}"},
PG_PRINTF_ATTRIBUTE => undef,
PG_USE_STDBOOL => 1,
PG_VERSION => qq{"$package_version$extraver"},
PG_VERSION_NUM => $self->{numver},
PG_VERSION_STR =>
qq{"PostgreSQL $package_version$extraver, compiled by Visual C++ build " CppAsString2(_MSC_VER) ", $bits-bit"},
PROFILE_PID_DIR => undef,
PTHREAD_CREATE_JOINABLE => undef,
RELSEG_SIZE => (1024 / $self->{options}->{blocksize}) *
$self->{options}->{segsize} * 1024,
SIZEOF_BOOL => 1,
SIZEOF_LONG => 4,
SIZEOF_OFF_T => undef,
SIZEOF_SIZE_T => $bits / 8,
SIZEOF_VOID_P => $bits / 8,
STDC_HEADERS => 1,
STRERROR_R_INT => undef,
USE_ARMV8_CRC32C => undef,
USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK => undef,
USE_ASSERT_CHECKING => $self->{options}->{asserts} ? 1 : undef,
USE_BONJOUR => undef,
USE_BSD_AUTH => undef,
USE_DEV_URANDOM => undef,
USE_ICU => $self->{options}->{icu} ? 1 : undef,
USE_LIBXML => undef,
USE_LIBXSLT => undef,
USE_LDAP => $self->{options}->{ldap} ? 1 : undef,
USE_LLVM => undef,
USE_NAMED_POSIX_SEMAPHORES => undef,
USE_OPENSSL => undef,
USE_OPENSSL_RANDOM => undef,
USE_PAM => undef,
USE_SLICING_BY_8_CRC32C => undef,
USE_SSE42_CRC32C => undef,
USE_SSE42_CRC32C_WITH_RUNTIME_CHECK => 1,
USE_SYSTEMD => undef,
USE_SYSV_SEMAPHORES => undef,
USE_SYSV_SHARED_MEMORY => undef,
USE_UNNAMED_POSIX_SEMAPHORES => undef,
USE_WIN32_RANDOM => 1,
USE_WIN32_SEMAPHORES => 1,
USE_WIN32_SHARED_MEMORY => 1,
WCSTOMBS_L_IN_XLOCALE => undef,
WORDS_BIGENDIAN => undef,
XLOG_BLCKSZ => 1024 * $self->{options}->{wal_blocksize},
_FILE_OFFSET_BITS => undef,
_LARGEFILE_SOURCE => undef,
_LARGE_FILES => undef,
inline => '__inline',
intptr_t => undef,
pg_restrict => '__restrict',
# not defined, because it'd conflict with __declspec(restrict)
restrict => undef,
signed => undef,
typeof => undef,
uintptr_t => undef,);
if ($self->{options}->{uuid})
{
print "Generating pg_config.h...\n";
open(my $i, '<', "src/include/pg_config.h.win32")
|| confess "Could not open pg_config.h.win32\n";
open(my $o, '>', "src/include/pg_config.h")
|| confess "Could not write to pg_config.h\n";
my $extraver = $self->{options}->{extraver};
$extraver = '' unless defined $extraver;
while (<$i>)
{
s{PG_VERSION "[^"]+"}{PG_VERSION "$self->{strver}$extraver"};
s{PG_VERSION_NUM \d+}{PG_VERSION_NUM $self->{numver}};
s{PG_VERSION_STR "[^"]+"}{PG_VERSION_STR "PostgreSQL $self->{strver}$extraver, compiled by Visual C++ build " CppAsString2(_MSC_VER) ", $bits-bit"};
print $o $_;
}
print $o "#define PG_MAJORVERSION \"$self->{majorver}\"\n";
print $o "/* defines added by config steps */\n";
print $o "#ifndef IGNORE_CONFIGURED_SETTINGS\n";
print $o "#define USE_ASSERT_CHECKING 1\n"
if ($self->{options}->{asserts});
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 ENABLE_NLS 1\n" if ($self->{options}->{nls});
$define{HAVE_UUID_OSSP} = 1;
$define{HAVE_UUID_H} = 1;
}
if ($self->{options}->{xml})
{
$define{HAVE_LIBXML2} = 1;
$define{USE_LIBXML} = 1;
}
if ($self->{options}->{xslt})
{
$define{HAVE_LIBXSLT} = 1;
$define{USE_LIBXSLT} = 1;
}
if ($self->{options}->{openssl})
{
$define{USE_OPENSSL} = 1;
print $o "#define BLCKSZ ", 1024 * $self->{options}->{blocksize},
"\n";
print $o "#define RELSEG_SIZE ",
(1024 / $self->{options}->{blocksize}) *
$self->{options}->{segsize} * 1024, "\n";
print $o "#define XLOG_BLCKSZ ",
1024 * $self->{options}->{wal_blocksize}, "\n";
my ($digit1, $digit2, $digit3) = $self->GetOpenSSLVersion();
if ($self->{options}->{uuid})
# More symbols are needed with OpenSSL 1.1.0 and above.
if ($digit1 >= '1' && $digit2 >= '1' && $digit3 >= '0')
{
print $o "#define HAVE_UUID_OSSP\n";
print $o "#define HAVE_UUID_H\n";
$define{HAVE_ASN1_STRING_GET0_DATA} = 1;
$define{HAVE_BIO_GET_DATA} = 1;
$define{HAVE_BIO_METH_NEW} = 1;
$define{HAVE_OPENSSL_INIT_SSL} = 1;
}
if ($self->{options}->{xml})
{
print $o "#define HAVE_LIBXML2\n";
print $o "#define USE_LIBXML\n";
}
if ($self->{options}->{xslt})
{
print $o "#define HAVE_LIBXSLT\n";
print $o "#define USE_LIBXSLT\n";
}
if ($self->{options}->{gss})
{
print $o "#define ENABLE_GSS 1\n";
}
if ($self->{options}->{openssl})
{
print $o "#define USE_OPENSSL 1\n";
my ($digit1, $digit2, $digit3) = $self->GetOpenSSLVersion();
# More symbols are needed with OpenSSL 1.1.0 and above.
if ($digit1 >= '1' && $digit2 >= '1' && $digit3 >= '0')
{
print $o "#define HAVE_ASN1_STRING_GET0_DATA 1\n";
print $o "#define HAVE_BIO_GET_DATA 1\n";
print $o "#define HAVE_BIO_METH_NEW 1\n";
print $o "#define HAVE_OPENSSL_INIT_SSL 1\n";
}
}
if ($self->{options}->{icu})
{
print $o "#define USE_ICU 1\n";
}
if (my $port = $self->{options}->{"--with-pgport"})
{
print $o "#undef DEF_PGPORT\n";
print $o "#undef DEF_PGPORT_STR\n";
print $o "#define DEF_PGPORT $port\n";
print $o "#define DEF_PGPORT_STR \"$port\"\n";
}
print $o "#define VAL_CONFIGURE \""
. $self->GetFakeConfigure() . "\"\n";
print $o "#endif /* IGNORE_CONFIGURED_SETTINGS */\n";
close($o);
close($i);
}
if (IsNewer(
"src/include/pg_config_ext.h",
"src/include/pg_config_ext.h.win32"))
{
print "Copying pg_config_ext.h...\n";
copyFile(
"src/include/pg_config_ext.h.win32",
"src/include/pg_config_ext.h");
}
$self->GenerateConfigHeader('src/include/pg_config.h', \%define, 1);
$self->GenerateConfigHeader('src/include/pg_config_ext.h', \%define, 0);
$self->GenerateConfigHeader('src/interfaces/ecpg/include/ecpg_config.h', \%define, 0);
open(my $f, '>>', 'src/include/pg_config.h')
|| confess "Could not write to src/include/pg_config.h\n";
print $f "\n";
print $f "#define VAL_CONFIGURE \"" . $self->GetFakeConfigure() . "\"\n";
close($f);
$self->GenerateDefFile(
"src/interfaces/libpq/libpqdll.def",
@@ -475,22 +752,6 @@ sub GenerateFiles
chdir('../../../..');
}
if (IsNewer(
'src/interfaces/ecpg/include/ecpg_config.h',
'src/interfaces/ecpg/include/ecpg_config.h.in'))
{
print "Generating ecpg_config.h...\n";
open(my $o, '>', 'src/interfaces/ecpg/include/ecpg_config.h')
|| confess "Could not open ecpg_config.h";
print $o <<EOF;
#define HAVE_LONG_LONG_INT 1
#define HAVE_LONG_LONG_INT_64 1
#define PG_USE_STDBOOL 1
#define ENABLE_THREAD_SAFETY 1
EOF
close($o);
}
unless (-f "src/port/pg_config_paths.h")
{
print "Generating pg_config_paths.h...\n";
@@ -581,13 +842,76 @@ EOF
open(my $o, '>', "doc/src/sgml/version.sgml")
|| croak "Could not write to version.sgml\n";
print $o <<EOF;
<!ENTITY version "$self->{strver}">
<!ENTITY version "$package_version">
<!ENTITY majorversion "$self->{majorver}">
EOF
close($o);
return;
}
# Read lines from input file and substitute symbols using the same
# logic that config.status uses. There should be one call of this for
# each AC_CONFIG_HEADERS call in configure.in.
#
# If the "required" argument is true, we also keep track which of our
# defines have been found and error out if any are left unused at the
# end. That way we avoid accumulating defines in this file that are
# no longer used by configure.
sub GenerateConfigHeader
{
my ($self, $config_header, $defines, $required) = @_;
my %defines_copy = %$defines;
my $config_header_in = $config_header . '.in';
if (IsNewer($config_header, $config_header_in) ||
IsNewer($config_header, __FILE__))
{
open(my $i, '<', $config_header_in)
|| confess "Could not open $config_header_in\n";
open(my $o, '>', $config_header)
|| confess "Could not write to $config_header\n";
print $o
"/* $config_header. Generated from $config_header_in by src/tools/msvc/Solution.pm. */\n";
while (<$i>)
{
if (m/^#(\s*)undef\s+(\w+)/)
{
my $ws = $1;
my $macro = $2;
if (exists $defines->{$macro})
{
if (defined $defines->{$macro})
{
print $o "#${ws}define $macro ", $defines->{$macro}, "\n";
}
else
{
print $o "/* #${ws}undef $macro */\n";
}
delete $defines_copy{$macro};
}
else
{
croak "undefined symbol: $macro at $config_header line $.";
}
}
else
{
print $o $_;
}
}
close($o);
close($i);
}
if ($required && scalar(keys %defines_copy) > 0)
{
croak "unused defines: " . join(' ', keys %defines_copy);
}
}
sub GenerateDefFile
{
my ($self, $deffile, $txtfile, $libname) = @_;