C++ Builder での CMake の利用
目次
CMake コマンドラインのサポート
RAD Studio 10.2 Tokyo Release 3 には、RAD Studio の C++ コンパイラを利用したコマンドライン上での CMake プロジェクトのビルドのサポートが含まれています。Windows に対して、または Windows から他のプラットフォームに対してコンパイルすることができます。 CMake は、RAD Studio の次の Clang 拡張コンパイラをサポートします: BCCAARM for Android、BCCIOSARM64 for 64 ビット iOS、BCCIOSARM for 32 ビット iOS、BCC64 for 64 ビット Windows、BCC32X for 32 ビット Windows。 RAD Studio 10.2 Tokyo Release 3 はまた、Ninja を CMake でサポートしています。これにより、高速な並列コンパイルが可能になります。
CMake と Ninja のインストール
CMake
CMake 3.10 をダウンロードしてインストールします。バイナリ インストーラを使用します。これは、システム パスに CMake をオプションで追加します。インストール時にこのオプションを必ず選択してください。
CMake ファイルは、C:\Program Files (x86)\Embarcadero\Studio\19.0\cmake
にあります。しかしながら、ビルド プロセスでのエラーを回避するには、ファイルを 1 つ手動で移動させる必要があります。次のステップに従ってください:
- CMake インストレーション フォルダと Modules\Platform サブフォルダを探します。 例:
C:\Program Files\CMake\share\cmake-3.10\Modules\Platform
Windows-Embarcadero.cmake
ファイルを探し、バックアップを作成します。Windows-Embarcadero.cmake
をStudio\19.0\cmake
フォルダからコピーし、CMake フォルダにある方のバージョンを上書きします。
Windows コンパイラに対する内部ビルド CMake のサポートを大幅に拡張したため、ビルドを正常に行うためには、このファイルを使用する必要があります。
Ninja
Ninja 1.8.2 をダウンロードしてインストールします。 これを、手動でシステム パスに追加する必要があります。
CMake の使用方法
CMake は、テキスト ファイル CMakeLists.txt (CMake にビルドするファイルを支持するファイル)をベースに、ビルドを行います。さらなる情報については、開発者用ドキュメントを参照してください。 また、CMake 上にある Jeff Preshing によるブログ シリーズ、「How to Build a CMake-based Project」や「Learn CMake’s Scripting Language in 15 Minutes」もお読みになることをお勧めします。
CMake を使用するには、次のファイルが必要となります:
- ビルドしたい C++ ソース:多数の C++ ファイルおよびヘッダーです。
- CMakeLists.txt ファイル: プロジェクト名を定義し、すべてのソース ファイルを検索するために指定し、それらを実行可能ファイル、ライブラリ、パッケージ、その他にビルドします。下記にサンプル ファイルが複数あるので参照してください。さらに上級の CMakeLists.txt ファイルでは、複数のプロジェクトを指定します。
- (任意)CMake を動かすためのバッチ スクリプト:バッチ スクリプト (*.bat) を使用して数多くのコマンドを格納することができます。CMake は、大量のファイルを作成することができ、バッチ ファイルを使用して、CMake のファイルを含むすべての出力を格納するサブフォルダを作成することができます。「using bcc32c with CMake」上のこのブログ投稿でより詳しく説明しています。
- バッチ スクリプトをコマンドラインから実行して、実行可能ファイルを数多くのその他のファイルと共に、指定されたサブフォルダに生成します。
メモ: CMakeLists.txt ファイルは、プロジェクトのルート フォルダに格納してください。ソース ファイルはサブフォルダに格納できます。
CMake を利用したビルド
RAD Studio コマンド プロンプトを[スタート]メニューから開始するか、コマンド プロンプトを開き、RAD Studio の \bin フォルダにある rsvars.bat を実行します。
CMake が、CMakeLists.txt ファイルを検索します。プロジェクトのこれらファイルのいずれかを作成する方法については、以下を参照してください。
Windows の場合
Win32 をターゲットとする場合:
cmake -DCMAKE_C_COMPILER=bcc32x.exe -DCMAKE_CXX_COMPILER=bcc32x.exe -G Ninja
Win64 をターゲットとする場合:
cmake -DCMAKE_C_COMPILER=bcc64.exe -DCMAKE_CXX_COMPILER=bcc64.exe -G Ninja
その後、
ninja
実際のビルドを行うために Ninja を呼び出すには:
iOS および Android の場合
iOS および Android は、ツールチェーン ファイルによって処理されます(これは、クロスコンパイルに使用されます)。コマンドライン ビルドを行う前に、IDE からビルドおよびデプロイができること(SDK の設定を含む)を確認します。
iOS32 をターゲットとする場合:
cmake -DCMAKE_TOOLCHAIN_FILE=bccios32.cmake -G Ninja
iOS64 をターゲットとする場合:
cmake -DCMAKE_TOOLCHAIN_FILE=bccios64.cmake -G Ninja
Android をターゲットとする場合:
cmake -DCMAKE_TOOLCHAIN_FILE=bccaarm.cmake -G Ninja
その後、
ninja
実際のビルドを行うために Ninja を呼び出すには:
その他のコマンドライン フラグ
- -G”Borland Makefiles”: 旧スタイルの make をビルドに使用する際
- -DCMAKE_BUILD_TYPE_INIT=Release: デバッグ ビルドまたはリリース ビルドをターゲットとする際
- -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON: デバッグ出力を簡単にするため
- --debug-output: CMake をデバッグ モードにするため
例:
cmake -DCMAKE_C_COMPILER=bcc32x.exe -DCMAKE_CXX_COMPILER=bcc32x.exe -DCMAKE_BUILD_TYPE_INIT=Release -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON -G "Borland Makefiles" --debug-output -v ..
Win32 コンパイラ、リリース ビルド、その他詳細出力またはデバッグ フラグを使用するには、親フォルダ内に配置された CMakeLists.txt で、make を使用してビルドします。
CMakeLists.txt における C++ Builder 固有のサポート
ターゲット
CMake を使用して、実行可能ファイル、DLL、静的ライブラリ、パッケージを作成することができます。
set_embt_target(FMX) set_embt_target(VCL) set_embt_target(Package) set_embt_target(DynamicRuntime)
または、組み合わせることもできます:
set_embt_target(VCL DynamicRuntime)
マクロと変数
iOS と Android には、数多くの マクロと変数があります。このサンプル CMakeLists.txt は、そのいくつかを表しています:
cmake_minimum_required(VERSION 3.9) set(APP "FMXApp") set(CMAKE_BUILD_TYPE "DEBUG") set(EMBT_PROJECT_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/Project_${APP}") project (${APP}) if(EMBT_TARGET STREQUAL iOS64) set(EMBT_IOS_BUNDLE_IDENTIFIER "com.company.adhoc") set(EMBT_IOS_BUNDLE_EXECUTABLE ${APP}) set(EMBT_IOS_BUNDLE_NAME ${APP}) set(EMBT_IOS_BUNDLE_VERSION "1.0") set(EMBT_IOS_BUILD_TYPE "Ad-hoc") add_embt_background_modes(audio) add_embt_background_modes(voip) add_embt_additional_files("${CMAKE_CURRENT_SOURCE_DIR}/cmakelists.txt") add_embt_additional_files("${CMAKE_CURRENT_SOURCE_DIR}/cmakelists.txt" "${EMBT_PROJECT_LOCATION}" "new.txt") set(EMBT_IOS_CAMERA_USAGE_DESCRIPTION "This app needs access to your camera") set_embt_device_family(iphone) set(EMBT_IOS_MINIMUM_OS_VERSION 8.0) set(EMBT_IOS_BUNDLE_ALLOW_MIXED_LOCALIZATIONS YES) set(REMOTE_PROFILE "_mac") set(PROVISIONING_PROFILE "provision.mobileprovision") set(CERTIFICATE "iPhone Distribution:") elseif(EMBT_TARGET STREQUAL iOS32) set(EMBT_IOS_BUNDLE_EXECUTABLE ${APP}) set(EMBT_IOS_BUNDLE_NAME ${APP}) set(EMBT_IOS_BUNDLE_IDENTIFIER "com.company.id") set(EMBT_IOS_BUNDLE_VERSION "1.0") set(EMBT_IOS_MINIMUM_OS_VERSION 8.0) add_embt_background_modes(audio) elseif(EMBT_TARGET STREQUAL Android) set(EMBT_ANDROID_BUILD_TYPE "Development") add_embt_additional_files("${CMAKE_CURRENT_SOURCE_DIR}/cmakelists.txt") add_embt_additional_files("${CMAKE_CURRENT_SOURCE_DIR}/cmakelists.txt" "${EMBT_PROJECT_LOCATION}" "new.txt") #set(EMBT_ANDROID_SPLASH_IMAGE_LARGE "c:/myArtwork/Android/FM_SplashImage_640x480.png") set(EMBT_ANDROID_INCLUDE_SPLASH_IMAGE True) set(EMBT_ANDROID_ALIAS "release-keystore") set(EMBT_ANDROID_KEYSTORE "release.jks") set(EMBT_ANDROID_STOREPASS "cmakeandroid") set(EMBT_ANDROID_KEYPASS "cmakeandroid") endif() # Create a sources variable with a link to all cpp files to compile file(GLOB SOURCES "src/*.h" "src/*.cpp" ) set_embt_target("FMX") if(EMBT_TARGET STREQUAL Windows) add_executable (${APP} WIN32 ${SOURCES}) install(TARGETS ${APP} RUNTIME DESTINATION bin) else() add_fmx_app("${SOURCES}") endif()
CMakeLists.txt ファイルの例
Example という名のプロジェクトで、ソース ファイルが同じフォルダにある場合、もっとも最小の CMakeLists.txt ファイルは次のようになります:
cmake_minimum_required (VERSION 3.10) project (Example) file(GLOB Example_SRC "*.h" "*.cpp" ) add_executable(Example ${Example_SRC})
これは最低バージョン(3.10)、プロジェクト名を示し、利用可能な .cpp と .h のファイルをすべて使用し、それらをすべて Example.exe にコンパイルします。
すべてのファイルを一緒に “Glob”する(ワイルドカードで指定する)ことは、迅速かつ簡単ですが、推奨される最良の方法ではありません。代わりに、使用したいファイルを指定するほうが推奨されます。.cpp のファイル群やヘッダー群を指定することができますが、.cpp ファイルを指定する最小例は次のようになります:
cmake_minimum_required (VERSION 3.10) project (Example) add_executable(Example main.cpp foo.cpp bar.cpp)
サンプル CMakeLists.txt: VCL アプリケーション
cmake_minimum_required(VERSION 3.9) project (VCLApp) set_embt_target(VCL DynamicRuntime) add_executable (VCLApp WIN32 src/VCLApplication.cpp src/Project1.cpp) install(TARGETS VCLApp RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib/static )
サンプル CMakeLists.txt: FMX アプリケーション
cmake_minimum_required(VERSION 3.9) project (FMXApp) set_embt_target(FMX) add_executable (FMXApp WIN32 src/FMXSample.cpp src/FMXProj.cpp) install(TARGETS FMXApp RUNTIME DESTINATION bin)
サンプル CMakeLists.txt: 共有ライブラリ
project(SharedLibrary) set(SharedLibrary_headers SharedLibrary.h) set(SharedLibrary_sources SharedLibrary.cpp) add_library(SharedLibrary SHARED SharedLibrary.h SharedLibrary.cpp) install(TARGETS SharedLibrary RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib/static )
サンプル CMakeLists.txt: 静的ライブラリ
project(StaticLibrary) set(StaticLibrary_headers StaticLibrary.h) set(StaticLibrary_sources StaticLibrary.cpp) add_library(StaticLibrary STATIC StaticLibrary.h StaticLibrary.cpp) install(TARGETS StaticLibrary RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib/static )
サンプル CMakeLists.txt: パッケージ
cmake_minimum_required(VERSION 3.9) project (PackageExample) set_embt_target(Package) add_library(PackageExample SHARED PackageExample.cpp) install(TARGETS PackageExample RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib/static )
サンプル CMakeLists.txt: リソース
cmake_minimum_required(VERSION 3.9) project (myapp) set(SYSTEM_SOURCES ${SYSTEM_SOURCES} myapp.rc ) set(StrTableRes_SRCS resource.h myapp.cpp) ADD_EXECUTABLE(myapp WIN32 ${SYSTEM_SOURCES} ${StrTableRes_SRCS} )