| package Solution; |
| |
| # |
| # Package that encapsulates a Visual C++ solution file generation |
| # |
| # src/tools/msvc/Solution.pm |
| # |
| use Carp; |
| use strict; |
| use warnings; |
| use VSObjectFactory; |
| |
| no warnings qw(redefine); ## no critic |
| |
| sub _new |
| { |
| my $classname = shift; |
| my $options = shift; |
| my $self = { |
| projects => {}, |
| options => $options, |
| VisualStudioVersion => undef, |
| MinimumVisualStudioVersion => undef, |
| vcver => undef, |
| platform => undef, |
| }; |
| bless($self, $classname); |
| |
| $self->DeterminePlatform(); |
| |
| if ($options->{xslt} && !$options->{xml}) |
| { |
| die "XSLT requires XML\n"; |
| } |
| $options->{blocksize} = 8 |
| unless $options->{blocksize}; # undef or 0 means default |
| die "Bad blocksize $options->{blocksize}" |
| unless grep { $_ == $options->{blocksize} } (1, 2, 4, 8, 16, 32); |
| $options->{segsize} = 1 |
| unless $options->{segsize}; # undef or 0 means default |
| # only allow segsize 1 for now, as we can't do large files yet in windows |
| die "Bad segsize $options->{segsize}" |
| unless $options->{segsize} == 1; |
| $options->{wal_blocksize} = 8 |
| unless $options->{wal_blocksize}; # undef or 0 means default |
| die "Bad wal_blocksize $options->{wal_blocksize}" |
| unless grep { $_ == $options->{wal_blocksize} } |
| (1, 2, 4, 8, 16, 32, 64); |
| |
| return $self; |
| } |
| |
| sub GetAdditionalHeaders |
| { |
| return ''; |
| } |
| |
| sub DeterminePlatform |
| { |
| my $self = shift; |
| |
| if ($^O eq "MSWin32") |
| { |
| # Examine CL help output to determine if we are in 32 or 64-bit mode. |
| my $output = `cl /? 2>&1`; |
| $? >> 8 == 0 or die "cl command not found"; |
| $self->{platform} = |
| ($output =~ /^\/favor:<.+AMD64/m) ? 'x64' : 'Win32'; |
| } |
| else |
| { |
| $self->{platform} = 'FAKE'; |
| } |
| print "Detected hardware platform: $self->{platform}\n"; |
| return; |
| } |
| |
| # Return 1 if $oldfile is newer than $newfile, or if $newfile doesn't exist. |
| # Special case - if config.pl has changed, always return 1 |
| sub IsNewer |
| { |
| my ($newfile, $oldfile) = @_; |
| -e $oldfile or warn "source file \"$oldfile\" does not exist"; |
| if ( $oldfile ne 'src/tools/msvc/config.pl' |
| && $oldfile ne 'src/tools/msvc/config_default.pl') |
| { |
| return 1 |
| if (-f 'src/tools/msvc/config.pl') |
| && IsNewer($newfile, 'src/tools/msvc/config.pl'); |
| return 1 |
| if (-f 'src/tools/msvc/config_default.pl') |
| && IsNewer($newfile, 'src/tools/msvc/config_default.pl'); |
| } |
| return 1 if (!(-e $newfile)); |
| my @nstat = stat($newfile); |
| my @ostat = stat($oldfile); |
| return 1 if ($nstat[9] < $ostat[9]); |
| return 0; |
| } |
| |
| # Copy a file, *not* preserving date. Only works for text files. |
| sub copyFile |
| { |
| my ($src, $dest) = @_; |
| open(my $i, '<', $src) || croak "Could not open $src"; |
| open(my $o, '>', $dest) || croak "Could not open $dest"; |
| while (<$i>) |
| { |
| print $o $_; |
| } |
| close($i); |
| close($o); |
| return; |
| } |
| |
| # Fetch version of OpenSSL based on a parsing of the command shipped with |
| # the installer this build is linking to. This returns as result an array |
| # made of the three first digits of the OpenSSL version, which is enough |
| # to decide which options to apply depending on the version of OpenSSL |
| # linking with. |
| sub GetOpenSSLVersion |
| { |
| my $self = shift; |
| |
| # Attempt to get OpenSSL version and location. This assumes that |
| # openssl.exe is in the specified directory. |
| # Quote the .exe name in case it has spaces |
| my $opensslcmd = |
| qq("$self->{options}->{openssl}\\bin\\openssl.exe" version 2>&1); |
| my $sslout = `$opensslcmd`; |
| |
| $? >> 8 == 0 |
| or croak |
| "Unable to determine OpenSSL version: The openssl.exe command wasn't found."; |
| |
| if ($sslout =~ /(\d+)\.(\d+)\.(\d+)(\D)/m) |
| { |
| return ($1, $2, $3); |
| } |
| |
| croak |
| "Unable to determine OpenSSL version: The openssl.exe version could not be determined."; |
| } |
| |
| sub GenerateFiles |
| { |
| my $self = shift; |
| my $bits = $self->{platform} eq 'Win32' ? 32 : 64; |
| my $ac_init_found = 0; |
| my $package_name; |
| my $package_version; |
| my $package_bugreport; |
| my $package_url; |
| my ($majorver, $minorver); |
| my $pg_graph_version; |
| my $pg_graph_comp_version; |
| |
| # 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\(\[([^\]]+)\], \[([^\]]+)\], \[([^\]]+)\], \[([^\]]*)\], \[([^\]]+)\]/ |
| ) |
| { |
| $ac_init_found = 1; |
| |
| $package_name = $1; |
| $package_version = $2; |
| $package_bugreport = $3; |
| #$package_tarname = $4; |
| $package_url = $5; |
| |
| if ($package_version !~ /^(\d+)(?:\.(\d+))?/) |
| { |
| confess "Bad format of version: $package_version\n"; |
| } |
| $majorver = sprintf("%d", $1); |
| $minorver = sprintf("%d", $2 ? $2 : 0); |
| } |
| |
| # PG_GRAPH_VERSION |
| if (/\[PG_GRAPH_VERSION=([^\]]+)\]/) |
| { |
| $pg_graph_version = $1; |
| } |
| |
| # PG_GRAPH_COMP_VERSION |
| if (/\[PG_GRAPH_COMP_VERSION=([^\]]+)\]/) |
| { |
| $pg_graph_comp_version = $1; |
| } |
| } |
| close($c); |
| confess "Unable to parse configure.in for all variables!" |
| unless $ac_init_found; |
| |
| 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 "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}, |
| CONFIGURE_ARGS => '"' . $self->GetFakeConfigure() . '"', |
| 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, |
| 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_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 => 0, |
| HAVE_DECL_LLVMCREATEPERFJITEVENTLISTENER => 0, |
| HAVE_DECL_LLVMGETHOSTCPUNAME => 0, |
| HAVE_DECL_LLVMGETHOSTCPUFEATURES => 0, |
| HAVE_DECL_LLVMORCGETSYMBOLADDRESSIN => 0, |
| HAVE_DECL_POSIX_FADVISE => 0, |
| HAVE_DECL_RTLD_GLOBAL => 0, |
| HAVE_DECL_RTLD_NOW => 0, |
| HAVE_DECL_STRLCAT => 0, |
| HAVE_DECL_STRLCPY => 0, |
| 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_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_IFADDRS_H => undef, |
| HAVE_INET_ATON => undef, |
| HAVE_INT_TIMEZONE => 1, |
| HAVE_INT64 => undef, |
| HAVE_INT8 => undef, |
| HAVE_INTTYPES_H => undef, |
| HAVE_INT_OPTERR => undef, |
| HAVE_INT_OPTRESET => undef, |
| HAVE_IPV6 => 1, |
| HAVE_I_CONSTRAINT__BUILTIN_CONSTANT_P => undef, |
| HAVE_KQUEUE => undef, |
| HAVE_LANGINFO_H => undef, |
| HAVE_LDAP_H => undef, |
| HAVE_LDAP_INITIALIZE => undef, |
| HAVE_LIBCRYPTO => undef, |
| HAVE_LIBLDAP => 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_LINK => 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_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_RL_COMPLETION_APPEND_CHARACTER => undef, |
| HAVE_RL_COMPLETION_MATCHES => undef, |
| HAVE_RL_COMPLETION_SUPPRESS_QUOTE => undef, |
| HAVE_RL_FILENAME_COMPLETION_FUNCTION => undef, |
| HAVE_RL_FILENAME_QUOTE_CHARACTERS => undef, |
| HAVE_RL_FILENAME_QUOTING_FUNCTION => undef, |
| HAVE_RL_RESET_SCREEN_SIZE => undef, |
| HAVE_SECURITY_PAM_APPL_H => undef, |
| HAVE_SETENV => 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 => 1, |
| 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_SOCKADDR_UN => 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_EVENT_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_UNION_SEMUN => undef, |
| HAVE_UNISTD_H => 1, |
| HAVE_UNSETENV => undef, |
| HAVE_USELOCALE => undef, |
| 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_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_FRAME_ADDRESS => 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 => qq{"$package_url"}, |
| PACKAGE_VERSION => qq{"$package_version"}, |
| PG_INT128_TYPE => undef, |
| PG_INT64_TYPE => 'long long int', |
| PG_KRB_SRVNAM => qq{"postgres"}, |
| PG_MAJORVERSION => qq{"$majorver"}, |
| PG_MAJORVERSION_NUM => $majorver, |
| PG_MINORVERSION_NUM => $minorver, |
| PG_PRINTF_ATTRIBUTE => undef, |
| PG_USE_STDBOOL => 1, |
| PG_VERSION => qq{"$package_version$extraver"}, |
| PG_VERSION_NUM => sprintf("%d%04d", $majorver, $minorver), |
| PG_VERSION_STR => |
| qq{"PostgreSQL $package_version$extraver,(pg_graph $pg_graph_version) 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', |
| pg_restrict => '__restrict', |
| # not defined, because it'd conflict with __declspec(restrict) |
| restrict => undef, |
| typeof => undef, |
| # PgGraph |
| PG_GRAPH_COMP_VERSION => qq{"$pg_graph_comp_version"}, |
| PG_GRAPH_VERSION => qq{"$pg_graph_version"}, |
| # We will not care about revision on Windows |
| AG_GIT_REVISION => qq{"win_no_rev"},); |
| |
| if ($self->{options}->{uuid}) |
| { |
| $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; |
| |
| my ($digit1, $digit2, $digit3) = $self->GetOpenSSLVersion(); |
| |
| # More symbols are needed with OpenSSL 1.1.0 and above. |
| if ( ($digit1 >= '3' && $digit2 >= '0' && $digit3 >= '0') |
| || ($digit1 >= '1' && $digit2 >= '1' && $digit3 >= '0')) |
| { |
| $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; |
| } |
| } |
| |
| $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); |
| |
| $self->GenerateDefFile( |
| "src/interfaces/libpq/libpqdll.def", |
| "src/interfaces/libpq/exports.txt", |
| "LIBPQ"); |
| $self->GenerateDefFile( |
| "src/interfaces/ecpg/ecpglib/ecpglib.def", |
| "src/interfaces/ecpg/ecpglib/exports.txt", |
| "LIBECPG"); |
| $self->GenerateDefFile( |
| "src/interfaces/ecpg/compatlib/compatlib.def", |
| "src/interfaces/ecpg/compatlib/exports.txt", |
| "LIBECPG_COMPAT"); |
| $self->GenerateDefFile( |
| "src/interfaces/ecpg/pgtypeslib/pgtypeslib.def", |
| "src/interfaces/ecpg/pgtypeslib/exports.txt", |
| "LIBPGTYPES"); |
| |
| chdir('src/backend/utils'); |
| my $pg_proc_dat = '../../../src/include/catalog/pg_proc.dat'; |
| if ( IsNewer('fmgr-stamp', 'Gen_fmgrtab.pl') |
| || IsNewer('fmgr-stamp', '../catalog/Catalog.pm') |
| || IsNewer('fmgr-stamp', $pg_proc_dat) |
| || IsNewer('fmgr-stamp', '../../../src/include/access/transam.h')) |
| { |
| system( |
| "perl -I ../catalog Gen_fmgrtab.pl --include-path ../../../src/include/ $pg_proc_dat" |
| ); |
| open(my $f, '>', 'fmgr-stamp') |
| || confess "Could not touch fmgr-stamp"; |
| close($f); |
| } |
| chdir('../../..'); |
| |
| if (IsNewer( |
| 'src/include/utils/fmgroids.h', |
| 'src/backend/utils/fmgroids.h')) |
| { |
| copyFile('src/backend/utils/fmgroids.h', |
| 'src/include/utils/fmgroids.h'); |
| } |
| |
| if (IsNewer( |
| 'src/include/utils/fmgrprotos.h', |
| 'src/backend/utils/fmgrprotos.h')) |
| { |
| copyFile( |
| 'src/backend/utils/fmgrprotos.h', |
| 'src/include/utils/fmgrprotos.h'); |
| } |
| |
| if (IsNewer( |
| 'src/include/storage/lwlocknames.h', |
| 'src/backend/storage/lmgr/lwlocknames.txt')) |
| { |
| print "Generating lwlocknames.c and lwlocknames.h...\n"; |
| chdir('src/backend/storage/lmgr'); |
| system('perl generate-lwlocknames.pl lwlocknames.txt'); |
| chdir('../../../..'); |
| } |
| if (IsNewer( |
| 'src/include/storage/lwlocknames.h', |
| 'src/backend/storage/lmgr/lwlocknames.h')) |
| { |
| copyFile( |
| 'src/backend/storage/lmgr/lwlocknames.h', |
| 'src/include/storage/lwlocknames.h'); |
| } |
| |
| if (IsNewer('src/include/utils/probes.h', 'src/backend/utils/probes.d')) |
| { |
| print "Generating probes.h...\n"; |
| system( |
| 'perl src/backend/utils/Gen_dummy_probes.pl src/backend/utils/probes.d > src/include/utils/probes.h' |
| ); |
| } |
| |
| if ($self->{options}->{python} |
| && IsNewer( |
| 'src/pl/plpython/spiexceptions.h', |
| 'src/backend/utils/errcodes.txt')) |
| { |
| print "Generating spiexceptions.h...\n"; |
| system( |
| 'perl src/pl/plpython/generate-spiexceptions.pl src/backend/utils/errcodes.txt > src/pl/plpython/spiexceptions.h' |
| ); |
| } |
| |
| if (IsNewer( |
| 'src/include/utils/errcodes.h', |
| 'src/backend/utils/errcodes.txt')) |
| { |
| print "Generating errcodes.h...\n"; |
| system( |
| 'perl src/backend/utils/generate-errcodes.pl src/backend/utils/errcodes.txt > src/backend/utils/errcodes.h' |
| ); |
| copyFile('src/backend/utils/errcodes.h', |
| 'src/include/utils/errcodes.h'); |
| } |
| |
| if (IsNewer( |
| 'src/pl/plpgsql/src/plerrcodes.h', |
| 'src/backend/utils/errcodes.txt')) |
| { |
| print "Generating plerrcodes.h...\n"; |
| system( |
| 'perl src/pl/plpgsql/src/generate-plerrcodes.pl src/backend/utils/errcodes.txt > src/pl/plpgsql/src/plerrcodes.h' |
| ); |
| } |
| |
| if ($self->{options}->{tcl} |
| && IsNewer( |
| 'src/pl/tcl/pltclerrcodes.h', 'src/backend/utils/errcodes.txt')) |
| { |
| print "Generating pltclerrcodes.h...\n"; |
| system( |
| 'perl src/pl/tcl/generate-pltclerrcodes.pl src/backend/utils/errcodes.txt > src/pl/tcl/pltclerrcodes.h' |
| ); |
| } |
| |
| if (IsNewer( |
| 'src/backend/utils/sort/qsort_tuple.c', |
| 'src/backend/utils/sort/gen_qsort_tuple.pl')) |
| { |
| print "Generating qsort_tuple.c...\n"; |
| system( |
| 'perl src/backend/utils/sort/gen_qsort_tuple.pl > src/backend/utils/sort/qsort_tuple.c' |
| ); |
| } |
| |
| if (IsNewer('src/bin/psql/sql_help.h', 'src/bin/psql/create_help.pl')) |
| { |
| print "Generating sql_help.h...\n"; |
| chdir('src/bin/psql'); |
| system("perl create_help.pl ../../../doc/src/sgml/ref sql_help"); |
| chdir('../../..'); |
| } |
| |
| if (IsNewer('src/common/kwlist_d.h', 'src/include/parser/kwlist.h')) |
| { |
| print "Generating kwlist_d.h...\n"; |
| system( |
| 'perl -I src/tools src/tools/gen_keywordlist.pl --extern -o src/common src/include/parser/kwlist.h' |
| ); |
| } |
| |
| if (IsNewer( |
| 'src/pl/plpgsql/src/pl_reserved_kwlist_d.h', |
| 'src/pl/plpgsql/src/pl_reserved_kwlist.h') |
| || IsNewer( |
| 'src/pl/plpgsql/src/pl_unreserved_kwlist_d.h', |
| 'src/pl/plpgsql/src/pl_unreserved_kwlist.h')) |
| { |
| print |
| "Generating pl_reserved_kwlist_d.h and pl_unreserved_kwlist_d.h...\n"; |
| chdir('src/pl/plpgsql/src'); |
| system( |
| 'perl -I ../../../tools ../../../tools/gen_keywordlist.pl --varname ReservedPLKeywords pl_reserved_kwlist.h' |
| ); |
| system( |
| 'perl -I ../../../tools ../../../tools/gen_keywordlist.pl --varname UnreservedPLKeywords pl_unreserved_kwlist.h' |
| ); |
| chdir('../../../..'); |
| } |
| |
| if (IsNewer( |
| 'src/interfaces/ecpg/preproc/c_kwlist_d.h', |
| 'src/interfaces/ecpg/preproc/c_kwlist.h') |
| || IsNewer( |
| 'src/interfaces/ecpg/preproc/ecpg_kwlist_d.h', |
| 'src/interfaces/ecpg/preproc/ecpg_kwlist.h')) |
| { |
| print "Generating c_kwlist_d.h and ecpg_kwlist_d.h...\n"; |
| chdir('src/interfaces/ecpg/preproc'); |
| system( |
| 'perl -I ../../../tools ../../../tools/gen_keywordlist.pl --varname ScanCKeywords --no-case-fold c_kwlist.h' |
| ); |
| system( |
| 'perl -I ../../../tools ../../../tools/gen_keywordlist.pl --varname ScanECPGKeywords ecpg_kwlist.h' |
| ); |
| chdir('../../../..'); |
| } |
| |
| if (IsNewer( |
| 'src/interfaces/ecpg/preproc/preproc.y', |
| 'src/backend/parser/gram.y')) |
| { |
| print "Generating preproc.y...\n"; |
| chdir('src/interfaces/ecpg/preproc'); |
| system('perl parse.pl < ../../../backend/parser/gram.y > preproc.y'); |
| chdir('../../../..'); |
| } |
| |
| unless (-f "src/port/pg_config_paths.h") |
| { |
| print "Generating pg_config_paths.h...\n"; |
| open(my $o, '>', 'src/port/pg_config_paths.h') |
| || confess "Could not open pg_config_paths.h"; |
| print $o <<EOF; |
| #define PGBINDIR "/bin" |
| #define PGSHAREDIR "/share" |
| #define SYSCONFDIR "/etc" |
| #define INCLUDEDIR "/include" |
| #define PKGINCLUDEDIR "/include" |
| #define INCLUDEDIRSERVER "/include/server" |
| #define LIBDIR "/lib" |
| #define PKGLIBDIR "/lib" |
| #define LOCALEDIR "/share/locale" |
| #define DOCDIR "/doc" |
| #define HTMLDIR "/doc" |
| #define MANDIR "/man" |
| EOF |
| close($o); |
| } |
| |
| my $mf = Project::read_file('src/backend/catalog/Makefile'); |
| $mf =~ s{\\\r?\n}{}g; |
| $mf =~ /^CATALOG_HEADERS\s*:?=(.*)$/gm |
| || croak "Could not find CATALOG_HEADERS in Makefile\n"; |
| my @bki_srcs = split /\s+/, $1; |
| push @bki_srcs, 'toasting.h'; |
| push @bki_srcs, 'indexing.h'; |
| $mf =~ /^POSTGRES_BKI_DATA\s*:?=[^,]+,(.*)\)$/gm |
| || croak "Could not find POSTGRES_BKI_DATA in Makefile\n"; |
| my @bki_data = split /\s+/, $1; |
| |
| my $need_genbki = 0; |
| foreach my $bki (@bki_srcs, @bki_data) |
| { |
| next if $bki eq ""; |
| if (IsNewer( |
| 'src/backend/catalog/bki-stamp', |
| "src/include/catalog/$bki")) |
| { |
| $need_genbki = 1; |
| last; |
| } |
| } |
| $need_genbki = 1 |
| if IsNewer('src/backend/catalog/bki-stamp', |
| 'src/backend/catalog/genbki.pl'); |
| $need_genbki = 1 |
| if IsNewer('src/backend/catalog/bki-stamp', |
| 'src/backend/catalog/Catalog.pm'); |
| if ($need_genbki) |
| { |
| chdir('src/backend/catalog'); |
| my $bki_srcs = join(' ../../../src/include/catalog/', @bki_srcs); |
| system( |
| "perl genbki.pl --include-path ../../../src/include/ --set-version=$majorver $bki_srcs" |
| ); |
| open(my $f, '>', 'bki-stamp') |
| || confess "Could not touch bki-stamp"; |
| close($f); |
| chdir('../../..'); |
| } |
| |
| if (IsNewer( |
| 'src/include/catalog/header-stamp', |
| 'src/backend/catalog/bki-stamp')) |
| { |
| # Copy generated headers to include directory. |
| opendir(my $dh, 'src/backend/catalog/') |
| || die "Can't opendir src/backend/catalog/ $!"; |
| my @def_headers = grep { /pg_\w+_d\.h$/ } readdir($dh); |
| closedir $dh; |
| foreach my $def_header (@def_headers) |
| { |
| copyFile( |
| "src/backend/catalog/$def_header", |
| "src/include/catalog/$def_header"); |
| } |
| copyFile( |
| 'src/backend/catalog/schemapg.h', |
| 'src/include/catalog/schemapg.h'); |
| open(my $chs, '>', 'src/include/catalog/header-stamp') |
| || confess "Could not touch header-stamp"; |
| close($chs); |
| } |
| |
| open(my $o, '>', "doc/src/sgml/version.sgml") |
| || croak "Could not write to version.sgml\n"; |
| print $o <<EOF; |
| <!ENTITY version "$package_version"> |
| <!ENTITY majorversion "$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 $config_header_in = $config_header . '.in'; |
| |
| if ( IsNewer($config_header, $config_header_in) |
| || IsNewer($config_header, __FILE__)) |
| { |
| my %defines_copy = %$defines; |
| |
| 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) = @_; |
| |
| if (IsNewer($deffile, $txtfile)) |
| { |
| print "Generating $deffile...\n"; |
| open(my $if, '<', $txtfile) || confess("Could not open $txtfile\n"); |
| open(my $of, '>', $deffile) || confess("Could not open $deffile\n"); |
| print $of "LIBRARY $libname\nEXPORTS\n"; |
| while (<$if>) |
| { |
| next if (/^#/); |
| next if (/^\s*$/); |
| my ($f, $o) = split; |
| print $of " $f @ $o\n"; |
| } |
| close($of); |
| close($if); |
| } |
| return; |
| } |
| |
| sub AddProject |
| { |
| my ($self, $name, $type, $folder, $initialdir) = @_; |
| |
| my $proj = |
| VSObjectFactory::CreateProject($self->{vcver}, $name, $type, $self); |
| push @{ $self->{projects}->{$folder} }, $proj; |
| $proj->AddDir($initialdir) if ($initialdir); |
| if ($self->{options}->{zlib}) |
| { |
| $proj->AddIncludeDir($self->{options}->{zlib} . '\include'); |
| $proj->AddLibrary($self->{options}->{zlib} . '\lib\zdll.lib'); |
| } |
| if ($self->{options}->{openssl}) |
| { |
| $proj->AddIncludeDir($self->{options}->{openssl} . '\include'); |
| my ($digit1, $digit2, $digit3) = $self->GetOpenSSLVersion(); |
| |
| # Starting at version 1.1.0 the OpenSSL installers have |
| # changed their library names from: |
| # - libeay to libcrypto |
| # - ssleay to libssl |
| if ( ($digit1 >= '3' && $digit2 >= '0' && $digit3 >= '0') |
| || ($digit1 >= '1' && $digit2 >= '1' && $digit3 >= '0')) |
| { |
| my $dbgsuffix; |
| my $libsslpath; |
| my $libcryptopath; |
| |
| # The format name of the libraries is slightly |
| # different between the Win32 and Win64 platform, so |
| # adapt. |
| if (-e "$self->{options}->{openssl}/lib/VC/sslcrypto32MD.lib") |
| { |
| # Win32 here, with a debugging library set. |
| $dbgsuffix = 1; |
| $libsslpath = '\lib\VC\libssl32.lib'; |
| $libcryptopath = '\lib\VC\libcrypto32.lib'; |
| } |
| elsif (-e "$self->{options}->{openssl}/lib/VC/sslcrypto64MD.lib") |
| { |
| # Win64 here, with a debugging library set. |
| $dbgsuffix = 1; |
| $libsslpath = '\lib\VC\libssl64.lib'; |
| $libcryptopath = '\lib\VC\libcrypto64.lib'; |
| } |
| else |
| { |
| # On both Win32 and Win64 the same library |
| # names are used without a debugging context. |
| $dbgsuffix = 0; |
| $libsslpath = '\lib\libssl.lib'; |
| $libcryptopath = '\lib\libcrypto.lib'; |
| } |
| |
| $proj->AddLibrary($self->{options}->{openssl} . $libsslpath, |
| $dbgsuffix); |
| $proj->AddLibrary($self->{options}->{openssl} . $libcryptopath, |
| $dbgsuffix); |
| } |
| else |
| { |
| # Choose which set of libraries to use depending on if |
| # debugging libraries are in place in the installer. |
| if (-e "$self->{options}->{openssl}/lib/VC/ssleay32MD.lib") |
| { |
| $proj->AddLibrary( |
| $self->{options}->{openssl} . '\lib\VC\ssleay32.lib', 1); |
| $proj->AddLibrary( |
| $self->{options}->{openssl} . '\lib\VC\libeay32.lib', 1); |
| } |
| else |
| { |
| # We don't expect the config-specific library |
| # to be here, so don't ask for it in last |
| # parameter. |
| $proj->AddLibrary( |
| $self->{options}->{openssl} . '\lib\ssleay32.lib', 0); |
| $proj->AddLibrary( |
| $self->{options}->{openssl} . '\lib\libeay32.lib', 0); |
| } |
| } |
| } |
| if ($self->{options}->{nls}) |
| { |
| $proj->AddIncludeDir($self->{options}->{nls} . '\include'); |
| $proj->AddLibrary($self->{options}->{nls} . '\lib\libintl.lib'); |
| } |
| if ($self->{options}->{gss}) |
| { |
| $proj->AddIncludeDir($self->{options}->{gss} . '\include'); |
| $proj->AddIncludeDir($self->{options}->{gss} . '\include\krb5'); |
| if ($self->{platform} eq 'Win32') |
| { |
| $proj->AddLibrary( |
| $self->{options}->{gss} . '\lib\i386\krb5_32.lib'); |
| $proj->AddLibrary( |
| $self->{options}->{gss} . '\lib\i386\comerr32.lib'); |
| $proj->AddLibrary( |
| $self->{options}->{gss} . '\lib\i386\gssapi32.lib'); |
| } |
| else |
| { |
| $proj->AddLibrary( |
| $self->{options}->{gss} . '\lib\amd64\krb5_64.lib'); |
| $proj->AddLibrary( |
| $self->{options}->{gss} . '\lib\amd64\comerr64.lib'); |
| $proj->AddLibrary( |
| $self->{options}->{gss} . '\lib\amd64\gssapi64.lib'); |
| } |
| } |
| if ($self->{options}->{iconv}) |
| { |
| $proj->AddIncludeDir($self->{options}->{iconv} . '\include'); |
| $proj->AddLibrary($self->{options}->{iconv} . '\lib\iconv.lib'); |
| } |
| if ($self->{options}->{icu}) |
| { |
| $proj->AddIncludeDir($self->{options}->{icu} . '\include'); |
| if ($self->{platform} eq 'Win32') |
| { |
| $proj->AddLibrary($self->{options}->{icu} . '\lib\icuin.lib'); |
| $proj->AddLibrary($self->{options}->{icu} . '\lib\icuuc.lib'); |
| $proj->AddLibrary($self->{options}->{icu} . '\lib\icudt.lib'); |
| } |
| else |
| { |
| $proj->AddLibrary($self->{options}->{icu} . '\lib64\icuin.lib'); |
| $proj->AddLibrary($self->{options}->{icu} . '\lib64\icuuc.lib'); |
| $proj->AddLibrary($self->{options}->{icu} . '\lib64\icudt.lib'); |
| } |
| } |
| if ($self->{options}->{xml}) |
| { |
| $proj->AddIncludeDir($self->{options}->{xml} . '\include'); |
| $proj->AddIncludeDir($self->{options}->{xml} . '\include\libxml2'); |
| $proj->AddLibrary($self->{options}->{xml} . '\lib\libxml2.lib'); |
| } |
| if ($self->{options}->{xslt}) |
| { |
| $proj->AddIncludeDir($self->{options}->{xslt} . '\include'); |
| $proj->AddLibrary($self->{options}->{xslt} . '\lib\libxslt.lib'); |
| } |
| if ($self->{options}->{uuid}) |
| { |
| $proj->AddIncludeDir($self->{options}->{uuid} . '\include'); |
| $proj->AddLibrary($self->{options}->{uuid} . '\lib\uuid.lib'); |
| } |
| return $proj; |
| } |
| |
| sub Save |
| { |
| my ($self) = @_; |
| my %flduid; |
| |
| $self->GenerateFiles(); |
| foreach my $fld (keys %{ $self->{projects} }) |
| { |
| foreach my $proj (@{ $self->{projects}->{$fld} }) |
| { |
| $proj->Save(); |
| } |
| } |
| |
| open(my $sln, '>', "pgsql.sln") || croak "Could not write to pgsql.sln\n"; |
| print $sln <<EOF; |
| Microsoft Visual Studio Solution File, Format Version $self->{solutionFileVersion} |
| # $self->{visualStudioName} |
| EOF |
| |
| print $sln $self->GetAdditionalHeaders(); |
| |
| foreach my $fld (keys %{ $self->{projects} }) |
| { |
| foreach my $proj (@{ $self->{projects}->{$fld} }) |
| { |
| print $sln <<EOF; |
| Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "$proj->{name}", "$proj->{name}$proj->{filenameExtension}", "$proj->{guid}" |
| EndProject |
| EOF |
| } |
| if ($fld ne "") |
| { |
| $flduid{$fld} = $^O eq "MSWin32" ? Win32::GuidGen() : 'FAKE'; |
| print $sln <<EOF; |
| Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "$fld", "$fld", "$flduid{$fld}" |
| EndProject |
| EOF |
| } |
| } |
| |
| print $sln <<EOF; |
| Global |
| GlobalSection(SolutionConfigurationPlatforms) = preSolution |
| Debug|$self->{platform}= Debug|$self->{platform} |
| Release|$self->{platform} = Release|$self->{platform} |
| EndGlobalSection |
| GlobalSection(ProjectConfigurationPlatforms) = postSolution |
| EOF |
| |
| foreach my $fld (keys %{ $self->{projects} }) |
| { |
| foreach my $proj (@{ $self->{projects}->{$fld} }) |
| { |
| print $sln <<EOF; |
| $proj->{guid}.Debug|$self->{platform}.ActiveCfg = Debug|$self->{platform} |
| $proj->{guid}.Debug|$self->{platform}.Build.0 = Debug|$self->{platform} |
| $proj->{guid}.Release|$self->{platform}.ActiveCfg = Release|$self->{platform} |
| $proj->{guid}.Release|$self->{platform}.Build.0 = Release|$self->{platform} |
| EOF |
| } |
| } |
| |
| print $sln <<EOF; |
| EndGlobalSection |
| GlobalSection(SolutionProperties) = preSolution |
| HideSolutionNode = FALSE |
| EndGlobalSection |
| GlobalSection(NestedProjects) = preSolution |
| EOF |
| |
| foreach my $fld (keys %{ $self->{projects} }) |
| { |
| next if ($fld eq ""); |
| foreach my $proj (@{ $self->{projects}->{$fld} }) |
| { |
| print $sln "\t\t$proj->{guid} = $flduid{$fld}\n"; |
| } |
| } |
| |
| print $sln <<EOF; |
| EndGlobalSection |
| EndGlobal |
| EOF |
| close($sln); |
| return; |
| } |
| |
| sub GetFakeConfigure |
| { |
| my $self = shift; |
| |
| my $cfg = '--enable-thread-safety'; |
| $cfg .= ' --enable-cassert' if ($self->{options}->{asserts}); |
| $cfg .= ' --enable-nls' if ($self->{options}->{nls}); |
| $cfg .= ' --enable-tap-tests' if ($self->{options}->{tap_tests}); |
| $cfg .= ' --with-ldap' if ($self->{options}->{ldap}); |
| $cfg .= ' --without-zlib' unless ($self->{options}->{zlib}); |
| $cfg .= ' --with-extra-version' if ($self->{options}->{extraver}); |
| $cfg .= ' --with-openssl' if ($self->{options}->{openssl}); |
| $cfg .= ' --with-uuid' if ($self->{options}->{uuid}); |
| $cfg .= ' --with-libxml' if ($self->{options}->{xml}); |
| $cfg .= ' --with-libxslt' if ($self->{options}->{xslt}); |
| $cfg .= ' --with-gssapi' if ($self->{options}->{gss}); |
| $cfg .= ' --with-icu' if ($self->{options}->{icu}); |
| $cfg .= ' --with-tcl' if ($self->{options}->{tcl}); |
| $cfg .= ' --with-perl' if ($self->{options}->{perl}); |
| $cfg .= ' --with-python' if ($self->{options}->{python}); |
| my $port = $self->{options}->{'--with-pgport'}; |
| $cfg .= " --with-pgport=$port" if defined($port); |
| |
| return $cfg; |
| } |
| |
| package VS2013Solution; |
| |
| # |
| # Package that encapsulates a Visual Studio 2013 solution file |
| # |
| |
| use Carp; |
| use strict; |
| use warnings; |
| use base qw(Solution); |
| |
| no warnings qw(redefine); ## no critic |
| |
| sub new |
| { |
| my $classname = shift; |
| my $self = $classname->SUPER::_new(@_); |
| bless($self, $classname); |
| |
| $self->{solutionFileVersion} = '12.00'; |
| $self->{vcver} = '12.00'; |
| $self->{visualStudioName} = 'Visual Studio 2013'; |
| $self->{VisualStudioVersion} = '12.0.21005.1'; |
| $self->{MinimumVisualStudioVersion} = '10.0.40219.1'; |
| |
| return $self; |
| } |
| |
| package VS2015Solution; |
| |
| # |
| # Package that encapsulates a Visual Studio 2015 solution file |
| # |
| |
| use Carp; |
| use strict; |
| use warnings; |
| use base qw(Solution); |
| |
| no warnings qw(redefine); ## no critic |
| |
| sub new |
| { |
| my $classname = shift; |
| my $self = $classname->SUPER::_new(@_); |
| bless($self, $classname); |
| |
| $self->{solutionFileVersion} = '12.00'; |
| $self->{vcver} = '14.00'; |
| $self->{visualStudioName} = 'Visual Studio 2015'; |
| $self->{VisualStudioVersion} = '14.0.24730.2'; |
| $self->{MinimumVisualStudioVersion} = '10.0.40219.1'; |
| |
| return $self; |
| } |
| |
| package VS2017Solution; |
| |
| # |
| # Package that encapsulates a Visual Studio 2017 solution file |
| # |
| |
| use Carp; |
| use strict; |
| use warnings; |
| use base qw(Solution); |
| |
| no warnings qw(redefine); ## no critic |
| |
| sub new |
| { |
| my $classname = shift; |
| my $self = $classname->SUPER::_new(@_); |
| bless($self, $classname); |
| |
| $self->{solutionFileVersion} = '12.00'; |
| $self->{vcver} = '15.00'; |
| $self->{visualStudioName} = 'Visual Studio 2017'; |
| $self->{VisualStudioVersion} = '15.0.26730.3'; |
| $self->{MinimumVisualStudioVersion} = '10.0.40219.1'; |
| |
| return $self; |
| } |
| |
| package VS2019Solution; |
| |
| # |
| # Package that encapsulates a Visual Studio 2019 solution file |
| # |
| |
| use Carp; |
| use strict; |
| use warnings; |
| use base qw(Solution); |
| |
| no warnings qw(redefine); ## no critic |
| |
| sub new |
| { |
| my $classname = shift; |
| my $self = $classname->SUPER::_new(@_); |
| bless($self, $classname); |
| |
| $self->{solutionFileVersion} = '12.00'; |
| $self->{vcver} = '16.00'; |
| $self->{visualStudioName} = 'Visual Studio 2019'; |
| $self->{VisualStudioVersion} = '16.0.28729.10'; |
| $self->{MinimumVisualStudioVersion} = '10.0.40219.1'; |
| |
| return $self; |
| } |
| |
| package VS2022Solution; |
| |
| # |
| # Package that encapsulates a Visual Studio 2022 solution file |
| # |
| |
| use Carp; |
| use strict; |
| use warnings; |
| use base qw(Solution); |
| |
| no warnings qw(redefine); ## no critic |
| |
| sub new |
| { |
| my $classname = shift; |
| my $self = $classname->SUPER::_new(@_); |
| bless($self, $classname); |
| |
| $self->{solutionFileVersion} = '12.00'; |
| $self->{vcver} = '17.00'; |
| $self->{visualStudioName} = 'Visual Studio 2022'; |
| $self->{VisualStudioVersion} = '17.0.31903.59'; |
| $self->{MinimumVisualStudioVersion} = '10.0.40219.1'; |
| |
| return $self; |
| } |
| |
| sub GetAdditionalHeaders |
| { |
| my ($self, $f) = @_; |
| |
| return qq|VisualStudioVersion = $self->{VisualStudioVersion} |
| MinimumVisualStudioVersion = $self->{MinimumVisualStudioVersion} |
| |; |
| } |
| |
| 1; |