Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   MSBuild für mehrere Targets mit unterschiedlichen Defines (https://www.delphipraxis.net/208364-msbuild-fuer-mehrere-targets-mit-unterschiedlichen-defines.html)

casiosmu 20. Jul 2021 10:52

MSBuild für mehrere Targets mit unterschiedlichen Defines
 
Hallo,

ich teste gerade automatische Builds.
Dazu habe ich folgende Batch-Datei:
Code:
REM ### Aufruf: buildRelease.bat "PathOfDProjFile" "OutputPathOfBinary" [Release|Debug]
call "C:\Program Files (x86)\Embarcadero\Studio\19.0\bin\rsvars.bat"
msbuild "%1" /p:config=%3 /p:DCC_ExeOutput="%2"
In meiner Test-Projektdatei sind folgende 2 Build-Konfigurationen mit jeweils eigenen Defines/Bedingungen vorhanden:
- Debug: <DCC_Define>ISDEBUG;$(DCC_Define)</DCC_Define>
- Release: <DCC_Define>ISRELEASE;$(DCC_Define)</DCC_Define>

Im Code gebe ich zum Testen einfach unterschiedliche Texte aus mit {$IFDEF ISDEBUG} und {$IFDEF ISRELEASE}.

Wenn ich über Delphi kompiliere, passt auch alles wunderbar.
Wenn ich allerdings über das Script kompiliere, werden nur die Defines des in der Projektdatei gerade als 'aktiv' gesetzten Targets gesetzt, und nicht die des per /p:config gewählten.
D.h. wenn ich das Projekt in der IDE zuletzt als Debug erzeugt habe, wird bei kompilieren per msbuild anschließend immer ISDEBUG gesetzt, egal ob das Script mit Debug oder Release als Argument aufgerufen wurde.

Die restlichen Projekteinstellungen (Kompileroptionen,Pre-/Postbuild,..) werden korrekt von dem in /p:config gesetzten genommen.

In einem anderen Thread habe ich gesehen, dass man bei msbuild Defines mit /p: DCC_Define=... setzen/überschreiben kann. Ich würde allerdings bevorzugen, dass die bereits in der Projektdatei hinterlegten benutzt werden! (sonst muss ich ja alles doppelt hinterlegen...)

Wie kriege ich es also hin, dass msbuild auch die korrekten Defines aus dem Projekt nimmt?

Gruß,
Sebastian

generic 20. Jul 2021 13:07

AW: MSBuild für mehrere Targets mit unterschiedlichen Defines
 
Bin gerade zwischen Tür und Angeln und um das auszuprobieren fehlt gerade die Zeit.

Probier das mal mit CaseSensitive.

Also "Config=Release" oder "Config=Debug" bzw. "PLATFORM=Win32"

Uwe Raabe 20. Jul 2021 13:24

AW: MSBuild für mehrere Targets mit unterschiedlichen Defines
 
Hier funktioniert es, wenn man die jeweilige Konfiguration in Anführungszeichen setzt:
Code:
/p:config="Release"

uligerhardt 20. Jul 2021 13:27

AW: MSBuild für mehrere Targets mit unterschiedlichen Defines
 
Kann auch sein dass du p:Configuration brauchst. (Je nach Delphi-Version und/oder ob du ein DProj oder GroupProj kompilierst.)

himitsu 20. Jul 2021 13:54

AW: MSBuild für mehrere Targets mit unterschiedlichen Defines
 
Die " sind nur nötig, wenn z.B. Leerzeichen enthalten sind.

Aber das CaseSensitiv ist hier wohl das Entscheidende.



Und falls sonst nichts hilft, dann
schau mal nach allen <DCC_Define> und den <PropertyGroup Condition=...> drumrum.

Gibt es da noch etwas Anderes, was nach dem Gewünschten das nochmal überschreibt?



Ob Config oder Configuration siehst auch in der *PROJ
Zitat:

<PropertyGroup Condition="'$(Config)'=='Release'

casiosmu 20. Jul 2021 17:34

AW: MSBuild für mehrere Targets mit unterschiedlichen Defines
 
Ok, CaseSensitiv habe ich beachtet, Leerzeichen gibt es keine.

p:Configuration werde ich bei nächster Gelegenheit mal probieren (verwende eine dproj, Delphi 10.2).

Delphi erzeugt in der .dproj-Datei irgendwie automatisch 'Cfg_X'-Aliase (hier gekürzt):
Code:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <ProjectGuid>...</ProjectGuid>
        <MainSource>...</MainSource>
        <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
        <Base>True</Base>
        <Config Condition="'$(Config)'==''">Debug</Config>
        <Platform Condition="'$(Platform)'==''">Win64</Platform>
        <TargetedPlatforms>3</TargetedPlatforms>
        <AppType>Application</AppType>
    </PropertyGroup>
    <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
        <Base>true</Base>
    </PropertyGroup>
    <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''">
        <Base_Win32>true</Base_Win32>
        <CfgParent>Base</CfgParent>
        <Base>true</Base>
    </PropertyGroup>
    <PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Base)'=='true') or '$(Base_Win64)'!=''">
        <Base_Win64>true</Base_Win64>
        <CfgParent>Base</CfgParent>
        <Base>true</Base>
    </PropertyGroup>
    <PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_1)'!=''">
        <Cfg_1>true</Cfg_1>
        <CfgParent>Base</CfgParent>
        <Base>true</Base>
    </PropertyGroup>
    <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win32)'!=''">
        <Cfg_1_Win32>true</Cfg_1_Win32>
        <CfgParent>Cfg_1</CfgParent>
        <Cfg_1>true</Cfg_1>
        <Base>true</Base>
    </PropertyGroup>
    <PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win64)'!=''">
        <Cfg_1_Win64>true</Cfg_1_Win64>
        <CfgParent>Cfg_1</CfgParent>
        <Cfg_1>true</Cfg_1>
        <Base>true</Base>
    </PropertyGroup>
    <PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_2)'!=''">
        <Cfg_2>true</Cfg_2>
        <CfgParent>Base</CfgParent>
        <Base>true</Base>
    </PropertyGroup>
    <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_2)'=='true') or '$(Cfg_2_Win32)'!=''">
        <Cfg_2_Win32>true</Cfg_2_Win32>
        <CfgParent>Cfg_2</CfgParent>
        <Cfg_2>true</Cfg_2>
        <Base>true</Base>
    </PropertyGroup>
    <PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Cfg_2)'=='true') or '$(Cfg_2_Win64)'!=''">
        <Cfg_2_Win64>true</Cfg_2_Win64>
        <CfgParent>Cfg_2</CfgParent>
        <Cfg_2>true</Cfg_2>
        <Base>true</Base>
    </PropertyGroup>

    <PropertyGroup Condition="'$(Base)'!=''">
        <DCC_Define>_WINDOWS_;$(DCC_Define)</DCC_Define>
    </PropertyGroup>
    <PropertyGroup Condition="'$(Cfg_1)'!=''">
        <DCC_Define>RELEASE;$(DCC_Define)</DCC_Define>
    </PropertyGroup>
    <PropertyGroup Condition="'$(Cfg_2)'!=''">
        <DCC_Define>DEBUG;$(DCC_Define)</DCC_Define>
    </PropertyGroup>
