Change the upstream source URL
[platform/upstream/c-ares.git] / Makefile.msvc
index f2c4ee6..21d3de6 100644 (file)
@@ -1,6 +1,5 @@
-# $Id$
 
-# Copyright (C) 2009 by Daniel Stenberg
+# Copyright (C) 2009-2013 by Daniel Stenberg
 #
 # Permission to use, copy, modify, and distribute this
 # software and its documentation for any purpose and without
 # Makefile for building c-ares libraries and sample programs with MSVC.
 #
 # Usage: nmake /f makefile.msvc CFG=<config> <target>
-# 
+#
 # <config> must be one of: [ lib-release | lib-debug | dll-release | dll-debug }
 # <target> must be one of: [ ALL | c-ares | acountry | adig | ahost | clean }
-# 
+#
 # If a <target> other than ALL or clean is given, <config> becomes mandatory.
-# 
+#
 # If neither <config> nor <target> are specified this results in
 # all targets being built for all <config> c-ares library types.
 #
 #
 # ------------------------------------------------------------------------------
 
+NAME = cares
+
 # ------------------------------------------------
 # c-ares static and dynamic libraries common base
 # file names for release and debug configurations
 # ------------------------------------------------
 
-LIB_BASENAME       = cares
-LIB_BASENAME_DEBUG = caresd
+STA_LIB_REL = lib$(NAME)
+DYN_LIB_REL = $(NAME)
+STA_LIB_DBG = $(STA_LIB_REL)d
+DYN_LIB_DBG = $(DYN_LIB_REL)d
 
 # -------------------------------------------
 # Base names for c-ares DLL import libraries
 # -------------------------------------------
 
-IMPLIB_BASENAME       = $(LIB_BASENAME)_imp
-IMPLIB_BASENAME_DEBUG = $(LIB_BASENAME_DEBUG)_imp
+IMP_LIB_REL = $(DYN_LIB_REL)
+IMP_LIB_DBG = $(DYN_LIB_DBG)
 
 # --------------------------
 # Runtime library selection
@@ -68,63 +71,26 @@ RTLIBD = /MTd
 
 USE_WATT32 = 0
 
-# -------------------------------------------
-# Detect NMAKE version deducing MSVC version
-# -------------------------------------------
-
-!IFNDEF _NMAKE_VER
-!  MESSAGE Macro _NMAKE_VER not defined.
-!  MESSAGE Use MSVC's NMAKE to process this makefile.
-!  ERROR   See previous message.
-!ENDIF
-
-!IF     "$(_NMAKE_VER)" == "6.00.8168.0"
-CC_VERS_NUM = 60
-!ELSEIF "$(_NMAKE_VER)" == "6.00.9782.0"
-CC_VERS_NUM = 60
-!ELSEIF "$(_NMAKE_VER)" == "7.00.9466"
-CC_VERS_NUM = 70
-!ELSEIF "$(_NMAKE_VER)" == "7.00.9955"
-CC_VERS_NUM = 70
-!ELSEIF "$(_NMAKE_VER)" == "7.10.3077"
-CC_VERS_NUM = 71
-!ELSEIF "$(_NMAKE_VER)" == "8.00.40607.16"
-CC_VERS_NUM = 80
-!ELSEIF "$(_NMAKE_VER)" == "8.00.50727.42"
-CC_VERS_NUM = 80
-!ELSEIF "$(_NMAKE_VER)" == "8.00.50727.762"
-CC_VERS_NUM = 80
-!ELSEIF "$(_NMAKE_VER)" == "9.00.21022.08"
-CC_VERS_NUM = 90
-!ELSEIF "$(_NMAKE_VER)" == "9.00.30729.01"
-CC_VERS_NUM = 90
-!ELSEIF "$(_NMAKE_VER)" == "10.00.20506.01"
-CC_VERS_NUM = 100
-!ELSE
-!  MESSAGE Unknown value for _NMAKE_VER macro: "$(_NMAKE_VER)"
-!  MESSAGE Please, report this condition on the c-ares development
-!  MESSAGE mailing list: http://cool.haxx.se/mailman/listinfo/c-ares/
-!  ERROR   See previous message.
-!ENDIF
-
-CC_VERS_STR = msvc$(CC_VERS_NUM)
+# --------------------------------------------------------
+# Detect compiler version.
+# --------------------------------------------------------
+!INCLUDE .\msvc_ver.inc
 
 # ----------------------------------------------------
 # Verify that current subdir is the c-ares source one
 # ----------------------------------------------------
 
