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

时间:2013-05-15 15:16:43

标签: wix

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

  

candle.exe公开了Windows Installer XML编译器。蜡烛是   负责将输入.wxs文件预处理为有效   针对WiX架构的格式良好的XML文档,wix.xsd。然后,每个   经过后处理的源文件被编译成.wixobj文件。

     

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

命令行帮助提供了一些,但还不够。

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

在一个相关的问题Platform identification in WiX 3.0中,有one answer with a sliver of hint关于可能发生的事情,但这还不够,我不知道它是否准确。

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

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

<小时/> 另一个相关问题WIX: is the Platform attribute of the Package element truly deprecated?讨论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.

3 个答案:

答案 0 :(得分: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?>

<小时/> 稍后在WiX源中使用这些定义。

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

<Directory Id="$(var.Program_Files)">
    [...]
</Directory>

答案 1 :(得分:2)

部分答案:

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

答案 2 :(得分:0)

除了定义MSI的体系结构(Package / @ Platform)之外,它还为MSI(WiX中的Win64)中的msidbComponentAttributes64bit属性设置了默认组件表值。

IE。如果sys.BUILDARCH = x86则设置,如果是x64则 设置(+256)。 这是WIX.chm中提到的,只是重新迭代MSI.chm有关上述属性

  

将此属性设置为“yes”以将其标记为64位   零件。此属性有助于安装包   包括32位和64位组件。如果这个位不是   set,组件注册为32位组件。**如果是   64位组件替换32位组件,设置此位并分配   Guid属性中的新GUID。

(所以不告诉你):当你想使用BUILDARCH时,你只需要创建Win64 WiX属性来覆盖默认值,这对于从同一个WiX代码构建不同的arch MSI很有帮助。在此之前,我在每个组件上为Win64属性使用了一个环境变量。