Was wird compiliert und gelinkt?



  • Hallo zusammen,

    da ich in meinen Programmen OpenSource verwende, muß ich dies ja bei der Installation mit Version und entsprechender Lizenz nennen (momentan in einer Textdatei geplant).
    Da die entsprechenden Informationen meistens schon irgendwie im Quelltext stehen, habe ich mir gedacht, daß ich einfach alle Dateien durch einen entsprechenden Parser schiebe und anschließend meine Textdatei mit allen verwendeten OpenSource Informationen heraus kommt.
    Der Parser sollte nicht das große Problem sein, allerdings wie bekomme ich automatisch heraus welche Dateien kompiliert und gelinkt werden?

    Ich hoffe es ist soweit verständlich was ich meine.
    Bin natürlich auch für weitere Ansätze offen.
    Was ich nur nicht möchte ist, das ganze in irgendeiner weise von Hand zu pflegen.
    Arbeite momentan mit XE3.

    MfG Stephan



  • Delphi und C++Builder verwenden MSBuild, also könntest du analog hierzu vorgehen, um alle Quelldateien zu enumerieren. Alternativ kannst du das XML in den Projektdateien selbst parsen und auswerten.

    Von den Quelldateien aus kommst du mit Hilfe des Präprozessors an die eingebundenen Headerdateien. Für jede Quelltextdatei rufst du CPP32 auf, gibst den Include-Pfad mit und übergibst die Parameter -Ss -Sg -Sx . Dann schreibt der Präprozessor dir eine .i Datei mit einer hierarchischen Auflistung der eingebundenen Headerdateien:

    /*
    File: omfcsfix.cpp Total lines compiled: 2693
      E:\Programme\Fulcrum\include\windows\crtl\cstdio: included:1, lines:31\1009 NOGUARD
        E:\Programme\Fulcrum\include\windows\crtl\stdio.h: included:1, lines:650\979 NOGUARD
          E:\Programme\Fulcrum\include\windows\crtl\_stddef.h: included:4, lines:166\305 NOGUARD
            E:\Programme\Fulcrum\include\windows\crtl\_defs.h: included:1, lines:114\114 FASTGUARD(40,112)
            E:\Programme\Fulcrum\include\windows\crtl\_null.h: included:1, lines:27\27 FASTGUARD(18,24)
          E:\Programme\Fulcrum\include\windows\crtl\_nfile.h: included:1, lines:26\26 FASTGUARD(18,24)
      E:\Programme\Fulcrum\include\windows\crtl\cstdlib: included:1, lines:20\1480 NOGUARD
        E:\Programme\Fulcrum\include\windows\crtl\stdlib.h: included:1, lines:708\1461 NOGUARD
          E:\Programme\Fulcrum\include\windows\crtl\_stddef.h: included:4, lines:166\305 NOGUARD
          E:\Programme\Fulcrum\include\windows\crtl\search.h: included:1, lines:91\256 NOGUARD
            E:\Programme\Fulcrum\include\windows\crtl\_stddef.h: included:4, lines:166\305 NOGUARD
          E:\Programme\Fulcrum\include\windows\crtl\errno.h: included:1, lines:169\334 NOGUARD
            E:\Programme\Fulcrum\include\windows\crtl\_stddef.h: included:4, lines:166\305 NOGUARD
    
    */
    

    Von diesen schließt du alle diejenigen aus, die im C++Builder-Installationsverzeichnis liegen, die restlichen läßt du durch deinen Parser laufen.

    Was Delphi-Komponenten angeht, so verfügt der Delphi-Compiler über die Fähigkeit, Metadaten zum Quelltext in eine XML-Datei auszugeben. Dazu rufst du DCC32 mit der Option --doc auf. Für jede .pas-Datei bekommst du dann sowas wie einen XML-Dump der Symboltabelle, aber für eine .dpr- oder .dpk-Datei bekommst du eine nette Liste der eingebundenen Units:

    <?xml version="1.0" encoding="utf-8"?>
    <namespace name="DelphiRegexTest">
      <contains name="RegularExpressionsConsts" />
      <contains name="ComStrs" />
      <contains name="SysConst" />
      <contains name="RTLConsts" />
      <contains name="Consts" />
      <contains name="TpcShrd" />
      ...
      <contains name="MainUnit" />
      <contains name="Forms" />
      <contains name="SysInit" />
      <contains name="System" />
    </namespace>
    

    Die mußt du dann eben im Suchpfad finden und durch deinen Parser laufenlassen.

    [OT: Auch BCC32 kann übrigens die Symboltabelle in XML dumpen. Die ganze Sache ist für DCC und BCC hier, hier und hier dokumentiert; zusätzlich zu den dort beschriebenen Optionen 'f' (skip base type members), 'm' (emit macros) und 'p' (emit position information gibt es bei BCC noch folgende undokumentierte Optionen: 'r' (emit references), 'a' (emit compiler internals).]



  • @audacia
    Das hört sich interessant an, jedoch dies ist vermutlich nicht in ein paar Stunden erledigt 😉
    Werde mir das ganze mal in Ruhe zu Gemüte führen.

    Vielen Dank.
    MfG Stephan



  • Stephan schrieb:

    Das hört sich interessant an, jedoch dies ist vermutlich nicht in ein paar Stunden erledigt 😉

    Nein, in der Tat nicht, und an deiner Stelle würde ich das auch von Hand erledigen, wenn das Projekt nicht übergroß ist und einen völlig undurchblickbaren Wald von Open-Source-Abhängigkeiten hat. Aber Handarbeit hattest du ja ausgeschlossen 🙂


Log in to reply