-!IF ! EXIST(.\ares_init.c)
+!IF ! EXIST(.\src\lib\ares_init.c)
 !  MESSAGE Can not process Makefile.msvc from outside of c-ares source subdirectory.
 !  MESSAGE Change to the subdirectory where Makefile.msvc is found, and try again.
 !  ERROR   See previous message.
 !ENDIF
 
 # ------------------------------------------------------------------
-# Base subdir is the common root from which other subdirs will hang,
-# the name depends on MSVC version being used when building c-ares.
+# Base subdir is the common root from which other subdirs will hang.
 # ------------------------------------------------------------------
 
-BASE_DIR = .\$(CC_VERS_STR)
+BASE_DIR = .\msvc
 
 # ----------------------------------------
 # Subdir holding sources for all projects
@@ -132,6 +98,22 @@ BASE_DIR = .\$(CC_VERS_STR)
 
 SRCDIR = .
 
+# -----------------------------
+# Default installation subdirs
+# -----------------------------
+
+!IFNDEF INSTALL_DIR
+INSTALL_DIR = .
+!ENDIF
+
+!IFNDEF INSTALL_DIR_LIB
+INSTALL_DIR_LIB = $(INSTALL_DIR)\lib
+!ENDIF
+
+!IFNDEF INSTALL_DIR_INC
+INSTALL_DIR_INC = $(INSTALL_DIR)\include
+!ENDIF
+
 # -------------------------
 # Configuration validation
 # -------------------------
@@ -201,14 +183,14 @@ CFLAGS  = /UWIN32 /DWATT32 /I$(WATT_ROOT)\inc
 EX_LIBS_REL = $(WATT_ROOT)\lib\wattcpvc_imp.lib
 EX_LIBS_DBG = $(WATT_ROOT)\lib\wattcpvc_imp_d.lib
 !ELSE
-CFLAGS  = /DWIN32
+CFLAGS  = /DWIN32 /D_WIN32_WINNT=0x0600
 EX_LIBS_REL = ws2_32.lib advapi32.lib kernel32.lib
 EX_LIBS_DBG = ws2_32.lib advapi32.lib kernel32.lib
 !ENDIF
 
-# -----------------------------------------
-# Switches that depend on compiler version
-# -----------------------------------------
+# -------------------------------------------------
+# Switches that depend on ancient compiler versions
+# -------------------------------------------------
 
 !IF $(CC_VERS_NUM) == 60
 PDB_NONE            = /pdb:none
@@ -218,81 +200,88 @@ PDBTYPE_CONSOLIDATE = /pdbtype:consolidate
 !UNDEF PDBTYPE_CONSOLIDATE
 !ENDIF
 
+!IF $(CC_VERS_NUM) <= 70
+RT_ERROR_CHECKING = /GZ
+!ELSE
+RT_ERROR_CHECKING = /RTCsu
+!ENDIF
+
 # ----------------------------
 # Assorted commands and flags
 # ----------------------------
 
-CC_CMD_NODBG = cl.exe /nologo $(RTLIB) /DNDEBUG /O2
-CC_CMD_DEBUG = cl.exe /nologo $(RTLIBD) /D_DEBUG /Od /Zi /GZ
-CC_CFLAGS    = $(CFLAGS) /I. /W3 /GX /FD
+CC_CMD_REL = cl.exe /nologo $(RTLIB) /DNDEBUG /O2
+CC_CMD_DBG = cl.exe /nologo $(RTLIBD) /D_DEBUG /Od /Zi $(RT_ERROR_CHECKING)
+CC_CFLAGS  = $(CFLAGS) /I.\src\lib /I.\include /W3 /EHsc /FD
 
