2017-06-01 217 views
2

我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

是不是自動附帶'<可可/ Cocoa.h>'? – andlabs

+0

您的部署目標是否在構建設置中設置爲<10.12? – Wevah

回答

0

感嘆。問題是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),但是一旦我確認我要在這個問題上提供一個雷達。我會在更新這個答案時提供更多細節。

感謝在此期間,您的幫助!

2

我一直設置那些編譯器標誌:-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

相關問題