Abläufe beim Erstellen von iOS-BuildsiOS Build Mechanics

In diesem Leitfaden erfahren Sie, wie Sie Ihre Anwendungen zeitlich steuern und wie Sie Methoden für schnellere Builds verwenden können.This guide explores how to time your apps and how to use methods that can be employed for quicker builds for all build configurations.

Das Entwickeln großartiger Anwendungen ist mehr als das bloße Schreiben von funktionierendem Code.Developing great applications is more than just writing code that works. Eine gut geschriebene App sollte Optimierungen aufweisen, die schnellere Builds mit kleineren und schnelleren Anwendungen ermöglichen.A well-written app should contain optimizations that accomplish quicker builds with apps that are smaller and faster running. Diese Optimierungen führen nicht nur zu einer besseren Erfahrung für den Benutzer, sondern auch für Sie bzw. alle Entwickler, die am Projekt arbeiten.These optimizations will not only result in a better experience for the user, but also for you or any developer working on the project. Es ist wichtig sicherzustellen, dass beim Umgang mit Ihrer App alles häufig zeitlich gesteuert wird.It is essential to ensure that when dealing with your app everything is timed often.

Denken Sie daran, dass die Standardoptionen sicher und schnell, aber nicht für jede Situation optimal sind.Remember that the default options are safe and fast, but are not optimal for every situation. Darüber hinaus können viele Optionen den Entwicklungszyklus je nach Projekt verlangsamen oder beschleunigen.In addition, many options can either slow down or speed up the development cycle depending on the individual project. Beispielsweise nimmt natives Entfernen Zeit in Anspruch, aber wenn nur eine sehr geringe Größe erreicht wird, lässt sich der Zeitaufwand für das Entfernen nicht durch eine schnellere Bereitstellung zurückgewinnen.For instance, native stripping takes time, but if very little size is gained then the time spent stripping will not be recovered by a faster deploy. Andererseits kann natives Entfernen die App erheblich verkleinern, wodurch die Bereitstellung schneller erfolgt.On the other hand, native stripping can shrink the app significantly, in which case it will be faster to deploy. Dies variiert je nach Projekt und kann nur durch Testen festgestellt werden.This varies between projects, and the only way to know is to test.

Das Tempo von Xamarin-Builds kann auch durch verschiedene Kapazitäten und Fähigkeiten eines Computers beeinflusst werden, die die Leistung beeinflussen können: Prozessorleistung, Busgeschwindigkeiten, die Größe des physischen Speichers, Festplattengeschwindigkeit, Netzwerkgeschwindigkeit.Xamarin build speeds can also be affected by various capacities and capabilities of a computer than can affect performance: processor capabilities, bus speeds, the amount of physical memory, disk speed, network speed. Diese Leistungseinschränkungen sind nicht Gegenstand dieses Dokuments und liegen in der Verantwortung des Entwicklers.These performance limitations are beyond the scope of this document and are the responsibility of the developer.

Zeitsteuerung-AppsTiming apps

So aktivieren Sie die Diagnoseausgabe von MSBuild in Visual Studio für MacTo enable diagnostic MSBuild output within Visual Studio for Mac:

  1. Klicken Sie auf Visual Studio für Mac > Einstellungen...Click Visual Studio for Mac > Preferences...
  2. Wählen Sie in der linken Struktur Projekte > Build aus.In the left-hand tree view, select Projects > Build
  3. Legen Sie im rechten Bereich das Dropdownelement „Protokollausführlichkeit“ auf Diagnose fest: Festlegen der Ausführlichkeit des ProtokollsIn the right-hand panel, set the Log verbosity drop-down to Diagnostic: Setting the Log verbosity
  4. Klicken Sie auf OK.Click OK
  5. Starten Sie Visual Studio für Mac neu.Restart Visual Studio for Mac
  6. Bereinigen Sie Ihr Paket, und erstellen Sie es erneut.Clean and rebuild your package
  7. Zeigen Sie die Diagnoseausgabe im Bereich „Fehler“ (Ansicht > Bereiche > Fehler) an, indem Sie auf die Schaltfläche „Buildausgabe“ klicken.View diagnostic output within the Errors Pad ( View > Pads > Errors ) by clicking the Build Output button

Zeitliche Steuerung von mtouchTiming mtouch

Um spezifische Informationen zum mtouch-Buildprozess anzuzeigen, übergeben Sie in Ihren Projektoptionen--time --time an die mtouch-Argumente.To display information specific to the mtouch build process, pass --time --time to the mtouch arguments in your Project Options. Die Ergebnisse finden Sie in der Buildausgabe, indem Sie den Task MTouch suchen:The results are found in the Build Output, by searching for the MTouch task:

Setup: 36 ms
Resolve References: 982 ms
Extracted native link info: 987 ms
...
Total time: 1554 ms

Herstellen einer Verbindung von Visual Studio mit dem BuildhostConnecting from Visual Studio with Build Host

Die Xamarin-Tools funktionieren technisch auf jedem Mac, auf dem OS X 10.10 Yosemite oder höher ausgeführt werden kann.Xamarin tooling technically works on any Mac that can run OS X 10.10 Yosemite or later. Allerdings können Entwicklererfahrungen und Buildzeiten durch die Leistung des Mac beeinträchtigt werden.However, developer experiences and build times can be hindered by the performance of the Mac.

Im getrennten Zustand führt Visual Studio unter Windows nur die C#-Kompilierungsphase durch und versucht nicht, eine Verknüpfung oder AOT-Kompilierung auszuführen, die Anwendung in ein  .app Bundle zu packen oder das App Bundle zu signieren.In the disconnected state, Visual Studio on Windows only performs the C# compilation phase and does not attempt to perform linking or AOT compilation, package the app into a .app Bundle, or sign the app bundle. (Die C#-Kompilierungsphase ist selten ein Leistungsengpass.) Versuchen Sie herauszufinden, wo in der Pipeline der Build verlangsamt wird, indem Sie direkt auf dem Mac-Buildhost in Visual Studio für Mac einen Build erstellen.(The C# compilation phase is rarely a performance bottleneck.) Attempt to pinpoint where in the pipeline the build is slowing down by building directly on the Mac build host in Visual Studio for Mac.

Darüber hinaus ist einer der häufigsten Gründe für Langsamkeit die Netzwerkverbindung zwischen dem Windows-Computer und dem Mac-Buildhost.In addition, one of the more common places for sluggishness is the network connection between the Windows machine and the Mac build host. Dies kann durch eine physische Einschränkung im Netzwerk, eine drahtlose Verbindung oder einen überlasteten Computer (z. B. einen Mac-in-the-Cloud-Dienst) verursacht werden.This could be due to a physical impediment on the network, using a wireless connection, or having to travel through a saturated machine (such as a Mac-in-the-cloud service).

SimulatortricksSimulator Tricks

Bei der Entwicklung mobiler Anwendungen ist die schnelle Bereitstellung von Code unerlässlich.When developing mobile applications, it is essential to deploy code rapidly. Aus einer Vielzahl von Gründen, darunter Geschwindigkeit und fehlende Anforderungen an die Gerätebereitstellung, entscheiden sich Entwickler häufig für die Bereitstellung auf einem vorinstallierten Simulator oder Emulator.For a variety of reasons including speed and a lack of device provisioning requirements, developers often choose to deploy to a pre-installed simulator or emulator. Für Hersteller von Entwicklertools ist die Entscheidung, einen Simulator oder Emulator zur Verfügung zu stellen, ein Kompromiss zwischen Geschwindigkeit und Kompatibilität.For manufacturers of developer tools, the decision to provide a simulator or emulator comes down to a trade-off between speed and compatibility.

Apple stellt einen Simulator für die iOS-Entwicklung zur Verfügung, der Geschwindigkeit über Kompatibilität stellt, indem er eine weniger restriktive Umgebung für die Ausführung von Code schafft.Apple provides a simulator for iOS development, promoting speed over compatibility by creating a less restrictive environment for running code. Diese weniger restriktive Umgebung erlaubt es Xamarin, den JIT-Compiler (Just In Time) für den Simulator zu verwenden (im Gegensatz zu AOT auf einem Gerät), was bedeutet, dass der Build zur Laufzeit in nativen Code kompiliert wird.This less restrictive environment allows Xamarin to use the Just In Time (JIT) compiler for the simulator (as opposed to AOT on a device), which means that the build is compiled to native code at runtime. Da der Mac viel schneller als ein Gerät ist, ermöglicht dies eine bessere Leistung.As the Mac is much faster than a device, this allows for better performance.

