public inbox for [email protected]
help / color / mirror / Atom feedFrom: Srirama Kucherlapati <[email protected]>
To: Peter Eisentraut <[email protected]>
To: [email protected] <[email protected]>
Cc: Heikki Linnakangas <[email protected]>
Cc: Tristan Partin <[email protected]>
Cc: AIX PG user <[email protected]>
Subject: RE: AIX support
Date: Fri, 23 Jan 2026 16:11:25 +0000
Message-ID: <SJ4PPFB81778326EC35CBFA16B5449CFA97DB94A@SJ4PPFB81778326.namprd15.prod.outlook.com> (raw)
In-Reply-To: <SJ4PPFB81778326E995FAD5945ECF752FA1DB96A@SJ4PPFB81778326.namprd15.prod.outlook.com>
References: <CY5PR11MB63928CC05906F27FB10D74D0FD322@CY5PR11MB6392.namprd11.prod.outlook.com>
<[email protected]>
<176279401378.2081919.12877701948713975661.pgcf@coridan.postgresql.org>
<SJ4PPFB817783263EA0FD91EBC346308C51DBA3A@SJ4PPFB81778326.namprd15.prod.outlook.com>
<[email protected]>
<SJ4PPFB817783267BD66F22BFC328D93F81DBA8A@SJ4PPFB81778326.namprd15.prod.outlook.com>
<[email protected]>
<SJ4PPFB8177832684055FA99E25A710A09BDBB2A@SJ4PPFB81778326.namprd15.prod.outlook.com>
<SJ4PPFB817783265975DE0984EE26A94891DBBBA@SJ4PPFB81778326.namprd15.prod.outlook.com>
<SJ4PPFB817783261597674B9814FE523944DB8EA@SJ4PPFB81778326.namprd15.prod.outlook.com>
<[email protected]>
<SJ4PPFB8177832645802E05CC9DD299E792DB8CA@SJ4PPFB81778326.namprd15.prod.outlook.com>
<[email protected]>
<SJ4PPFB81778326E995FAD5945ECF752FA1DB96A@SJ4PPFB81778326.namprd15.prod.outlook.com>
Hi Peter,
> It's ok to split changes into multiple patches, and then recommend which parts you want
> reviewed first. But we need to see at least a rough outline of the
> complete plan before spending significant effort on reviewing the pieces.
Please find attached patches.
Meson changes - 0001-Support-for-AIX-pg19-meson.2.diff
Complete changes - 0001-Support-for-AIX.pg19.v11.patch
We have updated couple of changes in the full patch wrt to your previous
comments as well. Also, we are working to get the stats for the s_lock.h wrt
TAS. Will submit in a different thread.
Kindly request you to review the meson related changes.
Warm regards,
Sriram.
Attachments:
[application/octet-stream] 0001-Support-for-AIX-pg19-meson.2.diff (8.1K, 3-0001-Support-for-AIX-pg19-meson.2.diff)
download | inline diff:
diff --git a/meson.build b/meson.build
index 6e7ddd74683..17ad9c6ca32 100644
--- a/meson.build
+++ b/meson.build
@@ -198,6 +198,8 @@ endif
# that purpose.
portname = host_system
+dep_static_lib = declare_dependency()
+
if host_system == 'cygwin'
sema_kind = 'unnamed_posix'
cppflags += '-D_GNU_SOURCE'
@@ -206,6 +208,32 @@ if host_system == 'cygwin'
mod_link_with_name = 'lib@[email protected]'
mod_link_with_dir = 'libdir'
+elif host_system == 'aix'
+ sema_kind = 'unnamed_posix'
+ library_path_var = 'LIBPATH'
+ export_file_format = 'aix'
+ export_fmt = '-Wl,-bE:@0@'
+ mod_link_args_fmt = ['-Wl,-bI:@0@']
+ mod_link_with_dir = 'libdir'
+ mod_link_with_name = '@[email protected]'
+ dl_suffix = '.a'
+ # This flag is required to make sure the user spefic float.h is
+ # picked instead of the system float.h header file, which doesnot
+ # have definition like float8, etc
+ cflags += '-D_H_FLOAT'
+
+ # M:SRE sets a flag indicating that an object is a shared library. Seems to
+ # work in some circumstances without, but required in others.
+ ldflags_sl += '-Wl,-bM:SRE'
+ ldflags_be += '-Wl,-brtllib'
+
+ # https://mesonbuild.com/Release-notes-for-1-6-0.html
+ # According to Mesons documentation for AIX, both shared and static libraries
+ # are typically archived, and they should have distinct names if a project
+ # requires building both. However, in this case, only shared libraries are
+ # used on AIX, so we are skipping the build for static libraries.
+ dep_static_lib = disabler()
+
elif host_system == 'darwin'
dlsuffix = '.dylib'
library_path_var = 'DYLD_LIBRARY_PATH'
@@ -1765,10 +1793,49 @@ endforeach
# as long, char, short, or int. Note that we intentionally do not consider
# any types wider than 64 bits, as allowing MAXIMUM_ALIGNOF to exceed 8
# would be too much of a penalty for disk and memory space.
-alignof_double = cdata.get('ALIGNOF_DOUBLE')
-if cc.alignment('int64_t', args: test_c_args, prefix: '#include <stdint.h>') > alignof_double
- error('alignment of int64_t is greater than the alignment of double')
-endif
+if host_system != 'aix'
+ alignof_double = cdata.get('ALIGNOF_DOUBLE')
+ if cc.alignment('int64_t', args: test_c_args, prefix: '#include <stdint.h>') > alignof_double
+ error('alignment of int64_t is greater than the alignment of double')
+ endif
+else
+ # The AIX 'power' alignment rules apply the natural alignment of the "first
+ # member" if it is of a floating-point data type (or is an aggregate whose
+ # recursively "first" member or element is such a type). The alignment
+ # associated with these types for subsequent members use an alignment value
+ # where the floating-point data type is considered to have 4-byte alignment.
+ # More info
+ # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99557
+ #
+ # The double is aligned to 4-bytes on AIX in aggregates. But to maintain
+ # alignement across platforms the max alignment of long should be considered.
+
+ # Get the alignment values
+ ac_cv_alignof_long = cc.alignment('long', args: test_c_args, prefix: '#include <stdint.h>')
+ ac_cv_alignof_double = cc.alignment('double', args: test_c_args, prefix: '#include <stdint.h>')
+ ac_cv_alignof_int64_t = cc.alignment('int64_t', args: test_c_args, prefix: '#include <stdint.h>')
+
+ message('Alignment of long : @0@'.format(ac_cv_alignof_long))
+ message('Alignment of double : @0@'.format(ac_cv_alignof_double))
+ message('Alignment of int64_t : @0@'.format(ac_cv_alignof_int64_t))
+
+ # Start with long
+ alignof_double = ac_cv_alignof_long
+ message('MAX ALIGN ac_cv_alignof_long')
+
+ # Compare with double
+ if alignof_double < ac_cv_alignof_double
+ alignof_double = ac_cv_alignof_double
+ message('MAX ALIGN ac_cv_alignof_double')
+ endif
+
+ # Compare with int64_t
+ if alignof_double < ac_cv_alignof_int64_t
+ alignof_double = ac_cv_alignof_int64_t
+ message('MAX ALIGN ac_cv_alignof_int64_t')
+ endif
+endif
+message('MAX ALIGN OF DOUBLE : @0@'.format(alignof_double))
cdata.set('MAXIMUM_ALIGNOF', alignof_double)
cdata.set('SIZEOF_LONG', cc.sizeof('long', args: test_c_args))
@@ -3466,13 +3533,17 @@ endif
installed_targets = [
backend_targets,
bin_targets,
- libpq_st,
pl_targets,
contrib_targets,
nls_mo_targets,
ecpg_targets,
]
+# Include the libpq only if its build. For AIX its skipped.
+if dep_static_lib.found()
+ installed_targets += [libpq_st]
+endif
+
if oauth_flow_supported
installed_targets += [
libpq_oauth_so,
diff --git a/src/backend/meson.build b/src/backend/meson.build
index b831a541652..4838f245ab3 100644
--- a/src/backend/meson.build
+++ b/src/backend/meson.build
@@ -125,6 +125,24 @@ if host_system == 'windows'
'--FILEDESC', 'PostgreSQL Server',])
endif
+if host_system == 'aix'
+ # The '.' argument leads mkldexport.sh to emit "#! .", which refers to the
+ # main executable, allowing extension libraries to resolve their undefined
+ # symbols to symbols in the postgres binary.
+ postgres_imp = custom_target('postgres.imp',
+ command: [files('port/aix/mkldexport.sh'), '@INPUT@', '.'],
+ input: postgres_lib,
+ output: 'postgres.imp',
+ capture: true,
+ install: true,
+ install_dir: dir_lib,
+ build_by_default: false,
+ )
+ backend_link_args += '-Wl,-bE:@0@'.format(postgres_imp.full_path())
+ backend_link_depends += postgres_imp
+endif
+
+
postgres = executable('postgres',
backend_input,
sources: post_export_backend_sources,
diff --git a/src/interfaces/ecpg/compatlib/meson.build b/src/interfaces/ecpg/compatlib/meson.build
index 56e0a21651b..4bc47153896 100644
--- a/src/interfaces/ecpg/compatlib/meson.build
+++ b/src/interfaces/ecpg/compatlib/meson.build
@@ -20,11 +20,13 @@ ecpg_compat_st = static_library('libecpg_compat',
ecpg_compat_sources,
include_directories: ecpg_compat_inc,
c_args: ecpg_compat_c_args,
- dependencies: [frontend_stlib_code, thread_dep],
+ dependencies: [frontend_stlib_code, thread_dep, dep_static_lib],
link_with: [ecpglib_st, ecpg_pgtypes_st],
kwargs: default_lib_args,
)
-ecpg_targets += ecpg_compat_st
+if ecpg_compat_st.found()
+ ecpg_targets += ecpg_compat_st
+endif
ecpg_compat_so = shared_library('libecpg_compat',
ecpg_compat_sources + ecpg_compat_so_sources,
diff --git a/src/interfaces/ecpg/ecpglib/meson.build b/src/interfaces/ecpg/ecpglib/meson.build
index 8f478c6a73e..c5ee8e80cd1 100644
--- a/src/interfaces/ecpg/ecpglib/meson.build
+++ b/src/interfaces/ecpg/ecpglib/meson.build
@@ -30,11 +30,13 @@ ecpglib_st = static_library('libecpg',
include_directories: ecpglib_inc,
c_args: ecpglib_c_args,
c_pch: pch_postgres_fe_h,
- dependencies: [frontend_stlib_code, thread_dep, libpq],
+ dependencies: [frontend_stlib_code, thread_dep, libpq, dep_static_lib],
link_with: [ecpg_pgtypes_st],
kwargs: default_lib_args,
)
-ecpg_targets += ecpglib_st
+if ecpglib_st.found()
+ ecpg_targets += ecpglib_st
+endif
ecpglib_so = shared_library('libecpg',
ecpglib_sources + ecpglib_so_sources,
diff --git a/src/interfaces/ecpg/pgtypeslib/meson.build b/src/interfaces/ecpg/pgtypeslib/meson.build
index 02301ec9acb..2b7d80ddfb1 100644
--- a/src/interfaces/ecpg/pgtypeslib/meson.build
+++ b/src/interfaces/ecpg/pgtypeslib/meson.build
@@ -26,10 +26,12 @@ ecpg_pgtypes_st = static_library('libpgtypes',
include_directories: ecpg_pgtypes_inc,
c_args: ecpg_pgtypes_c_args,
c_pch: pch_postgres_fe_h,
- dependencies: frontend_stlib_code,
+ dependencies: [frontend_stlib_code, dep_static_lib],
kwargs: default_lib_args,
)
-ecpg_targets += ecpg_pgtypes_st
+if ecpg_pgtypes_st.found()
+ ecpg_targets += ecpg_pgtypes_st
+endif
ecpg_pgtypes_so = shared_library('libpgtypes',
ecpg_pgtypes_sources + ecpg_pgtypes_so_sources,
diff --git a/src/interfaces/libpq/meson.build b/src/interfaces/libpq/meson.build
index a74e885b169..ea3f540f8bc 100644
--- a/src/interfaces/libpq/meson.build
+++ b/src/interfaces/libpq/meson.build
@@ -62,7 +62,7 @@ libpq_st = static_library('libpq',
include_directories: [libpq_inc],
c_args: libpq_c_args,
c_pch: pch_postgres_fe_h,
- dependencies: [frontend_stlib_code, libpq_deps],
+ dependencies: [frontend_stlib_code, libpq_deps, dep_static_lib],
kwargs: default_lib_args,
)
[application/octet-stream] 0001-Support-for-AIX.pg19.v11.patch (23.6K, 4-0001-Support-for-AIX.pg19.v11.patch)
download | inline diff:
diff --git a/Makefile b/Makefile
index 8a2ec9396b6..9bc1a4ec17b 100644
--- a/Makefile
+++ b/Makefile
@@ -13,8 +13,6 @@
# AIX make defaults to building *every* target of the first rule. Start with
# a single-target, empty rule to make the other targets non-default.
-# (We don't support AIX anymore, but if someone tries to build on AIX anyway,
-# at least they'll get the instructions to run 'configure' first.)
all:
all check install installdirs installcheck installcheck-parallel uninstall clean distclean maintainer-clean dist distcheck world check-world install-world installcheck-world:
diff --git a/configure b/configure
index 3a0ed11fa8e..c4749a8e5b6 100755
--- a/configure
+++ b/configure
@@ -3020,6 +3020,7 @@ else
# --with-template not given
case $host_os in
+ aix*) template=aix ;;
cygwin*|msys*) template=cygwin ;;
darwin*) template=darwin ;;
dragonfly*) template=netbsd ;;
@@ -17006,13 +17007,37 @@ _ACEOF
# wider than 64 bits, as allowing MAXIMUM_ALIGNOF to exceed 8 would be too
# much of a penalty for disk and memory space.
-MAX_ALIGNOF=$ac_cv_alignof_double
+echo "Checking for MAX ALIGN - $PORTNAME"
+if test "$PORTNAME" != "aix"; then
+ MAX_ALIGNOF=$ac_cv_alignof_double
-if test $ac_cv_alignof_long -gt $MAX_ALIGNOF ; then
- as_fn_error $? "alignment of 'long' is greater than the alignment of 'double'" "$LINENO" 5
-fi
-if test $ac_cv_alignof_int64_t -gt $MAX_ALIGNOF ; then
- as_fn_error $? "alignment of 'int64_t' is greater than the alignment of 'double'" "$LINENO" 5
+ if test $ac_cv_alignof_long -gt $MAX_ALIGNOF ; then
+ as_fn_error $? "alignment of 'long' is greater than the alignment of 'double'" "$LINENO" 5
+ fi
+ if test x"$HAVE_LONG_LONG_INT_64" = xyes && test $ac_cv_alignof_long_long_int -gt $MAX_ALIGNOF ; then
+ as_fn_error $? "alignment of 'long long int' is greater than the alignment of 'double'" "$LINENO" 5
+ fi
+else
+# The AIX 'power' alignment rules apply the natural alignment of the "first
+# member" if it is of a floating-point data type (or is an aggregate whose
+# recursively "first" member or element is such a type). The alignment
+# associated with these types for subsequent members use an alignment value
+# where the floating-point data type is considered to have 4-byte alignment.
+# More info
+# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99557
+#
+# The double is aligned to 4-bytes on AIX in aggregates. But to maintain
+# alignement across platforms the max alignment of long should be considered.
+ echo "MAX ALIGN ac_cv_alignof_long"
+ MAX_ALIGNOF=$ac_cv_alignof_long
+ if test $MAX_ALIGNOF -lt $ac_cv_alignof_double ; then
+ MAX_ALIGNOF=$ac_cv_alignof_double
+ echo "MAX ALIGN ac_cv_alignof_double"
+ fi
+ if test $MAX_ALIGNOF -lt $ac_cv_alignof_int64_t; then
+ MAX_ALIGNOF="$ac_cv_alignof_int64_t"
+ echo "MAX ALIGN ac_cv_alignof_int64_t"
+ fi
fi
cat >>confdefs.h <<_ACEOF
diff --git a/configure.ac b/configure.ac
index c2413720a18..7f1530df2b1 100644
--- a/configure.ac
+++ b/configure.ac
@@ -62,6 +62,7 @@ PGAC_ARG_REQ(with, template, [NAME], [override operating system template],
# --with-template not given
case $host_os in
+ aix*) template=aix ;;
cygwin*|msys*) template=cygwin ;;
darwin*) template=darwin ;;
dragonfly*) template=netbsd ;;
@@ -2006,7 +2007,33 @@ AC_CHECK_ALIGNOF(double)
# wider than 64 bits, as allowing MAXIMUM_ALIGNOF to exceed 8 would be too
# much of a penalty for disk and memory space.
-MAX_ALIGNOF=$ac_cv_alignof_double
+if test "$PORTNAME" != "aix"; then
+ MAX_ALIGNOF=$ac_cv_alignof_double
+
+ if test $ac_cv_alignof_long -gt $MAX_ALIGNOF ; then
+ as_fn_error $? "alignment of 'long' is greater than the alignment of 'double'" "$LINENO" 5
+ fi
+ if test $ac_cv_alignof_int64_t -gt $MAX_ALIGNOF; then
+ as_fn_error $? "alignment of 'long long int' is greater than the alignment of 'double'" "$LINENO" 5
+ fi
+else
+# The AIX 'power' alignment rules apply the natural alignment of the "first
+# member" if it is of a floating-point data type (or is an aggregate whose
+# recursively "first" member or element is such a type). The alignment
+# associated with these types for subsequent members use an alignment value
+# where the floating-point data type is considered to have 4-byte alignment.
+# More info
+# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99557
+#
+# The double is aligned to 4-bytes on AIX in aggregates. But to maintain
+# alignement across platforms the max alignment of long should be considered.
+ MAX_ALIGNOF=$ac_cv_alignof_long
+ if test $MAX_ALIGNOF -lt $ac_cv_alignof_double ; then
+ MAX_ALIGNOF=$ac_cv_alignof_double
+ fi
+ if test $MAX_ALIGNOF -lt $ac_cv_alignof_int64_t ; then
+ MAX_ALIGNOF="$ac_cv_alignof_int64_t"
+ fi
if test $ac_cv_alignof_long -gt $MAX_ALIGNOF ; then
AC_MSG_ERROR([alignment of 'long' is greater than the alignment of 'double'])
diff --git a/meson.build b/meson.build
index 6e7ddd74683..17ad9c6ca32 100644
--- a/meson.build
+++ b/meson.build
@@ -198,6 +198,8 @@ endif
# that purpose.
portname = host_system
+dep_static_lib = declare_dependency()
+
if host_system == 'cygwin'
sema_kind = 'unnamed_posix'
cppflags += '-D_GNU_SOURCE'
@@ -206,6 +208,32 @@ if host_system == 'cygwin'
mod_link_with_name = 'lib@[email protected]'
mod_link_with_dir = 'libdir'
+elif host_system == 'aix'
+ sema_kind = 'unnamed_posix'
+ library_path_var = 'LIBPATH'
+ export_file_format = 'aix'
+ export_fmt = '-Wl,-bE:@0@'
+ mod_link_args_fmt = ['-Wl,-bI:@0@']
+ mod_link_with_dir = 'libdir'
+ mod_link_with_name = '@[email protected]'
+ dl_suffix = '.a'
+ # This flag is required to make sure the user spefic float.h is
+ # picked instead of the system float.h header file, which doesnot
+ # have definition like float8, etc
+ cflags += '-D_H_FLOAT'
+
+ # M:SRE sets a flag indicating that an object is a shared library. Seems to
+ # work in some circumstances without, but required in others.
+ ldflags_sl += '-Wl,-bM:SRE'
+ ldflags_be += '-Wl,-brtllib'
+
+ # https://mesonbuild.com/Release-notes-for-1-6-0.html
+ # According to Mesons documentation for AIX, both shared and static libraries
+ # are typically archived, and they should have distinct names if a project
+ # requires building both. However, in this case, only shared libraries are
+ # used on AIX, so we are skipping the build for static libraries.
+ dep_static_lib = disabler()
+
elif host_system == 'darwin'
dlsuffix = '.dylib'
library_path_var = 'DYLD_LIBRARY_PATH'
@@ -1765,10 +1793,49 @@ endforeach
# as long, char, short, or int. Note that we intentionally do not consider
# any types wider than 64 bits, as allowing MAXIMUM_ALIGNOF to exceed 8
# would be too much of a penalty for disk and memory space.
-alignof_double = cdata.get('ALIGNOF_DOUBLE')
-if cc.alignment('int64_t', args: test_c_args, prefix: '#include <stdint.h>') > alignof_double
- error('alignment of int64_t is greater than the alignment of double')
-endif
+if host_system != 'aix'
+ alignof_double = cdata.get('ALIGNOF_DOUBLE')
+ if cc.alignment('int64_t', args: test_c_args, prefix: '#include <stdint.h>') > alignof_double
+ error('alignment of int64_t is greater than the alignment of double')
+ endif
+else
+ # The AIX 'power' alignment rules apply the natural alignment of the "first
+ # member" if it is of a floating-point data type (or is an aggregate whose
+ # recursively "first" member or element is such a type). The alignment
+ # associated with these types for subsequent members use an alignment value
+ # where the floating-point data type is considered to have 4-byte alignment.
+ # More info
+ # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99557
+ #
+ # The double is aligned to 4-bytes on AIX in aggregates. But to maintain
+ # alignement across platforms the max alignment of long should be considered.
+
+ # Get the alignment values
+ ac_cv_alignof_long = cc.alignment('long', args: test_c_args, prefix: '#include <stdint.h>')
+ ac_cv_alignof_double = cc.alignment('double', args: test_c_args, prefix: '#include <stdint.h>')
+ ac_cv_alignof_int64_t = cc.alignment('int64_t', args: test_c_args, prefix: '#include <stdint.h>')
+
+ message('Alignment of long : @0@'.format(ac_cv_alignof_long))
+ message('Alignment of double : @0@'.format(ac_cv_alignof_double))
+ message('Alignment of int64_t : @0@'.format(ac_cv_alignof_int64_t))
+
+ # Start with long
+ alignof_double = ac_cv_alignof_long
+ message('MAX ALIGN ac_cv_alignof_long')
+
+ # Compare with double
+ if alignof_double < ac_cv_alignof_double
+ alignof_double = ac_cv_alignof_double
+ message('MAX ALIGN ac_cv_alignof_double')
+ endif
+
+ # Compare with int64_t
+ if alignof_double < ac_cv_alignof_int64_t
+ alignof_double = ac_cv_alignof_int64_t
+ message('MAX ALIGN ac_cv_alignof_int64_t')
+ endif
+endif
+message('MAX ALIGN OF DOUBLE : @0@'.format(alignof_double))
cdata.set('MAXIMUM_ALIGNOF', alignof_double)
cdata.set('SIZEOF_LONG', cc.sizeof('long', args: test_c_args))
@@ -3466,13 +3533,17 @@ endif
installed_targets = [
backend_targets,
bin_targets,
- libpq_st,
pl_targets,
contrib_targets,
nls_mo_targets,
ecpg_targets,
]
+# Include the libpq only if its build. For AIX its skipped.
+if dep_static_lib.found()
+ installed_targets += [libpq_st]
+endif
+
if oauth_flow_supported
installed_targets += [
libpq_oauth_so,
diff --git a/src/Makefile.shlib b/src/Makefile.shlib
index 3825af5b228..35adc4174ed 100644
--- a/src/Makefile.shlib
+++ b/src/Makefile.shlib
@@ -106,6 +106,20 @@ ifdef SO_MAJOR_VERSION
override CPPFLAGS += -DSO_MAJOR_VERSION=$(SO_MAJOR_VERSION)
endif
+ifeq ($(PORTNAME), aix)
+ LINK.shared = $(COMPILER)
+ ifdef SO_MAJOR_VERSION
+ shlib = lib$(NAME)$(DLSUFFIX).$(SO_MAJOR_VERSION)
+ endif
+ haslibarule = yes
+ # $(exports_file) is also usable as an import file
+ exports_file = lib$(NAME).exp
+ BUILD.exports = ( echo '\#! $(shlib)'; $(AWK) '/^[^\#]/ {printf "%s\n",$$1}' $< ) > $@
+ ifneq (,$(SHLIB_EXPORTS))
+ LINK.shared += -Wl,-bE:$(exports_file)
+ endif
+endif
+
ifeq ($(PORTNAME), darwin)
ifdef soname
# linkable library
@@ -254,6 +268,14 @@ $(stlib): $(OBJS) | $(SHLIB_PREREQS)
touch $@
endif #haslibarule
+# AIX wraps both shared libraries and static library, which can be used both
+# for static and shared linking
+ifeq ($(PORTNAME), aix)
+$(stlib): $(shlib)
+ rm -f $(stlib)
+ $(AR) $(AROPT) $(stlib) $(shlib)
+endif # aix
+
ifeq (,$(filter cygwin win32,$(PORTNAME)))
# Normal case
@@ -267,8 +289,11 @@ ifneq ($(shlib), $(shlib_major))
endif
# Make sure we have a link to a name without any version numbers
ifneq ($(shlib), $(shlib_bare))
+# except on AIX, where that's not a thing
+ifneq ($(PORTNAME), aix)
rm -f $(shlib_bare)
$(LN_S) $(shlib) $(shlib_bare)
+endif # aix
endif # shlib_bare
endif # shlib_major
@@ -376,6 +401,9 @@ install-lib-static: $(stlib) installdirs-lib
install-lib-shared: $(shlib) installdirs-lib
ifdef soname
+# we don't install $(shlib) on AIX
+# (see http://archives.postgresql.org/message-id/52EF20B2E3209443BC37736D00C3C1380A6E79FE@EXADV1.host.magwien.gv.at)
+ifneq ($(PORTNAME), aix)
$(INSTALL_SHLIB) $< '$(DESTDIR)$(libdir)/$(shlib)'
ifneq ($(PORTNAME), cygwin)
ifneq ($(PORTNAME), win32)
@@ -391,6 +419,7 @@ ifneq ($(shlib), $(shlib_bare))
endif
endif # not win32
endif # not cygwin
+endif # not aix
ifneq (,$(findstring $(PORTNAME),win32 cygwin))
$(INSTALL_SHLIB) $< '$(DESTDIR)$(bindir)/$(shlib)'
endif
diff --git a/src/backend/Makefile b/src/backend/Makefile
index 7344c8c7f5c..572f5430a60 100644
--- a/src/backend/Makefile
+++ b/src/backend/Makefile
@@ -63,12 +63,14 @@ all: submake-libpgport submake-catalog-headers submake-utils-headers postgres $(
ifneq ($(PORTNAME), cygwin)
ifneq ($(PORTNAME), win32)
+ifneq ($(PORTNAME), aix)
postgres: $(OBJS)
$(CC) $(CFLAGS) $(call expand_subsys,$^) $(LDFLAGS) $(LIBS) -o $@
endif
endif
+endif
ifeq ($(PORTNAME), cygwin)
@@ -95,6 +97,24 @@ libpostgres.a: postgres
endif # win32
+ifeq ($(PORTNAME), aix)
+
+postgres: $(POSTGRES_IMP)
+ $(CC) $(CFLAGS) $(call expand_subsys,$(OBJS)) $(LDFLAGS) -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.
+#
+# It looks alluring to use $(CC) -r instead of ld -r, but that doesn't
+# trivially work with gcc, due to gcc specific static libraries linked in with
+# -r.
+$(POSTGRES_IMP): $(OBJS)
+ ld -r -o SUBSYS.o $(call expand_subsys,$^)
+ $(MKLDEXPORT) SUBSYS.o . > $@
+ @rm -f SUBSYS.o
+
+endif # aix
+
$(top_builddir)/src/port/libpgport_srv.a: | submake-libpgport
diff --git a/src/backend/meson.build b/src/backend/meson.build
index b831a541652..4838f245ab3 100644
--- a/src/backend/meson.build
+++ b/src/backend/meson.build
@@ -125,6 +125,24 @@ if host_system == 'windows'
'--FILEDESC', 'PostgreSQL Server',])
endif
+if host_system == 'aix'
+ # The '.' argument leads mkldexport.sh to emit "#! .", which refers to the
+ # main executable, allowing extension libraries to resolve their undefined
+ # symbols to symbols in the postgres binary.
+ postgres_imp = custom_target('postgres.imp',
+ command: [files('port/aix/mkldexport.sh'), '@INPUT@', '.'],
+ input: postgres_lib,
+ output: 'postgres.imp',
+ capture: true,
+ install: true,
+ install_dir: dir_lib,
+ build_by_default: false,
+ )
+ backend_link_args += '-Wl,-bE:@0@'.format(postgres_imp.full_path())
+ backend_link_depends += postgres_imp
+endif
+
+
postgres = executable('postgres',
backend_input,
sources: post_export_backend_sources,
diff --git a/src/backend/port/aix/mkldexport.sh b/src/backend/port/aix/mkldexport.sh
new file mode 100755
index 00000000000..adf3793e868
--- /dev/null
+++ b/src/backend/port/aix/mkldexport.sh
@@ -0,0 +1,61 @@
+#!/bin/sh
+#
+# mkldexport
+# create an AIX exports file from an object file
+#
+# src/backend/port/aix/mkldexport.sh
+#
+# Usage:
+# mkldexport objectfile [location]
+# where
+# objectfile is the current location of the object file.
+# location is the eventual (installed) location of the
+# object file (if different from the current
+# working directory).
+#
+# [This file comes from the Postgres 4.2 distribution. - ay 7/95]
+#
+# Header: /usr/local/devel/postgres/src/tools/mkldexport/RCS/mkldexport.sh,v 1.2 1994/03/13 04:59:12 aoki Exp
+#
+
+# setting this to nm -B might be better
+# ... due to changes in AIX 4.x ...
+# ... let us search in different directories - Gerhard Reithofer
+if [ -x /usr/ucb/nm ]
+then NM=/usr/ucb/nm
+elif [ -x /usr/bin/nm ]
+then NM=/usr/bin/nm
+elif [ -x /usr/ccs/bin/nm ]
+then NM=/usr/ccs/bin/nm
+elif [ -x /usr/usg/bin/nm ]
+then NM=/usr/usg/bin/nm
+else echo "Fatal error: cannot find `nm' ... please check your installation."
+ exit 1
+fi
+
+CMDNAME=`basename $0`
+if [ -z "$1" ]; then
+ echo "Usage: $CMDNAME object [location]"
+ exit 1
+fi
+OBJNAME=`basename $1`
+if [ "`basename $OBJNAME`" != "`basename $OBJNAME .o`" ]; then
+ OBJNAME=`basename $OBJNAME .o`.so
+fi
+if [ -z "$2" ]; then
+ echo '#!'
+else
+ if [ "$2" = "." ]; then
+ # for the base executable (AIX 4.2 and up)
+ echo '#! .'
+ else
+ echo '#!' $2
+ fi
+fi
+$NM -BCg $1 | \
+ egrep ' [TDB] ' | \
+ sed -e 's/.* //' | \
+ egrep -v '\$' | \
+ sed -e 's/^[.]//' | \
+ sort | \
+ uniq
diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index 29643c51439..1c933b5afad 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -914,7 +914,9 @@ errcode_for_file_access(void)
/* Wrong object type or state */
case ENOTDIR: /* Not a directory */
case EISDIR: /* Is a directory */
+#if defined(ENOTEMPTY) && (ENOTEMPTY != EEXIST) /* same code on AIX */
case ENOTEMPTY: /* Directory not empty */
+#endif
edata->sqlerrcode = ERRCODE_WRONG_OBJECT_TYPE;
break;
diff --git a/src/include/port/aix.h b/src/include/port/aix.h
new file mode 100644
index 00000000000..c86983a4452
--- /dev/null
+++ b/src/include/port/aix.h
@@ -0,0 +1,3 @@
+/*
+ * src/include/port/aix.h
+ */
diff --git a/src/include/storage/s_lock.h b/src/include/storage/s_lock.h
index 7f8f566bd40..1a0cd5ec019 100644
--- a/src/include/storage/s_lock.h
+++ b/src/include/storage/s_lock.h
@@ -398,60 +398,20 @@ typedef unsigned int slock_t;
#define TAS(lock) tas(lock)
-/* On PPC, it's a win to use a non-locking test before the lwarx */
+/* On PPC, use the compiler provided Built-in functions for atomic memory
+ * exchange operations.
+ */
#define TAS_SPIN(lock) (*(lock) ? 1 : TAS(lock))
-/*
- * The second operand of addi can hold a constant zero or a register number,
- * hence constraint "=&b" to avoid allocating r0. "b" stands for "address
- * base register"; most operands having this register-or-zero property are
- * address bases, e.g. the second operand of lwax.
- *
- * NOTE: per the Enhanced PowerPC Architecture manual, v1.0 dated 7-May-2002,
- * an isync is a sufficient synchronization barrier after a lwarx/stwcx loop.
- * But if the spinlock is in ordinary memory, we can use lwsync instead for
- * better performance.
- */
static __inline__ int
tas(volatile slock_t *lock)
{
- slock_t _t;
- int _res;
-
- __asm__ __volatile__(
-" lwarx %0,0,%3,1 \n"
-" cmpwi %0,0 \n"
-" bne 1f \n"
-" addi %0,%0,1 \n"
-" stwcx. %0,0,%3 \n"
-" beq 2f \n"
-"1: \n"
-" li %1,1 \n"
-" b 3f \n"
-"2: \n"
-" lwsync \n"
-" li %1,0 \n"
-"3: \n"
-: "=&b"(_t), "=r"(_res), "+m"(*lock)
-: "r"(lock)
-: "memory", "cc");
- return _res;
+ return __sync_lock_test_and_set(lock, 1);
}
-
-/*
- * PowerPC S_UNLOCK is almost standard but requires a "sync" instruction.
- * But we can use lwsync instead for better performance.
- */
-#define S_UNLOCK(lock) \
-do \
-{ \
- __asm__ __volatile__ (" lwsync \n" ::: "memory"); \
- *((volatile slock_t *) (lock)) = 0; \
-} while (0)
+#define S_UNLOCK(lock) __sync_lock_release(lock)
#endif /* powerpc */
-
-
+
#if defined(__mips__) && !defined(__sgi) /* non-SGI MIPS */
#define HAS_TEST_AND_SET
diff --git a/src/interfaces/ecpg/compatlib/meson.build b/src/interfaces/ecpg/compatlib/meson.build
index 56e0a21651b..4bc47153896 100644
--- a/src/interfaces/ecpg/compatlib/meson.build
+++ b/src/interfaces/ecpg/compatlib/meson.build
@@ -20,11 +20,13 @@ ecpg_compat_st = static_library('libecpg_compat',
ecpg_compat_sources,
include_directories: ecpg_compat_inc,
c_args: ecpg_compat_c_args,
- dependencies: [frontend_stlib_code, thread_dep],
+ dependencies: [frontend_stlib_code, thread_dep, dep_static_lib],
link_with: [ecpglib_st, ecpg_pgtypes_st],
kwargs: default_lib_args,
)
-ecpg_targets += ecpg_compat_st
+if ecpg_compat_st.found()
+ ecpg_targets += ecpg_compat_st
+endif
ecpg_compat_so = shared_library('libecpg_compat',
ecpg_compat_sources + ecpg_compat_so_sources,
diff --git a/src/interfaces/ecpg/ecpglib/meson.build b/src/interfaces/ecpg/ecpglib/meson.build
index 8f478c6a73e..c5ee8e80cd1 100644
--- a/src/interfaces/ecpg/ecpglib/meson.build
+++ b/src/interfaces/ecpg/ecpglib/meson.build
@@ -30,11 +30,13 @@ ecpglib_st = static_library('libecpg',
include_directories: ecpglib_inc,
c_args: ecpglib_c_args,
c_pch: pch_postgres_fe_h,
- dependencies: [frontend_stlib_code, thread_dep, libpq],
+ dependencies: [frontend_stlib_code, thread_dep, libpq, dep_static_lib],
link_with: [ecpg_pgtypes_st],
kwargs: default_lib_args,
)
-ecpg_targets += ecpglib_st
+if ecpglib_st.found()
+ ecpg_targets += ecpglib_st
+endif
ecpglib_so = shared_library('libecpg',
ecpglib_sources + ecpglib_so_sources,
diff --git a/src/interfaces/ecpg/pgtypeslib/meson.build b/src/interfaces/ecpg/pgtypeslib/meson.build
index 02301ec9acb..2b7d80ddfb1 100644
--- a/src/interfaces/ecpg/pgtypeslib/meson.build
+++ b/src/interfaces/ecpg/pgtypeslib/meson.build
@@ -26,10 +26,12 @@ ecpg_pgtypes_st = static_library('libpgtypes',
include_directories: ecpg_pgtypes_inc,
c_args: ecpg_pgtypes_c_args,
c_pch: pch_postgres_fe_h,
- dependencies: frontend_stlib_code,
+ dependencies: [frontend_stlib_code, dep_static_lib],
kwargs: default_lib_args,
)
-ecpg_targets += ecpg_pgtypes_st
+if ecpg_pgtypes_st.found()
+ ecpg_targets += ecpg_pgtypes_st
+endif
ecpg_pgtypes_so = shared_library('libpgtypes',
ecpg_pgtypes_sources + ecpg_pgtypes_so_sources,
diff --git a/src/interfaces/libpq/meson.build b/src/interfaces/libpq/meson.build
index a74e885b169..ea3f540f8bc 100644
--- a/src/interfaces/libpq/meson.build
+++ b/src/interfaces/libpq/meson.build
@@ -62,7 +62,7 @@ libpq_st = static_library('libpq',
include_directories: [libpq_inc],
c_args: libpq_c_args,
c_pch: pch_postgres_fe_h,
- dependencies: [frontend_stlib_code, libpq_deps],
+ dependencies: [frontend_stlib_code, libpq_deps, dep_static_lib],
kwargs: default_lib_args,
)
diff --git a/src/makefiles/Makefile.aix b/src/makefiles/Makefile.aix
new file mode 100644
index 00000000000..e91b250fd19
--- /dev/null
+++ b/src/makefiles/Makefile.aix
@@ -0,0 +1,34 @@
+# -blibpath:
+# The path to be inserted into the default path (Index 0 path) field of the
+# loader section. When this flag is presented, the -L paths will not be stored.
+# AIX uses a stricter, more explicit approach. The runtime linker expects to
+# tell it exactly where to look using -blibpath.
+# -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
+
+# AIX uses a stricter, more explicit approach. The runtime linker expects
+# to tell it exactly where to look using -blibpath.
+rpath = -Wl,-blibpath:'$(rpathdir)$(libpath)'
+
+# gcc needs to know it's building a shared lib, otherwise it'll not emit
+# correct code / link to the right support libraries
+ifeq ($(GCC), yes)
+LDFLAGS_SL += -shared
+endif
+
+# env var name to use in place of LD_LIBRARY_PATH
+ld_library_path_var = LIBPATH
+
+POSTGRES_IMP= postgres.imp
+
+ifdef PGXS
+BE_DLLLIBS= -Wl,-bI:$(pkglibdir)/$(POSTGRES_IMP)
+else
+BE_DLLLIBS= -Wl,-bI:$(top_builddir)/src/backend/$(POSTGRES_IMP)
+endif
+
+MKLDEXPORT_DIR=src/backend/port/aix
+MKLDEXPORT=$(top_srcdir)/$(MKLDEXPORT_DIR)/mkldexport.sh
+
+%$(DLSUFFIX): %.o
+ $(CC) $(CFLAGS) $*.o $(LDFLAGS) $(LDFLAGS_SL) -o $@ $(BE_DLLLIBS)
diff --git a/src/port/strerror.c b/src/port/strerror.c
index f0746517770..c46b9dc91fc 100644
--- a/src/port/strerror.c
+++ b/src/port/strerror.c
@@ -214,8 +214,10 @@ get_errno_symbol(int errnum)
return "ENOTCONN";
case ENOTDIR:
return "ENOTDIR";
+#if defined(ENOTEMPTY) && (ENOTEMPTY != EEXIST) /* same code on AIX */
case ENOTEMPTY:
return "ENOTEMPTY";
+#endif
case ENOTSOCK:
return "ENOTSOCK";
#ifdef ENOTSUP
diff --git a/src/template/aix b/src/template/aix
new file mode 100644
index 00000000000..22f61093b1b
--- /dev/null
+++ b/src/template/aix
@@ -0,0 +1,6 @@
+# This file is referred for specific flags wrt to AIX build process like
+# cflags.
+# src/template/aix
+
+# Extra CFLAGS for code that will go into a shared library
+CFLAGS_SL=" "
diff --git a/src/tools/gen_export.pl b/src/tools/gen_export.pl
index 86a7742b369..19c8b60560f 100644
--- a/src/tools/gen_export.pl
+++ b/src/tools/gen_export.pl
@@ -18,9 +18,10 @@ GetOptions(
if (not( $format eq 'darwin'
or $format eq 'gnu'
- or $format eq 'win'))
+ or $format eq 'win'
+ or $format eq 'aix'))
{
- die "$0: $format is not yet handled (only darwin, gnu, win are)\n";
+ die "$0: $format is not yet handled (only darwin, gnu, win, aix are)\n";
}
open(my $input_handle, '<', $input)
@@ -46,6 +47,10 @@ elsif ($format eq 'win')
}
print $output_handle "EXPORTS\n";
}
+elsif ($format eq 'aix')
+{
+ print $output_handle "#!\n";
+}
while (<$input_handle>)
{
@@ -63,6 +68,10 @@ while (<$input_handle>)
{
print $output_handle " $1;\n";
}
+ elsif ($format eq 'aix')
+ {
+ print $output_handle "$1\n";
+ }
elsif ($format eq 'win')
{
print $output_handle "$1 @ $2\n";
view thread (51+ messages) latest in thread
reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: [email protected]
Cc: [email protected], [email protected], [email protected], [email protected], [email protected], [email protected]
Subject: RE: AIX support
In-Reply-To: <SJ4PPFB81778326EC35CBFA16B5449CFA97DB94A@SJ4PPFB81778326.namprd15.prod.outlook.com>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox