// libomp.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",  "LLVM* 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",      "LLVM* 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",
                    "LLVM* 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 //
