1 2# Copyright (C) 2009-2013 by Daniel Stenberg 3# 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. 15 16# ------------------------------------------------------------------------------ 17# 18# Makefile for building c-ares libraries and sample programs with MSVC. 19# 20# Usage: nmake /f makefile.msvc CFG=<config> <target> 21# 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 } 24# 25# If a <target> other than ALL or clean is given, <config> becomes mandatory. 26# 27# If neither <config> nor <target> are specified this results in 28# all targets being built for all <config> c-ares library types. 29# 30# This makefile must be processed from the subdir where it is located. 31# 32# All results are generated below a subdirectory named msvcXXX. 33# 34# ------------------------------------------------------------------------------ 35 36NAME = cares 37 38# ------------------------------------------------ 39# c-ares static and dynamic libraries common base 40# file names for release and debug configurations 41# ------------------------------------------------ 42 43STA_LIB_REL = lib$(NAME) 44DYN_LIB_REL = $(NAME) 45STA_LIB_DBG = $(STA_LIB_REL)d 46DYN_LIB_DBG = $(DYN_LIB_REL)d 47 48# ------------------------------------------- 49# Base names for c-ares DLL import libraries 50# ------------------------------------------- 51 52IMP_LIB_REL = $(DYN_LIB_REL) 53IMP_LIB_DBG = $(DYN_LIB_DBG) 54 55# -------------------------- 56# Runtime library selection 57# -------------------------- 58 59RTLIB = /MD 60RTLIBD = /MDd 61 62!IF "$(RTLIBCFG)" == "static" 63RTLIB = /MT 64RTLIBD = /MTd 65!ENDIF 66 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# -------------------------------------------------------- 71 72USE_WATT32 = 0 73 74# -------------------------------------------------------- 75# Detect compiler version. 76# -------------------------------------------------------- 77!INCLUDE .\msvc_ver.inc 78 79# ---------------------------------------------------- 80# Verify that current subdir is the c-ares source one 81# ---------------------------------------------------- 82 83!IF ! EXIST(.\ares_init.c) 84! MESSAGE Can not process Makefile.msvc from outside of c-ares source subdirectory. 85! MESSAGE Change to the subdirectory where Makefile.msvc is found, and try again. 86! ERROR See previous message. 87!ENDIF 88 89# ------------------------------------------------------------------ 90# Base subdir is the common root from which other subdirs will hang. 91# ------------------------------------------------------------------ 92 93BASE_DIR = .\msvc 94 95# ---------------------------------------- 96# Subdir holding sources for all projects 97# ---------------------------------------- 98 99SRCDIR = . 100 101# ----------------------------- 102# Default installation subdirs 103# ----------------------------- 104 105!IFNDEF INSTALL_DIR 106INSTALL_DIR = . 107!ENDIF 108 109!IFNDEF INSTALL_DIR_LIB 110INSTALL_DIR_LIB = $(INSTALL_DIR)\lib 111!ENDIF 112 113!IFNDEF INSTALL_DIR_INC 114INSTALL_DIR_INC = $(INSTALL_DIR)\include 115!ENDIF 116 117# ------------------------- 118# Configuration validation 119# ------------------------- 120 121VALID_CFGSET = FALSE 122!IF "$(CFG)" == "lib-release" || "$(CFG)" == "lib-debug" || \ 123 "$(CFG)" == "dll-release" || "$(CFG)" == "dll-debug" 124VALID_CFGSET = TRUE 125!ENDIF 126 127!IF "$(VALID_CFGSET)" == "FALSE" && "$(CFG)" != "" 128! MESSAGE MSVC c-ares makefile 129! MESSAGE 130! MESSAGE Usage: nmake /f makefile.msvc CFG=<config> <target> 131! MESSAGE 132! MESSAGE <config> must be one of: [ lib-release | lib-debug | dll-release | dll-debug } 133! MESSAGE <target> must be one of: [ ALL | c-ares | acountry | adig | ahost | clean } 134! MESSAGE 135! MESSAGE If a <target> other than ALL or clean is given, <config> becomes mandatory. 136! MESSAGE 137! MESSAGE If neither <config> nor <target> are specified this results in 138! MESSAGE all targets being built for all <config> c-ares library types. 139! MESSAGE 140! ERROR Choose a valid configuration. 141!ENDIF 142 143# -------------------------------------------------------- 144# Project subdirs independent of configuration being used 145# -------------------------------------------------------- 146 147CARES_DIR = $(BASE_DIR)\cares 148PROG1_DIR = $(BASE_DIR)\acountry 149PROG2_DIR = $(BASE_DIR)\adig 150PROG3_DIR = $(BASE_DIR)\ahost 151 152# --------------------------------------------------- 153# Subdirs which are configuration dependent are only 154# defined when a valid configuration has been given. 155# --------------------------------------------------- 156 157!IF "$(VALID_CFGSET)" == "TRUE" 158CARES_OUTDIR = $(CARES_DIR)\$(CFG) 159PROG1_OUTDIR = $(PROG1_DIR)\$(CFG) 160PROG2_OUTDIR = $(PROG2_DIR)\$(CFG) 161PROG3_OUTDIR = $(PROG3_DIR)\$(CFG) 162CARES_OBJDIR = $(CARES_OUTDIR)\obj 163PROG1_OBJDIR = $(PROG1_OUTDIR)\obj 164PROG2_OBJDIR = $(PROG2_OUTDIR)\obj 165PROG3_OBJDIR = $(PROG3_OUTDIR)\obj 166!ELSE 167!UNDEF CARES_OUTDIR 168!UNDEF PROG1_OUTDIR 169!UNDEF PROG2_OUTDIR 170!UNDEF PROG3_OUTDIR 171!UNDEF CARES_OBJDIR 172!UNDEF PROG1_OBJDIR 173!UNDEF PROG2_OBJDIR 174!UNDEF PROG3_OBJDIR 175!ENDIF 176 177# ------------------------------------- 178# Settings that depend on tcp/ip stack 179# ------------------------------------- 180 181!IF "$(USE_WATT32)" == "1" 182CFLAGS = /UWIN32 /DWATT32 /I$(WATT_ROOT)\inc 183EX_LIBS_REL = $(WATT_ROOT)\lib\wattcpvc_imp.lib 184EX_LIBS_DBG = $(WATT_ROOT)\lib\wattcpvc_imp_d.lib 185!ELSE 186CFLAGS = /DWIN32 /D_WIN32_WINNT=0x0600 187EX_LIBS_REL = ws2_32.lib advapi32.lib kernel32.lib 188EX_LIBS_DBG = ws2_32.lib advapi32.lib kernel32.lib 189!ENDIF 190 191# ------------------------------------------------- 192# Switches that depend on ancient compiler versions 193# ------------------------------------------------- 194 195!IF $(CC_VERS_NUM) == 60 196PDB_NONE = /pdb:none 197PDBTYPE_CONSOLIDATE = /pdbtype:consolidate 198!ELSE 199!UNDEF PDB_NONE 200!UNDEF PDBTYPE_CONSOLIDATE 201!ENDIF 202 203!IF $(CC_VERS_NUM) <= 70 204RT_ERROR_CHECKING = /GZ 205!ELSE 206RT_ERROR_CHECKING = /RTCsu 207!ENDIF 208 209# ---------------------------- 210# Assorted commands and flags 211# ---------------------------- 212 213CC_CMD_REL = cl.exe /nologo $(RTLIB) /DNDEBUG /O2 214CC_CMD_DBG = cl.exe /nologo $(RTLIBD) /D_DEBUG /Od /Zi $(RT_ERROR_CHECKING) 215CC_CFLAGS = $(CFLAGS) /I. /W3 /EHsc /FD 216 217RC_CMD_REL = rc.exe /l 0x409 /d "NDEBUG" 218RC_CMD_DBG = rc.exe /l 0x409 /d "_DEBUG" 219 220LINK_CMD_LIB = link.exe /lib /nologo 221LINK_CMD_DLL = link.exe /dll /nologo /incremental:no /fixed:no 222LINK_CMD_EXE = link.exe /nologo /incremental:no /fixed:no /subsystem:console 223 224LINK_CMD_EXE_REL = $(LINK_CMD_EXE) /release $(PDB_NONE) 225LINK_CMD_EXE_DBG = $(LINK_CMD_EXE) /debug $(PDBTYPE_CONSOLIDATE) 226 227# --------------------------------- 228# Configuration dependent settings 229# --------------------------------- 230 231!IF "$(CFG)" == "lib-release" 232CARES_TARGET = $(STA_LIB_REL).lib 233CARES_CFLAGS = /DCARES_BUILDING_LIBRARY /DCARES_STATICLIB 234CARES_LFLAGS = 235SPROG_CFLAGS = /DCARES_STATICLIB 236SPROG_LFLAGS = /libpath:$(CARES_OUTDIR) $(EX_LIBS_REL) $(STA_LIB_REL).lib 237CARES_LINK = $(LINK_CMD_LIB) 238SPROG_LINK = $(LINK_CMD_EXE_REL) 239CC_CMD = $(CC_CMD_REL) 240!ENDIF 241 242!IF "$(CFG)" == "lib-debug" 243CARES_TARGET = $(STA_LIB_DBG).lib 244CARES_CFLAGS = /DCARES_BUILDING_LIBRARY /DCARES_STATICLIB /DDEBUGBUILD 245CARES_LFLAGS = 246SPROG_CFLAGS = /DCARES_STATICLIB 247SPROG_LFLAGS = /libpath:$(CARES_OUTDIR) $(EX_LIBS_DBG) $(STA_LIB_DBG).lib 248CARES_LINK = $(LINK_CMD_LIB) 249SPROG_LINK = $(LINK_CMD_EXE_DBG) 250CC_CMD = $(CC_CMD_DBG) 251!ENDIF 252 253!IF "$(CFG)" == "dll-release" 254CARES_TARGET = $(DYN_LIB_REL).dll 255CARES_CFLAGS = /DCARES_BUILDING_LIBRARY 256CARES_LFLAGS = /release $(EX_LIBS_REL) /implib:$(CARES_OUTDIR)\$(IMP_LIB_REL).lib $(PDB_NONE) 257SPROG_CFLAGS = 258SPROG_LFLAGS = /libpath:$(CARES_OUTDIR) $(EX_LIBS_REL) $(IMP_LIB_REL).lib 259CARES_LINK = $(LINK_CMD_DLL) 260SPROG_LINK = $(LINK_CMD_EXE_REL) 261CC_CMD = $(CC_CMD_REL) 262USE_RES_FILE = TRUE 263RC_CMD = $(RC_CMD_REL) 264!ENDIF 265 266!IF "$(CFG)" == "dll-debug" 267CARES_TARGET = $(DYN_LIB_DBG).dll 268CARES_CFLAGS = /DCARES_BUILDING_LIBRARY /DDEBUGBUILD 269CARES_LFLAGS = /debug $(EX_LIBS_DBG) /implib:$(CARES_OUTDIR)\$(IMP_LIB_DBG).lib /pdb:$(CARES_OUTDIR)\$(DYN_LIB_DBG).pdb $(PDBTYPE_CONSOLIDATE) 270SPROG_CFLAGS = 271SPROG_LFLAGS = /libpath:$(CARES_OUTDIR) $(EX_LIBS_DBG) $(IMP_LIB_DBG).lib 272CARES_LINK = $(LINK_CMD_DLL) 273SPROG_LINK = $(LINK_CMD_EXE_DBG) 274CC_CMD = $(CC_CMD_DBG) 275USE_RES_FILE = TRUE 276RC_CMD = $(RC_CMD_DBG) 277!ENDIF 278 279# -------------------------------------------- 280# Makefile.inc provides lists of source files 281# -------------------------------------------- 282 283!INCLUDE .\Makefile.inc 284 285# ---------------------------- 286# Build lists of object files 287# ---------------------------- 288 289!IF "$(VALID_CFGSET)" == "TRUE" 290 291!IF [ECHO CARES_OBJS=^$(CARES_OBJDIR)\$(CSOURCES: = $(CARES_OBJDIR^)\) > .\cares_objs.inc] == 0 292!INCLUDE .\cares_objs.inc 293!IF [DEL .\cares_objs.inc] 294!ENDIF 295!ELSE 296!ERROR Problem generating CARES_OBJS list. 297!ENDIF 298CARES_OBJS = $(CARES_OBJS:.c=.obj) 299!IF "$(USE_RES_FILE)" == "TRUE" 300CARES_OBJS = $(CARES_OBJS) $(CARES_OBJDIR)\cares.res 301!ENDIF 302 303!IF [ECHO PROG1_OBJS=^$(PROG1_OBJDIR)\$(SAMPLESOURCES: = $(PROG1_OBJDIR^)\) > .\prog1_objs.inc] == 0 304!INCLUDE .\prog1_objs.inc 305!IF [DEL .\prog1_objs.inc] 306!ENDIF 307!ELSE 308!ERROR Problem generating PROG1_OBJS list. 309!ENDIF 310PROG1_OBJS = $(PROG1_OBJS:.c=.obj) 311PROG1_OBJS = $(PROG1_OBJS) $(PROG1_OBJDIR)\acountry.obj 312 313!IF [ECHO PROG2_OBJS=^$(PROG2_OBJDIR)\$(SAMPLESOURCES: = $(PROG2_OBJDIR^)\) > .\prog2_objs.inc] == 0 314!INCLUDE .\prog2_objs.inc 315!IF [DEL .\prog2_objs.inc] 316!ENDIF 317!ELSE 318!ERROR Problem generating PROG2_OBJS list. 319!ENDIF 320PROG2_OBJS = $(PROG2_OBJS:.c=.obj) 321PROG2_OBJS = $(PROG2_OBJS) $(PROG2_OBJDIR)\adig.obj 322 323!IF [ECHO PROG3_OBJS=^$(PROG3_OBJDIR)\$(SAMPLESOURCES: = $(PROG3_OBJDIR^)\) > .\prog3_objs.inc] == 0 324!INCLUDE .\prog3_objs.inc 325!IF [DEL .\prog3_objs.inc] 326!ENDIF 327!ELSE 328!ERROR Problem generating PROG3_OBJS list. 329!ENDIF 330PROG3_OBJS = $(PROG3_OBJS:.c=.obj) 331PROG3_OBJS = $(PROG3_OBJS) $(PROG3_OBJDIR)\ahost.obj 332 333!ENDIF 334 335# -------------------------------- 336# Only our custom inference rules 337# -------------------------------- 338 339.SUFFIXES: 340.SUFFIXES: .c .rc 341 342{$(SRCDIR)}.rc{$(CARES_OBJDIR)}.res: 343 $(RC_CMD) /Fo $@ $< 344 345{$(SRCDIR)}.c{$(CARES_OBJDIR)}.obj: 346 $(CC_CMD) $(CC_CFLAGS) $(CARES_CFLAGS) /Fo$@ /Fd$(@D)\ /c $< 347 348{$(SRCDIR)}.c{$(PROG1_OBJDIR)}.obj: 349 $(CC_CMD) $(CC_CFLAGS) $(SPROG_CFLAGS) /Fo$@ /Fd$(@D)\ /c $< 350 351{$(SRCDIR)}.c{$(PROG2_OBJDIR)}.obj: 352 $(CC_CMD) $(CC_CFLAGS) $(SPROG_CFLAGS) /Fo$@ /Fd$(@D)\ /c $< 353 354{$(SRCDIR)}.c{$(PROG3_OBJDIR)}.obj: 355 $(CC_CMD) $(CC_CFLAGS) $(SPROG_CFLAGS) /Fo$@ /Fd$(@D)\ /c $< 356 357# ------------------------------------------------------------- # 358# ------------------------------------------------------------- # 359# Default target when no CFG library type has been specified, # 360# results in building target ALL for all c-ares library types. # 361# ------------------------------------------------------------- # 362# ------------------------------------------------------------- # 363 364!IF "$(VALID_CFGSET)" == "FALSE" 365 366ALL: 367 $(MAKE) /NOLOGO /f .\Makefile.msvc CFG=lib-release ALL 368 $(MAKE) /NOLOGO /f .\Makefile.msvc CFG=lib-debug ALL 369 $(MAKE) /NOLOGO /f .\Makefile.msvc CFG=dll-release ALL 370 $(MAKE) /NOLOGO /f .\Makefile.msvc CFG=dll-debug ALL 371 372clean: 373 @-RMDIR /S /Q $(BASE_DIR) >NUL 2>&1 374 375install: 376 @$(MAKE) /nologo /f .\Makefile.msvc CFG=lib-release install 377 @$(MAKE) /nologo /f .\Makefile.msvc CFG=lib-debug install 378 @$(MAKE) /nologo /f .\Makefile.msvc CFG=dll-release install 379 @$(MAKE) /nologo /f .\Makefile.msvc CFG=dll-debug install 380 381!ENDIF 382 383# --------------------------------------------------------------------- 384# Targets only available when a proper CFG library type has been given 385# --------------------------------------------------------------------- 386 387!IF "$(VALID_CFGSET)" == "TRUE" 388 389ALL: c-ares acountry adig ahost 390 @ 391 392c-ares: $(HHEADERS) $(CSOURCES) $(CARES_OBJDIR) $(CARES_OBJS) $(CARES_OUTDIR) 393 $(CARES_LINK) $(CARES_LFLAGS) /out:$(CARES_OUTDIR)\$(CARES_TARGET) $(CARES_OBJS) 394! IF "$(USE_RES_FILE)" == "TRUE" 395 @if exist $(CARES_OUTDIR)\$(CARES_TARGET).manifest mt -nologo -manifest $(CARES_OUTDIR)\$(CARES_TARGET).manifest -outputresource:$(CARES_OUTDIR)\$(CARES_TARGET);2 396! ENDIF 397 398acountry: c-ares acountry.c $(SAMPLESOURCES) $(SAMPLEHEADERS) $(PROG1_OBJDIR) $(PROG1_OBJS) $(PROG1_OUTDIR) 399 $(SPROG_LINK) $(SPROG_LFLAGS) /out:$(PROG1_OUTDIR)\acountry.exe $(PROG1_OBJS) 400 @if exist $(PROG1_OUTDIR)\acountry.exe.manifest mt -nologo -manifest $(PROG1_OUTDIR)\acountry.exe.manifest -outputresource:$(PROG1_OUTDIR)\acountry.exe;1 401 402adig: c-ares adig.c $(SAMPLESOURCES) $(SAMPLEHEADERS) $(PROG2_OBJDIR) $(PROG2_OBJS) $(PROG2_OUTDIR) 403 $(SPROG_LINK) $(SPROG_LFLAGS) /out:$(PROG2_OUTDIR)\adig.exe $(PROG2_OBJS) 404 @if exist $(PROG2_OUTDIR)\adig.exe.manifest mt -nologo -manifest $(PROG2_OUTDIR)\adig.exe.manifest -outputresource:$(PROG2_OUTDIR)\adig.exe;1 405 406ahost: c-ares ahost.c $(SAMPLESOURCES) $(SAMPLEHEADERS) $(PROG3_OBJDIR) $(PROG3_OBJS) $(PROG3_OUTDIR) 407 $(SPROG_LINK) $(SPROG_LFLAGS) /out:$(PROG3_OUTDIR)\ahost.exe $(PROG3_OBJS) 408 @if exist $(PROG3_OUTDIR)\ahost.exe.manifest mt -nologo -manifest $(PROG3_OUTDIR)\ahost.exe.manifest -outputresource:$(PROG3_OUTDIR)\ahost.exe;1 409 410$(CARES_OUTDIR): $(CARES_DIR) 411 @if not exist $(CARES_OUTDIR) mkdir $(CARES_OUTDIR) 412 413$(PROG1_OUTDIR): $(PROG1_DIR) 414 @if not exist $(PROG1_OUTDIR) mkdir $(PROG1_OUTDIR) 415 416$(PROG2_OUTDIR): $(PROG2_DIR) 417 @if not exist $(PROG2_OUTDIR) mkdir $(PROG2_OUTDIR) 418 419$(PROG3_OUTDIR): $(PROG3_DIR) 420 @if not exist $(PROG3_OUTDIR) mkdir $(PROG3_OUTDIR) 421 422$(CARES_OBJDIR): $(CARES_OUTDIR) 423 @if not exist $(CARES_OBJDIR) mkdir $(CARES_OBJDIR) 424 425$(PROG1_OBJDIR): $(PROG1_OUTDIR) 426 @if not exist $(PROG1_OBJDIR) mkdir $(PROG1_OBJDIR) 427 428$(PROG2_OBJDIR): $(PROG2_OUTDIR) 429 @if not exist $(PROG2_OBJDIR) mkdir $(PROG2_OBJDIR) 430 431$(PROG3_OBJDIR): $(PROG3_OUTDIR) 432 @if not exist $(PROG3_OBJDIR) mkdir $(PROG3_OBJDIR) 433 434clean: 435 @-RMDIR /S /Q $(CARES_OUTDIR) >NUL 2>&1 436 @-RMDIR /S /Q $(PROG1_OUTDIR) >NUL 2>&1 437 @-RMDIR /S /Q $(PROG2_OUTDIR) >NUL 2>&1 438 @-RMDIR /S /Q $(PROG3_OUTDIR) >NUL 2>&1 439 440install: 441 @if not exist $(CARES_OUTDIR)\$(CARES_TARGET) \ 442 $(MAKE) /f .\Makefile.msvc CFG=$(CFG) c-ares 443 @if not exist "$(INSTALL_DIR)" mkdir "$(INSTALL_DIR)" 444 @if not exist "$(INSTALL_DIR_LIB)" mkdir "$(INSTALL_DIR_LIB)" 445 @if not exist "$(INSTALL_DIR_INC)" mkdir "$(INSTALL_DIR_INC)" 446 @copy /y $(CARES_OUTDIR)\*.* "$(INSTALL_DIR_LIB)" >NUL 447 @copy /y $(SRCDIR)\ares.h "$(INSTALL_DIR_INC)" >NUL 448 @copy /y $(SRCDIR)\ares_build.h "$(INSTALL_DIR_INC)" >NUL 449 @copy /y $(SRCDIR)\ares_rules.h "$(INSTALL_DIR_INC)" >NUL 450 @copy /y $(SRCDIR)\ares_version.h "$(INSTALL_DIR_INC)" >NUL 451 @echo Installed c-ares $(CFG) 452 453!ENDIF 454 455$(BASE_DIR): 456 @if not exist $(BASE_DIR) mkdir $(BASE_DIR) 457 458$(CARES_DIR): $(BASE_DIR) 459 @if not exist $(CARES_DIR) mkdir $(CARES_DIR) 460 461$(PROG1_DIR): $(BASE_DIR) 462 @if not exist $(PROG1_DIR) mkdir $(PROG1_DIR) 463 464$(PROG2_DIR): $(BASE_DIR) 465 @if not exist $(PROG2_DIR) mkdir $(PROG2_DIR) 466 467$(PROG3_DIR): $(BASE_DIR) 468 @if not exist $(PROG3_DIR) mkdir $(PROG3_DIR) 469 470# End of Makefile.msvc 471