升级到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项目。
那么我做错了什么?谢谢。
感叹。问题是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 out,CMAKE_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 thing为qemu
。
谢谢。我会稍后详细阅读/回应(当我有更多时间时),但我会说我已经在我的CMakeLists.txt中设置了(CMAKE_OSX_DEPLOYMENT_TARGET“10.8”)'。 – andlabs
另外我想知道'-mmacosx-version-min'标志或其他CMake在那里生成的东西(我现在忘记了具体细节,对不起)只影响目标文件和链接步骤。 – andlabs
其实我只是注意到了一些东西:一些弃用警告是在'static const'变量上,这意味着我不能在ISO C99模式的'switch'语句中使用它们,而不会有任何警告。我很想在这一点上打开一个雷达,如果只是这样,我可以从源头上了解当前的宏应该是什么,或者如果你链接的开源代码是我唯一真正的选择......(我是希望我可以使用不同的SDK,但我只似乎有10.12.sdk现在。) – andlabs
Are you include AvailabilityMacros.h? https://opensource.apple.com/source/xnu/xnu-3789.1.32/EXTERNAL_HEADERS/AvailabilityMacros.h.auto.html – Paurian
是不是自动附带''? – andlabs
您的部署目标是否在构建设置中设置为 Wevah