MSBuild; Ausdruck auswerten für jede Datei

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Spiele Programmierer
Establishment
Beiträge: 426
Registriert: 23.01.2013, 15:55

MSBuild; Ausdruck auswerten für jede Datei

Beitrag von Spiele Programmierer »

Heute ist es mir wieder passiert: Zwei Dateien mit gleichen Namen im gleichen Projekt, aber in unterschiedlichen Ordnern und VS versagt kommentarlos ohne Warnung beim linken völlig. Die Fehlersuche hat für einen derartigen Fehler wieder viel zu viel Zeit in Anspruch genommen. Dann wollte ich VS am besten gleich so konfigurieren, dass das nie mehr passieren kann und die Objektdateien ja nach Unterpfad andere Namen bekommen. Ich habe es zwar sogar geschafft mit Property Functions einen MSBuild Ausdruck zu schreiben, der mir die Datei eindeutig benennt, jedoch funktioniert dieser nur dann, wenn man ihn direkt in die Properties der Datei einträgt. Gebe ich den Ausdruck allerdings für das gesamte Projekt oder in mein Projektübergreifendes Property Sheet ein, wird der Ausdruck scheinbar nur einmal zugewiesen und das "%(FullPath)" nicht richtig aufgelöst. Am Ende entsteht dann eine Objektdatei mit dem Namen "%(FullPath)" im Objektdateiverzeichnis, was nicht ganz der Sinn der Sache ist. Meine Frage ist jetzt: Wie bekomme ich den Objektdateinamen projektweit geändert geändert, so das der Ausdruck "%(FullPath)" richtig aufgelöst wird?

Der MSBuild-Ausdruck sieht im Moment im Property Sheet so aus:

Code: Alles auswählen

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  [...]
  <ItemDefinitionGroup>
    <ClCompile>
      [...]
      <ObjectFileName>$(IntDir)$([MSBuild]::MakeRelative($([System.IO.Path]::GetFullPath("$(ProjectDir)\..\..\..\Source\$(ProjectName)")), %(FullPath)).Replace("\","__").Replace("/","__")).obj</ObjectFileName>
    </ClCompile>
    [...]
  </ItemDefinitionGroup>
</Project>
Benutzeravatar
Krishty
Establishment
Beiträge: 8351
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: MSBuild; Ausdruck auswerten für jede Datei

Beitrag von Krishty »

Properties -> C/C++ -> Output Files -> Object File Name: $(IntDir)\%(Directory)

Dann können die Dateien den selben Namen haben, aber weil sie in unterschiedlichen Unterverzeichnissen landen überschreiben sie sich nicht mehr gegenseitig und das Linken klappt. (Wir hatten das vor einem Jahr auf so auf der Arbeit gelöst.)

Du könntest auch %(RelativeDir) benutzen, aber falls deine Quelldateien in der Projektstruktur *über* der Projektdatei liegen, verpesten dir die temporären Dateien in diesem Fall die halbe Festplatte.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Spiele Programmierer
Establishment
Beiträge: 426
Registriert: 23.01.2013, 15:55

Re: MSBuild; Ausdruck auswerten für jede Datei

Beitrag von Spiele Programmierer »

Aha interessant. Der Ausdruck wird aufgelöst, auch wenn ich es projektweit so einstelle.
Vielleicht machte ich es dann sogar erstmal so. Allerdings wäre es mir eigentlich schon lieber wenn es eine Möglichkeit gäbe, eine Methode wie die meine zur Dateibenamung die auch relativ arbeitet, Projektweit zum Laufen zu bekommen. So ein verflucht unübersichtliches Ordnerchaos mit absoluten Pfaden mag ich eigentlich nicht so gerne. Nichtmal im Objektdateiordner. "D:\Eigenes\Programmierung\Programme\LibrarySet\Source\Diverse\Extern\PugiXml\pugixml.cpp" würde mit dem Property Functions zu "Extern__PugiXml__PugiXml.cpp.obj" zerfallen, das wäre irgendwie übersichtlicher.

Ja sie liegen "darüber". Sogar 3 Ordnerebenen. :!:
Antworten