Der Simulator verwendet einen gemeinsam genutzten Anwendungsstarter, sodass der Starter wiederverwendet werden kann, anstatt jedes Mal neu erstellt zu werden, wie es auf dem Gerät erforderlich ist.The simulator uses a shared application launcher, allowing the launcher to be reused, as opposed to being built each time, as is required on the device.

Unter Berücksichtigung der obigen Informationen bietet die nachstehende Liste einige Informationen zu den Schritten, die Sie beim Erstellen und Bereitstellen Ihrer App im Simulator durchführen müssen, um die beste Leistung zu erzielen.While taking into account the information above, the list below gives some information on steps to take when building and deploying your app on the simulator to provide the best performance.

TippsTips

  • Für Builds:For Builds:
    • Deaktivieren Sie in „Projektoptionen“ die Option PNG-Bilder optimieren.De-select the Optimize PNG images option in the Project Options. Diese Optimierung ist für Builds im Simulator nicht notwendig.This optimization is not necessary for builds on the simulator.
    • Legen Sie den Linker auf Nicht verknüpfen fest.Set the linker to Don't Link. Das Deaktivieren des Linkers sorgt für Beschleunigung, da die Ausführung des Linkers viel Zeit in Anspruch nimmt.Disabling the linker is faster because executing it takes a significant amount of time.
    • Das Deaktivieren des gemeinsam genutzten Anwendungsstarters durch Verwendung des Flags --nofastsim führt dazu, dass Simulatorbuilds wesentlich langsamer werden.Disabling the shared application launcher by using the --nofastsim flag causes simulator builds to be much slower. Entfernen Sie dieses Flag, wenn es nicht mehr benötigt wird.Remove this flag when it is no longer required.
    • Die Verwendung nativer Bibliotheken ist langsamer, da die gemeinsam genutzte Hauptausführungsdatei von simlauncher in solchen Fällen nicht wiederverwendet werden kann und für jeden Build eine anwendungsspezifische ausführbare Datei kompiliert werden muss.Using native libraries is slower because the shared simlauncher main executable cannot be reused in such cases and an application-specific executable has to be compiled for every build.
  • Für die BereitstellungFor Deployment
    • Lassen Sie den Simulator nach Möglichkeit immer in Betrieb.Always keep the simulator running when possible. Der Kaltstart des Simulators kann bis zu 12 Sekunden dauern.It can take up to 12 seconds to cold start the simulator.
  • Weitere TippsAdditional Tips
    • Ziehen Sie das Erstellen dem Neuerstellen vor, da beim Neuerstellen vor dem Erstellen des Builds eine Bereinigung erfolgt.Prefer Build over Rebuild, because Rebuild cleans before building. Das Bereinigen kann sehr lange dauern, da Verweise entfernt werden, die verwendet werden könnten.Cleaning can take a long time as it removes references which could be used.
    • Nutzen Sie die Tatsache aus, dass der Simulator die Sandbox nicht erzwingt.Take advantage of the fact that the simulator does not enforce the sandbox. Wenn Sie große Ressourcen wie Videos oder andere Objekte in Ihr Projekt einbinden, kann es bei jedem Start der Anwendung im Simulator zu aufwändigen Dateikopiervorgängen kommen.Having large resources such as videos or other assets included into your project can create costly file copy operations every time the app is launched in the simulator. Vermeiden Sie diese aufwändigen Vorgänge, indem Sie diese Dateien im Basisverzeichnis ablegen und in Ihrer Anwendung über den vollständigen Dateipfad auf sie verweisen.Avoid these costly operations by placing these files in the home directory, and reference them in your application by the full file path.
    • Verwenden Sie im Zweifelsfall das Flag --time --time, um Ihre Änderung zu messen.When in doubt, use the --time --time flag to measure your change

Der folgende Screenshot zeigt, wie Sie in Ihren iOS-Optionen diese Optionen für den Simulator festlegen:The screenshot below illustrates how to set these options for the simulator in your iOS options:

Festlegen der OptionenSetting the options

GerätetricksDevice Tricks