-RC_CMD_NODBG = rc.exe /l 0x409 /d "NDEBUG"
-RC_CMD_DEBUG = rc.exe /l 0x409 /d "_DEBUG"
+RC_CMD_REL = rc.exe /l 0x409 /d "NDEBUG"
+RC_CMD_DBG = rc.exe /l 0x409 /d "_DEBUG"
 
 LINK_CMD_LIB = link.exe /lib /nologo
 LINK_CMD_DLL = link.exe /dll /nologo /incremental:no /fixed:no
 LINK_CMD_EXE = link.exe /nologo /incremental:no /fixed:no /subsystem:console
 
-LINK_CMD_EXE_NODBG = $(LINK_CMD_EXE) /release $(PDB_NONE)
-LINK_CMD_EXE_DEBUG = $(LINK_CMD_EXE) /debug $(PDBTYPE_CONSOLIDATE)
+LINK_CMD_EXE_REL = $(LINK_CMD_EXE) /release $(PDB_NONE)
+LINK_CMD_EXE_DBG = $(LINK_CMD_EXE) /debug $(PDBTYPE_CONSOLIDATE)
 
 # ---------------------------------
 # Configuration dependent settings
 # ---------------------------------
 
 !IF "$(CFG)" == "lib-release"
-CARES_TARGET = $(LIB_BASENAME).lib
+CARES_TARGET = $(STA_LIB_REL).lib
 CARES_CFLAGS = /DCARES_BUILDING_LIBRARY /DCARES_STATICLIB
 CARES_LFLAGS =
 SPROG_CFLAGS = /DCARES_STATICLIB
-SPROG_LFLAGS = /libpath:$(CARES_OUTDIR) $(EX_LIBS_REL) $(LIB_BASENAME).lib
+SPROG_LFLAGS = /libpath:$(CARES_OUTDIR) $(EX_LIBS_REL) $(STA_LIB_REL).lib
 CARES_LINK   = $(LINK_CMD_LIB)
-SPROG_LINK   = $(LINK_CMD_EXE_NODBG)
-CC_CMD       = $(CC_CMD_NODBG)
+SPROG_LINK   = $(LINK_CMD_EXE_REL)
+CC_CMD       = $(CC_CMD_REL)
 !ENDIF
 
 !IF "$(CFG)" == "lib-debug"
-CARES_TARGET = $(LIB_BASENAME_DEBUG).lib
+CARES_TARGET = $(STA_LIB_DBG).lib
 CARES_CFLAGS = /DCARES_BUILDING_LIBRARY /DCARES_STATICLIB /DDEBUGBUILD
 CARES_LFLAGS =
 SPROG_CFLAGS = /DCARES_STATICLIB
-SPROG_LFLAGS = /libpath:$(CARES_OUTDIR) $(EX_LIBS_DBG) $(LIB_BASENAME_DEBUG).lib
+SPROG_LFLAGS = /libpath:$(CARES_OUTDIR) $(EX_LIBS_DBG) $(STA_LIB_DBG).lib
 CARES_LINK   = $(LINK_CMD_LIB)
-SPROG_LINK   = $(LINK_CMD_EXE_DEBUG)
-CC_CMD       = $(CC_CMD_DEBUG)
+SPROG_LINK   = $(LINK_CMD_EXE_DBG)
+CC_CMD       = $(CC_CMD_DBG)
 !ENDIF
 
 !IF "$(CFG)" == "dll-release"
-CARES_TARGET = $(LIB_BASENAME).dll
+CARES_TARGET = $(DYN_LIB_REL).dll
 CARES_CFLAGS = /DCARES_BUILDING_LIBRARY
