2016-06-15 9 views
10

私はASTを使ってSwiftプロジェクトを分析する作業をしていましたが、Xcodeを使ってSwiftプロジェクトを構築する際に何らかの形で生成できるかどうかを知りたいと思います。Xcodeプロジェクトを構築中にASTをダンプすることはできますか?

今のところ、単一ファイルと単純なプロジェクトに対してswiftc -dump-astコマンドを実行すると、端末でASTを印刷できます。しかし、より複雑なプロジェクトに使用すると難しくなります。

このため、xcodeを使用したいと思います。私はすでにビルド設定>スウィフトコンパイラ - カスタムフラグ>その他のスウィフトフラグでコンパイラに-dump-astフラグを渡そうとしました。フラグは実際にコンパイラに渡されました(ビルド時に出力は-dump-astフラグを指定してswiftcを呼び出すとレポートします)。私はxcodeとxcodebuildコマンドの両方でプロジェクトを構築しようとしましたが、どちらもastを投げませんでした。

xcodebuild -target 'CompilingTest.xcodeproj' -scheme 'CompilingTest' - 
configuration "Debug" -sdk iphoneos -arch "armv7" 
CONFIGURATION_BUILD_DIR="TestBuild" ONLY_ACTIVE_ARCH=NO 

は今、私はどちらかのXcodeのビルド・プロセスは、いくつかのファイルにswiftcの出力をリダイレクトすることを推論しています、またはそれは何とかそれを封じます。何かご意見は?

ご協力いただければ幸いです。

答えて

17

Xcodeのビルド設定を変更するだけでは、アプリのASTをダンプすることはできません。これの主な理由は、Xcodeが のコンパイラフラグに関する多くの決定をswiftcに渡していることです。 はASTをダンプするのに互換性がなく、Xcodeを から停止することはできません。

しかし、それは、Xcodeののヘルプ(または で下記の私のスクリプトを使用してXcodeの)とのXcodeの外で行うことが可能です。これを行うには、 swiftcコマンドをキャプチャして、あなたのプロジェクトでXcodeを実行してから、 を少し変更してASTをダンプする必要があります。

まず、プロジェクトをビルドしてから、Xcodeのレポートナビゲータ(左側のナビゲータペインの 最後のタブ)に移動します。ここから、 全体のビルドログを保存ボタンの上に保存するか、 swiftcコマンドをXcodeから直接コピーしてください。あなたは のASTに複数のターゲットを設定する必要がある場合は、 あなたのアプリケーションターゲットのコンパイルスイフトソースと呼ばれるものを探しています(注: には1つのターゲットのコンパイルコマンドが含まれています)複数回)。 この手順が見つからない場合は、プロジェクトをクリーンアップして を再度コンパイルするか、古いビルドログを確認する必要があります。

swiftcコマンドをXcodeからコピーした後は、コマンドラインに移動してコマンドを少し変更する必要があります。 が必要です。ここであなたがする必要があります何 です:

  1. (右-jN前とファイルのリスト)-cを外し-emit-objc-header -emit-objc-header-path FILEPATH
  2. を削除-emit-module -emit-module-path FILEPATH
  3. を削除​​
  4. を削除
  5. -parseable-output
  6. を削除します
  7. 追加-dump-ast
  8. シェルコマンドに> output.ast 2>&1を追加してください。

これはなぜですか? ASTをダンプするときに、ファイルの別のタイプを放出することができないので

  • 番号1、2、3、及び4が除去されなければなりません。オープンソースSwiftコンパイラ のロジックは、 hereでご覧になれます。 -cの別名が-emit-objectであるため、この場合は4番です。
  • 数字5を入力すると、 swiftcを停止すると、この コマンドに関する他の情報が出力されなくても、AST出力をリダイレクトすることが容易になります。 シェルからの出力をリダイレクトする代わりに、このASTコマンドの出力を解析する予定がある場合は、 にこのオプションを残しておくとよいでしょう(JSONを取得することになります)。
  • 番号6はコマンドがASTを出力する原因です。 class-dumpスタイル出力対 より詳細な、古典的な解析可能なAST出力-dump-astを印刷すると、 も使用できると考えられます。
  • 番号7は単純なシェルリダイレクトで、ASTの (おそらく巨大な)出力を1つのファイルにリダイレクトすることができます。 output.astを任意のファイルに変更してください。 ASTがstdoutではなくstderrにダンプされるため、2>&1が必要になります。注文はここでも となります。

また、Xcodeのビルドログはスペースをエスケープしますが、シェルが好まないその他の文字は であることに注意してください。たとえば、 フォルダ/ディレクトリのパスに&がある場合は、手動でエスケープする必要があります。

このすべてがあまりにも多くの作業のように聞こえる場合は、この処理を に行うスクリプトを一緒に投げてXcodeで設定することができます。 on GitHubが見つかります。

+0

こんにちはキース、あなたの答えに感謝します。私は自分のツールチェーンをコンパイルすることでASTをダンプすることができました。なぜなら、常にダンプを出力ファイルに出力したからです。それは私を良く奉仕した。しかし、あなたのソリューションははるかにシンプルで、シンプルなプロジェクトのために働いています(結果を見るために1つのテストを行いました)、より安定しています(私は速やかなバージョン変更によってツールチェーンを更新しなければなりませんでした)。助けてくれてありがとう! –

関連する問題