Die Bereitstellung auf dem Gerät ist vergleichbar mit der Bereitstellung auf dem Simulator, da der Simulator eine kleine Teilmenge des Builds ist, der für das iOS-Gerät verwendet wird.Deploying to the device is similar to deploying to the simulator, as the simulator is a small subset of the build used for the iOS device. Das Erstellen eines Builds für ein Gerät erfordert viele weitere Schritte, hat aber den Vorteil, dass es zusätzliche Möglichkeiten zur Optimierung Ihrer App bietet.Building for device requires many more steps, but has the advantage of providing additional opportunities to optimize your app.

BuildkonfigurationenBuild Configurations

Es gibt eine Reihe von Buildkonfigurationen, die bei der Bereitstellung von iOS-Apps zur Verfügung stehen.There are a number of build configurations provided when deploying iOS apps. Es ist wichtig, ein gutes Verständnis der einzelnen Konfigurationen zu haben, um zu wissen, wann und warum Sie optimieren sollten.It is important to have a good understanding of each configuration, to know when and why you should be optimizing.

  • DebugDebug
    • Dies ist die Hauptkonfiguration, die während der Entwicklung einer App verwendet werden sollte und daher so schnell wie möglich sein sollte.This is the main configuration that should be used while an app is under development, and should, therefore, be as quick as possible.
  • FreigabeRelease
    • Releasebuilds sind diejenigen, die an Ihre Benutzer ausgeliefert werden. Bei ihnen liegt der Schwerpunkt auf der Leistung.Release builds are those that are shipped to your users and a focus on performance is paramount. Wenn Sie die Releasekonfiguration verwenden, empfiehlt es die Verwendung des LLVM-Optimierungscompilers und Optimierung von PNG-Dateien.When using the Release configuration, you might want to use the LLVM optimizing compiler and optimize PNG files.

Wichtig ist es auch, die Beziehung zwischen dem Erstellen des Builds und Bereitstellen zu verstehen.It is also important to understand the relationship between building and deploying. Die Bereitstellungszeit richtet sich nach der Größe der Anwendung.The deployment time is a function of the application size. Eine größere Anwendung benötigt mehr Zeit zum Bereitstellen.A larger application takes a longer time to deploy. Durch Minimieren der App-Größe können Sie die Bereitstellungszeit verkürzen.By minimizing the app size, you can reduce the deployment time.

Durch Minimieren der App-Größe verkürzt sich auch die Buildzeit.Minimizing the app size can also reduce the build time. Das liegt daran, dass das Entfernen von Code aus der Anwendung weniger Zeit in Anspruch nimmt, als das native Kompilieren des Codes, der nicht verwendet werden soll.This is because removing code from the application takes less time than natively compiling the code that won't be used. Kleinere Objektdateien bedeuten eine schnellere Verknüpfung, wodurch eine kleinere ausführbare Datei mit weniger zu erzeugenden Symbolen erstellt wird.Smaller object files mean faster linking, which creates a smaller executable with fewer symbols to generate. Das Einsparen von Speicherplatz zahlt sich also doppelt aus, weshalb SDK verknüpfen der Standard für alle Gerätebuilds ist.Saving space, therefore, has a double payoff, which is why Link SDK is the default for all device builds.

Hinweis

Die Option SDK verknüpfen kann je nach verwendeter IDE als „Nur Framework-SDKs verknüpfen“ oder „Nur SDK-Assemblys verknüpfen“ angezeigt werden.The Link SDK option may appear as Link Framework SDKs Only or Link SDK assemblies only, depending on the IDE that is being used.

TippsTips

  • Build:Build:
    • Das Erstellen einer einzelnen Architektur (z. B. ARM64) erfolgt schneller als das einer FAT-Binärdatei (z. B. ARMv7 + ARM64).Building a single architecture (e.g. ARM64) is faster than a FAT binary (e.g. ARMv7 + ARM64)
    • Vermeiden Sie die Optimierung von PNG-Dateien beim Debuggen.Avoid optimizing PNG files when debugging
    • Erwägen Sie, alle Assemblys zu verknüpfen.Consider Linking all assemblies. Optimieren Sie jede Assembly.Optimize every assembly
    • Deaktivieren Sie die Erstellung von Debugsymbolen mit  --dsym=false.Disabling the creation of debug symbols by using --dsym=false. Sie sollten sich jedoch im Klaren sein, dass das Deaktivieren dieser Option bedeutet, dass Absturzberichte nur auf dem Computer, auf dem die Anwendung erstellt wurde, durch Symbole dargestellt werden können, und nur dann, wenn aus der Anwendung kein nicht verwendeter Code entfernt wurde.However, you should be aware that disabling this will mean that crash reports can only be symbolicated on that machine that built the app, and only if the app wasn't stripped.

