Carthageのcopy-frameworksでInput Filesに追加するframeworkの一覧を出力するスクリプトを書いてみた


概要

carthage updateを行ったあとに、Targetの[Build Phases]にRunScriptを作って、
以下のようにcommandとInput Filesにライブラリのframeworkのpathを指定するのですが、

このInputFilesに入力するpathの一覧をターミナルで出力できるように、スクリプトを書いてみました。
特に手入力して頑張る場合、typoする可能性もあるので、正確なpathを吐き出してもらったほうが安心したりします。

コード

こんな感じで書いてみました。
体裁はこちらを参考にさせて頂きました。
Gistはこちらです。

carthage-framework-paths.sh
#!/bin/bash
usage() {
    cat <<HELP
SYNOPSIS:
  $0 [-d] [iOS(default)|watchOS|tvOS|Mac]
  $0 [-h]

ARGUMENTS:
  iOS       print paths for iOS (default)
  watchOS   print paths for iOS
  tvOS      print paths for iOS
  Mac       print paths for iOS

OPTIONS:
  -h  Show usage
  -d  output decorated result, e.g. "\$(SRCROOT)/Carthage/Build/iOS/APIKit.framework",

EXAMPLE:
  $0 iOS
  $0 -d watchOS

HELP
}

framework_not_found() {
  echo "framework not found."
}

print_paths() {
  dir_path="Carthage/Build/$1"
  if [ ! -d $dir_path ]; then
    framework_not_found; exit 0;
  fi
  if [ $DECORATE -eq 1 ]; then
    paths=$(find Carthage/Build/"$1" -type d -name "*.framework" | xargs -n 1 -I % echo '"$(SRCROOT)/'%'",')
  else
    paths=$(find Carthage/Build/"$1" -type d -name "*.framework" | xargs -n 1 -I % echo '$(SRCROOT)/'%)
  fi
  [ ! -z "$paths" ] && echo "$paths" || framework_not_found
}

main() {
  SCRIPT_DIR="$(cd $(dirname "$0"); pwd)"
  DECORATE=0
  for ARG; do
    case "$ARG" in
      -*)
      while getopts h,d OPT "$ARG"; do
        case "$OPT" in
          h) usage; exit 0;;
          d) DECORATE=1;;
          *) exit 1;;
        esac
      done
      ;;
    esac
  done

  shift $(expr $OPTIND - 1)
  if [ $# -gt 1 ]; then
    echo -e "Too many arguments. See below:\n"; usage; exit 1;
  fi
  if [ ! -d Carthage/Build ]; then
    echo "directory \"Carthage/Build\"  not found"; exit 1;
  fi
  print_paths ${1:-iOS}
}

main "$@"

使い方

事前にcarthage update等でCarthage/Build以下にframeworkが生成されている状態にします。
あとは、上記shファイルをプロジェクトのルートディレクトリに配置して実行するだけです。

デフォルトで "Carthage/Build/iOS" 中のframeworkのpathを出力しますが、
引数で "iOS, watchOS, tvOS, Mac" を指定すれば、それぞれのプラットフォームに対応したframeworkのpathの一覧を出力します。
あとはこれをInput Filesに追加していけばオッケーです

出力してみる

output
$ ./carthage-input-files.sh
# 出力結果
$(SRCROOT)/Carthage/Build/iOS/APIKit.framework
$(SRCROOT)/Carthage/Build/iOS/Bond.framework
$(SRCROOT)/Carthage/Build/iOS/FirstAppearing.framework
$(SRCROOT)/Carthage/Build/iOS/Himotoki.framework
$(SRCROOT)/Carthage/Build/iOS/Result.framework

$ ./carthage-input-files.sh watchOS
# 出力結果
$(SRCROOT)/Carthage/Build/watchOS/APIKit.framework
$(SRCROOT)/Carthage/Build/watchOS/Result.framework