1# Copyright (C) The c-ares project and its contributors 2# SPDX-License-Identifier: MIT 3# 4# Permission is hereby granted, free of charge, to any person obtaining a copy 5# of this software and associated documentation files (the "Software"), to deal 6# in the Software without restriction, including without limitation the rights 7# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8# copies of the Software, and to permit persons to whom the Software is 9# furnished to do so, subject to the following conditions: 10# 11# The above copyright notice and this permission notice (including the next 12# paragraph) shall be included in all copies or substantial portions of the 13# Software. 14# 15# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21# SOFTWARE. 22 23 24# ------------------------------------------------------------------------------ 25# 26# Makefile for building c-ares test suite with MSVC. 27# 28# Usage: nmake /f makefile.msvc CFG=<config> <target> 29# 30# <config> can be one of: [ lib-release | lib-debug | dll-release | dll-debug } 31# <target> can be one of: [ all | arestest | clean } 32# 33# If <target> is not specified then all targets are built. 34# If <config> is not specified then lib-debug will be assumed. 35# 36# This makefile must be processed from the subdir where it is located. 37# 38# All results are generated below a subdirectory named msvcXXX. 39# 40# ------------------------------------------------------------------------------ 41 42 43# ------------------------------------------------ 44# c-ares static and dynamic libraries common base 45# file names for release and debug configurations 46# ------------------------------------------------ 47 48LIBNAME = cares 49STA_LIB_REL = lib$(LIBNAME) 50DYN_LIB_REL = $(LIBNAME) 51STA_LIB_DBG = $(STA_LIB_REL)d 52DYN_LIB_DBG = $(DYN_LIB_REL)d 53 54# ------------------------------------------- 55# Base names for c-ares DLL import libraries 56# ------------------------------------------- 57 58IMP_LIB_REL = $(DYN_LIB_REL) 59IMP_LIB_DBG = $(DYN_LIB_DBG) 60 61# -------------------------- 62# Runtime library selection 63# -------------------------- 64 65RTLIB = /MD 66RTLIBD = /MDd 67 68!IF "$(RTLIBCFG)" == "static" 69RTLIB = /MT 70RTLIBD = /MTd 71!ENDIF 72 73# --------------------------------------------------------- 74# Verify that current subdir is below the c-ares source one 75# --------------------------------------------------------- 76 77!IF ! EXIST(..\src\lib\ares_init.c) 78! MESSAGE Can not process Makefile.msvc from outside of c-ares test subdirectory. 79! MESSAGE Change to the subdirectory where Makefile.msvc is found, and try again. 80! ERROR See previous message. 81!ENDIF 82 83# ------------------------------------------------------------------ 84# Base subdir is the common root from which other subdirs will hang, 85# the name depends on MSVC version being used when building c-ares. 86# ------------------------------------------------------------------ 87 88BASE_DIR = .\msvc 89# Look for a built library of the same configuration in the directory above. 90LIB_BASE_DIR = ..\msvc 91 92# ---------------------------------------- 93# Subdir holding sources for all projects 94# ---------------------------------------- 95 96SRCDIR = . 97 98# ------------------------- 99# Configuration validation 100# ------------------------- 101 102!IF "$(CFG)" == "" 103CFG = lib-debug 104!ENDIF 105 106VALID_CFGSET = FALSE 107!IF "$(CFG)" == "lib-release" || "$(CFG)" == "lib-debug" || \ 108 "$(CFG)" == "dll-release" || "$(CFG)" == "dll-debug" 109VALID_CFGSET = TRUE 110!ENDIF 111 112!IF "$(VALID_CFGSET)" == "FALSE" 113! MESSAGE MSVC c-ares makefile 114! MESSAGE 115! MESSAGE Usage: nmake /f makefile.msvc CFG=<config> GTEST_ROOT=<google-test-install> <target> 116! MESSAGE 117! MESSAGE <config> can be one of: [ lib-release | lib-debug | dll-release | dll-debug } 118! MESSAGE <target> can be one of: [ all | arestest | aresfuzz | aresfuzzname | dnsdump | clean } 119! MESSAGE 120! MESSAGE If <target> is not specified then all targets are built. 121! MESSAGE If <config> is not specified then lib-debug will be assumed. 122! MESSAGE 123! ERROR Choose a valid configuration. 124!ENDIF 125 126!IF "$(GTEST_ROOT)" == "" 127! ERROR Missing GTEST_ROOT 128!ENDIF 129 130# -------------------------------------------------------- 131# Project subdirs independent of configuration being used 132# -------------------------------------------------------- 133 134PROG_DIR = $(BASE_DIR)\arestest 135LIB_DIR = $(LIB_BASE_DIR)\cares 136 137# --------------------------------------------------- 138# Subdirs which are configuration dependent are only 139# defined when a valid configuration has been given. 140# --------------------------------------------------- 141 142PROG_OUTDIR = $(PROG_DIR)\$(CFG) 143PROG_OBJDIR = $(PROG_OUTDIR)\obj 144LIB_OUTDIR = $(LIB_DIR)\$(CFG) 145 146 147# ------------------------------------- 148# TCP/IP stack settings 149# ------------------------------------- 150CFLAGS = /DWIN32 151EX_LIBS_REL = ws2_32.lib advapi32.lib kernel32.lib iphlpapi.lib 152EX_LIBS_DBG = ws2_32.lib advapi32.lib kernel32.lib iphlpapi.lib 153 154 155# ---------------------------- 156# Assorted commands and flags 157# ---------------------------- 158 159CC_CMD_REL = cl.exe /nologo $(RTLIB) /DNDEBUG /O2 /D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_WARNINGS 160CC_CMD_DBG = cl.exe /nologo $(RTLIBD) /D_DEBUG /Od /Zi /D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_WARNINGS /RTCsu 161CC_CFLAGS = $(CFLAGS) /I. /I../src/lib /I../src/lib/include /I../include /I $(GTEST_ROOT)/include /W3 /EHsc /FD 162 163RC_CMD_REL = rc.exe /l 0x409 /d "NDEBUG" 164RC_CMD_DBG = rc.exe /l 0x409 /d "_DEBUG" 165 166LINK_CMD_LIB = link.exe /lib /nologo 167LINK_CMD_DLL = link.exe /dll /nologo /incremental:no /fixed:no 168LINK_CMD_EXE = link.exe /nologo /incremental:no /fixed:no /subsystem:console 169 170LINK_CMD_EXE_REL = $(LINK_CMD_EXE) /release 171LINK_CMD_EXE_DBG = $(LINK_CMD_EXE) /debug 172 173# --------------------------------- 174# Configuration dependent settings 175# --------------------------------- 176 177!IF "$(CFG)" == "lib-release" 178CARES_TARGET = $(STA_LIB_REL).lib 179CARES_CFLAGS = /DCARES_BUILDING_LIBRARY /DCARES_STATICLIB 180CARES_LFLAGS = 181SPROG_CFLAGS = /DCARES_STATICLIB /DCARES_NO_DEPRECATED 182SPROG_LFLAGS = /libpath:$(LIB_OUTDIR) $(EX_LIBS_REL) $(STA_LIB_REL).lib 183CARES_LINK = $(LINK_CMD_LIB) 184SPROG_LINK = $(LINK_CMD_EXE_REL) 185CC_CMD = $(CC_CMD_REL) 186!ENDIF 187 188!IF "$(CFG)" == "lib-debug" 189CARES_TARGET = $(STA_LIB_DBG).lib 190CARES_CFLAGS = /DCARES_BUILDING_LIBRARY /DCARES_STATICLIB /DDEBUGBUILD 191CARES_LFLAGS = 192SPROG_CFLAGS = /DCARES_STATICLIB /DCARES_NO_DEPRECATED 193SPROG_LFLAGS = /libpath:$(LIB_OUTDIR) $(EX_LIBS_DBG) $(STA_LIB_DBG).lib 194CARES_LINK = $(LINK_CMD_LIB) 195SPROG_LINK = $(LINK_CMD_EXE_DBG) 196CC_CMD = $(CC_CMD_DBG) 197!ENDIF 198 199!IF "$(CFG)" == "dll-release" 200CARES_TARGET = $(DYN_LIB_REL).dll 201CARES_CFLAGS = /DCARES_BUILDING_LIBRARY 202CARES_LFLAGS = /release $(EX_LIBS_REL) /implib:$(PROG_OUTDIR)\$(IMP_LIB_REL).lib 203SPROG_CFLAGS = /DCARES_NO_DEPRECATED 204SPROG_LFLAGS = /libpath:$(LIB_OUTDIR) $(EX_LIBS_REL) $(IMP_LIB_REL).lib 205CARES_LINK = $(LINK_CMD_DLL) 206SPROG_LINK = $(LINK_CMD_EXE_REL) 207CC_CMD = $(CC_CMD_REL) 208USE_RES_FILE = TRUE 209RC_CMD = $(RC_CMD_REL) 210!ENDIF 211 212!IF "$(CFG)" == "dll-debug" 213CARES_TARGET = $(DYN_LIB_DBG).dll 214CARES_CFLAGS = /DCARES_BUILDING_LIBRARY /DDEBUGBUILD 215CARES_LFLAGS = /debug $(EX_LIBS_DBG) /implib:$(PROG_OUTDIR)\$(IMP_LIB_DBG).lib /pdb:$(PROG_OUTDIR)\$(DYN_LIB_DBG).pdb 216SPROG_CFLAGS = /DCARES_NO_DEPRECATED 217SPROG_LFLAGS = /libpath:$(LIB_OUTDIR) $(EX_LIBS_DBG) $(IMP_LIB_DBG).lib 218CARES_LINK = $(LINK_CMD_DLL) 219SPROG_LINK = $(LINK_CMD_EXE_DBG) 220CC_CMD = $(CC_CMD_DBG) 221USE_RES_FILE = TRUE 222RC_CMD = $(RC_CMD_DBG) 223!ENDIF 224 225# -------------------------------------------- 226# Makefile.inc provides lists of source files 227# -------------------------------------------- 228 229!INCLUDE .\Makefile.inc 230 231# ---------------------------- 232# Build lists of object files 233# ---------------------------- 234 235!IF [ECHO PROG_OBJS=^$(PROG_OBJDIR)\$(TESTSOURCES: = $(PROG_OBJDIR^)\) > .\prog_objs.inc] == 0 236!INCLUDE .\prog_objs.inc 237!IF [DEL .\prog_objs.inc] 238!ENDIF 239!ELSE 240!ERROR Problem generating PROG_OBJS list. 241!ENDIF 242PROG_OBJS = $(PROG_OBJS:.cc=.obj) 243 244!IF [ECHO FUZZ_OBJS=^$(PROG_OBJDIR)\$(FUZZSOURCES: = $(PROG_OBJDIR^)\) > .\fuzz_objs.inc] == 0 245!INCLUDE .\fuzz_objs.inc 246!IF [DEL .\fuzz_objs.inc] 247!ENDIF 248!ELSE 249!ERROR Problem generating FUZZ_OBJS list. 250!ENDIF 251FUZZ_OBJS = $(FUZZ_OBJS:.c=.obj) 252 253!IF [ECHO FUZZNAME_OBJS=^$(PROG_OBJDIR)\$(FUZZNAMESOURCES: = $(PROG_OBJDIR^)\) > .\fuzzname_objs.inc] == 0 254!INCLUDE .\fuzzname_objs.inc 255!IF [DEL .\fuzzname_objs.inc] 256!ENDIF 257!ELSE 258!ERROR Problem generating FUZZNAME_OBJS list. 259!ENDIF 260FUZZNAME_OBJS = $(FUZZNAME_OBJS:.c=.obj) 261 262!IF [ECHO DNSDUMP_OBJS=^$(PROG_OBJDIR)\$(DUMPSOURCES: = $(PROG_OBJDIR^)\) > .\dnsdump_objs.inc] == 0 263!INCLUDE .\dnsdump_objs.inc 264!IF [DEL .\dnsdump_objs.inc] 265!ENDIF 266!ELSE 267!ERROR Problem generating DNSDUMP_OBJS list. 268!ENDIF 269DNSDUMP_OBJS = $(DNSDUMP_OBJS:.cc=.obj) 270 271# -------------------------------- 272# Only our custom inference rules 273# -------------------------------- 274 275.SUFFIXES: 276.SUFFIXES: .cc .c 277 278{$(SRCDIR)}.cc{$(PROG_OBJDIR)}.obj: 279 $(CC_CMD) $(CC_CFLAGS) $(SPROG_CFLAGS) /Fo$@ /Fd$(@D)\ /c $< 280{$(SRCDIR)}.c{$(PROG_OBJDIR)}.obj: 281 $(CC_CMD) $(CC_CFLAGS) $(SPROG_CFLAGS) /Fo$@ /Fd$(@D)\ /c $< 282 283 284# --------------------------------------------------------------------- 285# Main targets 286# --------------------------------------------------------------------- 287 288ALL: arestest aresfuzz aresfuzzname dnsdump 289 @ 290 291test: arestest 292 $(PROG_OUTDIR)\arestest -4 --gtest_filter=-*LiveSearchTXT*:*LiveSearchANY*:*LiveGetLocalhostByAddr* 293vtest: arestest 294 $(PROG_OUTDIR)\arestest -4 -v --gtest_filter=-*LiveSearchTXT*:*LiveSearchANY*:*LiveGetLocalhostByAddr* 295 296arestest: $(TESTSOURCES) $(PROG_OUTDIR) $(PROG_OBJDIR) $(PROG_OBJS) 297 $(SPROG_LINK) $(SPROG_LFLAGS) /out:$(PROG_OUTDIR)\arestest.exe $(PROG_OBJS) $(GTEST_ROOT)/lib/gmock.lib 298 @if exist $(PROG_OUTDIR)\arestest.exe.manifest mt -nologo -manifest $(PROG_OUTDIR)\arestest.exe.manifest -outputresource:$(PROG_OUTDIR)\arestest.exe;1 299 300aresfuzz: $(FUZZSOURCES) $(PROG_OUTDIR) $(PROG_OBJDIR) $(FUZZ_OBJS) 301 $(SPROG_LINK) $(SPROG_LFLAGS) /out:$(PROG_OUTDIR)\aresfuzz.exe $(FUZZ_OBJS) 302 @if exist $(PROG_OUTDIR)\aresfuzz.exe.manifest mt -nologo -manifest $(PROG_OUTDIR)\aresfuzz.exe.manifest -outputresource:$(PROG_OUTDIR)\aresfuzz.exe;1 303 304aresfuzzname: $(FUZZNAMESOURCES) $(PROG_OUTDIR) $(PROG_OBJDIR) $(FUZZNAME_OBJS) 305 $(SPROG_LINK) $(SPROG_LFLAGS) /out:$(PROG_OUTDIR)\aresfuzzname.exe $(FUZZNAME_OBJS) 306 @if exist $(PROG_OUTDIR)\aresfuzzname.exe.manifest mt -nologo -manifest $(PROG_OUTDIR)\aresfuzzname.exe.manifest -outputresource:$(PROG_OUTDIR)\aresfuzzname.exe;1 307 308dnsdump: $(DUMPSOURCES) $(PROG_OUTDIR) $(PROG_OBJDIR) $(DNSDUMP_OBJS) 309 $(SPROG_LINK) $(SPROG_LFLAGS) /out:$(PROG_OUTDIR)\dnsdump.exe $(DNSDUMP_OBJS) 310 @if exist $(PROG_OUTDIR)\dnsdump.exe.manifest mt -nologo -manifest $(PROG_OUTDIR)\dnsdump.exe.manifest -outputresource:$(PROG_OUTDIR)\dnsdump.exe;1 311 312$(PROG_OUTDIR): $(PROG_DIR) 313 @if not exist $(PROG_OUTDIR) mkdir $(PROG_OUTDIR) 314 315$(PROG_OBJDIR): $(PROG_OUTDIR) 316 @if not exist $(PROG_OBJDIR) mkdir $(PROG_OBJDIR) 317 318clean: 319 @-RMDIR /S /Q $(PROG_OUTDIR) >NUL 2>&1 320 321$(BASE_DIR): 322 @if not exist $(BASE_DIR) mkdir $(BASE_DIR) 323 324$(PROG_DIR): $(BASE_DIR) 325 @if not exist $(PROG_DIR) mkdir $(PROG_DIR) 326 327# End of Makefile.msvc 328