为什么升级到 macOS Sierra/Xcode 8 后不再支持 MAC_OS_X_VERSION_MIN_REQUIRED 和 MAC_OS_X_VERSION_MAX_ALLOWED?

and*_*abs 5 macos cocoa objective-c

我的 libui 项目必须在 OS X 10.8 及更高版本上编译并以 OS X 10.8 为目标,所以我有

#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
Run Code Online (Sandbox Code Playgroud)

在 Cocoa 代码的共享头文件中。到目前为止,这已经奏效了;我没有看到任何关于 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...
                           ^
Run Code Online (Sandbox Code Playgroud)

好像我提供的宏被忽略了。我试图弄清楚发生了什么事,但我只是得到了混合信号:苹果开发者网站上的一些消息来源告诉我这确实是 __MAC_OS_X_VERSION_MIN_REQUIRED (并使用数字而不是版本本身的符号常量),而其他人则告诉我我是的。有些来源似乎暗示这些值是由编译器设置决定的?我再也无法说出 Availability.h 想要什么。

就其价值而言,该项目使用 CMake 来构建,并且不直接使用 Xcode 项目。

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

and*_*abs 2

叹。问题是 CMake 很愚蠢。

好吧,事实证明所有这些新的弃用系统都有记录,但是以一种迂回的方式记录的。首先, 10.12 SDK 发行说明中提到了新的弃用宏。如果我查看定义它们的 Availability.h,我会发现它们availability在 clang 中扩展为新属性。你瞧,他们是由-mmacosx-deployment-target毕竟是被选项控制的。

但是等等,我有

set(CMAKE_OSX_DEPLOYMENT_TARGET "10.8")
Run Code Online (Sandbox Code Playgroud)

在我的 CMakeLists.txt 中。这还不够吗?显然不是,因为-mmacosx-version-min没有被放入 Makefile 中!

事实证明CMAKE_OSX_DEPLOYMENT_TARGET是那些愚蠢的 CMake 变量之一,需要您CACHE STRING "" FORCE实际操作set()才能工作。所以一旦我将线路更改为

set(CMAKE_OSX_DEPLOYMENT_TARGET "10.8" CACHE STRING "" FORCE)
Run Code Online (Sandbox Code Playgroud)

弃用警告消失了。为什么这么多 CMake 变量坚持这样缓存?还不够set()好吗?为什么我需要FORCE缓存;甚至CACHE不够好?:| 遗憾的是,试图用纯 Makefile 来维护 libui 被证明太笨重了,而 CMake 是大多数人想要的选择。:/


当然,弃用警告已经消失,但这并没有引导我们一路走来,因为一些重命名的常量被保留为static const变量。这意味着我不能说

case NSKeyUp:
Run Code Online (Sandbox Code Playgroud)

switch没有警告有关标准合规性的声明中,因为技术上这在 C99 中是不允许的(const只是对编译器的提示),并且我明确禁用了 GNU 语言扩展(主要是个人偏好)。我认为 C++ 中也不允许这样做(事实上,我很确定 C++11 就是constexpr因为这个原因引入的),但一旦我确认我将就这个问题提交雷达报告。我将在发布时用更多详细信息更新此答案。

感谢您在此期间提供的所有帮助!