2013-11-21 6 views
6

Ich habe meine benutzerdefinierte clang Plugin mit Hilfe von this tutorial erstellt und ich möchte es automatisch auf meinem Xcode iOS-Projekt ausführen.Wie kann ich zusätzliche Clang-Optionen für das Xcode-Projekt angeben?

Ich brauche folgende zusätzliche Befehle auf clang laufen,

-Xclang -load \ 
-Xclang ~/static_analysis/llvm/Debug+Asserts/lib/libPluginExample.so \ 
-Xclang -plugin -Xclang -example-plugin \ 

Ich möchte alle anderen Befehle, die von Xcode erzeugt speichern, weil es schwierig ist, zu erstellen und diese Befehle für jedes Xcode-Projekt übergeben. Aus diesem Grund wähle ich clang Plugin, aber nicht clang Werkzeug.

Wie kann ich das erreichen?

Oder wie kann ich compiler flags, die von xcode aoutomically generiert wurden, extrahieren, um sie in clang tool zu verwenden? (Becouse, für die korrekte Verwendung von Werkzeug brauche ich alle Verzeichnisse enthalten, um anzugeben, und alle Quellen und alle Frameworks)

Update:

Ich habe hinzugefügt Tsd Befehle im Projekt

Settings -> Build Phases -> Compile Sources (double click on source)

, aber in der Kompilierung gibt es Fehler (Plugin Standardbeispiel libPrintFunctionNames.dylib aus Klirren Quellen):

error: unable to load plugin '/Users/...llvm/Debug+Asserts/lib/libPrintFunctionNames.dylib': 'dlopen(/Users/.../llvm/Debug+Asserts/lib/libPrintFunctionNames.dylib, 9): Symbol not found: __ZN5clang11ASTConsumer21HandleInterestingDeclENS_12DeclGroupRefE Referenced from: /Users/.../llvm/Debug+Asserts/lib/libPrintFunctionNames.dylib Expected in: flat namespace in /Users/.../llvm/Debug+Asserts/lib/libPrintFunctionNames.dylib' Command /Applications/Xcode 2.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang failed with exit code 1

Ich habe versucht, libPrintFunctionNames.a statt libPrintFunctionNames.dylib zu verwenden, aber es hilft nicht.

Vielleicht ist die Ursache, dass ich mein Plugin auf getrennte Quelldateien von llvm und clang baute, und in xcode verwende ich andere Version von clang. Ich werde das überprüfen.

Antwort

4

Ich würde zusätzliche Clang-Optionen in Build-Option OTHER_CFLAGS angeben. Sie können dies tun, in

target/project Build Settings -> Apple LLVM 5.0 - Custom Compiler Flags -> Other C Flags 

Oder Sie können OTHER_CFLAGS für xcodebuild, zum Beispiel angeben,

xcodebuild -scheme SampleProject build OTHER_CFLAGS="-Xclang -load -Xclang /path/to/libPrintFunctionNames.dylib -Xclang -plugin -Xclang print-fns" 

xcodebuild ist praktisch, wenn Sie nicht wollen, 2 Ziele zu erhalten, die nur in OTHER_CFLAGS unterscheiden.

Aber du hast Recht, es sieht so aus, als ob du wirklich mit den gleichen Bibliotheken verlinken musst, da clang selbst verlinkt ist. Wenigstens habe ich Clang + LLVM 3.3 Binärdateien aus http://llvm.org/releases/download.html, baute das Plugin mit heruntergeladenen Bibliotheken heruntergeladen und es funktioniert mit Klirren von http://llvm.org, aber mit Klappern nicht von Xcode arbeiten - ich folgende Fehlermeldung auftreten:

error: unable to find plugin 'print-fns' 

Ich habe einen Xcode-Arbeitsbereich erstellt, der das Clang-Plugin erstellt und zeigt, wie Sie versuchen können, es mit der Standard-iOS-Anwendung zu verwenden. Sie können es unter https://github.com/vsapsai/ClangPluginExample

+0

Ich habe das gleiche Problem konfrontiert, aber es geschafft, über kleine Xcode Hack zu lösen. http://railsware.com/blog/2014/02/28/creation-and-using-clang-plugin-with-xcode/ Hier ist eine detailliertere Erklärung, wie man es mit Xcode arbeiten kann. – AlexDenisov

+0

Guter Punkt, @AlexDenisov.Eine andere Möglichkeit, Xcode zur Verwendung eines benutzerdefinierten Compilers zu zwingen, ist über xcodebuild. Der Befehl sieht wie folgt aus: xcodebuild [..einige Argumente ..] CC =/pfad/zu/custom/clang CXX =/pfad/zu/custom/clang –