Verwenden von CMake mit C++Builder

Aus RAD Studio
Wechseln zu: Navigation, Suche

Befehlszeilenunterstützung für CMake

RAD Studio 10.2 Tokyo Release 3 unterstützt das Erstellen von CMake-Projekten über die Befehlszeile mithilfe der C++-Compiler von RAD Studio. Sie können für Windows oder andere Plattformen compilieren. CMake unterstützt die durch Clang erweiterten RAD Studio-Compiler: BCCAARM für Android, BCCIOSARM64 für 64-Bit-iOS, BCCIOSARM für 32-Bit-iOS, BCC64 für 64-Bit-Windows und BCC32X für 32-Bit-Windows. RAD Studio 10.2 Tokyo Release 3 unterstützt auch die Verwendung von Ninja mit CMake. Damit können Sie sehr schnelle parallele Builds erstellen.

Installieren von CMake und Ninja

CMake

Laden Sie CMake 3.10 herunter und installieren Sie es. Verwenden Sie das binäre Installationsprogramm, weil Sie damit CMake optional dem Systempfad hinzufügen können. Wählen Sie die entsprechende Option bei der Installation aus.

CMake-Dateien befinden sich in C:\Programme (x86)\Embarcadero\Studio\19.0\cmake. Um Fehler beim Build-Vorgang zu vermeiden, müssen Sie allerdings eine Datei manuell verschieben. Führen Sie dazu die folgenden Schritte aus:

  1. Suchen Sie den CMake-Installationsordner und den Unterordner Modules\Platform. Z. B. C:\Programme\CMake\share\cmake-3.10\Modules\Platform
  2. Suchen Sie die Datei Windows-Embarcadero.cmake, und erstellen Sie eine Sicherung davon.
  3. Kopieren Sie Windows-Embarcadero.cmake aus dem Ordner Studio\19.0\cmake, und überschreiben Sie die Version im CMake-Ordner.

Wir haben die integrierten CMake-Unterstützung für die Windows-Compiler stark erweitert. Sie müssen diese Datei verwenden, um ein Build erfolgreich zu erstellen.

Ninja

Laden Sie Ninja 1.8.2 herunter, und installieren Sie es. Ninja müssen Sie dem Systempfad manuell hinzufügen.

Verwendung von CMake

CMake erstellt Builds auf Basis einer Textdatei namens CMakeLists.txt. Diese Datei enthält die Namen der Dateien, aus denen CMake das Build erstellt. Weitere Informationen finden Sie in der Entwickler-Dokumentation (EN). Wir empfehlen die Blogreihe von Jeff Preshing zu CMake: How to Build a CMake-based Project und Learn CMake’s Scripting Language in 15 Minutes.

Für CMake benötigen Sie die folgenden Dateien:

  • C++-Quellcode, den Sie erzeugen möchten: Eine Reihe von C++-Dateien und -Headern.
  • CMakeLists.txt: Legt den Projektnamen fest, enthält die Pfade zu den Quelldateien und erzeugt eine ausführbare Datei, Bibliothek, Package usw. Unten finden Sie einige Beispieldateien. In erweiterten CMakeLists.txt-Dateien können mehrere Projekte definiert werden.
  • (Optional) Batch-Skript für CMake: In einem Batch-Skript (*.bat) können Sie mehrere Befehle angeben. CMake kann eine große Anzahl an Dateien erstellen, und Sie können mit der Batch-Datei einen Unterordner anlegen, in dem alle Ausgaben einschließlich der Dateien von CMake gespeichert werden. In diesem Blogbeitrag über die Verwendung von bcc32c mit CMake (EN) finden Sie weitere Details.
Führen Sie das Batch-Skript in der Befehlszeile aus, um die ausführbare Datei zusammen mit vielen anderen Dateien in dem angegebenen Unterordner zu erzeugen.

Hinweis: Speichern Sie die Datei CMakeLists.txt im Stammverzeichnis Ihres Projekts. Sie können die Quelldateien in einem Unterordner speichern.

Erstellen von Builds mit CMake

Starten Sie eine RAD Studio-Eingabeaufforderung über das Startmenü oder indem Sie die Eingabeaufforderung öffnen und rsvars.bat im RAD Studio-Ordner \bin ausführen.