-CARES_LFLAGS = /release $(EX_LIBS_REL) /implib:$(CARES_OUTDIR)\$(IMPLIB_BASENAME).lib $(PDB_NONE)
+CARES_LFLAGS = /release $(EX_LIBS_REL) /implib:$(CARES_OUTDIR)\$(IMP_LIB_REL).lib $(PDB_NONE)
 SPROG_CFLAGS =
-SPROG_LFLAGS = /libpath:$(CARES_OUTDIR) $(EX_LIBS_REL) $(IMPLIB_BASENAME).lib
+SPROG_LFLAGS = /libpath:$(CARES_OUTDIR) $(EX_LIBS_REL) $(IMP_LIB_REL).lib
 CARES_LINK   = $(LINK_CMD_DLL)
-SPROG_LINK   = $(LINK_CMD_EXE_NODBG)
-CC_CMD       = $(CC_CMD_NODBG)
+SPROG_LINK   = $(LINK_CMD_EXE_REL)
+CC_CMD       = $(CC_CMD_REL)
 USE_RES_FILE = TRUE
-RC_CMD       = $(RC_CMD_NODBG)
+RC_CMD       = $(RC_CMD_REL)
 !ENDIF
 
 !IF "$(CFG)" == "dll-debug"
-CARES_TARGET = $(LIB_BASENAME_DEBUG).dll
+CARES_TARGET = $(DYN_LIB_DBG).dll
 CARES_CFLAGS = /DCARES_BUILDING_LIBRARY /DDEBUGBUILD
-CARES_LFLAGS = /debug $(EX_LIBS_DBG) /implib:$(CARES_OUTDIR)\$(IMPLIB_BASENAME_DEBUG).lib /pdb:$(CARES_OUTDIR)\$(LIB_BASENAME_DEBUG).pdb $(PDBTYPE_CONSOLIDATE)
+CARES_LFLAGS = /debug $(EX_LIBS_DBG) /implib:$(CARES_OUTDIR)\$(IMP_LIB_DBG).lib /pdb:$(CARES_OUTDIR)\$(DYN_LIB_DBG).pdb $(PDBTYPE_CONSOLIDATE)
 SPROG_CFLAGS =
-SPROG_LFLAGS = /libpath:$(CARES_OUTDIR) $(EX_LIBS_DBG) $(IMPLIB_BASENAME_DEBUG).lib
+SPROG_LFLAGS = /libpath:$(CARES_OUTDIR) $(EX_LIBS_DBG) $(IMP_LIB_DBG).lib
 CARES_LINK   = $(LINK_CMD_DLL)
-SPROG_LINK   = $(LINK_CMD_EXE_DEBUG)
-CC_CMD       = $(CC_CMD_DEBUG)
+SPROG_LINK   = $(LINK_CMD_EXE_DBG)
+CC_CMD       = $(CC_CMD_DBG)
 USE_RES_FILE = TRUE
-RC_CMD       = $(RC_CMD_DEBUG)
+RC_CMD       = $(RC_CMD_DBG)
 !ENDIF
 
 # --------------------------------------------
 # Makefile.inc provides lists of source files
 # --------------------------------------------
 
-!INCLUDE .\Makefile.inc
+!INCLUDE .\src\lib\Makefile.inc
+!INCLUDE .\src\tools\Makefile.inc
 
 # ----------------------------
 # Build lists of object files
@@ -320,6 +309,7 @@ CARES_OBJS = $(CARES_OBJS) $(CARES_OBJDIR)\cares.res
 !ERROR Problem generating PROG1_OBJS list.
 !ENDIF
 PROG1_OBJS = $(PROG1_OBJS:.c=.obj)
+PROG1_OBJS = $(PROG1_OBJS:/=\)
 PROG1_OBJS = $(PROG1_OBJS) $(PROG1_OBJDIR)\acountry.obj
 
 !IF [ECHO PROG2_OBJS=^$(PROG2_OBJDIR)\$(SAMPLESOURCES: = $(PROG2_OBJDIR^)\) > .\prog2_objs.inc] == 0
