postgres.git / summary / log / commit / refs

commit    229a5c8ade48db7eced79539ab1b8d8a0e86ae88
Author:   Tom Lane <tgl@sss.pgh.pa.us>
Date:     Fri Nov 02 22:54:00 2018 +0000

    Yet further rethinking of build changes for macOS Mojave.
    
    The solution arrived at in commit e74dd00f5 presumes that the compiler
    has a suitable default -isysroot setting ... but further experience
    shows that in many combinations of macOS version, XCode version, Xcode
    command line tools version, and phase of the moon, Apple's compiler
    will *not* supply a default -isysroot value.
    
    We could potentially go back to the approach used in commit 68fc227dd,
    but I don't have a lot of faith in the reliability or life expectancy of
    that either.  Let's just revert to the approach already shipped in 11.0,
    namely specifying an -isysroot switch globally.  As a partial response to
    the concerns raised by Jakob Egger, adjust the contents of Makefile.global
    to look like
    
    CPPFLAGS = -isysroot $(PG_SYSROOT) ...
    PG_SYSROOT = /path/to/sysroot
    
    This allows overriding the sysroot path at build time in a relatively
    painless way.
    
    Add documentation to installation.sgml about how to use the PG_SYSROOT
    option.  I also took the opportunity to document how to work around
    macOS's "System Integrity Protection" feature.
    
    As before, back-patch to all supported versions.
    
    Discussion: https://postgr.es/m/20840.1537850987@sss.pgh.pa.us


configure | 10 +++++++++ configure.in | 9 ++++++++ doc/src/sgml/installation.sgml | 51 ++++++++++++++++++++++++++++++++++++++++++ src/Makefile.global.in | 1 + src/template/darwin | 7 +++--- 5 files changed, 75 insertions(+), 3 deletions(-) diff --git a/configure b/configure index 8238bb5b464..25d613dc09a 100755 --- a/configure +++ b/configure @@ -627,6 +627,7 @@ ac_includes_default="\ ac_subst_vars='LTLIBOBJS vpath_build +PG_SYSROOT PG_VERSION_NUM PROVE FOP @@ -17010,6 +17011,15 @@ _ACEOF +# If we are inserting PG_SYSROOT into CPPFLAGS, do so symbolically not +# literally, so that it's possible to override it at build time using +# a command like "make ... PG_SYSROOT=path". This has to be done after +# we've finished all configure checks that depend on CPPFLAGS. +if test x"$PG_SYSROOT" != x; then + CPPFLAGS=`echo "$CPPFLAGS" | sed -e "s| $PG_SYSROOT | \\\$(PG_SYSROOT) |"` +fi + + # Begin output steps diff --git a/configure.in b/configure.in index 4347989a2a9..9c3d46aeeff 100644 --- a/configure.in +++ b/configure.in @@ -2248,6 +2248,15 @@ $AWK '{printf "%d%04d", $1, $2}'`"] AC_DEFINE_UNQUOTED(PG_VERSION_NUM, $PG_VERSION_NUM, [PostgreSQL version as a number]) AC_SUBST(PG_VERSION_NUM) +# If we are inserting PG_SYSROOT into CPPFLAGS, do so symbolically not +# literally, so that it's possible to override it at build time using +# a command like "make ... PG_SYSROOT=path". This has to be done after +# we've finished all configure checks that depend on CPPFLAGS. +if test x"$PG_SYSROOT" != x; then + CPPFLAGS=`echo "$CPPFLAGS" | sed -e "s| $PG_SYSROOT | \\\$(PG_SYSROOT) |"` +fi +AC_SUBST(PG_SYSROOT) + # Begin output steps diff --git a/doc/src/sgml/installation.sgml b/doc/src/sgml/installation.sgml index b178d3074bb..5023fc67133 100644 --- a/doc/src/sgml/installation.sgml +++ b/doc/src/sgml/installation.sgml @@ -2623,6 +2623,57 @@ PHSS_30849 s700_800 u2comp/be/plugin library Patch </para> </sect2> + <sect2 id="installation-notes-macos"> + <title>macOS</title> + + <indexterm zone="installation-notes-macos"> + <primary>macOS</primary> + <secondary>installation on</secondary> + </indexterm> + + <para> + On recent <productname>macOS</productname> releases, it's necessary to + embed the <quote>sysroot</quote> path in the include switches used to + find some system header files. This results in the outputs of + the <application>configure</application> script varying depending on + which SDK version was used during <application>configure</application>. + That shouldn't pose any problem in simple scenarios, but if you are + trying to do something like building an extension on a different machine + than the server code was built on, you may need to force use of a + different sysroot path. To do that, set <varname>PG_SYSROOT</varname>, + for example +<programlisting> +make PG_SYSROOT=<replaceable>/desired/path</replaceable> all +</programlisting> + To find out the appropriate path on your machine, run +<programlisting> +xcodebuild -version -sdk macosx Path +</programlisting> + Note that building an extension using a different sysroot version than + was used to build the core server is not really recommended; in the + worst case it could result in hard-to-debug ABI inconsistencies. + </para> + + <para> + You can also select a non-default sysroot path when configuring, by + specifying <varname>PG_SYSROOT</varname> + to <application>configure</application>: +<programlisting> +./configure ... PG_SYSROOT=<replaceable>/desired/path</replaceable> +</programlisting> + </para> + + <para> + <productname>macOS</productname>'s <quote>System Integrity + Protection</quote> (SIP) feature breaks <literal>make check</literal>, + because it prevents passing the needed setting + of <literal>DYLD_LIBRARY_PATH</literal> down to the executables being + tested. You can work around that by doing <literal>make + install</literal> before <literal>make check</literal>. + Most Postgres developers just turn off SIP, though. + </para> + </sect2> + <sect2 id="installation-notes-mingw"> <title>MinGW/Native Windows</title> diff --git a/src/Makefile.global.in b/src/Makefile.global.in index 087b6119cb9..34168a06500 100644 --- a/src/Makefile.global.in +++ b/src/Makefile.global.in @@ -231,6 +231,7 @@ PTHREAD_LIBS = @PTHREAD_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +PG_SYSROOT = @PG_SYSROOT@ override CPPFLAGS := $(ICU_CFLAGS) $(CPPFLAGS) diff --git a/src/template/darwin b/src/template/darwin index 159d8bb1275..c05adca0bfb 100644 --- a/src/template/darwin +++ b/src/template/darwin @@ -3,14 +3,15 @@ # Note: Darwin is the original code name for macOS, also known as OS X. # We still use "darwin" as the port name, partly because config.guess does. -# Some configure tests require explicit knowledge of where the Xcode "sysroot" -# is. We try to avoid having this leak into configure's results, though. +# Select where system include files should be sought. if test x"$PG_SYSROOT" = x"" ; then PG_SYSROOT=`xcodebuild -version -sdk macosx Path 2>/dev/null` fi # Old xcodebuild versions may produce garbage, so validate the result. if test x"$PG_SYSROOT" != x"" ; then - if test \! -d "$PG_SYSROOT" ; then + if test -d "$PG_SYSROOT" ; then + CPPFLAGS="-isysroot $PG_SYSROOT $CPPFLAGS" + else PG_SYSROOT="" fi fi [parent: beceb8725978]