Ignore:
Timestamp:
Apr 17, 2020, 1:10:45 AM (5 years ago)
Author:
bird
Message:

tools/VCC141*.kmk: Early commit of Visual C++ 14.1 tools.

File:
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/kBuild/tools/VCC141AMD64.kmk

    r3313 r3323  
    11# $Id$
    22## @file
    3 # kBuild Tool Config - Visual C++ 12.0 (aka Visual 2013 and MSC v18), targeting AMD64.
    4 #
    5 
    6 #
    7 # Copyright (c) 2004-2017 knut st. osmundsen <bird-kBuild-spam-xviiv@anduin.net>
     3# kBuild Tool Config - Visual C++ 14.1 (aka Visual 2017 and MSC v19.10), targeting AMD64.
     4#
     5
     6#
     7# Copyright (c) 2004-2020 knut st. osmundsen <bird-kBuild-spam-xx@anduin.net>
    88#
    99# This file is part of kBuild.
     
    3232#
    3333
    34 TOOL_VCC120AMD64 := Visual C++ 12.0 (aka Visual 2013 and MSC v18), targeting AMD64
    35 
     34ifndef TOOL_VCC141
     35 include $(KBUILD_PATH)/tools/VCC141.kmk
     36endif
     37
     38TOOL_VCC141AMD64 := Visual C++ 14.1 (aka Visual 2017 and MSC v19.1), targeting AMD64
     39
     40#
    3641# Tool Specific Properties
    37 ifndef PATH_TOOL_VCC120AMD64
    38  PATH_TOOL_VCC120AMD64 := $(wildcard $(KBUILD_DEVTOOLS)/win.x86/vcc/v12*)
    39  ifeq ($(PATH_TOOL_VCC120AMD64),)
    40   PATH_TOOL_VCC120AMD64 := $(PATH_TOOL_VCC120)
    41  endif
    42  ifeq ($(PATH_TOOL_VCC120AMD64),)
    43   PATH_TOOL_VCC120AMD64 := $(PATH_TOOL_VCC120X86)
    44  endif
    45  ifeq ($(PATH_TOOL_VCC120AMD64),)
    46   PATH_TOOL_VCC120AMD64 := $(wildcard $(KBUILD_DEVTOOLS)/win.x86/vcc/v12*)
    47  endif
    48  ifneq ($(PATH_TOOL_VCC120AMD64),)
    49   PATH_TOOL_VCC120AMD64 := $(lastword $(sort $(PATH_TOOL_VCC120AMD64)))
    50  else
    51   $(warning kBuild: PATH_TOOL_VCC120AMD64 cannot be determined!)
    52   PATH_TOOL_VCC120AMD64 := $(KBUILD_DEVTOOLS)/win.x86/vcc/v12
    53  endif
     42#
     43ifndef PATH_TOOL_VCC141AMD64
     44 PATH_TOOL_VCC141AMD64 := $(PATH_TOOL_VCC141)
    5445else
    5546 # Resolve any fancy stuff once and for all.
    56  PATH_TOOL_VCC120AMD64 := $(PATH_TOOL_VCC120AMD64)
    57 endif
    58 if "$(KBUILD_HOST).$(KBUILD_HOST_ARCH)" == "win.amd64" && exists("$(PATH_TOOL_VCC120AMD64)/bin/amd64") # Missing in express edition.
    59 PATH_TOOL_VCC120AMD64_BIN ?= $(PATH_TOOL_VCC120AMD64)/bin/amd64
    60 #$(error works now: $(PATH_TOOL_VCC120AMD64)/bin/amd64)
     47 PATH_TOOL_VCC141AMD64 := $(PATH_TOOL_VCC141AMD64)
     48endif
     49
     50ifndef PATH_TOOL_VCC141AMD64_BIN
     51PATH_TOOL_VCC141AMD64_BIN     := $(PATH_TOOL_VCC141_HOST_BIN)/x64
    6152else
    62 #$(error no joy: $(PATH_TOOL_VCC120AMD64)/bin/amd64)
    63 PATH_TOOL_VCC120AMD64_BIN_DLL ?= $(PATH_TOOL_VCC120AMD64)/bin
    64 PATH_TOOL_VCC120AMD64_BIN ?= $(PATH_TOOL_VCC120AMD64)/bin/x86_amd64
    65 endif
    66 PATH_TOOL_VCC120AMD64_LIB ?= $(PATH_TOOL_VCC120AMD64)/lib/amd64
    67 PATH_TOOL_VCC120AMD64_INC ?= $(PATH_TOOL_VCC120AMD64)/include
    68 PATH_TOOL_VCC120AMD64_ATLMFC ?= $(PATH_TOOL_VCC120AMD64)/atlmfc
    69 PATH_TOOL_VCC120AMD64_ATLMFC_INC ?= $(PATH_TOOL_VCC120AMD64_ATLMFC)/include
    70 PATH_TOOL_VCC120AMD64_ATLMFC_LIB ?= $(PATH_TOOL_VCC120AMD64_ATLMFC)/lib/amd64
    71 TOOL_VCC120AMD64_CC  ?= $(EXEC_X86_WIN32) $(PATH_TOOL_VCC120AMD64_BIN)/cl.exe
    72 TOOL_VCC120AMD64_CXX ?= $(EXEC_X86_WIN32) $(PATH_TOOL_VCC120AMD64_BIN)/cl.exe
    73 TOOL_VCC120AMD64_AS  ?= $(EXEC_X86_WIN32) $(PATH_TOOL_VCC120AMD64_BIN)/ml64.exe
    74 #TOOL_VCC120AMD64_AR  ?= $(EXEC_X86_WIN32) $(PATH_TOOL_VCC120AMD64_BIN)/lib.exe - just an exec wrapper for the below
    75 TOOL_VCC120AMD64_AR  ?= $(EXEC_X86_WIN32) $(PATH_TOOL_VCC120AMD64_BIN)/link.exe /LIB
    76 TOOL_VCC120AMD64_LD  ?= $(EXEC_X86_WIN32) $(PATH_TOOL_VCC120AMD64_BIN)/link.exe
    77 TOOL_VCC120AMD64_DUMPBIN ?= $(EXEC_X86_WIN32) $(PATH_TOOL_VCC120AMD64_BIN)/dumpbin.exe
    78 TOOL_VCC120AMD64_EDITBIN ?= $(EXEC_X86_WIN32) $(PATH_TOOL_VCC120AMD64_BIN)/editbin.exe
    79 TOOL_VCC120AMD64_RC  ?= $(EXEC_X86_WIN32) $(call TOOL_VCC120_FN_FIND_SDK_TOOL,rc.exe,[Rr][Cc].[Ee][Xx][Ee],TOOL_VCC120_RC_CACHED)
    80 TOOL_VCC120AMD64_MT  ?= $(EXEC_X86_WIN32) $(call TOOL_VCC120_FN_FIND_SDK_TOOL,mt.exe,[Mm][Tt].[Ee][Xx][Ee],TOOL_VCC120_MT_CACHED)
    81 ifdef TOOL_VCC120AMD64_USE_KSUBMIT
     53PATH_TOOL_VCC141AMD64_BIN     := $(PATH_TOOL_VCC141_BIN)
     54endif
     55PATH_TOOL_VCC141AMD64_BIN_QSH := $(requote sh,$(PATH_TOOL_VCC141AMD64_BIN))
     56
     57ifndef PATH_TOOL_VCC141AMD64_LIB
     58PATH_TOOL_VCC141AMD64_LIB     := $(PATH_TOOL_VCC141_LIB.amd64)
     59endif
     60ifndef PATH_TOOL_VCC141_ONECORE_LIB
     61PATH_TOOL_VCC141_ONECORE_LIB  := $(PATH_TOOL_VCC141_ONECORE_LIB.amd64)
     62endif
     63
     64ifndef PATH_TOOL_VCC141AMD64_INC
     65PATH_TOOL_VCC141AMD64_INC     := $(PATH_TOOL_VCC141_INC)
     66endif
     67
     68ifndef PATH_TOOL_VCC141AMD64_ATLMFC_INC
     69PATH_TOOL_VCC141AMD64_ATLMFC_INC := $(PATH_TOOL_VCC141_ATLMFC_INC.amd64)
     70endif
     71ifndef PATH_TOOL_VCC141AMD64_ATLMFC_LIB
     72PATH_TOOL_VCC141AMD64_ATLMFC_LIB := $(PATH_TOOL_VCC141_ATLMFC_LIB.amd64)
     73endif
     74
     75TOOL_VCC141AMD64_CC      ?= $(EXEC_X86_WIN32) $(PATH_TOOL_VCC141AMD64_BIN_QSH)/cl.exe
     76TOOL_VCC141AMD64_CXX     ?= $(EXEC_X86_WIN32) $(PATH_TOOL_VCC141AMD64_BIN_QSH)/cl.exe
     77TOOL_VCC141AMD64_AS      ?= $(EXEC_X86_WIN32) $(PATH_TOOL_VCC141AMD64_BIN_QSH)/ml64.exe
     78#TOOL_VCC141AMD64_AR      ?= $(EXEC_X86_WIN32) $(PATH_TOOL_VCC141AMD64_BIN_QSH)/lib.exe - just an exec wrapper for the below
     79TOOL_VCC141AMD64_AR      ?= $(EXEC_X86_WIN32) $(PATH_TOOL_VCC141AMD64_BIN_QSH)/link.exe /LIB
     80TOOL_VCC141AMD64_LD      ?= $(EXEC_X86_WIN32) $(PATH_TOOL_VCC141AMD64_BIN_QSH)/link.exe
     81TOOL_VCC141AMD64_DUMPBIN ?= $(EXEC_X86_WIN32) $(PATH_TOOL_VCC141AMD64_BIN_QSH)/dumpbin.exe
     82TOOL_VCC141AMD64_EDITBIN ?= $(EXEC_X86_WIN32) $(PATH_TOOL_VCC141AMD64_BIN_QSH)/editbin.exe
     83
     84TOOL_VCC141AMD64_RC ?= $(EXEC_X86_WIN32) $(call TOOL_VCC141_FN_FIND_SDK_TOOL,rc.exe,[Rr][Cc].[Ee][Xx][Ee],TOOL_VCC141_RC_CACHED)
     85TOOL_VCC141AMD64_MT ?= $(EXEC_X86_WIN32) $(call TOOL_VCC141_FN_FIND_SDK_TOOL,mt.exe,[Mm][Tt].[Ee][Xx][Ee],TOOL_VCC141_MT_CACHED)
     86
     87undefine TOOL_VCC141AMD64_USE_KSUBMIT # for now
     88ifdef TOOL_VCC141AMD64_USE_KSUBMIT
    8289 ifeq ($(KBUILD_HOST),win)
    83   ifneq ($(substr $(PATH_TOOL_VCC120AMD64_BIN),-9),x86_amd64)
    84    TOOL_VCC120AMD64_KSUBMIT ?= kmk_builtin_kSubmit --64-bit
    85    ifdef PATH_TOOL_VCC120AMD64_BIN_DLL
    86     TOOL_VCC120AMD64_KSUBMIT += --prepend 'PATH=$(PATH_TOOL_VCC120AMD64_BIN_DLL)$(HOST_PATH_SEP)'
    87    endif
    88    TOOL_VCC120AMD64_KSUBMIT_DD = $(TOOL_VCC120AMD64_KSUBMIT) --
     90  ifneq ($(substr $(qdir un,$(PATH_TOOL_VCC141AMD64_BIN)),-3),64/)
     91   TOOL_VCC141AMD64_KSUBMIT ?= kmk_builtin_kSubmit --64-bit
     92   TOOL_VCC141AMD64_KSUBMIT_DD = $(TOOL_VCC141AMD64_KSUBMIT) --
    8993  else
    90    # "fatal error C1902: Program database manager mismatch; please check your installation" when mixing with the 32-bit compiler.
    91    #TOOL_VCC120AMD64_KSUBMIT ?= kmk_builtin_kSubmit --32-bit
    92    #TOOL_VCC120AMD64_KSUBMIT_DD = $(TOOL_VCC120AMD64_KSUBMIT) --
     94   TOOL_VCC141AMD64_KSUBMIT ?= kmk_builtin_kSubmit --32-bit
     95   TOOL_VCC141AMD64_KSUBMIT_DD = $(TOOL_VCC141AMD64_KSUBMIT) --
    9396  endif
    9497 endif
    95 else ifdef PATH_TOOL_VCC120AMD64_BIN_DLL
    96  TOOL_VCC120AMD64_KSUBMIT_DD  = $(REDIRECT) --prepend 'PATH=$(PATH_TOOL_VCC120AMD64_BIN_DLL)$(HOST_PATH_SEP)' --
    97 endif
    98 
    99 # The following in duplicated in VCC120.kmk and VCC120X86.kmk.
    100 TOOL_VCC120_FN_FIND_SDK_TOOL_SUB = $(eval $3 := $(firstword  \
    101        $(if-expr defined(PATH_SDK_WINPSDK71_BIN), $(wildcard $(PATH_SDK_WINPSDK71_BIN)/$2)) \
    102        $(if-expr defined(PATH_SDK_WINPSDK_BIN)  , $(wildcard $(PATH_SDK_WINPSDK_BIN)/$2)) \
    103         $(rsort $(wildcard $(KBUILD_DEVTOOLS_HST)/sdk/*/[Bb][Ii][Nn]/$2)) \
    104         $(rsort $(wildcard $(KBUILD_DEVTOOLS_HST_ALT)/sdk/*/[Bb][Ii][Nn]/$2)) \
    105         $1))
    106 TOOL_VCC120_FN_FIND_SDK_TOOL = $(if-expr !defined($3),$(TOOL_VCC120_FN_FIND_SDK_TOOL_SUB),)$($3)
    107 
    108 ## Disabled fast DEP_IDB based dependencies.
    109 #VCC120AMD64_OLD_DEPS = 1
    110 
    111 ## Constructs the correct .pdb name (the name is lowercased).
    112 # @param    $(1)        Base name, no extention.
    113 # @param    $(2)        The extension.
    114 TOOL_VCC120AMD64_PDB = $(dir $(1))$(tolower $(notdir $(1))).$(2)
    115 
    116 
    117 # General Properties used by kBuild
    118 TOOL_VCC120AMD64_COBJSUFF         ?= .obj
    119 TOOL_VCC120AMD64_CFLAGS           ?= -TC -nologo -Zi
    120 TOOL_VCC120AMD64_CFLAGS.debug     ?=
    121 TOOL_VCC120AMD64_CFLAGS.dbgopt    ?= -O2
    122 TOOL_VCC120AMD64_CFLAGS.release   ?= -O2
    123 TOOL_VCC120AMD64_CFLAGS.profile   ?= -O2
    124 TOOL_VCC120AMD64_CINCS            ?= $(PATH_TOOL_VCC120AMD64_INC)
    125 TOOL_VCC120AMD64_CDEFS            ?=
    126 
    127 TOOL_VCC120AMD64_CXXOBJSUFF       ?= .obj
    128 TOOL_VCC120AMD64_CXXFLAGS         ?= -TP -nologo -Zi
    129 TOOL_VCC120AMD64_CXXFLAGS.debug   ?=
    130 TOOL_VCC120AMD64_CXXFLAGS.dbgopt  ?= -O2
    131 TOOL_VCC120AMD64_CXXFLAGS.release ?= -O2
    132 TOOL_VCC120AMD64_CXXFLAGS.profile ?= -O2
    133 TOOL_VCC120AMD64_CXXINCS          ?= $(PATH_TOOL_VCC120AMD64_INC) $(PATH_TOOL_VCC120AMD64_ATLMFC_INC)
    134 TOOL_VCC120AMD64_CXXDEFS          ?=
    135 
    136 TOOL_VCC120AMD64_ASOBJSUFF        ?= .obj
    137 
    138 TOOL_VCC120AMD64_RCOBJSUFF        ?= .res
    139 TOOL_VCC120AMD64_RCINCS           ?= $(PATH_TOOL_VCC120AMD64_INC) $(PATH_TOOL_VCC120AMD64_ATLMFC_INC)
    140 
    141 TOOL_VCC120AMD64_ARFLAGS          ?= -nologo -machine:amd64
    142 TOOL_VCC120AMD64_ARLIBSUFF        ?= .lib
    143 
    144 TOOL_VCC120AMD64_LDFLAGS          ?= -nologo -machine:amd64
    145 TOOL_VCC120AMD64_LDFLAGS.debug    ?= -debug
    146 TOOL_VCC120AMD64_LDFLAGS.dbgopt   ?= -debug
    147 TOOL_VCC120AMD64_LDFLAGS.profile  ?= -debug
    148 TOOL_VCC120AMD64_LDFLAGS.release  ?=
     98endif
     99
     100
     101#
     102# Properties used by kBuild
     103#
     104TOOL_VCC141AMD64_COBJSUFF         ?= .obj
     105TOOL_VCC141AMD64_CFLAGS           ?= -TC -nologo -Zi
     106TOOL_VCC141AMD64_CFLAGS.debug     ?=
     107TOOL_VCC141AMD64_CFLAGS.dbgopt    ?= -O2
     108TOOL_VCC141AMD64_CFLAGS.release   ?= -O2
     109TOOL_VCC141AMD64_CFLAGS.profile   ?= -O2
     110TOOL_VCC141AMD64_CINCS            ?= $(PATH_TOOL_VCC141AMD64_INC)
     111TOOL_VCC141AMD64_CDEFS            ?=
     112
     113TOOL_VCC141AMD64_CXXOBJSUFF       ?= .obj
     114TOOL_VCC141AMD64_CXXFLAGS         ?= -TP -nologo -Zi
     115TOOL_VCC141AMD64_CXXFLAGS.debug   ?=
     116TOOL_VCC141AMD64_CXXFLAGS.dbgopt  ?= -O2
     117TOOL_VCC141AMD64_CXXFLAGS.release ?= -O2
     118TOOL_VCC141AMD64_CXXFLAGS.profile ?= -O2
     119TOOL_VCC141AMD64_CXXINCS          ?= $(PATH_TOOL_VCC141AMD64_INC) $(PATH_TOOL_VCC141AMD64_ATLMFC_INC)
     120TOOL_VCC141AMD64_CXXDEFS          ?=
     121
     122TOOL_VCC141AMD64_ASOBJSUFF        ?= .obj
     123
     124TOOL_VCC141AMD64_RCOBJSUFF        ?= .res
     125TOOL_VCC141AMD64_RCINCS           ?= $(PATH_TOOL_VCC141AMD64_INC) $(PATH_TOOL_VCC141AMD64_ATLMFC_INC)
     126
     127TOOL_VCC141AMD64_ARFLAGS          ?= -nologo -machine:amd64
     128TOOL_VCC141AMD64_ARLIBSUFF        ?= .lib
     129
     130TOOL_VCC141AMD64_LDFLAGS          ?= -nologo -machine:amd64
     131TOOL_VCC141AMD64_LDFLAGS.debug    ?= -debug
     132TOOL_VCC141AMD64_LDFLAGS.dbgopt   ?= -debug
     133TOOL_VCC141AMD64_LDFLAGS.profile  ?= -debug
     134TOOL_VCC141AMD64_LDFLAGS.release  ?=
    149135
    150136
     
    163149# @param    $(outbase)  Output basename (full). Use this for list files and such.
    164150# @param    $(objsuff)  Object suffix.
    165 TOOL_VCC120AMD64_COMPILE_C_DEPEND =
    166 TOOL_VCC120AMD64_COMPILE_C_DEPORD =
    167 TOOL_VCC120AMD64_COMPILE_C_OUTPUT =
    168 TOOL_VCC120AMD64_COMPILE_C_OUTPUT_MAYBE = $(call TOOL_VCC120AMD64_PDB, $(outbase)-obj,pdb) $(call TOOL_VCC120AMD64_PDB, $(outbase)-obj,idb)
    169 ifdef TOOL_VCC120AMD64_KSUBMIT
    170  TOOL_VCC120AMD64_COMPILE_C_DONT_PURGE_OUTPUT := 1 # speed
    171  define TOOL_VCC120AMD64_COMPILE_C_CMDS
    172         $(QUIET)$(TOOL_VCC120AMD64_KSUBMIT) -P $(DEP_OBJ_INT) -f -s -q -o $(dep) -t $(obj) $(obj)\
    173                 -- $(TOOL_VCC120AMD64_CC) -c\
    174                 $(flags) $(addprefix -I, $(incs)) $(addprefix -D, $(defs))\
     151TOOL_VCC141AMD64_COMPILE_C_DEPEND =
     152TOOL_VCC141AMD64_COMPILE_C_DEPORD =
     153TOOL_VCC141AMD64_COMPILE_C_OUTPUT =
     154TOOL_VCC141AMD64_COMPILE_C_OUTPUT_MAYBE = $(call TOOL_VCC141_PDB, $(outbase)-obj,pdb) $(call TOOL_VCC141_PDB, $(outbase)-obj,idb)
     155ifdef TOOL_VCC141AMD64_KSUBMIT
     156 TOOL_VCC141AMD64_COMPILE_C_DONT_PURGE_OUTPUT := 1 # speed
     157 define TOOL_VCC141AMD64_COMPILE_C_CMDS
     158        $(QUIET)$(TOOL_VCC141AMD64_KSUBMIT) -P $(DEP_OBJ_INT) -f -s -q -o $(dep) -t $(obj) $(obj)\
     159                -- $(TOOL_VCC141AMD64_CC) -c\
     160                $(flags) $(qaddprefix sh,-I, $(incs)) $(qaddprefix sh,-D, $(defs))\
    175161                -Fd$(outbase)-obj.pdb \
    176162                -Fo$(obj)\
     
    178164 endef
    179165else
    180  define TOOL_VCC120AMD64_COMPILE_C_CMDS
    181         $(QUIET)$(if-expr defined(PATH_TOOL_VCC120AMD64_BIN_DLL)\
    182                 ,$(REDIRECT) --prepend 'PATH=$(PATH_TOOL_VCC120AMD64_BIN_DLL)$(HOST_PATH_SEP)' -- ,)$(TOOL_VCC120AMD64_CC) -c\
    183                 $(flags) $(addprefix -I, $(incs)) $(addprefix -D, $(defs))\
     166 define TOOL_VCC141AMD64_COMPILE_C_CMDS
     167        $(QUIET)$(TOOL_VCC141AMD64_CC) -c\
     168                $(flags) $(qaddprefix sh,-I, $(incs)) $(qaddprefix sh,-D, $(defs))\
    184169                -Fd$(outbase)-obj.pdb \
    185170                -Fo$(obj)\
     
    187172        $(QUIET)$(DEP_OBJ) -f -s -q -o $(dep) -t $(obj) $(obj)
    188173 endef
    189 endif # !TOOL_VCC120AMD64_KSUBMIT
     174endif # !TOOL_VCC141AMD64_KSUBMIT
    190175
    191176
     
    203188# @param    $(outbase)  Output basename (full). Use this for list files and such.
    204189# @param    $(objsuff)  Object suffix.
    205 TOOL_VCC120AMD64_COMPILE_CXX_DEPEND = $($(target)_1_VCC_PCH_FILE)
    206 TOOL_VCC120AMD64_COMPILE_CXX_DEPORD =
    207 TOOL_VCC120AMD64_COMPILE_CXX_OUTPUT =
    208 TOOL_VCC120AMD64_COMPILE_CXX_OUTPUT_MAYBE = $(if-expr defined($(target)_1_VCC_COMMON_OBJ_PDB)\
    209         ,,$(call TOOL_VCC120AMD64_PDB, $(outbase)-obj,pdb) $(call TOOL_VCC120AMD64_PDB, $(outbase)-obj,idb))
    210 ifdef TOOL_VCC120AMD64_KSUBMIT
    211  TOOL_VCC120AMD64_COMPILE_CXX_DONT_PURGE_OUTPUT := 1 # speed
    212  define TOOL_VCC120AMD64_COMPILE_CXX_CMDS
    213         $(QUIET)$(TOOL_VCC120AMD64_KSUBMIT) -P $(DEP_OBJ_INT) -f -s -q -o $(dep) -t $(obj) $(obj)\
    214                 -- $(TOOL_VCC120AMD64_CXX) -c\
    215                 $(flags) $(addprefix -I, $(incs)) $(addprefix -D, $(defs))\
     190TOOL_VCC141AMD64_COMPILE_CXX_DEPEND = $($(target)_1_VCC_PCH_FILE)
     191TOOL_VCC141AMD64_COMPILE_CXX_DEPORD =
     192TOOL_VCC141AMD64_COMPILE_CXX_OUTPUT =
     193TOOL_VCC141AMD64_COMPILE_CXX_OUTPUT_MAYBE = $(if-expr defined($(target)_1_VCC_COMMON_OBJ_PDB)\
     194        ,,$(call TOOL_VCC141_PDB, $(outbase)-obj,pdb) $(call TOOL_VCC141_PDB, $(outbase)-obj,idb))
     195ifdef TOOL_VCC141AMD64_KSUBMIT
     196 TOOL_VCC141AMD64_COMPILE_CXX_DONT_PURGE_OUTPUT := 1 # speed
     197 define TOOL_VCC141AMD64_COMPILE_CXX_CMDS
     198        $(QUIET)$(TOOL_VCC141AMD64_KSUBMIT) -P $(DEP_OBJ_INT) -f -s -q -o $(dep) -t $(obj) $(obj)\
     199                -- $(TOOL_VCC141AMD64_CXX) -c\
     200                $(flags) $(qaddprefix sh,-I, $(incs)) $(qaddprefix sh,-D, $(defs))\
    216201                $(if-expr defined($(target)_PCH_HDR)\
    217202                ,-FI$($(target)_PCH_HDR) -Yu$($(target)_PCH_HDR) -Fp$($(target)_1_VCC_PCH_FILE) -FS,)\
     
    221206 endef
    222207else
    223  define TOOL_VCC120AMD64_COMPILE_CXX_CMDS
    224         $(QUIET)$(if-expr defined(PATH_TOOL_VCC120AMD64_BIN_DLL)\
    225                 ,$(REDIRECT) --prepend 'PATH=$(PATH_TOOL_VCC120AMD64_BIN_DLL)$(HOST_PATH_SEP)' -- ,)$(TOOL_VCC120AMD64_CXX) -c\
    226                 $(flags) $(addprefix -I, $(incs)) $(addprefix -D, $(defs))\
     208 define TOOL_VCC141AMD64_COMPILE_CXX_CMDS
     209        $(QUIET)$(TOOL_VCC141AMD64_CXX) -c\
     210                $(flags) $(qaddprefix sh,-I, $(incs)) $(qaddprefix sh,-D, $(defs))\
    227211                $(if-expr defined($(target)_PCH_HDR)\
    228212                ,-FI$($(target)_PCH_HDR) -Yu$($(target)_PCH_HDR) -Fp$($(target)_1_VCC_PCH_FILE) -FS,)\
     
    232216        $(QUIET)$(DEP_OBJ) -f -s -q -o $(dep) -t $(obj) $(obj)
    233217 endef
    234 endif # !TOOL_VCC120AMD64_KSUBMIT
     218endif # !TOOL_VCC141AMD64_KSUBMIT
    235219
    236220
     
    241225# related _1_VCC_PCH_FILE and add -Yc.
    242226#
    243 TOOL_VCC120AMD64-PCH                         := Helper for creating precompiled header using CXX handling.
    244 TOOL_VCC120AMD64-PCH_EXTENDS                 := VCC120AMD64
    245 TOOL_VCC120AMD64-PCH_CXXOBJSUFF              := .obj
    246 TOOL_VCC120AMD64-PCH_CXXINCS                  = $(TOOL_VCC120AMD64_CXXINCS)
    247 TOOL_VCC120AMD64-PCH_CXXFLAGS                 = $(TOOL_VCC120AMD64_CXXFLAGS) -FS
    248 TOOL_VCC120AMD64-PCH_CXXFLAGS.debug           = $(TOOL_VCC120AMD64_CXXFLAGS.debug)
    249 TOOL_VCC120AMD64-PCH_CXXFLAGS.dbgopt          = $(TOOL_VCC120AMD64_CXXFLAGS.dbgopt)
    250 TOOL_VCC120AMD64-PCH_CXXFLAGS.release         = $(TOOL_VCC120AMD64_CXXFLAGS.release)
    251 TOOL_VCC120AMD64-PCH_CXXFLAGS.profile         = $(TOOL_VCC120AMD64_CXXFLAGS.profile)
    252 TOOL_VCC120AMD64-PCH_COMPILE_CXX_DEPEND       = $(NO_SUCH_VARIABLE)
    253 TOOL_VCC120AMD64-PCH_COMPILE_CXX_DEPORD       = $(NO_SUCH_VARIABLE)
    254 TOOL_VCC120AMD64-PCH_COMPILE_CXX_OUTPUT       = $($(target)_1_VCC_PCH_FILE) $($(target)_1_VCC_COMMON_OBJ_PDB)
    255 TOOL_VCC120AMD64-PCH_COMPILE_CXX_OUTPUT_MAYBE = $(NO_SUCH_VARIABLE)
    256 ifdef TOOL_VCC120AMD64_KSUBMIT
    257  define TOOL_VCC120AMD64-PCH_COMPILE_CXX_CMDS
     227TOOL_VCC141AMD64-PCH                         := Helper for creating precompiled header using CXX handling.
     228TOOL_VCC141AMD64-PCH_EXTENDS                 := VCC141AMD64
     229TOOL_VCC141AMD64-PCH_CXXOBJSUFF              := .obj
     230TOOL_VCC141AMD64-PCH_CXXINCS                  = $(TOOL_VCC141AMD64_CXXINCS)
     231TOOL_VCC141AMD64-PCH_CXXFLAGS                 = $(TOOL_VCC141AMD64_CXXFLAGS) -FS
     232TOOL_VCC141AMD64-PCH_CXXFLAGS.debug           = $(TOOL_VCC141AMD64_CXXFLAGS.debug)
     233TOOL_VCC141AMD64-PCH_CXXFLAGS.dbgopt          = $(TOOL_VCC141AMD64_CXXFLAGS.dbgopt)
     234TOOL_VCC141AMD64-PCH_CXXFLAGS.release         = $(TOOL_VCC141AMD64_CXXFLAGS.release)
     235TOOL_VCC141AMD64-PCH_CXXFLAGS.profile         = $(TOOL_VCC141AMD64_CXXFLAGS.profile)
     236TOOL_VCC141AMD64-PCH_COMPILE_CXX_DEPEND       = $(NO_SUCH_VARIABLE)
     237TOOL_VCC141AMD64-PCH_COMPILE_CXX_DEPORD       = $(NO_SUCH_VARIABLE)
     238TOOL_VCC141AMD64-PCH_COMPILE_CXX_OUTPUT       = $($(target)_1_VCC_PCH_FILE) $($(target)_1_VCC_COMMON_OBJ_PDB)
     239TOOL_VCC141AMD64-PCH_COMPILE_CXX_OUTPUT_MAYBE = $(NO_SUCH_VARIABLE)
     240ifdef TOOL_VCC141AMD64_KSUBMIT
     241 define TOOL_VCC141AMD64-PCH_COMPILE_CXX_CMDS
    258242        $(QUIET)$(RM) -f -- $($(target)_1_VCC_PCH_FILE) $($(target)_1_VCC_COMMON_OBJ_PDB)
    259         $(QUIET)$(TOOL_VCC120AMD64_KSUBMIT) --no-pch-caching -P $(DEP_OBJ_INT) -f -s -q -e .pch -o $(dep) -t $(obj) $(obj)\
    260                 -- $(TOOL_VCC120AMD64_CXX) -c -Yc\
    261                 $(flags) $(addprefix -I, $(incs)) $(addprefix -D, $(defs))\
     243        $(QUIET)$(TOOL_VCC141AMD64_KSUBMIT) --no-pch-caching -P $(DEP_OBJ_INT) -f -s -q -e .pch -o $(dep) -t $(obj) $(obj)\
     244                -- $(TOOL_VCC141AMD64_CXX) -c -Yc\
     245                $(flags) $(qaddprefix sh,-I, $(incs)) $(qaddprefix sh,-D, $(defs))\
    262246               -Fp$($(target)_1_VCC_PCH_FILE) \
    263247                -Fd$($(target)_1_VCC_COMMON_OBJ_PDB) \
     
    267251 endef
    268252else
    269  define TOOL_VCC120AMD64-PCH_COMPILE_CXX_CMDS
     253 define TOOL_VCC141AMD64-PCH_COMPILE_CXX_CMDS
    270254        $(QUIET)$(RM) -f -- $($(target)_1_VCC_PCH_FILE) $($(target)_1_VCC_COMMON_OBJ_PDB)
    271         $(QUIET)$(if-expr defined(PATH_TOOL_VCC120AMD64_BIN_DLL)\
    272                 ,$(REDIRECT) --prepend 'PATH=$(PATH_TOOL_VCC120AMD64_BIN_DLL)$(HOST_PATH_SEP)' -- ,)$(TOOL_VCC120AMD64_CXX) -c -Yc\
    273                 $(flags) $(addprefix -I, $(incs)) $(addprefix -D, $(defs))\
     255        $(QUIET)$(TOOL_VCC141AMD64_CXX) -c -Yc\
     256                $(flags) $(qaddprefix sh,-I, $(incs)) $(qaddprefix sh,-D, $(defs))\
    274257               -Fp$($(target)_1_VCC_PCH_FILE) \
    275258                -Fd$($(target)_1_VCC_COMMON_OBJ_PDB) \
     
    280263
    281264 endef
    282 endif # !TOOL_VCC120AMD64_KSUBMIT
     265endif # !TOOL_VCC141AMD64_KSUBMIT
    283266
    284267
     
    298281# @param    $(outbase)  Output basename (full). Use this for list files and such.
    299282# @param    $(objsuff)  Object suffix.
    300 TOOL_VCC120AMD64_COMPILE_RC_DEPEND =
    301 TOOL_VCC120AMD64_COMPILE_RC_DEPORD =
    302 TOOL_VCC120AMD64_COMPILE_RC_OUTPUT =
    303 ## @todo Fix kmk_redirect so we can use it for setting PATH without spawning a shell or two
    304 define TOOL_VCC120AMD64_COMPILE_RC_CMDS
    305         $(QUIET)$(if-expr defined(PATH_TOOL_VCC120AMD64_BIN_DLL)\
    306                 ,$(REDIRECT) --prepend 'PATH=$(PATH_TOOL_VCC120AMD64_BIN_DLL)$(HOST_PATH_SEP)' -- ,)$(TOOL_VCC120AMD64_RC) \
    307                 $(flags) $(addprefix /i, $(subst /,\\,$(incs))) $(addprefix /d, $(defs))\
     283TOOL_VCC141AMD64_COMPILE_RC_DEPEND =
     284TOOL_VCC141AMD64_COMPILE_RC_DEPORD =
     285TOOL_VCC141AMD64_COMPILE_RC_OUTPUT =
     286define TOOL_VCC141AMD64_COMPILE_RC_CMDS
     287        $(QUIET)$(TOOL_VCC141AMD64_RC) \
     288                $(flags) $(qaddprefix sh,/i, $(subst /,\\,$(incs))) $(qaddprefix sh,/d, $(defs))\
    308289                /fo$(obj)\
    309290                $(subst /,\\,$(abspath $(source)))
     
    321302# @param    $(outbase)  Output basename (full). Use this for list files and such.
    322303#
    323 TOOL_VCC120AMD64_LINK_LIBRARY_DEPEND = $(othersrc)
    324 TOOL_VCC120AMD64_LINK_LIBRARY_DEPORD =
    325 TOOL_VCC120AMD64_LINK_LIBRARY_OUTPUT = $(outbase).rsp
    326 TOOL_VCC120AMD64_LINK_LIBRARY_OUTPUT_MAYBE = $(outbase).lst $(outbase).exp $(outbase).pdb
    327 define TOOL_VCC120AMD64_LINK_LIBRARY_CMDS
     304TOOL_VCC141AMD64_LINK_LIBRARY_DEPEND = $(othersrc)
     305TOOL_VCC141AMD64_LINK_LIBRARY_DEPORD =
     306TOOL_VCC141AMD64_LINK_LIBRARY_OUTPUT = $(outbase).rsp
     307TOOL_VCC141AMD64_LINK_LIBRARY_OUTPUT_MAYBE = $(outbase).lst $(outbase).exp $(outbase).pdb
     308define TOOL_VCC141AMD64_LINK_LIBRARY_CMDS
    328309        $(QUIET)$(APPEND) -tn $(outbase).rsp \
    329                 $(foreach arg,\
    330                         $(subst /,\\,$(objs) \
    331                         $(filter-out %.def,$(othersrc))) \
    332                         $(addprefix /DEF:,$(filter %.def,$(othersrc))) \
    333                         ,\"$(arg)\")
    334         $(QUIET)$(TOOL_VCC120AMD64_KSUBMIT_DD) $(TOOL_VCC120AMD64_AR) $(flags) /OUT:$(out) @$(outbase).rsp
     310                $(qforeachfile u,arg, $(objs) $(filter-out %.def,$(othersrc)),$(quote-sh "$(subst /,\,$(arg))")) \
     311                $(qforeachfile u,arg, $(filter %.def,$(othersrc)),$(quote-sh "/DEF:$(subst /,\,$(arg))"))
     312        $(QUIET)$(TOOL_VCC141AMD64_KSUBMIT_DD) $(TOOL_VCC141AMD64_AR) $(flags) /OUT:$(out) @$(outbase).rsp
    335313endef
    336314
     
    350328# @param    $(outbase)      Output basename (full). Use this for list files and such.
    351329#
    352 TOOL_VCC120AMD64_LINK_PROGRAM_DEPEND = $(foreach lib,$(libs),$(if $(findstring $(lib),$(subst /,x,$(lib))),, $(lib))) $(othersrc)
    353 TOOL_VCC120AMD64_LINK_PROGRAM_DEPORD =
    354 TOOL_VCC120AMD64_LINK_PROGRAM_OUTPUT_MAYBE_PRECIOUS = $(outbase).map $(outbase).rsp
    355 TOOL_VCC120AMD64_LINK_PROGRAM_OUTPUT_MAYBE = $(outbase).lib $(outbase).exp $(outbase).ilk $(out).manifest
    356 TOOL_VCC120AMD64_LINK_PROGRAM_OUTPUT_DEBUG = $(outbase).pdb
    357 TOOL_VCC120AMD64_LINK_PROGRAM_DEBUG_INSTALL_FN = $(2).pdb=>$(basename $(3)).pdb
    358 define TOOL_VCC120AMD64_LINK_PROGRAM_CMDS
     330TOOL_VCC141AMD64_LINK_PROGRAM_DEPEND = $(foreachfile lib,$(libs),$(if $(findstring $(lib),$(subst /,x,$(lib))),, $(lib))) $(othersrc)
     331TOOL_VCC141AMD64_LINK_PROGRAM_DEPORD =
     332TOOL_VCC141AMD64_LINK_PROGRAM_OUTPUT_MAYBE_PRECIOUS = $(outbase).map $(outbase).rsp
     333TOOL_VCC141AMD64_LINK_PROGRAM_OUTPUT_MAYBE = $(outbase).lib $(outbase).exp $(outbase).ilk $(out).manifest
     334TOOL_VCC141AMD64_LINK_PROGRAM_OUTPUT_DEBUG = $(outbase).pdb
     335TOOL_VCC141AMD64_LINK_PROGRAM_DEBUG_INSTALL_FN = $(2).pdb=>$(basename $(3)).pdb
     336define TOOL_VCC141AMD64_LINK_PROGRAM_CMDS
    359337        $(QUIET)$(APPEND) -tn $(outbase).rsp \
    360                 $(foreach arg,\
    361                     $(subst /,\\,$(objs)) \
    362                     $(subst /,\\,$(libs)) \
    363                         ,\"$(arg)\")
    364         $(QUIET)$(TOOL_VCC120AMD64_KSUBMIT_DD) $(TOOL_VCC120AMD64_LD) $(flags) \
     338                $(qforeachfile u,arg, $(objs) $(libs),$(quote-sh "$(subst /,\,$(arg))"))
     339        $(QUIET)$(TOOL_VCC141AMD64_KSUBMIT_DD) $(TOOL_VCC141AMD64_LD) $(flags) \
    365340                /OUT:$(out) \
    366341                /MAPINFO:EXPORTS /INCREMENTAL:NO \
     
    368343                $(foreach def,$(filter %.def,$(othersrc)), /DEF:$(def)) \
    369344                $(subst /,\\,$(filter %.exp %.res,$(othersrc))) \
    370                 $(foreach p,$(libpath), /LIBPATH:$(p)) \
     345                $(qaddprefix sh,/LIBPATH:,$(libpath)) \
    371346                @$(outbase).rsp
    372 ifndef TOOL_VCC120AMD64_NO_AUTO_MANIFEST
     347ifndef TOOL_VCC141AMD64_NO_AUTO_MANIFEST
    373348        $(QUIET)$(TEST) -f $(out).manifest -- \
    374                 $(TOOL_VCC120AMD64_MT) -manifest $(subst /,\\,$(out)).manifest -outputresource:$(subst /,\\,$(out))
     349                $(TOOL_VCC141AMD64_MT) -manifest $(subst /,\\,$(out)).manifest -outputresource:$(subst /,\\,$(out))
    375350endif
    376351endef
     
    391366#
    392367# @param    $(outbase)  Output basename (full). Use this for list files and such.
    393 TOOL_VCC120AMD64_LINK_DLL_DEPEND = $(objs) $(foreach lib,$(libs),$(if $(findstring $(lib),$(subst /,x,$(lib))),, $(lib))) $(othersrc)
    394 TOOL_VCC120AMD64_LINK_DLL_DEPORD = $(call DIRDEP,$(PATH_STAGE_LIB))
    395 TOOL_VCC120AMD64_LINK_DLL_OUTPUT = $(outbase).lib $(outbase).exp
    396 TOOL_VCC120AMD64_LINK_DLL_OUTPUT_MAYBE = $(outbase).ilk $(out).manifest $(PATH_STAGE_LIB)/$(notdir $(outbase)).exp
    397 TOOL_VCC120AMD64_LINK_DLL_OUTPUT_MAYBE_PRECIOUS = $(PATH_STAGE_LIB)/$(notdir $(outbase)).lib $(outbase).map $(outbase).rsp
    398 TOOL_VCC120AMD64_LINK_DLL_OUTPUT_DEBUG = $(outbase).pdb
    399 TOOL_VCC120AMD64_LINK_DLL_DEBUG_INSTALL_FN = $(2).pdb=>$(basename $(3)).pdb
    400 define TOOL_VCC120AMD64_LINK_DLL_CMDS
     368TOOL_VCC141AMD64_LINK_DLL_DEPEND = $(foreachfile lib,$(libs),$(if $(findstring $(lib),$(subst /,x,$(lib))),, $(lib))) $(othersrc)
     369TOOL_VCC141AMD64_LINK_DLL_DEPORD = $(call DIRDEP,$(PATH_STAGE_LIB))
     370TOOL_VCC141AMD64_LINK_DLL_OUTPUT = $(outbase).lib $(outbase).exp
     371TOOL_VCC141AMD64_LINK_DLL_OUTPUT_MAYBE = $(outbase).ilk $(out).manifest $(PATH_STAGE_LIB)/$(notdir $(outbase)).exp
     372TOOL_VCC141AMD64_LINK_DLL_OUTPUT_MAYBE_PRECIOUS = $(PATH_STAGE_LIB)/$(notdir $(outbase)).lib $(outbase).map $(outbase).rsp
     373TOOL_VCC141AMD64_LINK_DLL_OUTPUT_DEBUG = $(outbase).pdb
     374TOOL_VCC141AMD64_LINK_DLL_DEBUG_INSTALL_FN = $(2).pdb=>$(basename $(3)).pdb
     375define TOOL_VCC141AMD64_LINK_DLL_CMDS
    401376        $(QUIET)$(APPEND) -tn $(outbase).rsp \
    402                 $(foreach arg,\
    403                     $(subst /,\\,$(objs)) \
    404                     $(subst /,\\,$(libs)) \
    405                         ,\"$(arg)\")
    406         $(QUIET)$(TOOL_VCC120AMD64_KSUBMIT_DD) $(TOOL_VCC120AMD64_LD) $(flags) \
     377                $(qforeachfile u,arg, $(objs) $(libs),$(quote-sh "$(subst /,\,$(arg))"))
     378        $(QUIET)$(TOOL_VCC141AMD64_KSUBMIT_DD) $(TOOL_VCC141AMD64_LD) $(flags) \
    407379                /OUT:$(out) \
    408380                /IMPLIB:$(outbase).lib \
     
    412384                $(foreach def,$(filter %.def,$(othersrc)), /DEF:$(def)) \
    413385                $(subst /,\\,$(filter %.exp %.res,$(othersrc))) \
    414                 $(foreach p,$(libpath), /LIBPATH:$(p)) \
     386                $(qaddprefix sh,/LIBPATH:,$(libpath)) \
    415387                @$(outbase).rsp
    416 ifndef TOOL_VCC120AMD64_NO_AUTO_MANIFEST
     388ifndef TOOL_VCC141AMD64_NO_AUTO_MANIFEST
    417389        $(QUIET)$(TEST) -f $(out).manifest -- \
    418                 $(TOOL_VCC120AMD64_MT) -manifest $(subst /,\\,$(out)).manifest '-outputresource:$(subst /,\\,$(out));#2'
     390                $(TOOL_VCC141AMD64_MT) -manifest $(subst /,\\,$(out)).manifest '-outputresource:$(subst /,\\,$(out));#2'
    419391endif
    420392        $(QUIET)$(TEST) -f $(outbase).lib -- $(KLIBTWEAKER_EXT) --clear-timestamps $(outbase).lib
     
    438410#
    439411# @param    $(outbase)  Output basename (full). Use this for list files and such.
    440 TOOL_VCC120AMD64_LINK_SYSMOD_DEPEND = $(foreach lib,$(libs),$(if $(findstring $(lib),$(subst /,x,$(lib))),, $(lib))) $(othersrc)
    441 TOOL_VCC120AMD64_LINK_SYSMOD_DEPORD =
    442 TOOL_VCC120AMD64_LINK_SYSMOD_OUTPUT_MAYBE = $(outbase).lib $(outbase).exp $(outbase).ilk $(out).manifest
    443 TOOL_VCC120AMD64_LINK_SYSMOD_OUTPUT_MAYBE_PRECIOUS = $(outbase).map $(outbase).rsp
    444 TOOL_VCC120AMD64_LINK_SYSMOD_OUTPUT_DEBUG = $(outbase).pdb
    445 TOOL_VCC120AMD64_LINK_SYSMOD_DEBUG_INSTALL_FN = $(2).pdb=>$(basename $(3)).pdb
    446 define TOOL_VCC120AMD64_LINK_SYSMOD_CMDS
     412TOOL_VCC141AMD64_LINK_SYSMOD_DEPEND = $(foreachfile lib,$(libs),$(if $(findstring $(lib),$(subst /,x,$(lib))),, $(lib))) $(othersrc)
     413TOOL_VCC141AMD64_LINK_SYSMOD_DEPORD =
     414TOOL_VCC141AMD64_LINK_SYSMOD_OUTPUT_MAYBE = $(outbase).lib $(outbase).exp $(outbase).ilk $(out).manifest
     415TOOL_VCC141AMD64_LINK_SYSMOD_OUTPUT_MAYBE_PRECIOUS = $(outbase).map $(outbase).rsp
     416TOOL_VCC141AMD64_LINK_SYSMOD_OUTPUT_DEBUG = $(outbase).pdb
     417TOOL_VCC141AMD64_LINK_SYSMOD_DEBUG_INSTALL_FN = $(2).pdb=>$(basename $(3)).pdb
     418define TOOL_VCC141AMD64_LINK_SYSMOD_CMDS
    447419        $(QUIET)$(APPEND) -tn $(outbase).rsp \
    448                 $(foreach arg,\
    449                     $(subst /,\\,$(objs)) \
    450                     $(subst /,\\,$(libs)) \
    451                         ,\"$(arg)\")
    452         $(QUIET)$(TOOL_VCC120AMD64_KSUBMIT_DD) $(TOOL_VCC120AMD64_LD) $(flags) \
     420                $(qforeachfile u,arg, $(objs) $(libs),$(quote-sh "$(subst /,\,$(arg))"))
     421        $(QUIET)$(TOOL_VCC141AMD64_KSUBMIT_DD) $(TOOL_VCC141AMD64_LD) $(flags) \
    453422                /OUT:$(out) \
    454423                /MAPINFO:EXPORTS /INCREMENTAL:NO \
     
    456425                $(foreach def,$(filter %.def,$(othersrc)), /DEF:$(def)) \
    457426                $(subst /,\\,$(filter %.exp %.res,$(othersrc))) \
    458                 $(foreach p,$(libpath), /LIBPATH:$(p)) \
     427                $(qaddprefix sh,/LIBPATH:,$(libpath)) \
    459428                @$(outbase).rsp
    460 ifndef TOOL_VCC120AMD64_NO_AUTO_MANIFEST
     429ifndef TOOL_VCC141AMD64_NO_AUTO_MANIFEST
    461430        $(QUIET)$(TEST) -f $(out).manifest -- \
    462                 $(TOOL_VCC120AMD64_MT) -manifest $(subst /,\\,$(out)).manifest '-outputresource:$(subst /,\\,$(out));#2'
     431                $(TOOL_VCC141AMD64_MT) -manifest $(subst /,\\,$(out)).manifest '-outputresource:$(subst /,\\,$(out));#2'
    463432endif
    464433endef
Note: See TracChangeset for help on using the changeset viewer.