@@ -330,6 +320,7 @@ PROG1_OBJS = $(PROG1_OBJS) $(PROG1_OBJDIR)\acountry.obj
 !ERROR Problem generating PROG2_OBJS list.
 !ENDIF
 PROG2_OBJS = $(PROG2_OBJS:.c=.obj)
+PROG2_OBJS = $(PROG2_OBJS:/=\)
 PROG2_OBJS = $(PROG2_OBJS) $(PROG2_OBJDIR)\adig.obj
 
 !IF [ECHO PROG3_OBJS=^$(PROG3_OBJDIR)\$(SAMPLESOURCES: = $(PROG3_OBJDIR^)\) > .\prog3_objs.inc] == 0
@@ -340,10 +331,12 @@ PROG2_OBJS = $(PROG2_OBJS) $(PROG2_OBJDIR)\adig.obj
 !ERROR Problem generating PROG3_OBJS list.
 !ENDIF
 PROG3_OBJS = $(PROG3_OBJS:.c=.obj)
+PROG3_OBJS = $(PROG3_OBJS:/=\)
 PROG3_OBJS = $(PROG3_OBJS) $(PROG3_OBJDIR)\ahost.obj
 
 !ENDIF
 
+
 # --------------------------------
 # Only our custom inference rules
 # --------------------------------
@@ -351,21 +344,33 @@ PROG3_OBJS = $(PROG3_OBJS) $(PROG3_OBJDIR)\ahost.obj
 .SUFFIXES:
 .SUFFIXES: .c .rc
 
-{$(SRCDIR)}.rc{$(CARES_OBJDIR)}.res:
+{$(SRCDIR)\src\lib}.rc{$(CARES_OBJDIR)}.res:
     $(RC_CMD) /Fo $@ $<
 
-{$(SRCDIR)}.c{$(CARES_OBJDIR)}.obj:
+{$(SRCDIR)\src\lib}.c{$(CARES_OBJDIR)}.obj:
     $(CC_CMD) $(CC_CFLAGS) $(CARES_CFLAGS) /Fo$@ /Fd$(@D)\ /c $<
 
-{$(SRCDIR)}.c{$(PROG1_OBJDIR)}.obj:
+{$(SRCDIR)\src\tools}.c{$(PROG1_OBJDIR)}.obj:
     $(CC_CMD) $(CC_CFLAGS) $(SPROG_CFLAGS) /Fo$@ /Fd$(@D)\ /c $<
 
-{$(SRCDIR)}.c{$(PROG2_OBJDIR)}.obj:
+{$(SRCDIR)\src\tools}.c{$(PROG2_OBJDIR)}.obj:
     $(CC_CMD) $(CC_CFLAGS) $(SPROG_CFLAGS) /Fo$@ /Fd$(@D)\ /c $<
 
-{$(SRCDIR)}.c{$(PROG3_OBJDIR)}.obj:
+{$(SRCDIR)\src\tools}.c{$(PROG3_OBJDIR)}.obj:
     $(CC_CMD) $(CC_CFLAGS) $(SPROG_CFLAGS) /Fo$@ /Fd$(@D)\ /c $<
 
+# Hack Alert! we reference ../lib/ files in the Makefile.inc for tools as they
+# share some files with the library itself.  We need to hack around that here.
+
+{$(SRCDIR)\src\lib}.c{$(PROG1_OBJDIR)\..\lib}.obj:
+    $(CC_CMD) $(CC_CFLAGS) $(SPROG_CFLAGS) /Fo$(PROG1_OBJDIR)\$(@F) /Fd$(PROG1_OBJDIR)\ /c $<
+
+{$(SRCDIR)\src\lib}.c{$(PROG2_OBJDIR)\..\lib}.obj:
+    $(CC_CMD) $(CC_CFLAGS) $(SPROG_CFLAGS) /Fo$(PROG2_OBJDIR)\$(@F) /Fd$(PROG2_OBJDIR)\ /c $<
+
+{$(SRCDIR)\src\lib}.c{$(PROG3_OBJDIR)\..\lib}.obj:
+    $(CC_CMD) $(CC_CFLAGS) $(SPROG_CFLAGS) /Fo$(PROG3_OBJDIR)\$(@F) /Fd$(PROG3_OBJDIR)\ /c $<
+
 # ------------------------------------------------------------- #
 # ------------------------------------------------------------- #
 # Default target when no CFG library type has been specified,   #
