2017-06-01 6 views
2

Mein libui Projekt muss sowohl kompilieren und Ziel-OS X 10.8 und höher, so habe ichWarum werden MAC_OS_X_VERSION_MIN_REQUIRED und MAC_OS_X_VERSION_MAX_ALLOWED nach dem Upgrade auf macOS Sierra/Xcode 8 nicht mehr berücksichtigt?

#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 

in der gemeinsamen Header-Datei für den Code Cocoa. Bis jetzt hat das funktioniert; Ich habe nichts über veraltete Funktionen nach 10.9 gesehen. Doch nach auf 10,12 und Xcode 8 gestern Abend aktualisieren, bin ich plötzlich eine ganze Reihe von deprecation Warnungen zu sehen, wie

/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... 
         ^

als ob die Makros I zur Verfügung gestellt werden ignoriert. Ich habe versucht, herauszufinden, was passiert, und ich bekomme nur gemischte Signale: Einige Quellen auf Apples Entwickler-Site sagen mir, dass es wirklich __MAC_OS_X_VERSION_MIN_REQUIRED ist (und eine Zahl anstelle einer symbolischen Konstante für die Version selbst verwenden), während andere mir sagen bin richtig. Einige Quellen scheinen zu implizieren, dass diese Werte von den Compiler-Einstellungen bestimmt werden. Und ich kann nicht sagen, was Availability.h mehr will.

Für was es wert ist, verwendet dieses Projekt CMake zu bauen, und Xcode-Projekte nicht direkt verwendet.

Also, was mache ich falsch? Vielen Dank.

+0

Sind Sie AvailabilityMacros.h? https://opensource.apple.com/source/xnu/xnu-3789.1.32/EXTERNAL_HEADERS/AvailabilityMacros.h.auto.html – Paurian

+1

Ist das nicht automatisch in '' enthalten? – andlabs

+0

Ist das Implementierungsziel in den Erstellungseinstellungen auf <10,12 festgelegt? – Wevah

Antwort

0

Seufzer. Das Problem ist, dass CMake dumm ist.

Okay, so stellt sich heraus, dass alle diese neuen Deprecation-Systeme dokumentiert sind, aber auf Umwegen. Die neuen Depretion-Makros lauten zunächst mentioned here in the 10.12 SDK release notes. Wenn ich in Availability.h nachschaue, wo sie definiert sind, sehe ich, dass sie in clang in ein neues availability Attribut erweitert werden. Und siehe da, they are controlled by the -mmacosx-deployment-target option after all.

Aber warten Sie, ich hatte

set(CMAKE_OSX_DEPLOYMENT_TARGET "10.8") 

in meinem CMakeLists.txt. Sollte das nicht genug sein? Offenbar nicht, weil die -mmacosx-version-min nicht in den Makefiles abgelegt wurde!

As it turns out, CMAKE_OSX_DEPLOYMENT_TARGET ist einer jener dummen CMake Variablen, die Sie die tatsächliche set() für sie CACHE STRING "" FORCE erfordern zu arbeiten. Also, sobald ich die Zeile zu

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

änderte, gingen die Verwarnungswarnungen weg. Warum bestehen so viele dieser CMake-Variablen darauf, so zwischengespeichert zu werden? Ist set() nicht gut genug?Und warum muss ich das Caching FORCE; ist sogar CACHE nicht gut genug? : | Es ist eine Schande, die libui mit reinen Makefiles zu halten, was sich als zu unhandlich erwies und CMake die Option war, die die meisten Leute wollten. :/


Natürlich sind die deprecation Warnungen gegangen, aber das uns den ganzen Weg gibt es nicht führen, weil einige der Konstanten, die blieben in als static const Variablen umbenannt wurden. Was bedeutet, ich nicht

case NSKeyUp: 

in einer switch Anweisung ohne Warnung über die Einhaltung von Standards sagen, da das technisch nicht in C99 erlaubt (const ist nur ein Hinweis an den Compiler) und ich GNU Sprache explizit deaktivieren Erweiterungen (meist persönliche Präferenz). Ich denke nicht, dass es auch in C++ erlaubt ist (tatsächlich bin ich mir ziemlich sicher, dass C++ 11 aus diesem Grund constexpr eingeführt hat), aber sobald ich verifiziert habe, werde ich ein Radar zu diesem Thema einreichen. Ich werde diese Antwort mit mehr Details aktualisieren, wie sie kommen.

Vielen Dank für Ihre Hilfe in der Zwischenzeit!

2

Ich habe immer diese mit Compiler-Flags gesetzt: -mmacosx-version-min=10.8. CMake hat auch eine CMAKE_OSX_DEPLOYMENT_TARGET Variable, die ich denke, dass setzt.

Ich denke nicht, dass es diese deprecation Warnungen obwohl loswerden wird. Für diese veralteten AppKit-Konstanten haben sowohl die veralteten als auch die neuen Konstanten denselben Wert. Sie können die neuen Konstanten verwenden, der Wert ist derselbe und sollte zu älteren Betriebssystemen binärkompatibel sein.

Die Verwendung der neuen Konstanten wird verhindern, dass der Code auf Systemen älter als 10.12 kompiliert wird. emacs fixed this mit den neuen Konstanten im Code, aber #defining die alten zu den neuen beim Kompilieren mit einem Pre-10.12 SDK. I implemented the same thing für qemu.

+0

Danke. Ich werde später (wenn ich mehr Zeit habe) gründlich lesen/antworten, aber ich werde sagen, dass ich in meiner CMakeLists.txt bereits 'set (CMAKE_OSX_DEPLOYMENT_TARGET" 10.8 ") gesetzt habe. – andlabs

+0

Auch ich frage mich, ob die '-mmacosx-version-min'-Flagge oder was auch immer CMake dort produziert (ich vergesse die Besonderheiten jetzt, sorry) nur die Objektdatei und Verknüpfungsschritte beeinflussen. – andlabs

+0

Eigentlich habe ich gerade etwas bemerkt: Einige der Verwarnungswarnungen sind auf 'statischen const' Variablen, was bedeutet, dass ich sie nicht in' switch' Anweisungen im ISO C99 Modus verwenden kann, ohne dass es trotzdem eine Warnung gibt. Ich bin versucht, an dieser Stelle ein Radar zu öffnen, wenn ich nur von der Quelle lernen könnte, was die aktuellen Makros sein sollten, oder ob der von Ihnen verlinkte Open-Source-Code meine einzige echte Option ist ... (ich war Ich hoffe, ich könnte ein anderes SDK verwenden, aber ich habe jetzt anscheinend nur 10.12.sdk.) – andlabs

Verwandte Themen