升级到macOS Sierra/Xcode 8后,为什么MAC_OS_X_VERSION_MIN_REQUIRED和MAC_OS_X_VERSION_MAX_ALLOWED不再受到尊重?

问题描述:

我libui项目都必须在编译和目标OS X 10.8和更新,所以我有升级到macOS Sierra/Xcode 8后,为什么MAC_OS_X_VERSION_MIN_REQUIRED和MAC_OS_X_VERSION_MAX_ALLOWED不再受到尊重?

#define MAC_OS_X_VERSION_MIN_REQUIRED MAC_OS_X_VERSION_10_8 
#define MAC_OS_X_VERSION_MAX_ALLOWED MAC_OS_X_VERSION_10_8 

中的可可代码共享的头文件。到目前为止,这已经奏效;我没有看到10.9之后弃用的函数。但是,升级到10.12和Xcode的8昨晚之后,我突然看到了一大堆废弃警告,如

/Users/pietro/src/github.com/andlabs/libui/darwin/entry.m:181:28: warning: 
     'NSRegularControlSize' is deprecated: first deprecated in macOS 10.12 
     [-Wdeprecated-declarations] 
     uiDarwinSetControlFont(t, NSRegularControlSize); 
            ^~~~~~~~~~~~~~~~~~~~ 
            NSControlSizeRegular 
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSCell.h:102:28: note: 
     'NSRegularControlSize' has been explicitly marked deprecated here 
static const NSControlSize NSRegularControlSize API_DEPRECATED_WITH_REPL... 
         ^

,如果我提供的宏被忽略。我试图弄清楚发生了什么,而我只是得到了混合信号:苹果开发人员网站上的一些消息告诉我这真的是__MAC_OS_X_VERSION_MIN_REQUIRED(并且使用数字代替版本本身的数字),而其他人告诉我我对了。有些来源似乎暗示这些值是由编译器设置决定的?我无法告诉Availability.h想要什么。

这个项目使用CMake构建,不直接使用Xcode项目。

那么我做错了什么?谢谢。

+0

Are you include AvailabilityMacros.h? https://opensource.apple.com/source/xnu/xnu-3789.1.32/EXTERNAL_HEADERS/AvailabilityMacros.h.auto.html – Paurian

+1

是不是自动附带''? – andlabs

+0

您的部署目标是否在构建设置中设置为 Wevah

感叹。问题是CMake很愚蠢。

好的,所以事实证明,所有这些新的弃用系统都是记录,但以迂回的方式。首先,新的弃用宏是mentioned here in the 10.12 SDK release notes。如果我查看Availability.h中的定义,我发现它们在clang中扩展为新的availability属性。你看,they are controlled by the -mmacosx-deployment-target option after all

别急,我在我的CMakeLists.txt有

set(CMAKE_OSX_DEPLOYMENT_TARGET "10.8") 

。这应该不够吗?显然不是,因为-mmacosx-version-min没有被放入Makefiles!

As it turns outCMAKE_OSX_DEPLOYMENT_TARGET是需要你CACHE STRING "" FORCE实际set()为他们工作的那些愚蠢的CMake变量之一。所以一旦我改变线

set(CMAKE_OSX_DEPLOYMENT_TARGET "10.8" CACHE STRING "" FORCE) 

弃用警告消失了。为什么这么多的CMake变量坚持被这样缓存呢? set()不够好?为什么我需要缓存FORCE;甚至是CACHE不够好? :|这是一个耻辱,试图保持libui纯粹的Makefiles被证明是太笨拙,并且CMake是大多数人想要的选项。 :/


当然,废弃警告都没有了,但是,这并不使我们有一路,因为一些被重命名的常量留在为static const变量。这意味着我不能说

case NSKeyUp: 
switch声明

没有关于标准的符合性的警告,因为这在技术上C99是不允许的(const只是提示编译器),我明确禁用GNU语言扩展(主要是个人偏好)。我不认为它在C++中是允许的(事实上,我非常肯定C++ 11因为这个原因引入了constexpr),但是一旦我确认我要在这个问题上提供一个雷达。我会在更新这个答案时提供更多细节。

感谢在此期间,您的帮助!

我一直设置那些编译器标志:-mmacosx-version-min=10.8。 CMake也有我设定的CMAKE_OSX_DEPLOYMENT_TARGET变量。

虽然我不认为它会摆脱那些弃用警告。对于那些弃用的AppKit常量,不推荐使用的和新的常量都具有相同的值。你可以使用新的常量,值是相同的,它应该是二进制兼容的旧操作系统。

使用新的常量防止代码编制上比10.12,虽然较旧的系统。 emacs fixed this通过使用代码中的新常量,但在使用10.12之前版本的SDK进行编译时使用新旧常量。 implemented the same thingqemu

+0

谢谢。我会稍后详细阅读/回应(当我有更多时间时),但我会说我已经在我的CMakeLists.txt中设置了(CMAKE_OSX_DEPLOYMENT_TARGET“10.8”)'。 – andlabs

+0

另外我想知道'-mmacosx-version-min'标志或其他CMake在那里生成的东西(我现在忘记了具体细节,对不起)只影响目标文件和链接步骤。 – andlabs

+0

其实我只是注意到了一些东西:一些弃用警告是在'static const'变量上,这意味着我不能在ISO C99模式的'switch'语句中使用它们,而不会有任何警告。我很想在这一点上打开一个雷达,如果只是这样,我可以从源头上了解当前的宏应该是什么,或者如果你链接的开源代码是我唯一真正的选择......(我是希望我可以使用不同的SDK,但我只似乎有10.12.sdk现在。) – andlabs