Xcode11でoF0.9.8を楽に動かす話

## 重要項目

「取り敢えず動いた」って状態なのでこれ試してもダメだった場合はごめんなさい.

## 初めに

Xcode11からCodeSigningがゴニョゴニョで怒られるようになりましたね.
oFのmaster(2019/11/13時点)はそこら辺きちんとやってくれるようになってるのですが悲しいかなまだaddonの関係でoF0.9.8を使わなきゃいけないことも多々あります.

Xcode10系が使えるのならそっちで良いのですがMojaveの変なバグ踏んだりなんだかんだでXcode10系が使えない方(観測例1)も居るようで...

そんなあなたに朗報. (多分)Xcode11でも動かせます.

## 最初にやること

[Xcode10以降でoF 0.9.8を使わなきゃいけない場合](https://qiita.com/2bbb/items/d6ae95ede1e2152f3f70) を参考にやることをやってください.

## CodeSigning周り

最新の奴からパクッて来ましょう.
`Build Phases` の最後に `Run Script` を追加して以下をコピペ.

```bash 
echo "$GCC_PREPROCESSOR_DEFINITIONS";
APPSTORE=`expr "$GCC_PREPROCESSOR_DEFINITIONS" : ".*APPSTORE=\([0-9]*\)"`
if [ -z "$APPSTORE" ] ; then
echo "Note: Not copying bin/data to App Package or doing App Code signing. Use AppStore target for AppStore distribution";
else
# Copy bin/data into App/Resources
rsync -avz --exclude='.DS_Store' "${SRCROOT}/bin/data/" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/data/"

# ---- Code Sign App Package ----

# WARNING: You may have to run Clean in Xcode after changing CODE_SIGN_IDENTITY!

# Verify that $CODE_SIGN_IDENTITY is set
if [ -z "${CODE_SIGN_IDENTITY}" ] ; then
echo "CODE_SIGN_IDENTITY needs to be set for framework code-signing"
exit 0
fi

if [ -z "${CODE_SIGN_ENTITLEMENTS}" ] ; then
echo "CODE_SIGN_ENTITLEMENTS needs to be set for framework code-signing!"

if [ "${CONFIGURATION}" = "Release" ] ; then
exit 1
else
# Code-signing is optional for non-release builds.
exit 0
fi
fi

ITEMS=""

FRAMEWORKS_DIR="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
echo "$FRAMEWORKS_DIR"
if [ -d "$FRAMEWORKS_DIR" ] ; then
FRAMEWORKS=$(find "${FRAMEWORKS_DIR}" -depth -type d -name "*.framework" -or -name "*.dylib" -or -name "*.bundle" | sed -e "s/\(.*framework\)/\1\/Versions\/A\//")
RESULT=$?
if [[ $RESULT != 0 ]] ; then
exit 1
fi

ITEMS="${FRAMEWORKS}"
fi

LOGINITEMS_DIR="${TARGET_BUILD_DIR}/${CONTENTS_FOLDER_PATH}/Library/LoginItems/"
if [ -d "$LOGINITEMS_DIR" ] ; then
LOGINITEMS=$(find "${LOGINITEMS_DIR}" -depth -type d -name "*.app")
RESULT=$?
if [[ $RESULT != 0 ]] ; then
exit 1
fi

ITEMS="${ITEMS}"$'\n'"${LOGINITEMS}"
fi

# Prefer the expanded name, if available.
CODE_SIGN_IDENTITY_FOR_ITEMS="${EXPANDED_CODE_SIGN_IDENTITY_NAME}"
if [ "${CODE_SIGN_IDENTITY_FOR_ITEMS}" = "" ] ; then
# Fall back to old behavior.
CODE_SIGN_IDENTITY_FOR_ITEMS="${CODE_SIGN_IDENTITY}"
fi

echo "Identity:"
echo "${CODE_SIGN_IDENTITY_FOR_ITEMS}"

echo "Entitlements:"
echo "${CODE_SIGN_ENTITLEMENTS}"

echo "Found:"
echo "${ITEMS}"

# Change the Internal Field Separator (IFS) so that spaces in paths will not cause problems below.
SAVED_IFS=$IFS
IFS=$(echo -en "\n\b")

# Loop through all items.
for ITEM in $ITEMS;
do
echo "Stripping invalid archs '${ITEM}'"
lipo -remove i386 "${ITEM}" -o "${ITEM}"
echo "Signing '${ITEM}'"
codesign --force --verbose --sign "${CODE_SIGN_IDENTITY_FOR_ITEMS}" --entitlements "${CODE_SIGN_ENTITLEMENTS}" "${ITEM}"
RESULT=$?
if [[ $RESULT != 0 ]] ; then
echo "Failed to sign '${ITEM}'."
IFS=$SAVED_IFS
exit 1
fi
done

# Restore $IFS.
IFS=$SAVED_IFS

fi
```

そして, `Build Settings` の 
* `Code Sign Identity` を `Sign to Run Locally` に
* `Other Code Signing Flags` を `--deep` に
に設定しましょう.

ついでに, `Info` に
* `Key`: `Privacy - Microphone Usage Description`
    * `Value`: 適当な文言
* `Key`: `Privacy - Camera Usage Description`
    * `Value`: 適当な文言
を追加.

これでビルドが通るはず.

## PG対応

ここまで来たらPGで作ったらこの状態になって欲しい！
ということで `scripts/template/osx/` を修正しましょう.
ただ, この頃のxcodeprojの中身はXMLで記述されており, 最新のXcodeで開くと諸々がjsonライクなファイルに変わってしまいPGが読めなくなってしまいます.
ですので素直にテキストエディタで開くことにします.

`emptyExample.xcodeproj` の `パッケージの内容を表示` で中に入ります. その先に見える `project.pbxproj` が本体です. 好きなテキストエディタで開きましょう.

### まずは `Run Script` の追加から.

`PBXShellScriptBuildPhase` で検索すると `rsync` でファイルコピーをするフェイズが見つかります. スクリプト自体は `shellScript` のキーで `string` としてベタ書きされてますね.

```xml
		<key>E4B6FFFD0C3F9AB9008CF71C</key>
		<dict>
			<key>buildActionMask</key>
			<string>2147483647</string>
			<key>files</key>
			<array/>
			<key>inputPaths</key>
			<array/>
			<key>isa</key>
			<string>PBXShellScriptBuildPhase</string>
			<key>outputPaths</key>
			<array/>
			<key>runOnlyForDeploymentPostprocessing</key>
			<string>0</string>
			<key>shellPath</key>
			<string>/bin/sh</string>
			<key>shellScript</key>
			<string>mkdir -p "$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Contents/Resources/"
# Copy default icon file into App/Resources
rsync -aved "$ICON_FILE" "$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Contents/Resources/"
# Copy libfmod and change install directory for fmod to run
rsync -aved ../../../libs/fmodex/lib/osx/libfmodex.dylib "$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Contents/Frameworks/";
install_name_tool -change @executable_path/libfmodex.dylib @executable_path/../Frameworks/libfmodex.dylib "$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Contents/MacOS/$PRODUCT_NAME";
# Copy GLUT framework (must remove for AppStore submissions)
rsync -aved ../../../libs/glut/lib/osx/GLUT.framework "$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Contents/Frameworks/"
</string>
		</dict>
```

これでひとかたまりです.
これを真似ましょう.

この部分の直下にまずまるっとコピペします.
その後, `key` を適当に被らないように変更します.
ここではコピー元の`E4B6FFFD0C3F9AB9008CF71C` を1増やして `E4B6FFFD0C3F9AB9008CF71D` にしましょう.
そしてスクリプト部分に上の `Run Script` を追加のところで書いたスクリプトをコピーします.

しかしこれだけだと反映されません. これからこれを `Build Phases` と紐付けなければいけません.
そのためには `key` が怪しげです. `E4B6FFFD0C3F9AB9008CF71C` を検索してみましょう.
もう一件見つかりますね.

```xml
			<key>buildPhases</key>
			<array>
				<string>E4B69B580A3A1756003C02F2</string>
				<string>E4B69B590A3A1756003C02F2</string>
				<string>E4B6FFFD0C3F9AB9008CF71C</string>
				<string>E4C2427710CC5ABF004149E2</string>
			</array>
```

如何にも怪しげです. `Build Phases` の最後に追加したいので最後にエイヤッと `E4B6FFFD0C3F9AB9008CF71D` を追加しましょう.

```xml
			<key>buildPhases</key>
			<array>
				<string>E4B69B580A3A1756003C02F2</string>
				<string>E4B69B590A3A1756003C02F2</string>
				<string>E4B6FFFD0C3F9AB9008CF71C</string>
				<string>E4C2427710CC5ABF004149E2</string>
				<string>E4B6FFFD0C3F9AB9008CF71D</string>
			</array>
```

これで `Run Script` は反映されました.

### Code Signing周り

次はCode Signing周りも追加したいですね.
しかしここらへんは0.9.8のバージョンには存在しません...
雰囲気で変えていきましょう.
nightlyの方の `project.pbxproj` を `--deep` で検索してみると

```xml
		<key>99FA3DBB1C7456C400CFA0EE</key>
		<dict>
			<key>baseConfigurationReference</key>
			<string>E4EB6923138AFD0F00A09F29</string>
			<key>buildSettings</key>
			<dict>
				<key>CONFIGURATION_BUILD_DIR</key>
				<string>$(SRCROOT)/bin/</string>
				<key>COPY_PHASE_STRIP</key>
				<string>YES</string>
				<key>DEAD_CODE_STRIPPING</key>
				<string>YES</string>
				<key>GCC_AUTO_VECTORIZATION</key>
				<string>YES</string>
				<key>GCC_ENABLE_SSE3_EXTENSIONS</key>
				<string>YES</string>
				<key>GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS</key>
				<string>YES</string>
				<key>GCC_INLINES_ARE_PRIVATE_EXTERN</key>
				<string>NO</string>
				<key>GCC_OPTIMIZATION_LEVEL</key>
				<string>3</string>
				<key>GCC_PREPROCESSOR_DEFINITIONS[arch=*]</key>
				<string>DISTRIBUTION=1</string>
				<key>GCC_SYMBOLS_PRIVATE_EXTERN</key>
				<string>NO</string>
				<key>GCC_UNROLL_LOOPS</key>
				<string>YES</string>
				<key>GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS</key>
				<string>YES</string>
				<key>GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO</key>
				<string>NO</string>
				<key>GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL</key>
				<string>NO</string>
				<key>GCC_WARN_UNINITIALIZED_AUTOS</key>
				<string>NO</string>
				<key>GCC_WARN_UNUSED_VALUE</key>
				<string>NO</string>
				<key>GCC_WARN_UNUSED_VARIABLE</key>
				<string>NO</string>
				<key>HEADER_SEARCH_PATHS</key>
				<array>
					<string>$(OF_CORE_HEADERS)</string>
					<string>src</string>
				</array>
				<key>MACOSX_DEPLOYMENT_TARGET</key>
				<string>10.9</string>
				<key>OTHER_CODE_SIGN_FLAGS</key>
				<string>--deep</string>
				<key>OTHER_CPLUSPLUSFLAGS</key>
				<array>
					<string>-D__MACOSX_CORE__</string>
					<string>-mtune=native</string>
				</array>
				<key>SDKROOT</key>
				<string>macosx</string>
			</dict>
			<key>isa</key>
			<string>XCBuildConfiguration</string>
			<key>name</key>
			<string>AppStore</string>
		</dict>
```

こんな感じの場所が見つかりますね. これは怪しい.

ということで今度はXML風の奴で `CONFIGURATION_BUILD_DIR` とかで検索してみると

```xml
		<key>E4B69B4E0A3A1720003C02F2</key>
		<dict>
			<key>baseConfigurationReference</key>
			<string>E4EB6923138AFD0F00A09F29</string>
			<key>buildSettings</key>
			<dict>
				<key>CONFIGURATION_BUILD_DIR</key>
				<string>$(SRCROOT)/bin/</string>
				<key>COPY_PHASE_STRIP</key>
				<string>NO</string>
				<key>DEAD_CODE_STRIPPING</key>
				<string>YES</string>
				<key>GCC_AUTO_VECTORIZATION</key>
				<string>YES</string>
				<key>GCC_ENABLE_SSE3_EXTENSIONS</key>
				<string>YES</string>
				<key>GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS</key>
				<string>YES</string>
				<key>GCC_INLINES_ARE_PRIVATE_EXTERN</key>
				<string>NO</string>
				<key>GCC_OPTIMIZATION_LEVEL</key>
				<string>0</string>
				<key>GCC_SYMBOLS_PRIVATE_EXTERN</key>
				<string>NO</string>
				<key>GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS</key>
				<string>YES</string>
				<key>GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO</key>
				<string>NO</string>
				<key>GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL</key>
				<string>NO</string>
				<key>GCC_WARN_UNINITIALIZED_AUTOS</key>
				<string>NO</string>
				<key>GCC_WARN_UNUSED_VALUE</key>
				<string>NO</string>
				<key>GCC_WARN_UNUSED_VARIABLE</key>
				<string>NO</string>
				<key>MACOSX_DEPLOYMENT_TARGET</key>
				<string>10.8</string>
				<key>ONLY_ACTIVE_ARCH</key>
				<string>YES</string>
				<key>OTHER_CPLUSPLUSFLAGS</key>
				<array>
					<string>-D__MACOSX_CORE__</string>
					<string>-mtune=native</string>
				</array>
				<key>SDKROOT</key>
				<string>macosx</string>
			</dict>
			<key>isa</key>
			<string>XCBuildConfiguration</string>
			<key>name</key>
			<string>Debug</string>
		</dict>
```

こんな感じの塊が2個見つかります. `Debug` と `Release` 用で2個ですね.
ということで必要そうな `OTHER_CODE_SIGN_FLAGS` を追加しましょう.

```xml
		<key>E4B69B4E0A3A1720003C02F2</key>
		<dict>
			<key>baseConfigurationReference</key>
			<string>E4EB6923138AFD0F00A09F29</string>
			<key>buildSettings</key>
			<dict>
				<key>CONFIGURATION_BUILD_DIR</key>
				<string>$(SRCROOT)/bin/</string>
				<key>COPY_PHASE_STRIP</key>
				<string>NO</string>
				<key>DEAD_CODE_STRIPPING</key>
				<string>YES</string>
				<key>GCC_AUTO_VECTORIZATION</key>
				<string>YES</string>
				<key>GCC_ENABLE_SSE3_EXTENSIONS</key>
				<string>YES</string>
				<key>GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS</key>
				<string>YES</string>
				<key>GCC_INLINES_ARE_PRIVATE_EXTERN</key>
				<string>NO</string>
				<key>GCC_OPTIMIZATION_LEVEL</key>
				<string>0</string>
				<key>GCC_SYMBOLS_PRIVATE_EXTERN</key>
				<string>NO</string>
				<key>GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS</key>
				<string>YES</string>
				<key>GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO</key>
				<string>NO</string>
				<key>GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL</key>
				<string>NO</string>
				<key>GCC_WARN_UNINITIALIZED_AUTOS</key>
				<string>NO</string>
				<key>GCC_WARN_UNUSED_VALUE</key>
				<string>NO</string>
				<key>GCC_WARN_UNUSED_VARIABLE</key>
				<string>NO</string>
				<key>MACOSX_DEPLOYMENT_TARGET</key>
				<string>10.8</string>
				<key>OTHER_CODE_SIGN_FLAGS</key>
				<string>--deep</string>
				<key>ONLY_ACTIVE_ARCH</key>
				<string>YES</string>
				<key>OTHER_CPLUSPLUSFLAGS</key>
				<array>
					<string>-D__MACOSX_CORE__</string>
					<string>-mtune=native</string>
				</array>
				<key>SDKROOT</key>
				<string>macosx</string>
			</dict>
			<key>isa</key>
			<string>XCBuildConfiguration</string>
			<key>name</key>
			<string>Debug</string>
		</dict>
```

こんな感じに.

これで保存してPG通したら楽な世界があなたを待っている！（はず）

----

最後まで読んだあなたに

[諸々やったoF0.9.8zip](https://drive.google.com/file/d/1-SnYEFs4WOQJ3PpshyA3Su6lLYfiMiuu/view?usp=sharing)
[CoreOF.xcconfig](https://drive.google.com/file/d/1lsUU0ZzFzSDWgf6VdTAD9byhhii5lhG1/view?usp=sharing)
[template/osx](https://drive.google.com/file/d/1eWUXun2Dci7ioVrltRdaj2eENUYAblbJ/view?usp=sharing)

----

ところで

最近 [Github Sponsors](https://github.com/sponsors/2bbb) とか登録してみたのでこれで命を助けられた人とか居たら...