3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

XcodeにJAVA_HOMEを認識させる

Last updated at Posted at 2023-10-24

問題

Xcodeのbuild scriptをみんな知っていると思う。

Screenshot 2023-10-23 at 0.15.59.png

そう、このやろうだよ。便利だよね? このスクリプトに環境変数を渡したいんだ

プロジェクトチームで共通な環境変数であば User Definedの配下の変数として入れればいい。ここに入れるとXcodeもgitも管理することになる。Run Script実行の直前にXcodeが管理している環境変数全て渡すので プロジェクト共通・チーム共通の変数であればこれ対応完了!

Screenshot 2023-10-24 at 9.15.58.png

しかし、Xcodeが管理していない環境変数(開発者によって値が異なる変数)ならば そんなこと通用しない。

JAVA_HOMEはその例の1つである。JDKは色々ある、ディレクトリーも人それぞれだ。(もう、今さら誰もJavaを使ってXcodeで何かやっている人がいないと思っているかもしれないが Kotlin Multiplatform (KMP)というフレームワークがあり Kotlinコードをコンパイルし.frameworkという形にすることでAndroidと共通でコードが書ける! この仕組みはRun Scriptを利用していて、中でgradleが利用される。時々JDKのバージョンが合っていないとエラーになる。不一致エラーの場合は明示的にJAVA_HOMEをセットしてあげる必要がある。)

大抵の人は JAVA_HOMEを設定する必要ないが、もし必要となったらこの方法が役に立つかもしれない...

方法1: Xcode全体の設定を変更

Xcode > Settings > Locations > Custom Paths あたりで設定する。

Screenshot 2023-10-24 at 22.10.29.png

上記のように自分だけの環境変数を定義する

メリット デメリット
シンプル、手軽 ~/.zshenv~/.zshrcファイルでJAVA_HOMEを既に管理している可能性がある、その場合は 2重管理になってしまうかもしれない。

方法2: zshに切り替え

ステップ1: Run ScriptのShellの値を /bin/sh から /bin/zsh に変更。

ステップ2: 、~/.zshenvファイルに 自分の環境変数を定義。(私はSDKMANユーザーだからこんな感じ)

~/.zshenv
export JAVA_HOME="${HOME}/.sdkman/candidates/java/current"
メリット デメリット
~/.zshenv を利用しているので 2重管理にならない。*nix系のshellを理解している人にとっては 極自然でわかりやすい メリットがデメリットにもなる。~/.zshenv の影響を受けて、~/.zshenv 色々と書けてしまうのでビルドにも影響するかもしれない

Shellの値を/bin/sh から /bin/zsh に変えると どうしてzshenvが呼ばれるの?

まずXcodeのRun scriptの実行のための前処理を理解しよう

Xcodeが

  1. RunScriptのShell値を使って shebangにする。一時ファイル(例: script.sh)として保存
  2. RunScriptの中身を一時ファイルにappendする
  3. Non interactive(-cオプション)として実行する。(例: /bin/sh -c script.sh)

ということでscript.shの中にあるshebangで内部のシェルが決まり、Startup Fileの仕組みを活かせる!

shebangは #!/bin/sh だとbash利用される。bashのnon-interactiveシェルの場合は デフォルトではstartup fileとして何も呼ばれない。~/.profile, ~/.bash_profile当然読み込まれないから 環境変数が読み込まれない。詳細: Bash Startup File(Bash Reference Manual

A non-interactive shell invoked with the name sh does not attempt to read any other startup files.

一方、shebangは #!/bin/zsh だとzshが利用される。zsh世界ではinteractiveだろうがnon-interactiveだろうが ~/.zshenvが読まれる。ここ環境変数を置く場所だ! 詳細: An introductionto the Z Shell - Startup Files

`.zshenv' is sourced on all invocations of the shell, unless the -f option is set. It should contain commands to set the command search path, plus other important environment variables.

以上!役に立ったのでしょうか?

See you later! 🐊

3
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?