Sergey Shinderuk <s.shinde...@postgrespro.ru> writes: > On 15.01.2021 01:13, Tom Lane wrote: >> Also, after re-reading [1] I am not at all excited about trying to >> remove the -isysroot switches from our *FLAGS. What I propose to do >> is keep that, but improve our mechanism for choosing a default value >> for PG_SYSROOT. It looks like first trying "xcrun --show-sdk-path", >> and falling back to "xcodebuild -version -sdk macosx Path" if that >> doesn't yield a valid path, is more likely to give a working build >> than relying entirely on xcodebuild. Maybe there's a case for trying >> "xcrun --sdk macosx --show-sdk-path" in between; in my tests that >> seemed noticeably faster than invoking xcodebuild, and I've not yet >> seen a case where it gave a different answer.
> I spent quite some time trying to understand / reverse engineer the > logic behind xcrun's default SDK selection. Yeah, I wasted a fair amount of time on that too, going so far as to ktrace xcrun (as I gather you did too). I'm not any more enlightened than you are about exactly how it's making the choice. > Oh, that's weird! Nevertheless I like you suggestion to call "xcrun" > from "configure". Anyway, after re-reading the previous thread, something I like about the current behavior is that it tends to produce a version-numbered sysroot path, ie something ending in "MacOSX11.1.sdk" or whatever. One of the hazards we're trying to avoid is some parts of a PG installation being built against one SDK version while other parts are built against another. The typical behavior of "xcrun --show-sdk-path" seems to be to produce a path ending in "MacOSX.sdk", which defeats that. So I think we should accept the path only if it contains a version number, and otherwise move on to the other probe commands. Hence, I propose the attached. This works as far as I can tell to fix the problem you're seeing. regards, tom lane
diff --git a/src/template/darwin b/src/template/darwin index 32414d21a9..0c890482fe 100644 --- a/src/template/darwin +++ b/src/template/darwin @@ -3,11 +3,26 @@ # 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. -# Select where system include files should be sought. +# Select where system include files should be sought, if user didn't say. if test x"$PG_SYSROOT" = x"" ; then - PG_SYSROOT=`xcodebuild -version -sdk macosx Path 2>/dev/null` + # This is far more complicated than it ought to be. We first ask + # "xcrun --show-sdk-path", which seems to match the default -isysroot + # setting of Apple's compilers. However, that may produce no result or + # a result that is not version-specific (i.e., just ".../SDKs/MacOSX.sdk"). + # Having a version-specific sysroot seems desirable, so if there are not + # digits in the result string, try "xcrun --sdk macosx --show-sdk-path"; + # and if that still doesn't work, fall back to asking xcodebuild. + PG_SYSROOT=`xcrun --show-sdk-path 2>/dev/null` + if expr x"$PG_SYSROOT" : '.*[0-9]\.[0-9]' >/dev/null ; then : okay + else + PG_SYSROOT=`xcrun --sdk macosx --show-sdk-path 2>/dev/null` + if expr x"$PG_SYSROOT" : '.*[0-9]\.[0-9]' >/dev/null ; then : okay + else + PG_SYSROOT=`xcodebuild -version -sdk macosx Path 2>/dev/null` + fi + fi fi -# Old xcodebuild versions may produce garbage, so validate the result. +# Validate the result: if it doesn't point at a directory, ignore it. if test x"$PG_SYSROOT" != x"" ; then if test -d "$PG_SYSROOT" ; then CPPFLAGS="-isysroot $PG_SYSROOT $CPPFLAGS"