Die folgenden Dinge sollten vermieden werden:Some things that should be avoided are:

  • FAT-Binärdateien (Debuggen)Fat Binaries (debug)
  • Deaktivieren des Linkers --nolinkDisable the linker --nolink
  • Deaktivieren der Entfernung von nicht verwendetem CodeDisabling stripping
    • Symbole --nosymbolstripSymbols --nosymbolstrip
    • IL (Release) --nostrip.IL (release) --nostrip.

Weitere TippsAdditional tips

  • Ziehen Sie wie beim Simulator das Erstellen dem Neuerstellen vor.As on the simulator, prefer Build over Rebuild
    • AOT kompilierte Assemblys (Objektdateien) werden zwischengespeichert.AOT'd assemblies (object files) are cached
  • Debugbuilds dauern wegen der Symbole länger, da dsymutil ausgeführt wird. Und weil sie letztendlich größer werden, dauert das Hochladen auf Geräte länger.Debug builds take longer because of symbols, running dsymutil and since it ends up being larger, extra time to upload to devices.
  • Releasebuilds wenden standardmäßig eine IL-Entfernung auf die Assemblys an.Release builds will, by default, do an IL strip of the assemblies. Das dauert nur kurze Zeit, die wahrscheinlich zurückgewonnen wird, weil eine kleinere App auf dem Gerät bereitgestellt wird.That takes only a bit of time and is likely gained back when deploying a smaller .app to the device.
  • Vermeiden Sie das Bereitstellen großer statischer Dateien bei jedem Build (Debug).Avoid deploying large static files on every build (debug)
    • Verwenden Sie „UIFileSharingEnabled“ (Info.plist).Use UIFileSharingEnabled (info.plist)
      • Objekte können einmal hochgeladen werden.Assets can be uploaded once
  • Verwenden Sie im Zweifelsfall das Flag --time --time, um Ihre Änderung zu messen.When in doubt, use the --time --time flag to measure your change

Der folgende Screenshot zeigt, wie Sie in Ihren iOS-Optionen diese Optionen für den Simulator festlegen:The screenshot below illustrates how to set these options for the simulator in your iOS options:

Festlegen der OptionenSetting the options

Verwenden des LinkersUsing the Linker

Beim Erstellen Ihrer Anwendung verwendet mtouch einen Linker für verwalteten Code, der Code entfernt, den die Anwendung nicht verwendet.When building your application, mtouch uses a linker for managed code, which removes code that the application is not using. Theoretisch ergeben sich dadurch kleinere und damit schnellere Builds.In theory, this provides smaller, and therefore quicker builds. Weitere Informationen zum Linker finden Sie in der Anleitung Verknüpfung unter iOS.For more information on the linker refer to the Linking on iOS guide.

Beachten Sie beim Verwenden des Linkers die folgenden Punkte:Consider the following options when using the Linker:

  • Die Auswahl von Nicht verknüpfen für einen Gerätebuild bringt einen höheren Zeitaufwand mit sich und erzeugt auch eine größere App.Selecting Don't Link for a Device build takes a greater amount of time, and also generates a larger app.
    • Apple lehnt Apps ab, die die Größenbeschränkung überschreiten.Apple will reject apps if they are larger than the size limit. Abhängig von MinimumOSVersion sind maximal 60 MB möglich.Dependent on the MinimumOSVersion, this can be as small as 60MB.
    • Der native ausführbare Datei wird dabei eingerechnet.The native executable is being included.
    • Bei Simulatorbuilds ist die Verwendung von „Nicht verknüpfen“ schneller, da die JIT-Kompilierung zum Einsatz kommt (im Gegensatz zu AOT auf einem Gerät).Using Don't link is faster for simulator builds because JIT compilation is used (as opposed to AOT on a device).
  • „SDK verknüpfen“ ist die Standardoption.Link SDK is the default option.
  • Das Verwenden von „Alle verknüpfen“ ist möglicherweise nicht sicher, insbesondere wenn Sie mit Code arbeiten, der nicht Ihr eigener ist, wie z.B. NuGet-Pakete oder Komponenten.Link All may not be safe to use, particularly if you using code that is not your own such a NuGets or Components. Wenn Sie sich dafür entscheiden, Assemblys nicht zu verknüpfen, wird der gesamte Code aus diesen Diensten in Ihre Anwendung eingebunden, wodurch möglicherweise größere Apps entstehen.If you choose not to link assemblies all the code from these services are included with your application, potentially creating bigger apps.
    • Wenn Sie jedoch Alle verknüpfen wählen, kann die Anwendung abstürzen, insbesondere wenn externe Komponenten verwendet werden.However, if you choose Link All the application can crash, particularly if external components are used. Der Grund dafür ist, dass einige Komponenten für bestimmte Typen Reflektion verwenden.This is due to some components using Reflection on certain types.
    • Statische Analyse und Reflektion funktionieren nicht zusammen.Static analysis and reflection do not work together.

