From 818cf25415aa0ee7f45d40d11d0b3b8e87bc0ac2 Mon Sep 17 00:00:00 2001 From: Long Nguyen Date: Tue, 20 Apr 2021 07:19:44 +0700 Subject: [PATCH] [libpq] mingw support (#16740) * [libpq] mingw support * [libpq] Let libpq decides whether to build _shlib or not libpqcommon.a and libpqport.a are internal libraries intended for sharing code between the frontend and the backend. It's best to let the build system decides if the _shlib variant should be built or not * [libpq] Always run install-lib-static on mingw * [libpq] Rename .a to .dll.a and move .dll to correct folder * [libpq] Create bin folder for mingw * [vcpkg baseline] Update libpq * [libpq] Link with crypt32 on mingw * [vcpkg baseline] Update libpq * [libpq] Fix release/debug only build * [vcpkg baseline] Update libpq --- ports/libpq/Makefile | 17 +- .../patches/mingw/additional-zlib-names.patch | 186 ++++++++++++++++++ .../patches/mingw/link-with-crypt32.patch | 79 ++++++++ ports/libpq/portfile.cmake | 38 +++- ports/libpq/vcpkg.json | 2 +- versions/baseline.json | 2 +- versions/l-/libpq.json | 5 + 7 files changed, 312 insertions(+), 17 deletions(-) create mode 100644 ports/libpq/patches/mingw/additional-zlib-names.patch create mode 100644 ports/libpq/patches/mingw/link-with-crypt32.patch diff --git a/ports/libpq/Makefile b/ports/libpq/Makefile index 4832b503b85..ee2ffcaf195 100644 --- a/ports/libpq/Makefile +++ b/ports/libpq/Makefile @@ -4,19 +4,22 @@ include src/Makefile.global .NOTPARALLEL: -ifeq ($(LIBPQ_LIBRARY_TYPE), shared) -LIBPQ_LIB_SUFFIX = _shlib -endif - ifeq ($(LIBPQ_LIBRARY_TYPE), static) LIBPQ_INSTALL_LIBS = install-stlib endif +ifeq ($(LIBPQ_LIBRARY_TYPE), shared) +ifeq ($(USING_MINGW), yes) +# The import library name is the same as the static library name +EXTRA_TARGET = install-lib-static +endif +endif + .PHONY: all all: $(MAKE) -C src/include MAKELEVEL=0 - $(MAKE) -C src/common MAKELEVEL=0 libpgcommon$(LIBPQ_LIB_SUFFIX).a - $(MAKE) -C src/port MAKELEVEL=0 libpgport$(LIBPQ_LIB_SUFFIX).a + $(MAKE) -C src/common MAKELEVEL=0 + $(MAKE) -C src/port MAKELEVEL=0 $(MAKE) -C src/interfaces/libpq MAKELEVEL=0 all-$(LIBPQ_LIBRARY_TYPE)-lib $(MAKE) -C src/bin/pg_config MAKELEVEL=0 @@ -30,5 +33,5 @@ install-stlib: .PHONY: install install: $(LIBPQ_INSTALL_LIBS) $(MAKE) -C src/include MAKELEVEL=0 install - $(MAKE) -C src/interfaces/libpq MAKELEVEL=0 install-lib-$(LIBPQ_LIBRARY_TYPE) install-lib-pc install -o all -o install-lib + $(MAKE) -C src/interfaces/libpq MAKELEVEL=0 $(EXTRA_TARGET) install-lib-$(LIBPQ_LIBRARY_TYPE) install-lib-pc install -o all -o install-lib $(MAKE) -C src/bin/pg_config MAKELEVEL=0 install diff --git a/ports/libpq/patches/mingw/additional-zlib-names.patch b/ports/libpq/patches/mingw/additional-zlib-names.patch new file mode 100644 index 00000000000..e8ab7b06589 --- /dev/null +++ b/ports/libpq/patches/mingw/additional-zlib-names.patch @@ -0,0 +1,186 @@ +diff --git a/configure b/configure +index c22d3de..75210f0 100755 +--- a/configure ++++ b/configure +@@ -11777,13 +11789,13 @@ Use --without-readline to disable readline support." "$LINENO" 5 + fi + + if test "$with_zlib" = yes; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inflate in -lz" >&5 +-$as_echo_n "checking for inflate in -lz... " >&6; } +-if ${ac_cv_lib_z_inflate+:} false; then : ++ if test "$enable_debug" = yes; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing inflate" >&5 ++$as_echo_n "checking for library containing inflate... " >&6; } ++if ${ac_cv_search_inflate+:} false; then : + $as_echo_n "(cached) " >&6 + else +- ac_check_lib_save_LIBS=$LIBS +-LIBS="-lz $LIBS" ++ ac_func_search_save_LIBS=$LIBS + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +@@ -11802,23 +11814,101 @@ return inflate (); + return 0; + } + _ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- ac_cv_lib_z_inflate=yes +-else +- ac_cv_lib_z_inflate=no ++for ac_lib in '' zd zlibd zlib1d z zlib zlib1; do ++ if test -z "$ac_lib"; then ++ ac_res="none required" ++ else ++ ac_res=-l$ac_lib ++ LIBS="-l$ac_lib $ac_func_search_save_LIBS" ++ fi ++ if ac_fn_c_try_link "$LINENO"; then : ++ ac_cv_search_inflate=$ac_res + fi + rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-LIBS=$ac_check_lib_save_LIBS ++ conftest$ac_exeext ++ if ${ac_cv_search_inflate+:} false; then : ++ break + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_inflate" >&5 +-$as_echo "$ac_cv_lib_z_inflate" >&6; } +-if test "x$ac_cv_lib_z_inflate" = xyes; then : +- cat >>confdefs.h <<_ACEOF +-#define HAVE_LIBZ 1 ++done ++if ${ac_cv_search_inflate+:} false; then : ++ ++else ++ ac_cv_search_inflate=no ++fi ++rm conftest.$ac_ext ++LIBS=$ac_func_search_save_LIBS ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_inflate" >&5 ++$as_echo "$ac_cv_search_inflate" >&6; } ++ac_res=$ac_cv_search_inflate ++if test "$ac_res" != no; then : ++ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" ++ ++$as_echo "#define HAVE_LIBZ 1" >>confdefs.h ++ ++else ++ as_fn_error $? "zlib library not found ++If you have zlib already installed, see config.log for details on the ++failure. It is possible the compiler isn't looking in the proper directory. ++Use --without-zlib to disable zlib support." "$LINENO" 5 ++fi ++ ++ else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing inflate" >&5 ++$as_echo_n "checking for library containing inflate... " >&6; } ++if ${ac_cv_search_inflate+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ ac_func_search_save_LIBS=$LIBS ++cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++/* Override any GCC internal prototype to avoid an error. ++ Use char because int might match the return type of a GCC ++ builtin and then its argument prototype would still apply. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++char inflate (); ++int ++main () ++{ ++return inflate (); ++ ; ++ return 0; ++} + _ACEOF ++for ac_lib in '' z zlib zlib1; do ++ if test -z "$ac_lib"; then ++ ac_res="none required" ++ else ++ ac_res=-l$ac_lib ++ LIBS="-l$ac_lib $ac_func_search_save_LIBS" ++ fi ++ if ac_fn_c_try_link "$LINENO"; then : ++ ac_cv_search_inflate=$ac_res ++fi ++rm -f core conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext ++ if ${ac_cv_search_inflate+:} false; then : ++ break ++fi ++done ++if ${ac_cv_search_inflate+:} false; then : + +- LIBS="-lz $LIBS" ++else ++ ac_cv_search_inflate=no ++fi ++rm conftest.$ac_ext ++LIBS=$ac_func_search_save_LIBS ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_inflate" >&5 ++$as_echo "$ac_cv_search_inflate" >&6; } ++ac_res=$ac_cv_search_inflate ++if test "$ac_res" != no; then : ++ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" ++ ++$as_echo "#define HAVE_LIBZ 1" >>confdefs.h + + else + as_fn_error $? "zlib library not found +@@ -11827,6 +11917,7 @@ failure. It is possible the compiler isn't looking in the proper directory. + Use --without-zlib to disable zlib support." "$LINENO" 5 + fi + ++ fi + fi + + if test "$enable_spinlocks" = yes; then +diff --git a/configure.in b/configure.in +index 976f90d..e3cd80b 100644 +--- a/configure.in ++++ b/configure.in +@@ -1170,11 +1170,21 @@ Use --without-readline to disable readline support.]) + fi + + if test "$with_zlib" = yes; then +- AC_CHECK_LIB(z, inflate, [], +- [AC_MSG_ERROR([zlib library not found ++ if test "$enable_debug" = yes; then ++ AC_SEARCH_LIBS(inflate, [zd zlibd zlib1d z zlib zlib1], ++ [AC_DEFINE([HAVE_LIBZ], [1], [Define to 1 if you have the `z' library.])], ++ [AC_MSG_ERROR([zlib library not found + If you have zlib already installed, see config.log for details on the + failure. It is possible the compiler isn't looking in the proper directory. + Use --without-zlib to disable zlib support.])]) ++ else ++ AC_SEARCH_LIBS(inflate, [z zlib zlib1], ++ [AC_DEFINE([HAVE_LIBZ], [1], [Define to 1 if you have the `z' library.])], ++ [AC_MSG_ERROR([zlib library not found ++If you have zlib already installed, see config.log for details on the ++failure. It is possible the compiler isn't looking in the proper directory. ++Use --without-zlib to disable zlib support.])]) ++ fi + fi + + if test "$enable_spinlocks" = yes; then +diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in +index 244886a..29dd35b 100644 +--- a/src/include/pg_config.h.in ++++ b/src/include/pg_config.h.in +@@ -374,7 +374,7 @@ + /* Define to 1 if you have the `xslt' library (-lxslt). */ + #undef HAVE_LIBXSLT + +-/* Define to 1 if you have the `z' library (-lz). */ ++/* Define to 1 if you have the `z' library. */ + #undef HAVE_LIBZ + + /* Define to 1 if the system has the type `locale_t'. */ diff --git a/ports/libpq/patches/mingw/link-with-crypt32.patch b/ports/libpq/patches/mingw/link-with-crypt32.patch new file mode 100644 index 00000000000..67167de1f87 --- /dev/null +++ b/ports/libpq/patches/mingw/link-with-crypt32.patch @@ -0,0 +1,79 @@ +diff --git a/configure b/configure +index 75210f0..6ea5e1f 100755 +--- a/configure ++++ b/configure +@@ -11708,6 +11708,62 @@ if test "$ac_res" != no; then : + + fi + ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing CertOpenStore" >&5 ++$as_echo_n "checking for library containing CertOpenStore... " >&6; } ++if ${ac_cv_search_CertOpenStore+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ ac_func_search_save_LIBS=$LIBS ++cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++/* Override any GCC internal prototype to avoid an error. ++ Use char because int might match the return type of a GCC ++ builtin and then its argument prototype would still apply. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++char CertOpenStore (); ++int ++main () ++{ ++return CertOpenStore (); ++ ; ++ return 0; ++} ++_ACEOF ++for ac_lib in '' crypt32; do ++ if test -z "$ac_lib"; then ++ ac_res="none required" ++ else ++ ac_res=-l$ac_lib ++ LIBS="-l$ac_lib $ac_func_search_save_LIBS" ++ fi ++ if ac_fn_c_try_link "$LINENO"; then : ++ ac_cv_search_CertOpenStore=$ac_res ++fi ++rm -f core conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext ++ if ${ac_cv_search_CertOpenStore+:} false; then : ++ break ++fi ++done ++if ${ac_cv_search_CertOpenStore+:} false; then : ++ ++else ++ ac_cv_search_CertOpenStore=no ++fi ++rm conftest.$ac_ext ++LIBS=$ac_func_search_save_LIBS ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_CertOpenStore" >&5 ++$as_echo "$ac_cv_search_CertOpenStore" >&6; } ++ac_res=$ac_cv_search_CertOpenStore ++if test "$ac_res" != no; then : ++ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" ++ ++fi ++ + + if test "$with_readline" = yes; then + +diff --git a/configure.in b/configure.in +index 0832636..0911ec0 100644 +--- a/configure.in ++++ b/configure.in +@@ -1158,6 +1158,7 @@ AC_SEARCH_LIBS(sched_yield, rt) + AC_SEARCH_LIBS(gethostbyname_r, nsl) + # Cygwin: + AC_SEARCH_LIBS(shmget, cygipc) ++AC_SEARCH_LIBS(CertOpenStore, crypt32) + + if test "$with_readline" = yes; then + PGAC_CHECK_READLINE diff --git a/ports/libpq/portfile.cmake b/ports/libpq/portfile.cmake index 427aed5b118..3a59d4de8d6 100644 --- a/ports/libpq/portfile.cmake +++ b/ports/libpq/portfile.cmake @@ -42,9 +42,15 @@ set(PATCHES patches/windows/MSBuildProject_fix_gendef_perl.patch patches/windows/msgfmt.patch patches/windows/python_lib.patch - patches/windows/fix-compile-flag-Zi.patch - patches/linux/configure.patch) + patches/windows/fix-compile-flag-Zi.patch) +if(VCPKG_TARGET_IS_MINGW) + list(APPEND PATCHES patches/mingw/additional-zlib-names.patch) + list(APPEND PATCHES patches/mingw/link-with-crypt32.patch) +endif() +if(VCPKG_TARGET_IS_LINUX) + list(APPEND PATCHES patches/linux/configure.patch) +endif() if(VCPKG_LIBRARY_LINKAGE STREQUAL static) list(APPEND PATCHES patches/windows/MSBuildProject-static-lib.patch) list(APPEND PATCHES patches/windows/Mkvcbuild-static-lib.patch) @@ -107,7 +113,7 @@ endif() file(MAKE_DIRECTORY ${CURRENT_PACKAGES_DIR}/share/${PORT}) ## Do the build -if(VCPKG_TARGET_IS_WINDOWS) +if(VCPKG_TARGET_IS_WINDOWS AND NOT VCPKG_TARGET_IS_MINGW) file(GLOB SOURCE_FILES ${SOURCE_PATH}/*) foreach(_buildtype ${port_config_list}) # Copy libpq sources. @@ -274,13 +280,10 @@ else() vcpkg_configure_make( SOURCE_PATH ${SOURCE_PATH} COPY_SOURCE + DETERMINE_BUILD_TRIPLET OPTIONS ${BUILD_OPTS} - --with-includes=${CURRENT_INSTALLED_DIR}/include - OPTIONS_RELEASE - --with-libraries=${CURRENT_INSTALLED_DIR}/lib OPTIONS_DEBUG - --with-libraries=${CURRENT_INSTALLED_DIR}/debug/lib --enable-debug ) @@ -289,6 +292,9 @@ else() else() set(ENV{LIBPQ_LIBRARY_TYPE} static) endif() + if(VCPKG_TARGET_IS_MINGW) + set(ENV{USING_MINGW} yes) + endif() vcpkg_install_make() file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include) @@ -300,7 +306,23 @@ else() vcpkg_copy_tool_dependencies(${CURRENT_PACKAGES_DIR}/tools/${PORT}/bin) file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/tools/${PORT}/debug) endif() - set(USE_DL ON) + if(VCPKG_TARGET_IS_MINGW AND VCPKG_LIBRARY_LINKAGE STREQUAL "dynamic") + if (NOT VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "release") + file(MAKE_DIRECTORY ${CURRENT_PACKAGES_DIR}/bin) + file(RENAME ${CURRENT_PACKAGES_DIR}/lib/libpq.a ${CURRENT_PACKAGES_DIR}/lib/libpq.dll.a) + file(RENAME ${CURRENT_PACKAGES_DIR}/lib/libpq.dll ${CURRENT_PACKAGES_DIR}/bin/libpq.dll) + endif() + if (NOT VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug") + file(MAKE_DIRECTORY ${CURRENT_PACKAGES_DIR}/debug/bin) + file(RENAME ${CURRENT_PACKAGES_DIR}/debug/lib/libpq.a ${CURRENT_PACKAGES_DIR}/debug/lib/libpq.dll.a) + file(RENAME ${CURRENT_PACKAGES_DIR}/debug/lib/libpq.dll ${CURRENT_PACKAGES_DIR}/debug/bin/libpq.dll) + endif() + endif() + if(VCPKG_TARGET_IS_MINGW) + set(USE_DL OFF) + else() + set(USE_DL ON) + endif() endif() configure_file(${CMAKE_CURRENT_LIST_DIR}/vcpkg-cmake-wrapper.cmake ${CURRENT_PACKAGES_DIR}/share/postgresql/vcpkg-cmake-wrapper.cmake @ONLY) diff --git a/ports/libpq/vcpkg.json b/ports/libpq/vcpkg.json index d4029e44c23..a1f8e736af1 100644 --- a/ports/libpq/vcpkg.json +++ b/ports/libpq/vcpkg.json @@ -1,7 +1,7 @@ { "name": "libpq", "version": "12.2", - "port-version": 13, + "port-version": 14, "description": "The official database access API of postgresql", "homepage": "https://www.postgresql.org/", "supports": "!uwp", diff --git a/versions/baseline.json b/versions/baseline.json index 6c14c4f2df0..849aa5d7e2b 100644 --- a/versions/baseline.json +++ b/versions/baseline.json @@ -3382,7 +3382,7 @@ }, "libpq": { "baseline": "12.2", - "port-version": 13 + "port-version": 14 }, "libpqxx": { "baseline": "7.3.1", diff --git a/versions/l-/libpq.json b/versions/l-/libpq.json index 3cd73d421ec..517df834e38 100644 --- a/versions/l-/libpq.json +++ b/versions/l-/libpq.json @@ -1,5 +1,10 @@ { "versions": [ + { + "git-tree": "212f71f4fc5edf570dece0822c7d9863dbe0c90c", + "version": "12.2", + "port-version": 14 + }, { "git-tree": "740637e4b7da153db5afc1a568f6411ff88167c9", "version": "12.2",