空行而不是MSBuild中的任务控制台输出

时间:2015-10-08 11:19:28

标签: delphi msbuild delphi-xe3 dcc32

我的产品正在从Delphi 6迁移到更新的Delphi XE3。 Delphi 6编译器用于输出编译为可执行文件的文件列表:

Borland Delphi Version 14.0
Copyright (c) 1983,2002 Borland Software Corporation

ProjectName.dpr(X) 
...
PathToSomeUnit.pas(X) 
...
PathToSomeIncludedFile.inc(X)     
...
X lines, X.XX seconds, X bytes code, X bytes data.

其中" X"意味着一些数字

我们有一个内部软件,用于分析应用程序和特定文件之间的依赖关系 - 单元和包含的文件。该软件使用dcc32控制台输出(如上所述)作为输入。

使用新的Delphi XE3,我们不再直接调用dcc32,但我们使用MSBuild。不幸的是,控制台输出与Delphi 6不一样。当"安静编译"选项被禁用,控制台输出有多个空行代替已编译的文件列表。

Embarcadero Delphi for Win32 compiler version 24.0
Copyright (c) 1983,2012 Embarcadero Technologies, Inc.

[multiple blank lines]

X lines, X.X seconds, X bytes code, X bytes data. (TaskId:65) 

使用/ verbosity:diagnostic参数,如下所示

Embarcadero Delphi for Win32 compiler version 24.0 (TaskId:65)
Copyright (c) 1983,2012 Embarcadero Technologies, Inc. (TaskId:65)
(TaskId:65)
(TaskId:65)
(TaskId:65)
(TaskId:65)
(TaskId:65)
(TaskId:65)
...
X lines, X.X seconds, X bytes code, X bytes data. (TaskId:65)

直接调用dcc32时,出现了类似的问题,但是它已经通过" -B"编译器开关(-B =构建所有单元)。 我通过添加/ p:DCC_AdditionalSwitches = -B尝试了与MSBuild类似的方法,但仍然输出多个空行。

2 个答案:

答案 0 :(得分:3)

这是一个可能的解决方案:

  1. 备份文件等
  2. 打开.NET Framework SDK v2.0命令提示符。
  3. 反汇编Borland.Build.Tasks.Delphi.dll(位于$(BDS)\bin目录中):

    ildasm Borland.Build.Tasks.Delphi.dll /out=Borland.Build.Tasks.Delphi.il

  4. 修改Borland.Build.Tasks.Delphi.dcctask.xml(由上一步创建)并注释掉Ignore节点的OutputParsing子节点。

  5. 重新组装:

    ilasm Borland.Build.Tasks.Delphi.il /dll

  6. 为其注册强名称例外:

    sn -Vr Borland.Build.Tasks.Delphi.dll

  7. 如果您按照this answer中所述关闭了安静模式,那么使用MSBuild构建Delphi项目现在应该显示详细的编译器输出。

答案 1 :(得分:2)

- 依赖添加到DCC32命令行或 / p:DCC_OutputDependencies = true  对于msbuild,它将输出一个可以轻松解析的 .d 文件,如下例所示:

C:\publico\BUILD\temp\YourDPR.exe: YourDPR.dpr \
        C:\blabla blabla\FrameWork\Base\biblioteca\dcus\unit15.dcu \
        C:\blabla blabla\FrameWork\Base\biblioteca\dcus\unit13.dcu \
        C:\bla bla\bla\LIBD5\Units\unit12.dcu \
        C:\blabla blabla\FrameWork\Base\biblioteca\rxlib\units\unit1.dcu \
        C:\blabla blabla\FrameWork\Base\biblioteca\rxlib\units\unit13.dcu \
        C:\bla bla\bla\LIBD5\Units\unit1.dcu \
        C:\bla bla\bla\LIBD5\Units\unit12.dcu \

聚苯乙烯。您可以使用 / p隐藏那些空白的msbuild行:DCC_Hints = false;