CMake sucht nach einer CMakeLists.txt-Datei. Informationen zum Erstellen dieser Datei für ein Projekt finden Sie weiter unten.

Für Windows

Für Win32: cmake -DCMAKE_C_COMPILER=bcc32x.exe -DCMAKE_CXX_COMPILER=bcc32x.exe -G Ninja

Für Win64: cmake -DCMAKE_C_COMPILER=bcc64.exe -DCMAKE_CXX_COMPILER=bcc64.exe -G Ninja

Und anschließend: ninja

um Ninja zum Erstellen des eigentlichen Builds aufzurufen.

Für iOS und Android

Für iOS und Android werden Toolkettendateien zur übergreifenden Compilierung verwendet. Stellen Sie sicher, dass das Erstellen von Builds und die Bereitstellung aus der IDE (einschließlich des Einrichtens des SDK) möglich ist, bevor Sie über die Befehlszeile ein Build starten.

Für iOS32: cmake -DCMAKE_TOOLCHAIN_FILE=bccios32.cmake -G Ninja

Für iOS64: cmake -DCMAKE_TOOLCHAIN_FILE=bccios64.cmake -G Ninja

Für Android: cmake -DCMAKE_TOOLCHAIN_FILE=bccaarm.cmake -G Ninja

Und anschließend: ninja

um Ninja zum Erstellen des eigentlichen Builds aufzurufen.

Weitere Befehlszeilen-Flags

  • -G”Borland Makefiles” zur Verwendung des alten "Make" zum Erstellen von Builds.
  • -DCMAKE_BUILD_TYPE_INIT=Release für Debug- oder Release-Builds.
  • -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON zum vereinfachten Debuggen der Ausgabe.
  • --debug-output zum Versetzen von CMake in den Debug-Modus.

Zum Beispiel:

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 ..

um mit dem Win32-Compiler, Make und der Datei CMakeLists.txt im übergeordneten Ordner eine Release-Build, einige Meldungen und Debugging-Flags zu erzeugen.

C++Builder-spezifische Unterstützung in einer CMakeLists.txt

Ziele

Mit CMake können Sie ausführbare Dateien, DLLs, statische Bibliotheken und Packages erstellen.

set_embt_target(FMX)
set_embt_target(VCL)
set_embt_target(Package)
set_embt_target(DynamicRuntime)

Oder Kombinationen:

set_embt_target(VCL DynamicRuntime)

Makros und Variablen

Für iOS und Android gibt es eine Reihe von Makros und Variablen. In diesem Beispiel für eine CMakeLists.txt sind einige davon enthalten:

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()

Beispieldatei CMakeLists.txt

Für ein Projekt namens Example und mit Quelldateien im gleichen Ordner ist die folgende CMakeLists.txt-Datei ein Beispiel:

cmake_minimum_required (VERSION 3.10)
project (Example)

file(GLOB Example_SRC
   "*.h"
   "*.cpp"
)

add_executable(Example ${Example_SRC})

In dieser Datei ist die Minimalversion (3.10), der Projektname, die Verwendung aller verfügbaren CPP- und H-Dateien und dass all diese Dateien in die Example.exe compiliert werden, angegeben.

Alle Dateien per "Glob" zusammenzufassen ist schnell und einfach, aber keine empfohlene Methode. Geben Sie zu verwendenden Dateien stattdessen einzeln an. Sie können CPP-Dateien und Header angeben. Ein kleines Beispiel für die Angabe von CPP-Dateien ist:

cmake_minimum_required (VERSION 3.10)
project (Example)

add_executable(Example main.cpp foo.cpp bar.cpp)

Beispiel-CMakeLists.txt: VCL-App

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
)

Beispiel-CMakeLists.txt: FMX-App

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)

Beispiel-CMakeLists.txt: gemeinsame Bibliothek

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
       )

Beispiel-CMakeLists.txt: statische Bibliothek

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
       )

Beispiel-CMakeLists.txt: Package

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
       )

Beispiel-CMakeLists.txt: Ressourcen

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} )

Siehe auch