バッチ処理内でリビルドされない仕組み

Tera Term のリリースでは、一つの操作でインストーラとポータブル (zip) 版が生成される。

インストーラに含まれるバイナリとポータブル版に含まれるバイナリは、同じソースをそれぞれビルドしたものでなく、完全に同じものになるようにしている。cf. ttssh2-devel 4728, ttssh2-dev 273(ビルドのタイムスタンプでも含まれているのか、ソースを全く変更せずリビルドしたバイナリ同士を比較しても差がある)

ビルドするための操作方法が2つあるが、それぞれリビルドされないためにどうしているか解説する。

Inno Script Studio から作成する場合

  1. PreCompile セクションの指示により、"build.bat rebuild" が実行される
    • "libs/buildall.bat" を実行し、ライブラリがビルドされる(すでにビルドされていればリビルドされない)
    • buildtools\svnrev\svnrev.bat が実行される(SVN リビジョンが上がっていれば teraterm/ttpdlg/svnversion.h が更新される)
    • *.sln が "devenv /rebuild release" で実行される(release ターゲット・必ずリビルド
  2. Inno Setup により、ビルドされたバイナリを含むインストーラ exe が生成される
  3. PostCompile セクションの指示により、"makearchive.bat release" が実行される
    • "build.bat release" が実行される
      • "libs/buildall.bat" が実行される(すでにビルドされているのでリビルドされない)
      • buildtools\svnrev\svnrev.bat が実行される(先ほどから SVN リビジョンが上がっていないので teraterm/ttpdlg/svnversion.h は更新されない)
      • *.sln が "devenv release" で実行される(release ターゲット・rebuild が指定されていない ... ソースは変化していないのでリビルドされない
    • ファイルをまとめたスナップショットフォルダが作成される

release.bat から作成する場合

  1. "libs/download.cmake" を実行し、ライブラリのソースをダウンロードする
  2. "libs/buildall.bat" を実行し、ライブラリがビルドされる(すでにビルドされていればリビルドされない)
  3. ビルド
    1. RELEASE=1 の場合(svn のチェックアウト元が tags/ 配下の場合)
      • "build.bat rebuild" が実行される
        • "libs/buildall.bat" が実行される(すでにビルドされているのでリビルドされない)
        • buildtools\svnrev\svnrev.bat が実行される(SVN リビジョンが上がっていれば teraterm/ttpdlg/svnversion.h が更新される)
        • *.sln が "devenv /rebuild release" で実行される(release ターゲット・必ずリビルド
      • "makearchive.bat release" が実行される
        • "build.bat release" が実行される
          • "libs/buildall.bat" が実行される(すでにビルドされているのでリビルドされない)
          • buildtools\svnrev\svnrev.bat が実行される(先ほどから SVN リビジョンが上がっていないので teraterm/ttpdlg/svnversion.h は更新されない)
          • *.sln が "devenv release" で実行される(release ターゲット・rebuild が指定されていない ... ソースは変化していないのでリビルドされない
        • ファイルをまとめたスナップショットフォルダが作成される
    2. rebuild の場合
      • "build.bat rebuild" が実行される
        • "libs/buildall.bat" が実行される(すでにビルドされているのでリビルドされない)
        • buildtools\svnrev\svnrev.bat が実行される(SVN リビジョンが上がっていれば teraterm/ttpdlg/svnversion.h が更新される)
        • *.sln が "devenv /rebuild release" で実行される(release ターゲット・必ずリビルド
      • "makearchive.bat" が実行される
        • "build.bat" が実行される
          • "libs/buildall.bat" が実行される(すでにビルドされているのでリビルドされない)
          • buildtools\svnrev\svnrev.bat が実行される(先ほどから SVN リビジョンが上がっていないので teraterm/ttpdlg/svnversion.h は更新されない)
          • *.sln が "devenv release" で実行される(release ターゲット・rebuild が指定されていない ... ソースは変化していないのでリビルドされない
        • ファイルをまとめたスナップショットフォルダが作成される
    3. それ以外 の場合
      • "makearchive.bat" が実行される
        • "build.bat" が実行される
          • "libs/buildall.bat" が実行される(すでにビルドされているのでリビルドされない)
          • buildtools\svnrev\svnrev.bat が実行される(SVN リビジョンが上がっていれば teraterm/ttpdlg/svnversion.h が更新される)
          • *.sln が "devenv release" で実行される(release ターゲット・rebuild が指定されていない ... ソースに変化があればビルドされる
        • ファイルをまとめたスナップショットフォルダが作成される
  4. スナップショットフォルダが zip 圧縮される
  5. Inno Setup により、ビルドされたバイナリを含むインストーラ exe が生成される