• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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