Die Tools können angewiesen werden, Dinge innerhalb der Anwendung zu behalten, indem das [Preserve]-Attribut verwendet wird.The tools can be instructed to keep things inside the application by using the [Preserve] attribute.

Wenn Sie keinen Zugriff auf den Quellcode haben oder er von einem Tool generiert wird und Sie ihn nicht ändern möchten, können Sie ihn trotzdem verknüpfen, indem Sie eine XML-Datei erstellen, die alle Typen und Member beschreibt, die erhalten bleiben müssen.If you do not have access to the source code, or it is generated by a tool and you do not want to change it, it can still be linked by creating an XML file that describes all the types and members that need to be preserved. Sie können dann das Flag --xml={file.name}.xml Ihren Projektoptionen hinzufügen, wodurch Code genau so verarbeitet wird, als ob Sie Attribute verwenden würden.You can then add the flag --xml={file.name}.xml to your project options, which processed code exactly as though you were using Attributes.

Teilweises Verknüpfen von AnwendungenPartially Linking Applications

Es ist auch möglich, Anwendungen teilweise zu verknüpfen, um die Buildzeit Ihrer Anwendung zu optimieren:It is also possible to partially link applications, to help optimize the build time of your application:

  • Verwenden Sie Link All, und überspringen Sie einige Assemblys.Use Link All and skip some assemblies

    • Die Optimierung der Anwendungsgröße geht teilweise verloren.Some of the application size optimization is lost.
    • Es ist kein Zugriff auf den Quellcode erforderlich.No access to the source code is required.
    • Beispiel: --linkall --linkskip=fieldserviceiOS.For example --linkall --linkskip=fieldserviceiOS .
  • Verwenden Sie die Option Link SDK und das Attribut [LinkerSafe] für die benötigten Assemblys.Use Link SDK option and use the [LinkerSafe] attribute on the assemblies you need

    • Zugriff auf den Quellcode ist erforderlich.Access to the source code required.
    • Teilt dem System mit, dass die Assembly sicher zu verknüpfen ist und wie ein Xamarin SDK verarbeitet wird.Tells the system that the assembly is safe to link, and is processed as though it was a Xamarin SDK.

Objective-C-BindungenObjective-C Bindings

  • Durch Verwenden des [Assembly: LinkerSafe]-Attributs für Ihre Bindungen können Sie Zeit sparen und die Größe reduzieren.Using the [Assembly: LinkerSafe] attribute on your bindings can save time and size.

  • SmartLinkSmartLink

    • Erfolgt auf nativer Seite.Done on Native side
    • Verwenden Sie das Attribut [LinkWith (SmartLink=true)].Use the [LinkWith (SmartLink=true)] attribute
    • Dies hilft dem nativen Linker, nativen Code aus der Bibliothek zu entfernen, mit der Sie eine Verknüpfung herstellen.This helps the native linker to eliminate native code from the library you are linking against.
    • Beachten Sie, dass die dynamische Suche nach Symbolen in diesem Fall nicht funktioniert.Note that dynamic lookup of symbols will not work with this.

ZusammenfassungSummary

In dieser Anleitung wurde untersucht, wie eine iOS-Anwendung zeitlich gesteuert werden kann und welche Optionen zu berücksichtigen sind, die von der Buildkonfiguration und den Optionen des Projekts abhängen.This guide explored how to time an iOS application and options to consider that are dependent on the project's build configuration and options.