Hi, As the meson support stands right now, one cannot easily build an extension against a postgres built with meson. As discussed at the 2022 unconference [1], one way to make that easier for extensions is for meson to generate a complete enough Makefile.global for pgxs.mk to work.
This is a series of patches towards that goal. The first four simplify some aspects of Makefile.global, and then the fifth generates Makefile.global etc. 0001: autoconf: Unify CFLAGS_SSE42 and CFLAGS_ARMV8_CRC32C Right now emit the cflags to build the CRC objects into architecture specific variables. That doesn't make a whole lot of sense to me - we're never going to target x86 and arm at the same time, so they don't need to be separate variables. It might be better to instead continue to have CFLAGS_SSE42 / CFLAGS_ARMV8_CRC32C be computed by PGAC_ARMV8_CRC32C_INTRINSICS / PGAC_SSE42_CRC32_INTRINSICS and then set CFLAGS_CRC based on those. But it seems unlikely that we'd need other sets of flags for those two architectures at the same time. The separate flags could be supported by the meson build instead, it'd just add unneccessary complexity. 0002: autoconf: Rely on ar supporting index creation With meson we don't require ranlib. But as it is set in Makefile.global and used by several platforms, we'd need to detect it. FreeBSD, NetBSD, OpenBSD, the only platforms were we didn't use AROPT=crs, all have supported the 's' option for a long time. On macOS we ran ranlib after installing a static library. This was added a long time ago, in 58ad65ec2def. I cannot reproduce an issue in more recent macOS versions. I'm on the fence about removing the "touch $@" from the rule building static libs. That was added because of macos's ranlib not setting fine-grained timestamps. On a modern mac ar and ranlib are the same binary, and maybe that means that ar has the same issue? Both do set fine-grained timestamps: cc ../test.c -o test.o -c rm -f test.a; ar csr test.a test.o ; ranlib test.a; python3 -c "import os;print(os.stat('test.a').st_mtime_ns)" 1664999109090448534 But I don't know how far back that goes. We could just reformulate the comment to mention ar instead of ranlib. Tom, CCing you due to 58ad65ec2def and 826eff57c4c. 0003: aix: Build SUBSYS.o using $(CC) -r instead of $(LD) -r This is the only direct use of $(LD), and xlc -r and gcc -r end up with the same set of symbols and similar performance (noise is high, so hard to say if equivalent). Now that $(LD) isn't needed anymore, remove it from src/Makefile.global While at it, add a comment why -r is used. 0004: solaris: Check for -Wl,-E directly instead of checking for gnu LD This allows us to get rid of the nontrivial detection of with_gnu_ld, simplifying meson PGXS compatibility. It's also nice to delete libtool.m4. I don't like the SOLARIS_EXPORT_DYNAMIC variable I invented. If somebody has a better idea... 0005: meson: Add PGXS compatibility The actual meson PGXS compatibility. Plenty more replacements to do, but suffices to build common extensions on a few platforms. What level of completeness do we want to require here? A few replacements worth thinking about: - autodepend - I'm inclined to set it to true when using a gcc like compiler. I think extension authors won't be happy if suddenly their extensions don't rebuild reliably anymore. An --enable-depend like setting doesn't make sense for meson, so we don't have anything to source it from. - {LDAP,UUID,ICU}_{LIBS,CFLAGS} - might some extension need them? For some others I think it's ok to not have replacement. Would be good for somebody to check my thinking though: - LIBOBJS, PG_CRC32C_OBJS, TAS: Not needed because we don't build the server / PLs with the generated makefile - ZIC: only needed to build tzdata as part of server build - MSGFMT et al: translation doesn't appear to be supported by pgxs, correct? - XMLLINT et al: docs don't seem to be supported by pgxs - GENHTML et al: supporting coverage for pgxs-in-meson build doesn't seem worth it - WINDRES: I don't think extensions are bothering to generate rc files on windows My colleague Bilal has set up testing and verified that a few extensions build with the pgxs compatibility layer, on linux at last. Currently pg_qualstats, pg_cron, hypopg, orafce, postgis, pg_partman work. He also tested pgbouncer, but for him that failed both with autoconf and meson generated pgxs. I wonder if and where we could have something like this tested continually? Greetings, Andres Freund [1] https://wiki.postgresql.org/wiki/PgCon_2022_Developer_Unconference#Meson_new_build_system_proposal
>From 6e24c54141c3063db6d4b2e6e4d43d1cfa563deb Mon Sep 17 00:00:00 2001 From: Andres Freund <and...@anarazel.de> Date: Wed, 5 Oct 2022 12:24:14 -0700 Subject: [PATCH v2 1/5] autoconf: Unify CFLAGS_SSE42 and CFLAGS_ARMV8_CRC32C Until now we emit the cflags to build the CRC objects into architecture specific variables. That doesn't make a whole lot of sense to me - we're never going to target x86 and arm at the same time, so they don't need to be separate variables. It might be better to instead continue to have CFLAGS_SSE42 / CFLAGS_ARMV8_CRC32C be computed by PGAC_ARMV8_CRC32C_INTRINSICS / PGAC_SSE42_CRC32_INTRINSICS and then set CFLAGS_CRC based on those. But it seems unlikely that we'd need other sets of flags for those two architectures at the same time. --- src/port/Makefile | 16 ++++++++-------- config/c-compiler.m4 | 8 ++++---- configure | 19 +++++++++---------- configure.ac | 10 +++++----- src/Makefile.global.in | 3 +-- 5 files changed, 27 insertions(+), 29 deletions(-) diff --git a/src/port/Makefile b/src/port/Makefile index b3754d8940a..711f59e32bd 100644 --- a/src/port/Makefile +++ b/src/port/Makefile @@ -88,15 +88,15 @@ libpgport.a: $(OBJS) thread.o: CFLAGS+=$(PTHREAD_CFLAGS) thread_shlib.o: CFLAGS+=$(PTHREAD_CFLAGS) -# all versions of pg_crc32c_sse42.o need CFLAGS_SSE42 -pg_crc32c_sse42.o: CFLAGS+=$(CFLAGS_SSE42) -pg_crc32c_sse42_shlib.o: CFLAGS+=$(CFLAGS_SSE42) -pg_crc32c_sse42_srv.o: CFLAGS+=$(CFLAGS_SSE42) +# all versions of pg_crc32c_sse42.o need CFLAGS_CRC +pg_crc32c_sse42.o: CFLAGS+=$(CFLAGS_CRC) +pg_crc32c_sse42_shlib.o: CFLAGS+=$(CFLAGS_CRC) +pg_crc32c_sse42_srv.o: CFLAGS+=$(CFLAGS_CRC) -# all versions of pg_crc32c_armv8.o need CFLAGS_ARMV8_CRC32C -pg_crc32c_armv8.o: CFLAGS+=$(CFLAGS_ARMV8_CRC32C) -pg_crc32c_armv8_shlib.o: CFLAGS+=$(CFLAGS_ARMV8_CRC32C) -pg_crc32c_armv8_srv.o: CFLAGS+=$(CFLAGS_ARMV8_CRC32C) +# all versions of pg_crc32c_armv8.o need CFLAGS_CRC +pg_crc32c_armv8.o: CFLAGS+=$(CFLAGS_CRC) +pg_crc32c_armv8_shlib.o: CFLAGS+=$(CFLAGS_CRC) +pg_crc32c_armv8_srv.o: CFLAGS+=$(CFLAGS_CRC) # # Shared library versions of object files diff --git a/config/c-compiler.m4 b/config/c-compiler.m4 index 000b075312e..eb8cc8ce170 100644 --- a/config/c-compiler.m4 +++ b/config/c-compiler.m4 @@ -597,7 +597,7 @@ fi])# PGAC_HAVE_GCC__ATOMIC_INT64_CAS # the other ones are, on x86-64 platforms) # # An optional compiler flag can be passed as argument (e.g. -msse4.2). If the -# intrinsics are supported, sets pgac_sse42_crc32_intrinsics, and CFLAGS_SSE42. +# intrinsics are supported, sets pgac_sse42_crc32_intrinsics, and CFLAGS_CRC. AC_DEFUN([PGAC_SSE42_CRC32_INTRINSICS], [define([Ac_cachevar], [AS_TR_SH([pgac_cv_sse42_crc32_intrinsics_$1])])dnl AC_CACHE_CHECK([for _mm_crc32_u8 and _mm_crc32_u32 with CFLAGS=$1], [Ac_cachevar], @@ -613,7 +613,7 @@ AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <nmmintrin.h>], [Ac_cachevar=no]) CFLAGS="$pgac_save_CFLAGS"]) if test x"$Ac_cachevar" = x"yes"; then - CFLAGS_SSE42="$1" + CFLAGS_CRC="$1" pgac_sse42_crc32_intrinsics=yes fi undefine([Ac_cachevar])dnl @@ -629,7 +629,7 @@ undefine([Ac_cachevar])dnl # # An optional compiler flag can be passed as argument (e.g. # -march=armv8-a+crc). If the intrinsics are supported, sets -# pgac_armv8_crc32c_intrinsics, and CFLAGS_ARMV8_CRC32C. +# pgac_armv8_crc32c_intrinsics, and CFLAGS_CRC. AC_DEFUN([PGAC_ARMV8_CRC32C_INTRINSICS], [define([Ac_cachevar], [AS_TR_SH([pgac_cv_armv8_crc32c_intrinsics_$1])])dnl AC_CACHE_CHECK([for __crc32cb, __crc32ch, __crc32cw, and __crc32cd with CFLAGS=$1], [Ac_cachevar], @@ -647,7 +647,7 @@ AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <arm_acle.h>], [Ac_cachevar=no]) CFLAGS="$pgac_save_CFLAGS"]) if test x"$Ac_cachevar" = x"yes"; then - CFLAGS_ARMV8_CRC32C="$1" + CFLAGS_CRC="$1" pgac_armv8_crc32c_intrinsics=yes fi undefine([Ac_cachevar])dnl diff --git a/configure b/configure index 1caca21b625..80b28cb9310 100755 --- a/configure +++ b/configure @@ -645,8 +645,7 @@ MSGMERGE MSGFMT_FLAGS MSGFMT PG_CRC32C_OBJS -CFLAGS_ARMV8_CRC32C -CFLAGS_SSE42 +CFLAGS_CRC LIBOBJS ZSTD LZ4 @@ -17815,7 +17814,7 @@ fi # # First check if the _mm_crc32_u8 and _mm_crc32_u64 intrinsics can be used # with the default compiler flags. If not, check if adding the -msse4.2 -# flag helps. CFLAGS_SSE42 is set to -msse4.2 if that's required. +# flag helps. CFLAGS_CRC is set to -msse4.2 if that's required. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _mm_crc32_u8 and _mm_crc32_u32 with CFLAGS=" >&5 $as_echo_n "checking for _mm_crc32_u8 and _mm_crc32_u32 with CFLAGS=... " >&6; } if ${pgac_cv_sse42_crc32_intrinsics_+:} false; then : @@ -17850,7 +17849,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_sse42_crc32_intrinsics_" >&5 $as_echo "$pgac_cv_sse42_crc32_intrinsics_" >&6; } if test x"$pgac_cv_sse42_crc32_intrinsics_" = x"yes"; then - CFLAGS_SSE42="" + CFLAGS_CRC="" pgac_sse42_crc32_intrinsics=yes fi @@ -17889,13 +17888,12 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_sse42_crc32_intrinsics__msse4_2" >&5 $as_echo "$pgac_cv_sse42_crc32_intrinsics__msse4_2" >&6; } if test x"$pgac_cv_sse42_crc32_intrinsics__msse4_2" = x"yes"; then - CFLAGS_SSE42="-msse4.2" + CFLAGS_CRC="-msse4.2" pgac_sse42_crc32_intrinsics=yes fi fi - # Are we targeting a processor that supports SSE 4.2? gcc, clang and icc all # define __SSE4_2__ in that case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -17922,7 +17920,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # # First check if __crc32c* intrinsics can be used with the default compiler # flags. If not, check if adding -march=armv8-a+crc flag helps. -# CFLAGS_ARMV8_CRC32C is set if the extra flag is required. +# CFLAGS_CRC is set if the extra flag is required. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __crc32cb, __crc32ch, __crc32cw, and __crc32cd with CFLAGS=" >&5 $as_echo_n "checking for __crc32cb, __crc32ch, __crc32cw, and __crc32cd with CFLAGS=... " >&6; } if ${pgac_cv_armv8_crc32c_intrinsics_+:} false; then : @@ -17959,7 +17957,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_armv8_crc32c_intrinsics_" >&5 $as_echo "$pgac_cv_armv8_crc32c_intrinsics_" >&6; } if test x"$pgac_cv_armv8_crc32c_intrinsics_" = x"yes"; then - CFLAGS_ARMV8_CRC32C="" + CFLAGS_CRC="" pgac_armv8_crc32c_intrinsics=yes fi @@ -18000,13 +17998,14 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_armv8_crc32c_intrinsics__march_armv8_apcrc" >&5 $as_echo "$pgac_cv_armv8_crc32c_intrinsics__march_armv8_apcrc" >&6; } if test x"$pgac_cv_armv8_crc32c_intrinsics__march_armv8_apcrc" = x"yes"; then - CFLAGS_ARMV8_CRC32C="-march=armv8-a+crc" + CFLAGS_CRC="-march=armv8-a+crc" pgac_armv8_crc32c_intrinsics=yes fi fi + # Select CRC-32C implementation. # # If we are targeting a processor that has Intel SSE 4.2 instructions, we can @@ -18034,7 +18033,7 @@ if test x"$USE_SLICING_BY_8_CRC32C" = x"" && test x"$USE_SSE42_CRC32C" = x"" && USE_SSE42_CRC32C_WITH_RUNTIME_CHECK=1 else # Use ARM CRC Extension if available. - if test x"$pgac_armv8_crc32c_intrinsics" = x"yes" && test x"$CFLAGS_ARMV8_CRC32C" = x""; then + if test x"$pgac_armv8_crc32c_intrinsics" = x"yes" && test x"$CFLAGS_CRC" = x""; then USE_ARMV8_CRC32C=1 else # ARM CRC Extension, with runtime check? diff --git a/configure.ac b/configure.ac index 10fa55dd154..f837a602d01 100644 --- a/configure.ac +++ b/configure.ac @@ -2086,12 +2086,11 @@ fi # # First check if the _mm_crc32_u8 and _mm_crc32_u64 intrinsics can be used # with the default compiler flags. If not, check if adding the -msse4.2 -# flag helps. CFLAGS_SSE42 is set to -msse4.2 if that's required. +# flag helps. CFLAGS_CRC is set to -msse4.2 if that's required. PGAC_SSE42_CRC32_INTRINSICS([]) if test x"$pgac_sse42_crc32_intrinsics" != x"yes"; then PGAC_SSE42_CRC32_INTRINSICS([-msse4.2]) fi -AC_SUBST(CFLAGS_SSE42) # Are we targeting a processor that supports SSE 4.2? gcc, clang and icc all # define __SSE4_2__ in that case. @@ -2105,12 +2104,13 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [ # # First check if __crc32c* intrinsics can be used with the default compiler # flags. If not, check if adding -march=armv8-a+crc flag helps. -# CFLAGS_ARMV8_CRC32C is set if the extra flag is required. +# CFLAGS_CRC is set if the extra flag is required. PGAC_ARMV8_CRC32C_INTRINSICS([]) if test x"$pgac_armv8_crc32c_intrinsics" != x"yes"; then PGAC_ARMV8_CRC32C_INTRINSICS([-march=armv8-a+crc]) fi -AC_SUBST(CFLAGS_ARMV8_CRC32C) + +AC_SUBST(CFLAGS_CRC) # Select CRC-32C implementation. # @@ -2139,7 +2139,7 @@ if test x"$USE_SLICING_BY_8_CRC32C" = x"" && test x"$USE_SSE42_CRC32C" = x"" && USE_SSE42_CRC32C_WITH_RUNTIME_CHECK=1 else # Use ARM CRC Extension if available. - if test x"$pgac_armv8_crc32c_intrinsics" = x"yes" && test x"$CFLAGS_ARMV8_CRC32C" = x""; then + if test x"$pgac_armv8_crc32c_intrinsics" = x"yes" && test x"$CFLAGS_CRC" = x""; then USE_ARMV8_CRC32C=1 else # ARM CRC Extension, with runtime check? diff --git a/src/Makefile.global.in b/src/Makefile.global.in index d8ea2da583c..c87b6d97ca9 100644 --- a/src/Makefile.global.in +++ b/src/Makefile.global.in @@ -262,8 +262,7 @@ CFLAGS_SL_MODULE = @CFLAGS_SL_MODULE@ CXXFLAGS_SL_MODULE = @CXXFLAGS_SL_MODULE@ CFLAGS_UNROLL_LOOPS = @CFLAGS_UNROLL_LOOPS@ CFLAGS_VECTORIZE = @CFLAGS_VECTORIZE@ -CFLAGS_SSE42 = @CFLAGS_SSE42@ -CFLAGS_ARMV8_CRC32C = @CFLAGS_ARMV8_CRC32C@ +CFLAGS_CRC = @CFLAGS_CRC@ PERMIT_DECLARATION_AFTER_STATEMENT = @PERMIT_DECLARATION_AFTER_STATEMENT@ CXXFLAGS = @CXXFLAGS@ -- 2.37.3.542.gdd3f6c4cae
>From 9a3bf1ed84b24387900dfe09cfc09634012db680 Mon Sep 17 00:00:00 2001 From: Andres Freund <and...@anarazel.de> Date: Wed, 5 Oct 2022 12:48:02 -0700 Subject: [PATCH v2 2/5] autoconf: Rely on ar supporting index creation This way we don't need RANLIB anymore, making it a bit simpler to for the meson build to generate Makefile.global for PGXS compatibility. FreeBSD, NetBSD, OpenBSD, the only platforms were we didn't use AROPT=crs, all have supported the 's' option for a long time. This removes the 'touch' added after the ranlib, added in 826eff57c4c. Both ar and ranlib do set the finegrained timestamps today. We could instead just keep the touch, with an adjusted comment. On macOS we ran ranlib after installing a static library. This was added a long time ago, in 58ad65ec2def. I cannot reproduce an issue in more recent macOS versions. --- src/makefiles/Makefile.aix | 3 -- src/makefiles/Makefile.cygwin | 2 - src/makefiles/Makefile.darwin | 2 - src/makefiles/Makefile.freebsd | 2 - src/makefiles/Makefile.linux | 2 - src/makefiles/Makefile.netbsd | 2 - src/makefiles/Makefile.openbsd | 2 - src/makefiles/Makefile.solaris | 2 - src/makefiles/Makefile.win32 | 2 - configure | 93 ---------------------------------- configure.ac | 1 - src/Makefile.global.in | 2 +- src/Makefile.shlib | 11 ---- 13 files changed, 1 insertion(+), 125 deletions(-) diff --git a/src/makefiles/Makefile.aix b/src/makefiles/Makefile.aix index 56d7f22aff6..dd16a7a0378 100644 --- a/src/makefiles/Makefile.aix +++ b/src/makefiles/Makefile.aix @@ -2,9 +2,6 @@ # symbol names to tell them what to export/import. MAKE_EXPORTS= true -RANLIB= touch -AROPT = crs - # -blibpath must contain ALL directories where we should look for libraries libpath := $(shell echo $(subst -L,:,$(filter -L/%,$(LDFLAGS))) | sed -e's/ //g'):/usr/lib:/lib diff --git a/src/makefiles/Makefile.cygwin b/src/makefiles/Makefile.cygwin index 6afa9a06a1b..77593972638 100644 --- a/src/makefiles/Makefile.cygwin +++ b/src/makefiles/Makefile.cygwin @@ -10,8 +10,6 @@ endif # (see http://sources.redhat.com/cygwin/faq/faq.html#SEC110) LIBS:=$(filter-out -lm -lc, $(LIBS)) -AROPT = crs - override CPPFLAGS += -DWIN32_STACK_RLIMIT=$(WIN32_STACK_RLIMIT) ifneq (,$(findstring backend,$(subdir))) diff --git a/src/makefiles/Makefile.darwin b/src/makefiles/Makefile.darwin index 45f253a5b43..7095f66e25c 100644 --- a/src/makefiles/Makefile.darwin +++ b/src/makefiles/Makefile.darwin @@ -1,5 +1,3 @@ -AROPT = crs - # env var name to use in place of LD_LIBRARY_PATH ld_library_path_var = DYLD_LIBRARY_PATH diff --git a/src/makefiles/Makefile.freebsd b/src/makefiles/Makefile.freebsd index 0e77616b0f9..db74a21568c 100644 --- a/src/makefiles/Makefile.freebsd +++ b/src/makefiles/Makefile.freebsd @@ -1,5 +1,3 @@ -AROPT = cr - export_dynamic = -Wl,-export-dynamic rpath = -Wl,-R'$(rpathdir)' diff --git a/src/makefiles/Makefile.linux b/src/makefiles/Makefile.linux index 1ffec9d1698..5a9451371ab 100644 --- a/src/makefiles/Makefile.linux +++ b/src/makefiles/Makefile.linux @@ -1,5 +1,3 @@ -AROPT = crs - export_dynamic = -Wl,-E # Use --enable-new-dtags to generate DT_RUNPATH instead of DT_RPATH. # This allows LD_LIBRARY_PATH to still work when needed. diff --git a/src/makefiles/Makefile.netbsd b/src/makefiles/Makefile.netbsd index 421b735e407..4f8e9ec2521 100644 --- a/src/makefiles/Makefile.netbsd +++ b/src/makefiles/Makefile.netbsd @@ -1,5 +1,3 @@ -AROPT = cr - export_dynamic = -Wl,-E rpath = -Wl,-R'$(rpathdir)' diff --git a/src/makefiles/Makefile.openbsd b/src/makefiles/Makefile.openbsd index 421b735e407..4f8e9ec2521 100644 --- a/src/makefiles/Makefile.openbsd +++ b/src/makefiles/Makefile.openbsd @@ -1,5 +1,3 @@ -AROPT = cr - export_dynamic = -Wl,-E rpath = -Wl,-R'$(rpathdir)' diff --git a/src/makefiles/Makefile.solaris b/src/makefiles/Makefile.solaris index acdf44cc0f2..3de73ebc010 100644 --- a/src/makefiles/Makefile.solaris +++ b/src/makefiles/Makefile.solaris @@ -1,6 +1,4 @@ # src/makefiles/Makefile.solaris - -AROPT = crs rpath = -Wl,-rpath,'$(rpathdir)' ifeq ($(with_gnu_ld), yes) diff --git a/src/makefiles/Makefile.win32 b/src/makefiles/Makefile.win32 index d268b3ebafd..dc1aafa115a 100644 --- a/src/makefiles/Makefile.win32 +++ b/src/makefiles/Makefile.win32 @@ -10,8 +10,6 @@ endif override CPPFLAGS += -DWIN32_STACK_RLIMIT=$(WIN32_STACK_RLIMIT) -AROPT = crs - ifneq (,$(findstring backend,$(subdir))) ifeq (,$(findstring conversion_procs,$(subdir))) ifeq (,$(findstring libpqwalreceiver,$(subdir))) diff --git a/configure b/configure index 80b28cb9310..d338ae2cc8b 100755 --- a/configure +++ b/configure @@ -691,7 +691,6 @@ AR STRIP_SHARED_LIB STRIP_STATIC_LIB STRIP -RANLIB with_gnu_ld LD LDFLAGS_SL @@ -9465,98 +9464,6 @@ with_gnu_ld=$ac_cv_prog_gnu_ld -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. -set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -RANLIB=$ac_cv_prog_RANLIB -if test -n "$RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 -$as_echo "$RANLIB" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_RANLIB"; then - ac_ct_RANLIB=$RANLIB - # Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_RANLIB"; then - ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_RANLIB="ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB -if test -n "$ac_ct_RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 -$as_echo "$ac_ct_RANLIB" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_RANLIB" = x; then - RANLIB=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - RANLIB=$ac_ct_RANLIB - fi -else - RANLIB="$ac_cv_prog_RANLIB" -fi - if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. diff --git a/configure.ac b/configure.ac index f837a602d01..66c60974ef9 100644 --- a/configure.ac +++ b/configure.ac @@ -1129,7 +1129,6 @@ AC_ARG_VAR(LDFLAGS_SL, [extra linker flags for linking shared libraries only]) PGAC_PROG_LD AC_SUBST(LD) AC_SUBST(with_gnu_ld) -AC_PROG_RANLIB PGAC_CHECK_STRIP AC_CHECK_TOOL(AR, ar, ar) if test "$PORTNAME" = "win32"; then diff --git a/src/Makefile.global.in b/src/Makefile.global.in index c87b6d97ca9..a5e2f36d217 100644 --- a/src/Makefile.global.in +++ b/src/Makefile.global.in @@ -283,6 +283,7 @@ ZIC = @ZIC@ # Linking AR = @AR@ +AROPT = crs LIBS = @LIBS@ LDAP_LIBS_FE = @LDAP_LIBS_FE@ LDAP_LIBS_BE = @LDAP_LIBS_BE@ @@ -317,7 +318,6 @@ LDFLAGS_EX = @LDFLAGS_EX@ LDFLAGS_SL += @LDFLAGS_SL@ LDREL = -r LDOUT = -o -RANLIB = @RANLIB@ WINDRES = @WINDRES@ X = @EXEEXT@ diff --git a/src/Makefile.shlib b/src/Makefile.shlib index db466b3b845..fd0909b95df 100644 --- a/src/Makefile.shlib +++ b/src/Makefile.shlib @@ -251,17 +251,10 @@ all-static-lib: $(stlib) all-shared-lib: $(shlib) -# In this rule, "touch $@" works around a problem on some platforms wherein -# ranlib updates the library file's mod time with a value calculated to -# seconds precision. If the filesystem has sub-second timestamps, this can -# cause the library file to appear older than its input files, triggering -# parallel-make problems. ifndef haslibarule $(stlib): $(OBJS) | $(SHLIB_PREREQS) rm -f $@ $(LINK.static) $@ $^ - $(RANLIB) $@ - touch $@ endif #haslibarule # AIX wraps shared libraries inside a static library, can be used both @@ -394,10 +387,6 @@ install-lib-pc: lib$(NAME).pc installdirs-lib install-lib-static: $(stlib) installdirs-lib $(INSTALL_STLIB) $< '$(DESTDIR)$(libdir)/$(stlib)' -ifeq ($(PORTNAME), darwin) - cd '$(DESTDIR)$(libdir)' && \ - $(RANLIB) $(stlib) -endif install-lib-shared: $(shlib) installdirs-lib ifdef soname -- 2.37.3.542.gdd3f6c4cae
>From a59bff614f67842539b69fe71f08b744b9b5f350 Mon Sep 17 00:00:00 2001 From: Andres Freund <and...@anarazel.de> Date: Mon, 26 Sep 2022 14:42:01 -0700 Subject: [PATCH v2 3/5] aix: Build SUBSYS.o using $(CC) -r instead of $(LD) -r This is the only direct use of $(LD), and xlc -r and gcc -r end up with the same set of symbols and similar performance (noise is high, so hard to say if equivalent). Now that $(LD) isn't needed anymore, remove it from src/Makefile.global While at it, add a comment why -r is used. Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- src/backend/Makefile | 4 +++- configure | 2 -- configure.ac | 1 - src/Makefile.global.in | 3 --- 4 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/backend/Makefile b/src/backend/Makefile index 181c217fae4..5b704bb3600 100644 --- a/src/backend/Makefile +++ b/src/backend/Makefile @@ -100,8 +100,10 @@ ifeq ($(PORTNAME), aix) postgres: $(POSTGRES_IMP) $(CC) $(CFLAGS) $(call expand_subsys,$(OBJS)) $(LDFLAGS) $(LDFLAGS_EX) -Wl,-bE:$(top_builddir)/src/backend/$(POSTGRES_IMP) $(LIBS) -Wl,-brtllib -o $@ +# linking to a single .o with -r is a lot faster than building a .a or passing +# all objects to MKLDEXPORT $(POSTGRES_IMP): $(OBJS) - $(LD) $(LDREL) $(LDOUT) SUBSYS.o $(call expand_subsys,$^) + $(CC) -r -o SUBSYS.o $(call expand_subsys,$^) $(MKLDEXPORT) SUBSYS.o . > $@ @rm -f SUBSYS.o diff --git a/configure b/configure index d338ae2cc8b..7eafefb062a 100755 --- a/configure +++ b/configure @@ -692,7 +692,6 @@ STRIP_SHARED_LIB STRIP_STATIC_LIB STRIP with_gnu_ld -LD LDFLAGS_SL LDFLAGS_EX ZSTD_LIBS @@ -9464,7 +9463,6 @@ with_gnu_ld=$ac_cv_prog_gnu_ld - if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 diff --git a/configure.ac b/configure.ac index 66c60974ef9..398eb422595 100644 --- a/configure.ac +++ b/configure.ac @@ -1127,7 +1127,6 @@ AC_ARG_VAR(LDFLAGS_EX, [extra linker flags for linking executables only]) AC_ARG_VAR(LDFLAGS_SL, [extra linker flags for linking shared libraries only]) PGAC_PROG_LD -AC_SUBST(LD) AC_SUBST(with_gnu_ld) PGAC_CHECK_STRIP AC_CHECK_TOOL(AR, ar, ar) diff --git a/src/Makefile.global.in b/src/Makefile.global.in index a5e2f36d217..8107643578b 100644 --- a/src/Makefile.global.in +++ b/src/Makefile.global.in @@ -289,7 +289,6 @@ LDAP_LIBS_FE = @LDAP_LIBS_FE@ LDAP_LIBS_BE = @LDAP_LIBS_BE@ UUID_LIBS = @UUID_LIBS@ LLVM_LIBS=@LLVM_LIBS@ -LD = @LD@ with_gnu_ld = @with_gnu_ld@ # It's critical that within LDFLAGS, all -L switches pointing to build-tree @@ -316,8 +315,6 @@ LDFLAGS = $(LDFLAGS_INTERNAL) @LDFLAGS@ LDFLAGS_EX = @LDFLAGS_EX@ # LDFLAGS_SL might have already been assigned by calling makefile LDFLAGS_SL += @LDFLAGS_SL@ -LDREL = -r -LDOUT = -o WINDRES = @WINDRES@ X = @EXEEXT@ -- 2.37.3.542.gdd3f6c4cae
>From ae2370e7b83d82555471fee5bff28b184a6936c6 Mon Sep 17 00:00:00 2001 From: Andres Freund <and...@anarazel.de> Date: Mon, 26 Sep 2022 15:39:40 -0700 Subject: [PATCH v2 4/5] solaris: Check for -Wl,-E directly instead of checking for gnu LD This allows us to get rid of the harder to support with_gnu_ld detection, simplifying meson PGXS compatibility. It's also nice to delete libtool.m4. Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- config/c-compiler.m4 | 16 ++++ config/libtool.m4 | 119 ---------------------------- src/makefiles/Makefile.solaris | 2 +- aclocal.m4 | 1 - configure | 140 +++++++++------------------------ configure.ac | 10 ++- src/Makefile.global.in | 2 +- 7 files changed, 64 insertions(+), 226 deletions(-) delete mode 100644 config/libtool.m4 diff --git a/config/c-compiler.m4 b/config/c-compiler.m4 index eb8cc8ce170..d798c385c44 100644 --- a/config/c-compiler.m4 +++ b/config/c-compiler.m4 @@ -491,6 +491,22 @@ fi undefine([Ac_cachevar])dnl ])# PGAC_PROG_CC_LDFLAGS_OPT + +# PGAC_PROG_CC_LD_EXPORT_DYNAMIC +# ------------------------ +# Checks if the compiler / linker supports -Wl,-E and set +# pgac_cv_prog_cc_ld_export_dynamic if so. +AC_DEFUN([PGAC_PROG_CC_LD_EXPORT_DYNAMIC], +[AC_CACHE_CHECK([whether $CC supports -Wl,-E], [pgac_cv_prog_cc_ld_export_dynamic], +[pgac_save_LDFLAGS=$LDFLAGS +LDFLAGS="$pgac_save_LDFLAGS -Wl,-E" +AC_LINK_IFELSE([AC_LANG_PROGRAM([], [return 0;])], + [pgac_cv_prog_cc_ld_export_dynamic=yes], + [pgac_cv_prog_cc_ld_export_dynamic=no]) +LDFLAGS="$pgac_save_LDFLAGS"]) +])# PGAC_PROG_CC_LD_EXPORT_DYNAMIC + + # PGAC_HAVE_GCC__SYNC_CHAR_TAS # ---------------------------- # Check if the C compiler understands __sync_lock_test_and_set(char), diff --git a/config/libtool.m4 b/config/libtool.m4 deleted file mode 100644 index f6e426dbdf1..00000000000 --- a/config/libtool.m4 +++ /dev/null @@ -1,119 +0,0 @@ -## libtool.m4 - Configure libtool for the host system. -*-Shell-script-*- -## Copyright (C) 1996-1999,2000 Free Software Foundation, Inc. -## Originally by Gordon Matzigkeit <g...@gnu.ai.mit.edu>, 1996 -## -## This program is free software; you can redistribute it and/or modify -## it under the terms of the GNU General Public License as published by -## the Free Software Foundation; either version 2 of the License, or -## (at your option) any later version. -## -## This program is distributed in the hope that it will be useful, but -## WITHOUT ANY WARRANTY; without even the implied warranty of -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -## General Public License for more details. -## -## You should have received a copy of the GNU General Public License -## along with this program; if not, write to the Free Software -## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -## -## As a special exception to the GNU General Public License, if you -## distribute this file as part of a program that contains a -## configuration script generated by Autoconf, you may include it under -## the same distribution terms that you use for the rest of that program. - -# No, PostgreSQL doesn't use libtool (yet), we just borrow stuff from it. -# This file was taken on 2000-10-20 from the multi-language branch (since -# that is the branch that PostgreSQL would most likely adopt anyway). -# --petere - -# ... bunch of stuff removed here ... - -# PGAC_PROG_LD - find the path to the GNU or non-GNU linker -AC_DEFUN([PGAC_PROG_LD], -[AC_ARG_WITH(gnu-ld, -[ --with-gnu-ld assume the C compiler uses GNU ld [[default=no]]], -test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no) -AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([AC_CANONICAL_HOST])dnl -dnl ###not for PostgreSQL### AC_REQUIRE([AC_CANONICAL_BUILD])dnl -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - AC_MSG_CHECKING([for ld used by GCC]) - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case "$ac_prog" in - # Accept absolute paths. -changequote(,)dnl - [\\/]* | [A-Za-z]:[\\/]*) - re_direlt='/[^/][^/]*/\.\./' -changequote([,])dnl - # Canonicalize the path of ld - ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` - while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do - ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - AC_MSG_CHECKING([for GNU ld]) -else - AC_MSG_CHECKING([for non-GNU ld]) -fi -AC_CACHE_VAL(ac_cv_path_LD, -[if test -z "$LD"; then - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - ac_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some GNU ld's only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then - test "$with_gnu_ld" != no && break - else - test "$with_gnu_ld" != yes && break - fi - fi - done - IFS="$ac_save_ifs" -else - ac_cv_path_LD="$LD" # Let the user override the test with a path. -fi]) -LD="$ac_cv_path_LD" -if test -n "$LD"; then - AC_MSG_RESULT($LD) -else - AC_MSG_RESULT(no) -fi -test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) -PGAC_PROG_LD_GNU -]) - -AC_DEFUN([PGAC_PROG_LD_GNU], -[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], ac_cv_prog_gnu_ld, -[# I'd rather use --version here, but apparently some GNU ld's only accept -v. -if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then - ac_cv_prog_gnu_ld=yes -else - ac_cv_prog_gnu_ld=no -fi]) -with_gnu_ld=$ac_cv_prog_gnu_ld -]) - -# ... more stuff removed ... diff --git a/src/makefiles/Makefile.solaris b/src/makefiles/Makefile.solaris index 3de73ebc010..ba8e57988a9 100644 --- a/src/makefiles/Makefile.solaris +++ b/src/makefiles/Makefile.solaris @@ -1,7 +1,7 @@ # src/makefiles/Makefile.solaris rpath = -Wl,-rpath,'$(rpathdir)' -ifeq ($(with_gnu_ld), yes) +ifeq ($(SOLARIS_EXPORT_DYNAMIC), yes) export_dynamic = -Wl,-E endif diff --git a/aclocal.m4 b/aclocal.m4 index 1c19c60c596..d05f8f9e3a8 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -4,7 +4,6 @@ m4_include([config/c-compiler.m4]) m4_include([config/c-library.m4]) m4_include([config/check_decls.m4]) m4_include([config/general.m4]) -m4_include([config/libtool.m4]) m4_include([config/llvm.m4]) m4_include([config/perl.m4]) m4_include([config/pkg.m4]) diff --git a/configure b/configure index 7eafefb062a..c8bf357e6f3 100755 --- a/configure +++ b/configure @@ -629,6 +629,7 @@ ac_subst_vars='LTLIBOBJS vpath_build PG_SYSROOT PG_VERSION_NUM +SOLARIS_EXPORT_DYNAMIC PROVE DBTOEPUB FOP @@ -691,7 +692,6 @@ AR STRIP_SHARED_LIB STRIP_STATIC_LIB STRIP -with_gnu_ld LDFLAGS_SL LDFLAGS_EX ZSTD_LIBS @@ -870,7 +870,6 @@ with_system_tzdata with_zlib with_lz4 with_zstd -with_gnu_ld with_ssl with_openssl enable_largefile @@ -1581,7 +1580,6 @@ Optional Packages: --without-zlib do not use Zlib --with-lz4 build with LZ4 support --with-zstd build with ZSTD support - --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-ssl=LIB use LIB for SSL/TLS support (openssl) --with-openssl obsolete spelling of --with-ssl=openssl @@ -9364,105 +9362,6 @@ LDFLAGS="$LDFLAGS $LIBDIRS" -# Check whether --with-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then : - withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes -else - with_gnu_ld=no -fi - -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by GCC" >&5 -$as_echo_n "checking for ld used by GCC... " >&6; } - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case "$ac_prog" in - # Accept absolute paths. - [\\/]* | [A-Za-z]:[\\/]*) - re_direlt='/[^/][^/]*/\.\./' - # Canonicalize the path of ld - ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` - while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do - ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 -$as_echo_n "checking for GNU ld... " >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 -$as_echo_n "checking for non-GNU ld... " >&6; } -fi -if ${ac_cv_path_LD+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$LD"; then - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - ac_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some GNU ld's only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then - test "$with_gnu_ld" != no && break - else - test "$with_gnu_ld" != yes && break - fi - fi - done - IFS="$ac_save_ifs" -else - ac_cv_path_LD="$LD" # Let the user override the test with a path. -fi -fi - -LD="$ac_cv_path_LD" -if test -n "$LD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 -$as_echo "$LD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi -test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 -$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } -if ${ac_cv_prog_gnu_ld+:} false; then : - $as_echo_n "(cached) " >&6 -else - # I'd rather use --version here, but apparently some GNU ld's only accept -v. -if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then - ac_cv_prog_gnu_ld=yes -else - ac_cv_prog_gnu_ld=no -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_gnu_ld" >&5 -$as_echo "$ac_cv_prog_gnu_ld" >&6; } -with_gnu_ld=$ac_cv_prog_gnu_ld - - - - if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 @@ -19096,6 +18995,43 @@ fi fi +# Check if linker on solaris supports -Wl,-E (gnu linker does, solaris linker +# doesn't). +if test "$PORTNAME" = "solaris"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -Wl,-E" >&5 +$as_echo_n "checking whether $CC supports -Wl,-E... " >&6; } +if ${pgac_cv_prog_cc_ld_export_dynamic+:} false; then : + $as_echo_n "(cached) " >&6 +else + pgac_save_LDFLAGS=$LDFLAGS +LDFLAGS="$pgac_save_LDFLAGS -Wl,-E" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + pgac_cv_prog_cc_ld_export_dynamic=yes +else + pgac_cv_prog_cc_ld_export_dynamic=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LDFLAGS="$pgac_save_LDFLAGS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_cc_ld_export_dynamic" >&5 +$as_echo "$pgac_cv_prog_cc_ld_export_dynamic" >&6; } + + SOLARIS_EXPORT_DYNAMIC=$pgac_cv_prog_cc_ld_export_dynamic + +fi + # Create compiler version string if test x"$GCC" = x"yes" ; then cc_string=`${CC} --version | sed q` diff --git a/configure.ac b/configure.ac index 398eb422595..d87c9af77f8 100644 --- a/configure.ac +++ b/configure.ac @@ -1126,8 +1126,6 @@ LDFLAGS="$LDFLAGS $LIBDIRS" AC_ARG_VAR(LDFLAGS_EX, [extra linker flags for linking executables only]) AC_ARG_VAR(LDFLAGS_SL, [extra linker flags for linking shared libraries only]) -PGAC_PROG_LD -AC_SUBST(with_gnu_ld) PGAC_CHECK_STRIP AC_CHECK_TOOL(AR, ar, ar) if test "$PORTNAME" = "win32"; then @@ -2366,6 +2364,14 @@ else PGAC_PROG_CC_LDFLAGS_OPT([-Wl,--as-needed], $link_test_func) fi +# Check if linker on solaris supports -Wl,-E (gnu linker does, solaris linker +# doesn't). +if test "$PORTNAME" = "solaris"; then + PGAC_PROG_CC_LD_EXPORT_DYNAMIC() + SOLARIS_EXPORT_DYNAMIC=$pgac_cv_prog_cc_ld_export_dynamic + AC_SUBST(SOLARIS_EXPORT_DYNAMIC) +fi + # Create compiler version string if test x"$GCC" = x"yes" ; then cc_string=`${CC} --version | sed q` diff --git a/src/Makefile.global.in b/src/Makefile.global.in index 8107643578b..31294005235 100644 --- a/src/Makefile.global.in +++ b/src/Makefile.global.in @@ -289,7 +289,7 @@ LDAP_LIBS_FE = @LDAP_LIBS_FE@ LDAP_LIBS_BE = @LDAP_LIBS_BE@ UUID_LIBS = @UUID_LIBS@ LLVM_LIBS=@LLVM_LIBS@ -with_gnu_ld = @with_gnu_ld@ +SOLARIS_EXPORT_DYNAMIC=@SOLARIS_EXPORT_DYNAMIC@ # It's critical that within LDFLAGS, all -L switches pointing to build-tree # directories come before any -L switches pointing to external directories. -- 2.37.3.542.gdd3f6c4cae
>From cacef58c89ff4521b82912239d3bd48c15777f25 Mon Sep 17 00:00:00 2001 From: Andres Freund <and...@anarazel.de> Date: Wed, 24 Aug 2022 20:27:17 -0700 Subject: [PATCH v2 5/5] meson: Add PGXS compatibility This works for some extensions on some operating systems, but could use plenty of cleanups. --- meson.build | 5 + src/meson.build | 262 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 267 insertions(+) diff --git a/meson.build b/meson.build index 25a6fa941cc..29d7b2f4615 100644 --- a/meson.build +++ b/meson.build @@ -1789,6 +1789,11 @@ if cc.get_id() == 'msvc' ldflags_mod += '/NOIMPLIB' endif +if host_system == 'sunos' + solaris_export_dynamic = cc.has_link_argument('-Wl,-E') +else + solaris_export_dynamic = false +endif ############################################################### diff --git a/src/meson.build b/src/meson.build index b515af15bfa..8aa91940cec 100644 --- a/src/meson.build +++ b/src/meson.build @@ -10,3 +10,265 @@ subdir('bin') subdir('pl') subdir('interfaces') + + +### Generate a Makefile.global that's complete enough for PGXS to work. +# +# This is somewhat ugly, but allows extensions to use a single buildsystem +# across all the supported postgres versions. Once all supported PG versions +# support meson, we can remove all of this. +# +# XXX: Should we make this optional? + +pgxs_kv = { + 'PACKAGE_URL': pg_url, + 'PACKAGE_VERSION': pg_version, + 'PG_MAJORVERSION': pg_version_major, + 'PG_VERSION_NUM': pg_version_num, + 'configure_input': 'meson', + + 'vpath_build': 'yes', + 'autodepend': cc.get_argument_syntax() == 'gcc' ? 'yes' : 'no', + + 'host_cpu': host_cpu, + 'host': '@0@-@1@'.format(host_cpu, host_system), + 'host_os': host_system, + 'build_os': build_machine.system(), + 'PORTNAME': portname, + 'PG_SYSROOT': pg_sysroot, + + 'abs_top_builddir': meson.build_root(), + 'abs_top_srcdir': meson.source_root(), + + 'enable_thread_safety': 'yes', + 'enable_rpath': 'yes', + 'enable_nls': libintl.found() ? 'yes' : 'no', + 'enable_tap_tests': tap_tests_enabled ? 'yes' : 'no', + 'enable_debug': get_option('debug') ? 'yes' : 'no', + 'enable_coverage': get_option('b_coverage') ? 'yes' : 'no', + 'enable_dtrace': dtrace.found() ? 'yes' : 'no', + + 'DLSUFFIX': dlsuffix, + 'EXEEXT': exesuffix, + + 'SUN_STUDIO_CC': 'no', # not supported so far + + # want the chosen option, rather than the library + 'with_ssl' : get_option('ssl'), + 'with_uuid': uuidopt, + + 'default_port': get_option('pgport'), + 'with_system_tzdata': get_option('system_tzdata'), + + 'with_krb_srvnam': get_option('krb_srvnam'), + 'krb_srvtab': krb_srvtab, + + # FIXME: implement programs.m4 logic in PGAC_CHECK_STRIP + 'STRIP': 'strip', + 'STRIP_STATIC_LIB': 'strip -x', + 'STRIP_SHARED_LIB': 'strip --strip-unneeded', + + # Just always use the install_sh fallback that autoconf uses. Unlikely to + # matter performance-wise for extensions. If it turns out to do, we can + # improve that later. + 'MKDIR_P': ' '.join([install_sh.path(), '-d']), + + 'CC': var_cc, + 'CPP': var_cpp, + 'GCC': cc.get_argument_syntax() == 'gcc' ? 'yes' : 'no', + + 'SOLARIS_EXPORT_DYNAMIC': solaris_export_dynamic ? 'yes' : 'no', + + 'CFLAGS': var_cflags, + 'CPPFLAGS': var_cppflags, + 'CXXFLAGS': var_cxxflags, + 'CFLAGS_SL': var_cflags_sl, + 'CFLAGS_SL_MODULE': ' '.join(cflags_mod), + 'CXXFLAGS_SL_MODULE': ' '.join(cxxflags_mod), + 'CFLAGS_CRC': ' '.join(cflags_crc), + + 'CFLAGS_UNROLL_LOOPS': ' '.join(unroll_loops_cflags), + 'CFLAGS_VECTORIZE': ' '.join(vectorize_cflags), + + 'LDFLAGS': var_ldflags, + 'LDFLAGS_EX': var_ldflags_ex, + 'LDFLAGS_SL': var_ldflags_sl, + + # FIXME: + 'BITCODE_CFLAGS': '', + 'BITCODE_CXXFLAGS': '', + + 'BISONFLAGS': ' '.join(bison_flags), + 'FLEXFLAGS': ' '.join(flex_flags), + + 'LIBS': var_libs, +} + +if llvm.found() + pgxs_kv += { + 'CLANG': clang.path(), + 'CXX': ' '.join(cpp.cmd_array()), + 'LLVM_BINPATH': llvm_binpath, + } +else + pgxs_kv += { + 'CLANG': '', + 'CXX': '', + 'LLVM_BINPATH': '', + } +endif + +pgxs_bins = { + 'BISON': bison, + 'FLEX': flex, + 'GZIP': gzip, + 'LZ4': program_lz4, + 'PERL': perl, + 'PROVE': prove, + 'PYTHON': python, + 'TAR': tar, + 'ZSTD': program_zstd, + 'DTRACE': dtrace, + 'install_bin': install_sh, +} + +pgxs_empty = [ + 'PERMIT_DECLARATION_AFTER_STATEMENT', + 'ICU_CFLAGS', # needs to be added, included by public server headers + + # probably need most of these? + 'LN_S', + 'AR', + 'AWK', + + # hard to see why we'd need either? + 'ZIC', + 'TCLSH', + + # docs don't seem to be supported by pgxs + 'XMLLINT', + 'XSLTPROC', + 'DBTOEPUB', + 'FOP', + + # supporting coverage for pgxs-in-meson build doesn't seem worth it + 'GENHTML', + 'LCOV', + 'GCOV', + 'MSGFMT_FLAGS', + + # translation doesn't appear to be supported by pgxs + 'MSGFMT', + 'XGETTEXT', + 'MSGMERGE', + 'WANTED_LANGUAGES', + + # Not needed because we don't build the server / PLs with the generated makefile + 'LIBOBJS', 'PG_CRC32C_OBJS', 'TAS', + 'DTRACEFLAGS', # only server has dtrace probes + + 'perl_archlibexp', 'perl_embed_ccflags', 'perl_embed_ldflags', 'perl_includespec', 'perl_privlibexp', + 'python_additional_libs', 'python_includespec', 'python_libdir', 'python_libspec', 'python_majorversion', 'python_version', + + # possible that some of these are referenced explicitly in pgxs makefiles? + # For now not worth it. + 'TCL_INCLUDE_SPEC', 'TCL_LIBS', 'TCL_LIB_SPEC', 'TCL_SHARED_BUILD', + + 'LLVM_CFLAGS', 'LLVM_CPPFLAGS', 'LLVM_CXXFLAGS', 'LLVM_LIBS', + + 'LDAP_LIBS_BE', 'LDAP_LIBS_FE', + + 'UUID_LIBS', + + 'PTHREAD_CFLAGS', 'PTHREAD_LIBS', + + 'ICU_LIBS', +] + +if host_system == 'windows' and cc.get_argument_syntax() != 'msvc' + pgxs_bins += {'WINDRES': windres} +else + pgxs_empty += 'WINDRES' +endif + +pgxs_dirs = { + 'prefix': get_option('prefix'), + + 'bindir': '${exec_prefix}' / get_option('bindir'), + 'datarootdir': '${prefix}' / get_option('datadir'), + 'datadir': '${datarootdir}', + 'docdir': '${prefix}' / dir_doc, + 'exec_prefix': '${prefix}', + 'htmldir': '${prefix}' / dir_doc_html, #? + 'includedir': '${prefix}' / get_option('includedir'), + 'libdir': '${exec_prefix}' / get_option('libdir'), + 'localedir': '${prefix}' / get_option('localedir'), + 'mandir': '${prefix}' / get_option('mandir'), + 'sysconfdir': '${prefix}' / get_option('sysconfdir'), +} + +pgxs_deps = { + 'bonjour': bonjour, + 'bsd_auth': bsd_auth, + 'gssapi': gssapi, + 'icu': icu, + 'ldap': ldap, + 'libxml': libxml, + 'libxslt': libxslt, + 'llvm': llvm, + 'lz4': lz4, + 'nls': libintl, + 'pam': pam, + 'perl': perl_dep, + 'python': python3_dep, + 'readline': readline, + 'selinux': selinux, + 'systemd': systemd, + 'tcl': tcl_dep, + 'zlib': zlib, + 'zstd': zstd, +} + + +pgxs_cdata = configuration_data(pgxs_kv) + +foreach b, p : pgxs_bins + pgxs_cdata.set(b, p.found() ? p.path() : '') +endforeach + +foreach pe : pgxs_empty + pgxs_cdata.set(pe, '') +endforeach + +foreach d, p : pgxs_dirs + pgxs_cdata.set(d, p) +endforeach + +foreach d, v : pgxs_deps + pgxs_cdata.set('with_@0@'.format(d), v.found() ? 'yes' : 'no') +endforeach + + +makefile_global = configure_file( + input: 'Makefile.global.in', + output: 'Makefile.global', + configuration: pgxs_cdata, + install: true, + install_dir: dir_pgxs / 'src', +) +configure_files += makefile_global + +makefile_port = configure_file( + input: 'makefiles' / 'Makefile.@0@'.format(portname), + output: 'Makefile.port', + copy: true, + install_dir: dir_pgxs / 'src') +configure_files += makefile_port + +install_data( + 'Makefile.shlib', 'nls-global.mk', + install_dir: dir_pgxs / 'src') + +install_data( + 'makefiles/pgxs.mk', + install_dir: dir_pgxs / 'src' / 'makefiles') -- 2.37.3.542.gdd3f6c4cae