`candle`命令行上的`-arch`参数究竟是什么?

eh9*_*eh9 8 wix

我在WiX 3.7版中设置了32位和64位版本.在充分解释这一问题时,WiX文档存在缺陷.在文档中Package/@Platform,它说"不鼓励使用此属性;而是在candle.exe命令行指定-arch开关",但是没有解释这个参数实际上做了什么(至少没有我能找到的) .编译器"文档"完全值得"文档"这个词的空气引用,因为它基本上是一个存根(例如,与链接器文档不同).对于历史记录,这里完全是编译器文档:

Candle.exe公开了Windows Installer XML编译器.Candle负责根据WiX架构wix.xsd将输入的.wxs文件预处理为有效的格式良好的XML文档.然后,将每个经过后处理的源文件编译为.wixobj文件.

编译过程相对简单.WiX架构适用于简单的递归下降解析器.编译器依次处理每个元素,创建新符号,计算必要的引用并生成.wixobj文件的原始数据.

命令行帮助提供了一点,但还不够.

-arch      set architecture defaults for package, components, etc.
           values: x86, x64, or ia64 (default: x86)
Run Code Online (Sandbox Code Playgroud)

在一个相关的问题,在WiX 3.0中的平台识别,有一个答案,提示可能会发生什么,但这是不够的,我不知道它是否准确.

  • -arch参数是否与设置Package/@Platform属性具有相同的效果,还是更多?
  • 参数是否影响预处理器中可用的任何内容?特别是,它是否设置了PLATFORM预处理器变量?它还有其他什么吗?
  • 什么是架构"默认"?显式Package/@Platform属性是否覆盖命令行?或相反亦然?或者(更好的是)如果存在不一致的平台声明,是否会出错?

其中一些问题的答案似乎应该是显而易见的,事实上我只是写了一些问题.但我想要一个明确的答案,最好(提示)指向candle命令行的更新和准确的文档页面的链接.我确实希望在任何人回答的时候已经解决了这个问题,但是,我会尽快拯救其他人,因为我会花时间来解决这个问题.


另一个相关问题,WIX:是否真的弃用了Package元素的Platform属性?,讨论Package/@Platform属性,但不解决命令行参数.
关于该PLATFORM预处理器变量.现在显然BUILDARCH,尽管你很难从文档中了解它.

warning CNDL1034 : The built-in preprocessor variable '$(sys.PLATFORM)' is 
deprecated. Please correct your authoring to use the new '$(sys.BUILDARCH)' 
preprocessor variable instead.
Run Code Online (Sandbox Code Playgroud)

eh9*_*eh9 9

以下代码片段启用32位和64位版本之间的编译时配置,而不引入表示平台的用户变量,而是使用系统提供的用户变量.两个定义的变量都是普通安装的通用变量.64位系统的最低版本更高.基本程序文件目录在32位和64位版本之间有所不同.

<?if $(sys.BUILDARCH)="x86"?>
    <?define Minimum_Version="100"?>
    <?define Program_Files="ProgramFilesFolder"?>
<?elseif $(sys.BUILDARCH)="x64"?>
    <?define Minimum_Version="200"?>
    <?define Program_Files="ProgramFiles64Folder"?>
<?else?>
    <?error Unsupported value of sys.BUILDARCH=$(sys.BUILDARCH)?>
<?endif?>
Run Code Online (Sandbox Code Playgroud)


稍后在WiX源中使用这些定义.

<Package [...]
    InstallerVersion="$(var.Minimum_Version)"
/>

<Directory Id="$(var.Program_Files)">
    [...]
</Directory>
Run Code Online (Sandbox Code Playgroud)


eh9*_*eh9 3

部分答案:

  • -arch参数确实设置了sys.BUILDARCH变量以及变量sys.PLATFORM
  • 参数-arch默默地覆盖属性Package/@Platform。至少看起来是这样,如果看sys.BUILDARCH就足够了。
    • 因此命令行帮助是错误的。这是覆盖,而不是默认。