Subscribed unsubscribe Subscribe Subscribe

JPMartha's Pancake

This blog is the way to brush up my poor English.

xcconfig と Xcode の Build Settings について調べたこと 🤔

xcconfig Xcode OS X iOS xcconfigs

GitHub で著名なライブラリを見ていると xcconfigs というライブラリがよく利用されています。

github.com

xcconfigs は 階層的な Xcode configuration file(xcconfig)の集まりで変更・再利用しやすい状態に保ちます。(雑)

This project intends to aggregate common or universal Xcode configuration settings, keeping them in hierarchial Xcode configuration files for easy modification and reuse.

xcconfigs/README.md at master · jspahrsummers/xcconfigs · GitHub

そこで xcconfig ファイルについて調べました。

xcconfig ファイル

Xcode の Build Settings をコードで設定するファイルです。

ただし Build Settings にある項目すべてを設定できるかどうかは確認していません。

作成方法

  • ⌘N または File → New → File... で開きます。

  • Other にある「Configuration Settings File」を選択します。

f:id:JPMartha:20160224030647p:plain

記述方法

Run Search Paths

たとえば Run Search Paths を設定するには次のように記述します。

LD_RUNPATH_SEARCH_PATHS = $(inherited) @executable_path/../Frameworks @loader_path/../Frameworks

この項目は半角スペース区切りで複数設定できます。

Space-separated list of directory paths. Specifies the run-path locations at which the dynamic loader searches for the product’s run-path dependent libraries. See Dynamic Library Programming Topics .

Build Setting Reference

👉 変数名一覧は Build Setting Reference にあります。

外部ファイル取り込み

次のように外部ファイルを取り込むこともできます。

#include "../Base/Targets/Framework.xcconfig"
#include "Mac-Base.xcconfig"

プロジェクトへの追加

PROJECT を選択し Configurations で設定します。

f:id:JPMartha:20160223175211p:plain

xcconfig と Build Settings 画面

xcconfig を設定したら Xcode の Build Settings 画面の設定はどうなるか気になるので調べました。

Carthage をペースに作成した 自作ツール をサンプルとします。

github.com

f:id:JPMartha:20160224031741p:plain

Runpath Search Paths (LD_RUNPATH_SEARCH_PATHS)

  • Mac-Framework.xcconfig
// Import base framework settings
#include "../Base/Targets/Framework.xcconfig"

// Import common settings specific to Mac OS X
#include "Mac-Base.xcconfig"
  • Base/Targets/Framework.xcconfig

    LD_RUNPATH_SEARCH_PATHS の設定なし

  • Mac-Base.xcconfig

// Where to find embedded frameworks
LD_RUNPATH_SEARCH_PATHS = $(inherited) @executable_path/../Frameworks @loader_path/../Frameworks

継承せず設定なし

Build Settings 画面 継承 xcconfig
設定 A

Build Settings で Levels を表示すると一覧することができます。

f:id:JPMartha:20160224031905p:plain

👉 何も設定されません。

xcodebuild コマンドで LD_RUNPATH_SEARCH_PATHS を確認することもできます。

$ xcodebuild -target PancakeKit -configuration Release -showBuildSettings | grep LD_RUNPATH_SEARCH_PATHS

👉 何も出力されません。

継承せず設定あり

Build Settings 画面 継承 xcconfig
設定 B 設定 A

f:id:JPMartha:20160224083243p:plain

👉 設定 B のみ 反映されます。

$ xcodebuild -target PancakeKit -configuration Release -showBuildSettings | grep LD_RUNPATH_SEARCH_PATHS

LD_RUNPATH_SEARCH_PATHS = @loader_path/Frameworks

継承して設定なし

Build Settings 画面 継承 xcconfig
$(inherited) 設定 A

f:id:JPMartha:20160224033255p:plain

👉 設定 A が反映されます。

$ xcodebuild -target PancakeKit -configuration Release -showBuildSettings | grep LD_RUNPATH_SEARCH_PATHS

LD_RUNPATH_SEARCH_PATHS = @executable_path/../Frameworks @loader_path/../Frameworks

継承して設定あり

Build Settings 画面 継承 xcconfig
設定 B $(inherited) 設定 A

f:id:JPMartha:20160224081648p:plain

👉 設定 A と設定 B が反映されます。

$ xcodebuild -target PancakeKit -configuration Release -showBuildSettings | grep LD_RUNPATH_SEARCH_PATHS

LD_RUNPATH_SEARCH_PATHS = @executable_path/../Frameworks @loader_path/../Frameworks @loader_path/Frameworks

おまけ

コマンドラインで実行すると LD_RUNPATH_SEARCH_PATHS = @executable_path/../Frameworks の間に半角スペースが2つ入るので気になりました。🔍

継承せず同じ設定

Build Settings 画面 継承 xcconfig
設定 A 設定 A

f:id:JPMartha:20160224082509p:plain

👉 $(inherited) を除く設定 A が反映されます。

$ xcodebuild -target PancakeKit -configuration Release -showBuildSettings | grep LD_RUNPATH_SEARCH_PATHS

LD_RUNPATH_SEARCH_PATHS = @executable_path/../Frameworks @loader_path/../Frameworks

半角スペースが入りません。

継承して同じ設定

Build Settings 画面 継承 xcconfig
設定 A $(inherited) 設定 A

f:id:JPMartha:20160224083522p:plain

👉 設定 A が重複 します。

$ xcodebuild -target PancakeKit -configuration Release -showBuildSettings | grep LD_RUNPATH_SEARCH_PATHS

LD_RUNPATH_SEARCH_PATHS = @executable_path/../Frameworks @loader_path/../Frameworks @executable_path/../Frameworks @loader_path/../Frameworks

@loader_path/../Frameworks @executable_path/../Frameworks の間に半角スペースが2つ入りました。

Carthage/Makefile at master · Carthage/Carthage · GitHub にも半角スペース2つの箇所があって気になっていました。

未確認ですが意味がありそうです。

参考