@@ -376,14 +381,20 @@ PROG3_OBJS = $(PROG3_OBJS) $(PROG3_OBJDIR)\ahost.obj
 !IF "$(VALID_CFGSET)" == "FALSE"
 
 ALL:
-    $(MAKE) /f .\Makefile.msvc  CFG=lib-release  ALL
-    $(MAKE) /f .\Makefile.msvc  CFG=lib-debug    ALL
-    $(MAKE) /f .\Makefile.msvc  CFG=dll-release  ALL
-    $(MAKE) /f .\Makefile.msvc  CFG=dll-debug    ALL
+    $(MAKE) /NOLOGO /f .\Makefile.msvc  CFG=lib-release  ALL
+    $(MAKE) /NOLOGO /f .\Makefile.msvc  CFG=lib-debug    ALL
+    $(MAKE) /NOLOGO /f .\Makefile.msvc  CFG=dll-release  ALL
+    $(MAKE) /NOLOGO /f .\Makefile.msvc  CFG=dll-debug    ALL
 
 clean:
     @-RMDIR /S /Q $(BASE_DIR) >NUL 2>&1
 
+install:
+    @$(MAKE) /nologo /f .\Makefile.msvc  CFG=lib-release  install
+    @$(MAKE) /nologo /f .\Makefile.msvc  CFG=lib-debug    install
+    @$(MAKE) /nologo /f .\Makefile.msvc  CFG=dll-release  install
+    @$(MAKE) /nologo /f .\Makefile.msvc  CFG=dll-debug    install
+
 !ENDIF
 
 # ---------------------------------------------------------------------
@@ -395,22 +406,26 @@ clean:
 ALL: c-ares acountry adig ahost
     @
 
-c-ares: $(HHEADERS) $(CSOURCES) $(CARES_OBJDIR) $(CARES_OBJS) $(CARES_OUTDIR)
+# $(HHEADERS) $(CSOURCES)
+c-ares: $(CARES_OBJDIR) $(CARES_OBJS) $(CARES_OUTDIR)
     $(CARES_LINK) $(CARES_LFLAGS) /out:$(CARES_OUTDIR)\$(CARES_TARGET) $(CARES_OBJS)
 !   IF "$(USE_RES_FILE)" == "TRUE"
     @if exist $(CARES_OUTDIR)\$(CARES_TARGET).manifest mt -nologo -manifest $(CARES_OUTDIR)\$(CARES_TARGET).manifest -outputresource:$(CARES_OUTDIR)\$(CARES_TARGET);2
 !   ENDIF
 
-acountry: c-ares acountry.c $(SAMPLESOURCES) $(SAMPLEHEADERS) $(PROG1_OBJDIR) $(PROG1_OBJS) $(PROG1_OUTDIR)
-    $(SPROG_LINK) $(SPROG_LFLAGS) /out:$(PROG1_OUTDIR)\acountry.exe $(PROG1_OBJS)
+# acountry.c $(SAMPLESOURCES) $(SAMPLEHEADERS)
+acountry: c-ares $(PROG1_OBJDIR) $(PROG1_OBJS) $(PROG1_OUTDIR)
+    $(SPROG_LINK) $(SPROG_LFLAGS) /out:$(PROG1_OUTDIR)\acountry.exe $(PROG1_OBJS:..\lib=)
     @if exist $(PROG1_OUTDIR)\acountry.exe.manifest mt -nologo -manifest $(PROG1_OUTDIR)\acountry.exe.manifest -outputresource:$(PROG1_OUTDIR)\acountry.exe;1
 
