📘

C++Builder12 でMSBuildを使用する

2023/12/16に公開

MSBuildとは

Microsoftのビルドエンジンであり、通常はVisualStudioで使用されている。
Delphi,C++Builderも対応しており、コマンドラインからビルドが可能になっている。
これにより、ビルド後の実行ファイルの配置なども自動化できる。

使い方

C++Builderインストール時にバンドルされる "Rad Stdio コマンドプロンプト"を使用することが最も簡単である。プロジェクトファイルの存在するフォルダでMSBUILDコマンドを叩くことで自動的にビルドが行われる。
https://docwiki.embarcadero.com/RADStudio/Alexandria/ja/MSBuild
https://docwiki.embarcadero.com/RADStudio/Alexandria/ja/MSBuild_コマンドを使用したプロジェクトのビルド

コマンド

Project1というプロジェクトをビルドする場合は以下のように記述する。

msbuild Project1.cbproj /t:Build /p:config=Release /p:platform=Win32
  • プロジェクトを指定しない場合は、ディレクトリ内のプロジェクトをビルドする
  • ターゲットの指定
    • /t:Clean ... クリーン
    • /t:Make ... コンパイル
    • /t:Build ... ビルド
  • ビルド構成
    • /p:config=Debug ... デバッグモード
    • /p:config=Release ... リリースモード
  • ターゲットプラットフォーム
    • /p:platform=Win32 ... Win32アプリケーション
    • /p:platform=Win64 ... Win64アプリケーション
    • /p:platform=iOSDevice64 ... iOSアプリケーション(C++Builder12には存在しない)
    • /p:platform=Android ... Androidアプリケーション(C++Builder12には存在しない)
    • Classicコンパイラ or CLANGコンパイラはIDE側で指定する必要あり
    • 筆者環境ではCLANGコンパイラを使用する場合、Releaseモードでビルドができない。

サンプルスクリプト(コマンドプロンプト)

普通のコマンドプロンプトを使用する場合のサンプルコードを記載する。

rem ============
rem 初期パラメータ(Rad Studio コマンドプロンプトを使用しない場合に必要)
rem ============
@SET BDS=C:\Program Files (x86)\Embarcadero\Studio\23.0
@SET BDSINCLUDE=C:\Program Files (x86)\Embarcadero\Studio\23.0\include
@SET BDSCOMMONDIR=C:\Users\Public\Documents\Embarcadero\Studio\23.0
@SET FrameworkDir=C:\Windows\Microsoft.NET\Framework\v4.0.30319
@SET FrameworkVersion=v4.5
@SET FrameworkSDKDir=
@SET PATH=%FrameworkDir%;%FrameworkSDKDir%;C:\Program Files (x86)\Embarcadero\Studio\23.0\bin;C:\Program Files (x86)\Embarcadero\Studio\23.0\bin64;C:\Program Files (x86)\Embarcadero\Studio\23.0\cmake;%PATH%
@SET LANGDIR=JA
@SET PLATFORM=
@SET PlatformSDK=

rem ============
rem ビルド
rem ============
rem {プロジェクトファイルのあるディレクトリまで移動}
msbuild Project1.cbproj /t:Build /p:config=Release /p:platform=Win32

サンプルスクリプト(Python)

Pythonはこんな感じ。

import subprocess
import os

# ============
# 初期パラメータ(Rad Studio コマンドプロンプトを使用しない場合に必要)
# ============
my_env = os.environ.copy()
my_env["BDS"] = "C:\\Program Files (x86)\\Embarcadero\\Studio\\23.0"
my_env["BDSINCLUDE"] = "C:\\Program Files (x86)\\Embarcadero\\Studio\\23.0\\include"
my_env["BDSCOMMONDIR"] = "C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\23.0"
my_env["FrameworkDir"] = "C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319"
my_env["FrameworkVersion"] = "v4.5"
my_env["FrameworkSDKDir"] = ""
my_env["LANGDIR"] = "JA"
my_env["PLATFORM"] = ""
my_env["PlatformSDK"] = ""
my_env["PATH"] = my_env["FrameworkDir"]+ ";" +my_env["FrameworkDir"] + ";" + "C:\\Program Files (x86)\\Embarcadero\\Studio\\23.0\\bin;C:\\Program Files (x86)\\Embarcadero\\Studio\\23.0\\bin64;C:\\Program Files (x86)\\Embarcadero\\Studio\\23.0\\cmake;" + my_env["PATH"]

# ============
# ビルド
# ============
process = subprocess.run(
    ["msbuild", "/t:Build", "/p:config=Release", "/p:platform=Win32"], 
    cwd=r"{プロジェクトファイルのあるディレクトリを指定}", 
    env=my_env, # 環境変数をセットする
    shell=True
)

Discussion