2 # Copyright (C) 2009-2013 by Daniel Stenberg
4 # Permission to use, copy, modify, and distribute this
5 # software and its documentation for any purpose and without
6 # fee is hereby granted, provided that the above copyright
7 # notice appear in all copies and that both that copyright
8 # notice and this permission notice appear in supporting
9 # documentation, and that the name of M.I.T. not be used in
10 # advertising or publicity pertaining to distribution of the
11 # software without specific, written prior permission.
12 # M.I.T. makes no representations about the suitability of
13 # this software for any purpose. It is provided "as is"
14 # without express or implied warranty.
16 # ------------------------------------------------------------------------------
18 # Makefile for building c-ares libraries and sample programs with MSVC.
20 # Usage: nmake /f makefile.msvc CFG=<config> <target>
22 # <config> must be one of: [ lib-release | lib-debug | dll-release | dll-debug }
23 # <target> must be one of: [ ALL | c-ares | acountry | adig | ahost | clean }
25 # If a <target> other than ALL or clean is given, <config> becomes mandatory.
27 # If neither <config> nor <target> are specified this results in
28 # all targets being built for all <config> c-ares library types.
30 # This makefile must be processed from the subdir where it is located.
32 # All results are generated below a subdirectory named msvcXXX.
34 # ------------------------------------------------------------------------------
38 # ------------------------------------------------
39 # c-ares static and dynamic libraries common base
40 # file names for release and debug configurations
41 # ------------------------------------------------
43 STA_LIB_REL = lib$(NAME)
45 STA_LIB_DBG = $(STA_LIB_REL)d
46 DYN_LIB_DBG = $(DYN_LIB_REL)d
48 # -------------------------------------------
49 # Base names for c-ares DLL import libraries
50 # -------------------------------------------
52 IMP_LIB_REL = $(DYN_LIB_REL)
53 IMP_LIB_DBG = $(DYN_LIB_DBG)
55 # --------------------------
56 # Runtime library selection
57 # --------------------------
62 !IF "$(RTLIBCFG)" == "static"
67 # --------------------------------------------------------
68 # Define USE_WATT32 to 1 to use the Watt-32 tcp/ip stack,
69 # otherwise Winsock tcp/ip stack will be used as default.
70 # --------------------------------------------------------
74 # -------------------------------------------
75 # Detect NMAKE version deducing MSVC version
76 # -------------------------------------------
79 ! MESSAGE Macro _NMAKE_VER not defined.
80 ! MESSAGE Use MSVC's NMAKE to process this makefile.
81 ! ERROR See previous message.
84 !IF "$(_NMAKE_VER)" == "6.00.8168.0"
86 !ELSEIF "$(_NMAKE_VER)" == "6.00.9782.0"
88 !ELSEIF "$(_NMAKE_VER)" == "7.00.8882"
90 !ELSEIF "$(_NMAKE_VER)" == "7.00.9466"
92 !ELSEIF "$(_NMAKE_VER)" == "7.00.9955"
94 !ELSEIF "$(_NMAKE_VER)" == "7.10.2240.8"
96 !ELSEIF "$(_NMAKE_VER)" == "7.10.3077"
98 !ELSEIF "$(_NMAKE_VER)" == "8.00.40607.16"
100 !ELSEIF "$(_NMAKE_VER)" == "8.00.50727.42"
102 !ELSEIF "$(_NMAKE_VER)" == "8.00.50727.762"
104 !ELSEIF "$(_NMAKE_VER)" == "9.00.20706.01"
106 !ELSEIF "$(_NMAKE_VER)" == "9.00.21022.08"
108 !ELSEIF "$(_NMAKE_VER)" == "9.00.30729.01"
110 !ELSEIF "$(_NMAKE_VER)" == "10.00.20506.01"
112 !ELSEIF "$(_NMAKE_VER)" == "10.00.21003.01"
114 !ELSEIF "$(_NMAKE_VER)" == "10.00.30128.01"
116 !ELSEIF "$(_NMAKE_VER)" == "10.00.30319.01"
118 !ELSEIF "$(_NMAKE_VER)" == "10.00.40219.01"
120 !ELSEIF "$(_NMAKE_VER)" == "11.00.50522.1"
122 !ELSEIF "$(_NMAKE_VER)" == "11.00.50727.1"
124 !ELSEIF "$(_NMAKE_VER)" == "11.00.51106.1"
126 !ELSEIF "$(_NMAKE_VER)" == "11.00.60315.1"
128 !ELSEIF "$(_NMAKE_VER)" == "11.00.61030.0"
130 !ELSEIF "$(_NMAKE_VER)" == "12.00.21005.1"
132 !ELSEIF "$(_NMAKE_VER)" == "14.00.23026.0"
135 ! MESSAGE Unknown value for _NMAKE_VER macro: "$(_NMAKE_VER)"
136 ! MESSAGE Please, report this condition on the c-ares development
137 ! MESSAGE mailing list: http://cool.haxx.se/mailman/listinfo/c-ares/
138 ! ERROR See previous message.
141 CC_VERS_STR = msvc$(CC_VERS_NUM)
143 # ----------------------------------------------------
144 # Verify that current subdir is the c-ares source one
145 # ----------------------------------------------------
147 !IF ! EXIST(.\ares_init.c)
148 ! MESSAGE Can not process Makefile.msvc from outside of c-ares source subdirectory.
149 ! MESSAGE Change to the subdirectory where Makefile.msvc is found, and try again.
150 ! ERROR See previous message.
153 # ------------------------------------------------------------------
154 # Base subdir is the common root from which other subdirs will hang,
155 # the name depends on MSVC version being used when building c-ares.
156 # ------------------------------------------------------------------
158 BASE_DIR = .\$(CC_VERS_STR)
160 # ----------------------------------------
161 # Subdir holding sources for all projects
162 # ----------------------------------------
166 # -----------------------------
167 # Default installation subdirs
168 # -----------------------------
174 !IFNDEF INSTALL_DIR_LIB
175 INSTALL_DIR_LIB = $(INSTALL_DIR)\lib
178 !IFNDEF INSTALL_DIR_INC
179 INSTALL_DIR_INC = $(INSTALL_DIR)\include
182 # -------------------------
183 # Configuration validation
184 # -------------------------
187 !IF "$(CFG)" == "lib-release" || "$(CFG)" == "lib-debug" || \
188 "$(CFG)" == "dll-release" || "$(CFG)" == "dll-debug"
192 !IF "$(VALID_CFGSET)" == "FALSE" && "$(CFG)" != ""
193 ! MESSAGE MSVC c-ares makefile
195 ! MESSAGE Usage: nmake /f makefile.msvc CFG=<config> <target>
197 ! MESSAGE <config> must be one of: [ lib-release | lib-debug | dll-release | dll-debug }
198 ! MESSAGE <target> must be one of: [ ALL | c-ares | acountry | adig | ahost | clean }
200 ! MESSAGE If a <target> other than ALL or clean is given, <config> becomes mandatory.
202 ! MESSAGE If neither <config> nor <target> are specified this results in
203 ! MESSAGE all targets being built for all <config> c-ares library types.
205 ! ERROR Choose a valid configuration.
208 # --------------------------------------------------------
209 # Project subdirs independent of configuration being used
210 # --------------------------------------------------------
212 CARES_DIR = $(BASE_DIR)\cares
213 PROG1_DIR = $(BASE_DIR)\acountry
214 PROG2_DIR = $(BASE_DIR)\adig
215 PROG3_DIR = $(BASE_DIR)\ahost
217 # ---------------------------------------------------
218 # Subdirs which are configuration dependent are only
219 # defined when a valid configuration has been given.
220 # ---------------------------------------------------
222 !IF "$(VALID_CFGSET)" == "TRUE"
223 CARES_OUTDIR = $(CARES_DIR)\$(CFG)
224 PROG1_OUTDIR = $(PROG1_DIR)\$(CFG)
225 PROG2_OUTDIR = $(PROG2_DIR)\$(CFG)
226 PROG3_OUTDIR = $(PROG3_DIR)\$(CFG)
227 CARES_OBJDIR = $(CARES_OUTDIR)\obj
228 PROG1_OBJDIR = $(PROG1_OUTDIR)\obj
229 PROG2_OBJDIR = $(PROG2_OUTDIR)\obj
230 PROG3_OBJDIR = $(PROG3_OUTDIR)\obj
242 # -------------------------------------
243 # Settings that depend on tcp/ip stack
244 # -------------------------------------
246 !IF "$(USE_WATT32)" == "1"
247 CFLAGS = /UWIN32 /DWATT32 /I$(WATT_ROOT)\inc
248 EX_LIBS_REL = $(WATT_ROOT)\lib\wattcpvc_imp.lib
249 EX_LIBS_DBG = $(WATT_ROOT)\lib\wattcpvc_imp_d.lib
252 EX_LIBS_REL = ws2_32.lib advapi32.lib kernel32.lib
253 EX_LIBS_DBG = ws2_32.lib advapi32.lib kernel32.lib
256 # -----------------------------------------
257 # Switches that depend on compiler version
258 # -----------------------------------------
260 !IF $(CC_VERS_NUM) == 60
262 PDBTYPE_CONSOLIDATE = /pdbtype:consolidate
265 !UNDEF PDBTYPE_CONSOLIDATE
268 !IF $(CC_VERS_NUM) <= 70
269 RT_ERROR_CHECKING = /GZ
271 RT_ERROR_CHECKING = /RTCsu
274 # ----------------------------
275 # Assorted commands and flags
276 # ----------------------------
278 CC_CMD_REL = cl.exe /nologo $(RTLIB) /DNDEBUG /O2
279 CC_CMD_DBG = cl.exe /nologo $(RTLIBD) /D_DEBUG /Od /Zi $(RT_ERROR_CHECKING)
280 CC_CFLAGS = $(CFLAGS) /I. /W3 /EHsc /FD
282 RC_CMD_REL = rc.exe /l 0x409 /d "NDEBUG"
283 RC_CMD_DBG = rc.exe /l 0x409 /d "_DEBUG"
285 LINK_CMD_LIB = link.exe /lib /nologo
286 LINK_CMD_DLL = link.exe /dll /nologo /incremental:no /fixed:no
287 LINK_CMD_EXE = link.exe /nologo /incremental:no /fixed:no /subsystem:console
289 LINK_CMD_EXE_REL = $(LINK_CMD_EXE) /release $(PDB_NONE)
290 LINK_CMD_EXE_DBG = $(LINK_CMD_EXE) /debug $(PDBTYPE_CONSOLIDATE)
292 # ---------------------------------
293 # Configuration dependent settings
294 # ---------------------------------
296 !IF "$(CFG)" == "lib-release"
297 CARES_TARGET = $(STA_LIB_REL).lib
298 CARES_CFLAGS = /DCARES_BUILDING_LIBRARY /DCARES_STATICLIB
300 SPROG_CFLAGS = /DCARES_STATICLIB
301 SPROG_LFLAGS = /libpath:$(CARES_OUTDIR) $(EX_LIBS_REL) $(STA_LIB_REL).lib
302 CARES_LINK = $(LINK_CMD_LIB)
303 SPROG_LINK = $(LINK_CMD_EXE_REL)
304 CC_CMD = $(CC_CMD_REL)
307 !IF "$(CFG)" == "lib-debug"
308 CARES_TARGET = $(STA_LIB_DBG).lib
309 CARES_CFLAGS = /DCARES_BUILDING_LIBRARY /DCARES_STATICLIB /DDEBUGBUILD
311 SPROG_CFLAGS = /DCARES_STATICLIB
312 SPROG_LFLAGS = /libpath:$(CARES_OUTDIR) $(EX_LIBS_DBG) $(STA_LIB_DBG).lib
313 CARES_LINK = $(LINK_CMD_LIB)
314 SPROG_LINK = $(LINK_CMD_EXE_DBG)
315 CC_CMD = $(CC_CMD_DBG)
318 !IF "$(CFG)" == "dll-release"
319 CARES_TARGET = $(DYN_LIB_REL).dll
320 CARES_CFLAGS = /DCARES_BUILDING_LIBRARY
321 CARES_LFLAGS = /release $(EX_LIBS_REL) /implib:$(CARES_OUTDIR)\$(IMP_LIB_REL).lib $(PDB_NONE)
323 SPROG_LFLAGS = /libpath:$(CARES_OUTDIR) $(EX_LIBS_REL) $(IMP_LIB_REL).lib
324 CARES_LINK = $(LINK_CMD_DLL)
325 SPROG_LINK = $(LINK_CMD_EXE_REL)
326 CC_CMD = $(CC_CMD_REL)
328 RC_CMD = $(RC_CMD_REL)
331 !IF "$(CFG)" == "dll-debug"
332 CARES_TARGET = $(DYN_LIB_DBG).dll
333 CARES_CFLAGS = /DCARES_BUILDING_LIBRARY /DDEBUGBUILD
334 CARES_LFLAGS = /debug $(EX_LIBS_DBG) /implib:$(CARES_OUTDIR)\$(IMP_LIB_DBG).lib /pdb:$(CARES_OUTDIR)\$(DYN_LIB_DBG).pdb $(PDBTYPE_CONSOLIDATE)
336 SPROG_LFLAGS = /libpath:$(CARES_OUTDIR) $(EX_LIBS_DBG) $(IMP_LIB_DBG).lib
337 CARES_LINK = $(LINK_CMD_DLL)
338 SPROG_LINK = $(LINK_CMD_EXE_DBG)
339 CC_CMD = $(CC_CMD_DBG)
341 RC_CMD = $(RC_CMD_DBG)
344 # --------------------------------------------
345 # Makefile.inc provides lists of source files
346 # --------------------------------------------
348 !INCLUDE .\Makefile.inc
350 # ----------------------------
351 # Build lists of object files
352 # ----------------------------
354 !IF "$(VALID_CFGSET)" == "TRUE"
356 !IF [ECHO CARES_OBJS=^$(CARES_OBJDIR)\$(CSOURCES: = $(CARES_OBJDIR^)\) > .\cares_objs.inc] == 0
357 !INCLUDE .\cares_objs.inc
358 !IF [DEL .\cares_objs.inc]
361 !ERROR Problem generating CARES_OBJS list.
363 CARES_OBJS = $(CARES_OBJS:.c=.obj)
364 !IF "$(USE_RES_FILE)" == "TRUE"
365 CARES_OBJS = $(CARES_OBJS) $(CARES_OBJDIR)\cares.res
368 !IF [ECHO PROG1_OBJS=^$(PROG1_OBJDIR)\$(SAMPLESOURCES: = $(PROG1_OBJDIR^)\) > .\prog1_objs.inc] == 0
369 !INCLUDE .\prog1_objs.inc
370 !IF [DEL .\prog1_objs.inc]
373 !ERROR Problem generating PROG1_OBJS list.
375 PROG1_OBJS = $(PROG1_OBJS:.c=.obj)
376 PROG1_OBJS = $(PROG1_OBJS) $(PROG1_OBJDIR)\acountry.obj
378 !IF [ECHO PROG2_OBJS=^$(PROG2_OBJDIR)\$(SAMPLESOURCES: = $(PROG2_OBJDIR^)\) > .\prog2_objs.inc] == 0
379 !INCLUDE .\prog2_objs.inc
380 !IF [DEL .\prog2_objs.inc]
383 !ERROR Problem generating PROG2_OBJS list.
385 PROG2_OBJS = $(PROG2_OBJS:.c=.obj)
386 PROG2_OBJS = $(PROG2_OBJS) $(PROG2_OBJDIR)\adig.obj
388 !IF [ECHO PROG3_OBJS=^$(PROG3_OBJDIR)\$(SAMPLESOURCES: = $(PROG3_OBJDIR^)\) > .\prog3_objs.inc] == 0
389 !INCLUDE .\prog3_objs.inc
390 !IF [DEL .\prog3_objs.inc]
393 !ERROR Problem generating PROG3_OBJS list.
395 PROG3_OBJS = $(PROG3_OBJS:.c=.obj)
396 PROG3_OBJS = $(PROG3_OBJS) $(PROG3_OBJDIR)\ahost.obj
400 # --------------------------------
401 # Only our custom inference rules
402 # --------------------------------
407 {$(SRCDIR)}.rc{$(CARES_OBJDIR)}.res:
410 {$(SRCDIR)}.c{$(CARES_OBJDIR)}.obj:
411 $(CC_CMD) $(CC_CFLAGS) $(CARES_CFLAGS) /Fo$@ /Fd$(@D)\ /c $<
413 {$(SRCDIR)}.c{$(PROG1_OBJDIR)}.obj:
414 $(CC_CMD) $(CC_CFLAGS) $(SPROG_CFLAGS) /Fo$@ /Fd$(@D)\ /c $<
416 {$(SRCDIR)}.c{$(PROG2_OBJDIR)}.obj:
417 $(CC_CMD) $(CC_CFLAGS) $(SPROG_CFLAGS) /Fo$@ /Fd$(@D)\ /c $<
419 {$(SRCDIR)}.c{$(PROG3_OBJDIR)}.obj:
420 $(CC_CMD) $(CC_CFLAGS) $(SPROG_CFLAGS) /Fo$@ /Fd$(@D)\ /c $<
422 # ------------------------------------------------------------- #
423 # ------------------------------------------------------------- #
424 # Default target when no CFG library type has been specified, #
425 # results in building target ALL for all c-ares library types. #
426 # ------------------------------------------------------------- #
427 # ------------------------------------------------------------- #
429 !IF "$(VALID_CFGSET)" == "FALSE"
432 $(MAKE) /f .\Makefile.msvc CFG=lib-release ALL
433 $(MAKE) /f .\Makefile.msvc CFG=lib-debug ALL
434 $(MAKE) /f .\Makefile.msvc CFG=dll-release ALL
435 $(MAKE) /f .\Makefile.msvc CFG=dll-debug ALL
438 @-RMDIR /S /Q $(BASE_DIR) >NUL 2>&1
441 @$(MAKE) /nologo /f .\Makefile.msvc CFG=lib-release install
442 @$(MAKE) /nologo /f .\Makefile.msvc CFG=lib-debug install
443 @$(MAKE) /nologo /f .\Makefile.msvc CFG=dll-release install
444 @$(MAKE) /nologo /f .\Makefile.msvc CFG=dll-debug install
448 # ---------------------------------------------------------------------
449 # Targets only available when a proper CFG library type has been given
450 # ---------------------------------------------------------------------
452 !IF "$(VALID_CFGSET)" == "TRUE"
454 ALL: c-ares acountry adig ahost
457 c-ares: $(HHEADERS) $(CSOURCES) $(CARES_OBJDIR) $(CARES_OBJS) $(CARES_OUTDIR)
458 $(CARES_LINK) $(CARES_LFLAGS) /out:$(CARES_OUTDIR)\$(CARES_TARGET) $(CARES_OBJS)
459 ! IF "$(USE_RES_FILE)" == "TRUE"
460 @if exist $(CARES_OUTDIR)\$(CARES_TARGET).manifest mt -nologo -manifest $(CARES_OUTDIR)\$(CARES_TARGET).manifest -outputresource:$(CARES_OUTDIR)\$(CARES_TARGET);2
463 acountry: c-ares acountry.c $(SAMPLESOURCES) $(SAMPLEHEADERS) $(PROG1_OBJDIR) $(PROG1_OBJS) $(PROG1_OUTDIR)
464 $(SPROG_LINK) $(SPROG_LFLAGS) /out:$(PROG1_OUTDIR)\acountry.exe $(PROG1_OBJS)
465 @if exist $(PROG1_OUTDIR)\acountry.exe.manifest mt -nologo -manifest $(PROG1_OUTDIR)\acountry.exe.manifest -outputresource:$(PROG1_OUTDIR)\acountry.exe;1
467 adig: c-ares adig.c $(SAMPLESOURCES) $(SAMPLEHEADERS) $(PROG2_OBJDIR) $(PROG2_OBJS) $(PROG2_OUTDIR)
468 $(SPROG_LINK) $(SPROG_LFLAGS) /out:$(PROG2_OUTDIR)\adig.exe $(PROG2_OBJS)
469 @if exist $(PROG2_OUTDIR)\adig.exe.manifest mt -nologo -manifest $(PROG2_OUTDIR)\adig.exe.manifest -outputresource:$(PROG2_OUTDIR)\adig.exe;1
471 ahost: c-ares ahost.c $(SAMPLESOURCES) $(SAMPLEHEADERS) $(PROG3_OBJDIR) $(PROG3_OBJS) $(PROG3_OUTDIR)
472 $(SPROG_LINK) $(SPROG_LFLAGS) /out:$(PROG3_OUTDIR)\ahost.exe $(PROG3_OBJS)
473 @if exist $(PROG3_OUTDIR)\ahost.exe.manifest mt -nologo -manifest $(PROG3_OUTDIR)\ahost.exe.manifest -outputresource:$(PROG3_OUTDIR)\ahost.exe;1
475 $(CARES_OUTDIR): $(CARES_DIR)
476 @if not exist $(CARES_OUTDIR) mkdir $(CARES_OUTDIR)
478 $(PROG1_OUTDIR): $(PROG1_DIR)
479 @if not exist $(PROG1_OUTDIR) mkdir $(PROG1_OUTDIR)
481 $(PROG2_OUTDIR): $(PROG2_DIR)
482 @if not exist $(PROG2_OUTDIR) mkdir $(PROG2_OUTDIR)
484 $(PROG3_OUTDIR): $(PROG3_DIR)
485 @if not exist $(PROG3_OUTDIR) mkdir $(PROG3_OUTDIR)
487 $(CARES_OBJDIR): $(CARES_OUTDIR)
488 @if not exist $(CARES_OBJDIR) mkdir $(CARES_OBJDIR)
490 $(PROG1_OBJDIR): $(PROG1_OUTDIR)
491 @if not exist $(PROG1_OBJDIR) mkdir $(PROG1_OBJDIR)
493 $(PROG2_OBJDIR): $(PROG2_OUTDIR)
494 @if not exist $(PROG2_OBJDIR) mkdir $(PROG2_OBJDIR)
496 $(PROG3_OBJDIR): $(PROG3_OUTDIR)
497 @if not exist $(PROG3_OBJDIR) mkdir $(PROG3_OBJDIR)
500 @-RMDIR /S /Q $(CARES_OUTDIR) >NUL 2>&1
501 @-RMDIR /S /Q $(PROG1_OUTDIR) >NUL 2>&1
502 @-RMDIR /S /Q $(PROG2_OUTDIR) >NUL 2>&1
503 @-RMDIR /S /Q $(PROG3_OUTDIR) >NUL 2>&1
506 @if not exist $(CARES_OUTDIR)\$(CARES_TARGET) \
507 $(MAKE) /f .\Makefile.msvc CFG=$(CFG) c-ares
508 @if not exist "$(INSTALL_DIR)" mkdir "$(INSTALL_DIR)"
509 @if not exist "$(INSTALL_DIR_LIB)" mkdir "$(INSTALL_DIR_LIB)"
510 @if not exist "$(INSTALL_DIR_INC)" mkdir "$(INSTALL_DIR_INC)"
511 @copy /y $(CARES_OUTDIR)\*.* "$(INSTALL_DIR_LIB)" >NUL
512 @copy /y $(SRCDIR)\ares.h "$(INSTALL_DIR_INC)" >NUL
513 @copy /y $(SRCDIR)\ares_build.h "$(INSTALL_DIR_INC)" >NUL
514 @copy /y $(SRCDIR)\ares_rules.h "$(INSTALL_DIR_INC)" >NUL
515 @copy /y $(SRCDIR)\ares_version.h "$(INSTALL_DIR_INC)" >NUL
516 @echo Installed c-ares $(CFG)
521 @if not exist $(BASE_DIR) mkdir $(BASE_DIR)
523 $(CARES_DIR): $(BASE_DIR)
524 @if not exist $(CARES_DIR) mkdir $(CARES_DIR)
526 $(PROG1_DIR): $(BASE_DIR)
527 @if not exist $(PROG1_DIR) mkdir $(PROG1_DIR)
529 $(PROG2_DIR): $(BASE_DIR)
530 @if not exist $(PROG2_DIR) mkdir $(PROG2_DIR)
532 $(PROG3_DIR): $(BASE_DIR)
533 @if not exist $(PROG3_DIR) mkdir $(PROG3_DIR)
535 # End of Makefile.msvc