// libiomp.rc.var

//
////===----------------------------------------------------------------------===//
////
////                     The LLVM Compiler Infrastructure
////
//// This file is dual licensed under the MIT and the University of Illinois Open
//// Source Licenses. See LICENSE.txt for details.
////
////===----------------------------------------------------------------------===//
//

#include "winres.h"

LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US    // English (U.S.) resources
#pragma code_page(1252)

VS_VERSION_INFO VERSIONINFO
    // Parts of FILEVERSION and PRODUCTVERSION are 16-bit fields, entire build date yyyymmdd
    // does not fit into one version part, so we need to split it into yyyy and mmdd:
    FILEVERSION    $KMP_VERSION_MAJOR,$KMP_VERSION_MINOR,${{ our $KMP_VERSION_BUILD; int( $KMP_VERSION_BUILD / 10000 ) . "," . ( $KMP_VERSION_BUILD % 10000 ) }}
    PRODUCTVERSION $KMP_VERSION_MAJOR,$KMP_VERSION_MINOR,${{ our $KMP_VERSION_BUILD; int( $KMP_VERSION_BUILD / 10000 ) . "," . ( $KMP_VERSION_BUILD % 10000 ) }}
    FILEFLAGSMASK  VS_FFI_FILEFLAGSMASK
    FILEFLAGS      0
    #if $KMP_DIAG || $KMP_DEBUG_INFO
        | VS_FF_DEBUG
    #endif
    #if $KMP_VERSION_BUILD == 0
        | VS_FF_PRIVATEBUILD | VS_FF_PRERELEASE
    #endif
    FILEOS          VOS_NT_WINDOWS32    // Windows* Server* 2003, XP*, 2000, or NT*
    FILETYPE        VFT_DLL
    BEGIN
        BLOCK "StringFileInfo"
        BEGIN
            BLOCK "040904b0"            // U.S. English, Unicode (0x04b0 == 1200)
            BEGIN

                // FileDescription and LegalCopyright should be short.
                VALUE "FileDescription",  "Intel(R) OpenMP* Runtime Library${{ our $MESSAGE_CATALOG; $MESSAGE_CATALOG ? " Message Catalog" : "" }}\0"
                // Following values may be relatively long.
                VALUE "CompanyName",      "Intel Corporation\0"
                // VALUE "LegalTrademarks",  "\0"  // Not used for now.
                VALUE "ProductName",      "Intel(R) OpenMP* Runtime Library\0"
                VALUE "ProductVersion",   "$KMP_VERSION_MAJOR.$KMP_VERSION_MINOR\0"
                VALUE "FileVersion",      "$KMP_VERSION_BUILD\0"
                VALUE "InternalName",     "$KMP_FILE\0"
                VALUE "OriginalFilename", "$KMP_FILE\0"
                VALUE "Comments",
                    "Intel(R) OpenMP* ${{ our ( $MESSAGE_CATALOG, $KMP_TYPE ); $MESSAGE_CATALOG ? "Runtime Library Message Catalog" : "$KMP_TYPE Library" }} "
                    "version $KMP_VERSION_MAJOR.$KMP_VERSION_MINOR.$KMP_VERSION_BUILD "
                    "for $KMP_ARCH architecture built on $KMP_BUILD_DATE.\0"
                #if $KMP_VERSION_BUILD == 0
                    VALUE "PrivateBuild",
                        "This is a development build for internal testing purposes only. "
                        "Do not distribute it outside of Intel.\0"
                #endif
                // VALUE "SpecialBuild",     "\0"    // Not used for now.

            END
        END
        BLOCK "VarFileInfo"
        BEGIN
            VALUE "Translation", ${{ our ( $MESSAGE_CATALOG, $LANGUAGE ); $MESSAGE_CATALOG ? $LANGUAGE : 1033 }}, 1200
            // 1033 -- U.S. English, 1200 -- Unicode
        END
    END

// end of file //