-adig: c-ares adig.c $(SAMPLESOURCES) $(SAMPLEHEADERS) $(PROG2_OBJDIR) $(PROG2_OBJS) $(PROG2_OUTDIR)
-    $(SPROG_LINK) $(SPROG_LFLAGS) /out:$(PROG2_OUTDIR)\adig.exe $(PROG2_OBJS)
+# adig.c $(SAMPLESOURCES) $(SAMPLEHEADERS)
+adig: c-ares  $(PROG2_OBJDIR) $(PROG2_OBJS) $(PROG2_OUTDIR)
+    $(SPROG_LINK) $(SPROG_LFLAGS) /out:$(PROG2_OUTDIR)\adig.exe $(PROG2_OBJS:..\lib=)
     @if exist $(PROG2_OUTDIR)\adig.exe.manifest mt -nologo -manifest $(PROG2_OUTDIR)\adig.exe.manifest -outputresource:$(PROG2_OUTDIR)\adig.exe;1
 
-ahost: c-ares ahost.c $(SAMPLESOURCES) $(SAMPLEHEADERS) $(PROG3_OBJDIR) $(PROG3_OBJS) $(PROG3_OUTDIR)
-    $(SPROG_LINK) $(SPROG_LFLAGS) /out:$(PROG3_OUTDIR)\ahost.exe $(PROG3_OBJS)
+# ahost.c $(SAMPLESOURCES) $(SAMPLEHEADERS)
+ahost: c-ares $(PROG3_OBJDIR) $(PROG3_OBJS) $(PROG3_OUTDIR)
+    $(SPROG_LINK) $(SPROG_LFLAGS) /out:$(PROG3_OUTDIR)\ahost.exe $(PROG3_OBJS:..\lib=)
     @if exist $(PROG3_OUTDIR)\ahost.exe.manifest mt -nologo -manifest $(PROG3_OUTDIR)\ahost.exe.manifest -outputresource:$(PROG3_OUTDIR)\ahost.exe;1
 
 $(CARES_OUTDIR): $(CARES_DIR)
@@ -443,6 +458,19 @@ clean:
     @-RMDIR /S /Q $(PROG2_OUTDIR) >NUL 2>&1
     @-RMDIR /S /Q $(PROG3_OUTDIR) >NUL 2>&1
 
+install:
+    @if not exist $(CARES_OUTDIR)\$(CARES_TARGET) \
+        $(MAKE) /f .\Makefile.msvc CFG=$(CFG) c-ares
+    @if not exist "$(INSTALL_DIR)"     mkdir "$(INSTALL_DIR)"
+    @if not exist "$(INSTALL_DIR_LIB)" mkdir "$(INSTALL_DIR_LIB)"
+    @if not exist "$(INSTALL_DIR_INC)" mkdir "$(INSTALL_DIR_INC)"
+    @copy /y $(CARES_OUTDIR)\*.*              "$(INSTALL_DIR_LIB)" >NUL
+    @copy /y $(SRCDIR)\include\ares.h         "$(INSTALL_DIR_INC)" >NUL
+    @copy /y $(SRCDIR)\include\ares_build.h   "$(INSTALL_DIR_INC)" >NUL
+    @copy /y $(SRCDIR)\include\ares_rules.h   "$(INSTALL_DIR_INC)" >NUL
+    @copy /y $(SRCDIR)\include\ares_version.h "$(INSTALL_DIR_INC)" >NUL
+    @echo Installed c-ares $(CFG)
+
 !ENDIF
 
 $(BASE_DIR):
@@ -459,3 +487,5 @@ $(PROG2_DIR): $(BASE_DIR)
 
 $(PROG3_DIR): $(BASE_DIR)
     @if not exist $(PROG3_DIR) mkdir $(PROG3_DIR)
+
+# End of Makefile.msvc