What's new in MakePRI.exe configuration
This topic describes configuration changes for the MakePRI.exe tool to support the resource pack generation pipeline for Windows 8.1 and later.
- majorVersion attribute
- Schema for majorVersion
- Example for majorVersion
- Deprecating /vma message
- targetOsVersion attribute
- Schema for targetOsVersion
- Example for targetOsVersion
- Internal PRI version
- targetOsVersion in dump file
- File compatibility
- isDeploymentMergeable attribute
- Schema for isDeploymentMergeable
- Example for isDeploymentMergeable
- isDeploymentMergeable in dump file
- Packaging node
- Example of AutoResourcePackage along a specific dimension
- Example of manual ResourcePackage
- Nongoals of packaging node
- Parsing the packaging node
- Handling candidates (found in the index) with multi-qualifier-sets
- Default configuration file
majorVersion attribute
The /vma flag is deprecated for Windows 8.1 and later. Instead, provide the major version number through configuration of the PRI file. If you provide a version value in both the /vma flag and the config file, MakePRI.exe gives preference to the value read from the config file. The major version defaults to 1 if none is provided.
Schema for majorVersion
This is the schema for majorVersion:
<xs:element name="resources">
<xs:complexType>
<xs:sequence>
...
...
...
</xs:sequence>
<xs:attribute name="majorVersion" type="xs:positiveInteger" use="optional" />
</xs:complexType>
</xs:element>
Example for majorVersion
This example shows how to use majorVersion:
<resources majorVersion="2">
<index root="\" startIndexAt="\">
...
...
</index>
</resources>
Deprecating /vma message
MakePRI.exe shows this message if the /vma flag is used:
'/VersionMajor(vma) flag has been deprecated. Please specify major version in
the configuration file using 'majorVersion' attribute on 'resources' node.
For more information, refer to <msdn link>
The help text for the /vma flag is tagged with this "deprecated" string:
/VersionMajor(vma): <INTEGER> [Deprecated] Major version number for index, default is 1
targetOsVersion attribute
The format of the PRI XML configuration file is changed in Windows 8.1 and later to support various optimizations. To support building PRI files that are compatible with Windows 8, the targetOsVersion optional attribute is added to the 'resources' node to indicate the target operating system version. By default, MakePRI.exe will generate the latest file format.
Schema for targetOsVersion
This is the schema for targetOsVersion:
<xs:element name="resources">
<xs:complexType>
<xs:sequence>
...
...
...
</xs:sequence>
<xs:attribute name="targetOsVersion" type="xs:string" use="optional" />
</xs:complexType>
</xs:element>
These values are supported:
Target | Description |
---|---|
Windows 8 |
6.2.1 |
Windows 8.1 |
6.3.0 |
Here are error strings for particular scenarios:
Scenario | Error string |
---|---|
A targetOsVersion other than "6.2.1" or "6.3.0" is specified | Invalid Configuration: Invalid targetOsVersion specified. |
'packaging' node is specified with "6.2.1" | Invalid Configuration: 'Packaging' node is not supported with this targetOsVersion. |
Example for targetOsVersion
This example shows how to use targetOsVersion:
<resources targetOsVersion="6.2.1">
<index root="\" startIndexAt="\">
...
...
</index>
</resources>
Internal PRI version
The targetOsVersion value internally maps to an MRM number that is referenced in file MrmFiles.h:
targetOsVersion value | Target | MRM number |
---|---|---|
6.2.1 | Windows 8 | mrmfile0 |
6.3.0 | Windows 8.1 | mrmfile1 |
targetOsVersion in dump file
MakePRI.exe adds the targetOsVersion value to the detailed dump file:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<PriInfo>
<PriHeader>
<TargetOS version="6.2.1"/>
<WindowsEnvironment version="1.3" checksum="701192710"/>
<AutoMerge>false</AutoMerge>
</PriHeader>
...
...
</PriInfo>
File compatibility
Windows 8.1 supports Windows 8 PRI files. But, if you try to use a Windows 8.1 PRI file on a Windows 8 computer, you receive a failure because the file format is different.
isDeploymentMergeable attribute
The isDeploymentMergeable attribute will cause MakePRI.exe to set a flag in the PRI file that causes:
- Deployment merge to identify that this PRI file can merge.
- GetFullyQualifiedReference to return an error in case this flag is set and the resource manager has been initialized with a file.
The default value of this attribute is TRUE. MakePRI.exe only sets the flag in PRI if you target Windows 8.1. If you supply this attribute with a config that targets Windows 8, MakePRI.exe ignores it with no error or warning.
We recommend that you set isDeploymentMergeable for ResourcePack creation in Windows 8.1 and later.
Schema for isDeploymentMergeable
This is the schema for isDeploymentMergeable:
<xs:element name="resources">
<xs:complexType>
<xs:sequence>
...
...
...
</xs:sequence>
<xs:attribute name="isDeploymentMergeable" type="xs:boolean " use="optional" />
</xs:complexType>
</xs:element>
Example for isDeploymentMergeable
This example shows how to use isDeploymentMergeable:
<resources targetOsVersion="6.2.1", isDeploymentMergeable="true">
<index root="\" startIndexAt="\">
...
...
</index>
</resources>
isDeploymentMergeable in dump file
MakePRI.exe adds the isDeploymentMergeable value to the detailed dump file:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<PriInfo>
<PriHeader>
<TargetOS version="6.2.1"/>
<WindowsEnvironment version="1.2" checksum="701192710"/>
<AutoMerge>false</AutoMerge>
<IsDeploymentMergeable>false</IsDeploymentMergeable>
</PriHeader>
...
...
</PriInfo>
Packaging node
The PRI XML configuration file supports a new 'packaging' node that defines PRI split information. The schema for the 'packaging' node is defined for both automatic (support for AutoResourcePackage along a specific dimension) and manual configuration:
<xs:element name="packaging" maxOccurs="1" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="autoResourcePackage" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:attribute name="qualifier" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
<xs:element name="resourcePackage" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="qualifierSet" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:attribute name="definition" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
Example of AutoResourcePackage along a specific dimension
This example shows how to use "AutoResourcePackage along a specific dimension":
<packaging>
<autoResourcePackage qualifier="Language"/>
<autoResourcePackage qualifier="Scale"/>
<autoResourcePackage qualifier="DXFeatureLevel"/>
</packaging>
Example of manual ResourcePackage
This example shows how to use "manual ResourcePackage":
<packaging>
<resourcePackage name="Germany">
<qualifierSet definition="lang-de-de"/>
<qualifierSet definition="lang-es-es"/>
</resourcePackage>
<resourcePackage name="France">
<qualifierSet definition="lang-fr-fr"/>
</resourcePackage>
<resourcePackage name="HighRes1">
<qualifierSet definition="scale-140"/>
</resourcePackage>
<resourcePackage name="HighRes2">
<qualifierSet definition="scale-180"/>
</resourcePackage>
</packaging>
Nongoals of packaging node
MakePRI.exe doesn't explicitly block generation of resource PRI files along any specific dimension. Restrictions along a certain set of dimensions are defined and implemented externally by either MakeAppx.exe or other tools in the pipeline.
Parsing the packaging node
MakePRI.exe parses the 'packaging' node after all the 'index' nodes to populate all the default qualifiers. MakePRI.exe collects parsed info in these data structures.
enum ResourcePackageMode {
None,
AutoPackQualifier,
ManualPack
}
ResourcePackageMode eResourcePackageMode;
list<string> RPQualifierList; // To store AutoResourcePackage Qualifiers
map<string, list<string>> RPNameToQSIMap; // To store ResourcePackage name to QualifierSet list mapping.
Here are some error and warning strings for particular scenarios:
Scenario | Type of issue | String |
---|---|---|
More than one mode found in the configuration. For example, Manual and AutoResourcePackage specified. | Error | Invalid Configuration: 'packaging' node cannot have more than one mode of operation. |
No candidates are found for the QualifierSet listed for 'ResourcePackage' node. | Warning | Invalid Configuration: No candidates found for <Resource Package Name>. |
No candidates found for qualifier listed under ‘AutoResourcePackage’ node. | Warning | Invalid Configuration: No candidates found for qualifier <qualifier name>. Resource Package not generated. |
A default qualifier is listed under resource package. | Error | Invalid Configuration: <Qualifiername>=<QualifierValue> is a default qualifier and its candidates cannot be added to a resource package. |
None of the modes are found. That is, empty 'packaging' node found. | Warning | Invalid Configuration: No packaging mode specified. |
AutoResourcePackage qualifier contains multiple qualifiers. For example, language_scale. | Error | Invalid Configuration : AutoResourcePackage with multiple qualifiers is not supported. |
ResourcePackage QualifierSet contains multiple qualifiers. For example, language-en-us_scale-100 | Error | Invalid Configuration : QualifierSet with multiple qualifiers is not supported. |
Duplicate resourcepack name found. | Error | Invalid Configuration : Duplicate resource pack name <rpname>. |
Same qualifier set defined in two resource packages. | Error | Invalid Configuration: Multiple instances of QualifierSet "<qualifier tags>" found. |
Handling candidates (found in the index) with multi-qualifier-sets
MakePRI.exe explicitly blocks multi-qualifier set for packaging in the configuration file. However, candidates with multi-qualifier sets can still be found in the project. MakePRI.exe doesn't generate an error if these candidates are found in the project.
If 'AutoResourcePackage' is provided as a packaging option, any candidates (found in the index) that belong to multi-qualifier-sets are placed in a resource package based on the qualifier priority.
For example, suppose AutoResourcePackage is provided on Languages and Scale, and a multi-qual candidate is found (en-us\logo.scale-100.jpg). MakePRI.exe places the candidate in 'en-us' resource PRI instead of 'scale' resource PRI because 'Language' is higher priority than 'Scale.'
For example, suppose AutoResourcePackage is provided on Languages, and a multi-qual candidate is found (en-us\logo.scale-100.jpg). MakePRI.exe places the candidate in 'en-us' resource PRI because 'scale' doesn’t exist.
Default configuration file
MakePRI.exe generates this configuration when the createconfig option is specified:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<resources targetOsVersion="6.3.0" majorVersion="1">
<packaging>
<autoResourcePackage qualifier="Language"/>
<autoResourcePackage qualifier="Scale"/>
<autoResourcePackage qualifier="DXFeatureLevel"/>
</packaging>
<index root="\" startIndexAt="\">
<default>
<qualifier name="Language" value="en-us"/>
<qualifier name="Contrast" value="standard"/>
<qualifier name="Scale" value="100"/>
<qualifier name="HomeRegion" value="001"/>
<qualifier name="TargetSize" value="256"/>
<qualifier name="LayoutDirection" value="LTR"/>
<qualifier name="Configuration" value=""/>
<qualifier name="AlternateForm" value=""/>
<qualifier name="DXFeatureLevel" value="DX9"/>
</default>
<indexer-config type="folder" foldernameAsQualifier="true" filenameAsQualifier="true" qualifierDelimiter="."/>
<indexer-config type="resw" convertDotsToSlashes="true" initialPath=""/>
<indexer-config type="resjson" initialPath=""/>
<indexer-config type="PRI"/>
</index>
<!--<index startIndexAt="Start Index Here" root="Root Here">-->
<!-- <indexer-config type="resfiles" qualifierDelimiter="."/>-->
<!-- <indexer-config type="priinfo" emitStrings="true" emitPaths="true"/>-->
<!--</index>-->
</resources>