</Project>

himitsu 20. Jul 2021 23:09

AW: MSBuild für mehrere Targets mit unterschiedlichen Defines
 
Cfg_X sind keine Aliase.

Das sind einfch "Variablen", welche vorher gesetzt wurden,
wie z.B.
SQL-Code:
<Cfg_1>true</Cfg_1>

und dann nachfolgend
SQL-Code:
<PropertyGroup Condition="'... or '$(Cfg_1)'!='true'">




Cfg_1 und Cfg_2 sind "standardmäßig" die Configs "Release" und "Debug",
aber merke dir nicht was was ist, da Delphi das schon öfters mal getauscht hat (was zuerst angelegt wurde).

Das sind quasi die internen "durchnummeierten" Konfigurationen von der Projektverwaltung.

Die Parameter wie "Config" und "Platform" werden genommen, um eine der "Konfigurationen" auszuwählen,
dann wird damit Konfiguration und deren übergeordnete "Parent"-Konfigurationen "aktiviert", also deren Variablen z.B. auf True gesetzt,
um anschließend mit diesen Variablen die eigentlichen Settings und Aktionen zu laden.

dummzeuch 21. Jul 2021 10:52

AW: MSBuild für mehrere Targets mit unterschiedlichen Defines
 
Zitat:

Zitat von casiosmu (Beitrag 1492577)
p:Configuration werde ich bei nächster Gelegenheit mal probieren (verwende eine dproj, Delphi 10.2).

p:Configuration war nur bei Delhpi 2007. Alle neueren Versionen verwenden p:Config.

himitsu 21. Jul 2021 11:00

AW: MSBuild für mehrere Targets mit unterschiedlichen Defines
 
Bei 2006 nicht? (erstes Win32-Delphi mit der neuen IDE)

dummzeuch 21. Jul 2021 11:27

AW: MSBuild für mehrere Targets mit unterschiedlichen Defines
 
Zitat:

Zitat von himitsu (Beitrag 1492622)
Bei 2006 nicht? (erstes Win32-Delphi mit der neuen IDE)

Das erste Win32 Delphi mit der neuen IDE war Delphi 2005. Aber Delphi 2005 und 2006 verwendeten noch nicht msbuild und .dproj-Dateien sondern .bdsproj-Dateien in einem anderen Format.

Siehe Delphi Wiki


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:09 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz