summaryrefslogtreecommitdiff
path: root/Makefile.msvc
blob: a4b1e2d2a37ae5ac59bb6a39091253d498857716 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
# $Id$

# Copyright (C) 2009 by Daniel Stenberg
#
# Permission to use, copy, modify, and distribute this
# software and its documentation for any purpose and without
# fee is hereby granted, provided that the above copyright
# notice appear in all copies and that both that copyright
# notice and this permission notice appear in supporting
# documentation, and that the name of M.I.T. not be used in
# advertising or publicity pertaining to distribution of the
# software without specific, written prior permission.
# M.I.T. makes no representations about the suitability of
# this software for any purpose.  It is provided "as is"
# without express or implied warranty.

# ------------------------------------------------------------------------------
#
# 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.
#
# This makefile must be processed from the subdir where it is located.
#
# All results are generated below a subdirectory named msvcXXX.
#
# ------------------------------------------------------------------------------

# ------------------------------------------------
# c-ares static and dynamic libraries common base
# file names for release and debug configurations
# ------------------------------------------------

LIB_BASENAME       = cares
LIB_BASENAME_DEBUG = caresd

# -------------------------------------------
# Base names for c-ares DLL import libraries
# -------------------------------------------

IMPLIB_BASENAME       = $(LIB_BASENAME)_imp
IMPLIB_BASENAME_DEBUG = $(LIB_BASENAME_DEBUG)_imp

# --------------------------
# Runtime library selection
# --------------------------

RTLIB  = /MD
RTLIBD = /MDd

!IF "$(RTLIBCFG)" == "static"
RTLIB  = /MT
RTLIBD = /MTd
!ENDIF

# --------------------------------------------------------
# Define USE_WATT32 to 1 to use the Watt-32 tcp/ip stack,
# otherwise Winsock tcp/ip stack will be used as default.
# --------------------------------------------------------

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)

# ----------------------------------------------------
# Verify that current subdir is the c-ares source one
# ----------------------------------------------------

!IF ! EXIST(.\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_DIR = .\$(CC_VERS_STR)

# ----------------------------------------
# Subdir holding sources for all projects
# ----------------------------------------

SRCDIR = .

# -------------------------
# Configuration validation
# -------------------------

VALID_CFGSET = FALSE
!IF "$(CFG)" == "lib-release" || "$(CFG)" == "lib-debug" || \
    "$(CFG)" == "dll-release" || "$(CFG)" == "dll-debug"
VALID_CFGSET = TRUE
!ENDIF

!IF "$(VALID_CFGSET)" == "FALSE" && "$(CFG)" != ""
!  MESSAGE MSVC c-ares makefile
!  MESSAGE
!  MESSAGE Usage: nmake /f makefile.msvc CFG=<config> <target>
!  MESSAGE
!  MESSAGE <config> must be one of: [ lib-release | lib-debug | dll-release | dll-debug }
!  MESSAGE <target> must be one of: [ ALL | c-ares | acountry | adig | ahost | clean }
!  MESSAGE
!  MESSAGE If a <target> other than ALL or clean is given, <config> becomes mandatory.
!  MESSAGE
!  MESSAGE If neither <config> nor <target> are specified this results in
!  MESSAGE all targets being built for all <config> c-ares library types.
!  MESSAGE
!  ERROR Choose a valid configuration.
!ENDIF

# --------------------------------------------------------
# Project subdirs independent of configuration being used
# --------------------------------------------------------

CARES_DIR = $(BASE_DIR)\cares
PROG1_DIR = $(BASE_DIR)\acountry
PROG2_DIR = $(BASE_DIR)\adig
PROG3_DIR = $(BASE_DIR)\ahost

# ---------------------------------------------------
# Subdirs which are configuration dependent are only
# defined when a valid configuration has been given.
# ---------------------------------------------------

!IF "$(VALID_CFGSET)" == "TRUE"
CARES_OUTDIR = $(CARES_DIR)\$(CFG)
PROG1_OUTDIR = $(PROG1_DIR)\$(CFG)
PROG2_OUTDIR = $(PROG2_DIR)\$(CFG)
PROG3_OUTDIR = $(PROG3_DIR)\$(CFG)
CARES_OBJDIR = $(CARES_OUTDIR)\obj
PROG1_OBJDIR = $(PROG1_OUTDIR)\obj
PROG2_OBJDIR = $(PROG2_OUTDIR)\obj
PROG3_OBJDIR = $(PROG3_OUTDIR)\obj
!ELSE
!UNDEF CARES_OUTDIR
!UNDEF PROG1_OUTDIR
!UNDEF PROG2_OUTDIR
!UNDEF PROG3_OUTDIR
!UNDEF CARES_OBJDIR
!UNDEF PROG1_OBJDIR
!UNDEF PROG2_OBJDIR
!UNDEF PROG3_OBJDIR
!ENDIF

# -------------------------------------
# Settings that depend on tcp/ip stack
# -------------------------------------

!IF "$(USE_WATT32)" == "1"
CFLAGS  = /UWIN32 /DWATT32 /I$(WATT_ROOT)\inc
EX_LIBS = $(WATT_ROOT)\lib\wattcpvc_imp.lib
!ELSE
CFLAGS  = /DWIN32
EX_LIBS = ws2_32.lib advapi32.lib
!ENDIF

# -----------------------------------------
# Switches that depend on compiler version
# -----------------------------------------

!IF $(CC_VERS_NUM) == 60
PDB_NONE            = /pdb:none
PDBTYPE_CONSOLIDATE = /pdbtype:consolidate
!ELSE
!UNDEF PDB_NONE
!UNDEF PDBTYPE_CONSOLIDATE
!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

RC_CMD_NODBG = rc.exe /l 0x409 /d "NDEBUG"
RC_CMD_DEBUG = 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)

# ---------------------------------
# Configuration dependent settings
# ---------------------------------

!IF "$(CFG)" == "lib-release"
CARES_TARGET = $(LIB_BASENAME).lib
CARES_CFLAGS = /DCARES_BUILDING_LIBRARY /DCARES_STATICLIB
CARES_LFLAGS =
SPROG_CFLAGS = /DCARES_STATICLIB
SPROG_LFLAGS = /libpath:$(CARES_OUTDIR) $(EX_LIBS) $(LIB_BASENAME).lib
CARES_LINK   = $(LINK_CMD_LIB)
SPROG_LINK   = $(LINK_CMD_EXE_NODBG)
CC_CMD       = $(CC_CMD_NODBG)
!ENDIF

!IF "$(CFG)" == "lib-debug"
CARES_TARGET = $(LIB_BASENAME_DEBUG).lib
CARES_CFLAGS = /DCARES_BUILDING_LIBRARY /DCARES_STATICLIB /DDEBUGBUILD
CARES_LFLAGS =
SPROG_CFLAGS = /DCARES_STATICLIB
SPROG_LFLAGS = /libpath:$(CARES_OUTDIR) $(EX_LIBS) $(LIB_BASENAME_DEBUG).lib
CARES_LINK   = $(LINK_CMD_LIB)
SPROG_LINK   = $(LINK_CMD_EXE_DEBUG)
CC_CMD       = $(CC_CMD_DEBUG)
!ENDIF

!IF "$(CFG)" == "dll-release"
CARES_TARGET = $(LIB_BASENAME).dll
CARES_CFLAGS = /DCARES_BUILDING_LIBRARY
CARES_LFLAGS = /release $(EX_LIBS) /implib:$(CARES_OUTDIR)\$(IMPLIB_BASENAME).lib $(PDB_NONE)
SPROG_CFLAGS =
SPROG_LFLAGS = /libpath:$(CARES_OUTDIR) $(EX_LIBS) $(IMPLIB_BASENAME).lib
CARES_LINK   = $(LINK_CMD_DLL)
SPROG_LINK   = $(LINK_CMD_EXE_NODBG)
CC_CMD       = $(CC_CMD_NODBG)
USE_RES_FILE = TRUE
RC_CMD       = $(RC_CMD_NODBG)
!ENDIF

!IF "$(CFG)" == "dll-debug"
CARES_TARGET = $(LIB_BASENAME_DEBUG).dll
CARES_CFLAGS = /DCARES_BUILDING_LIBRARY /DDEBUGBUILD
CARES_LFLAGS = /debug $(EX_LIBS) /implib:$(CARES_OUTDIR)\$(IMPLIB_BASENAME_DEBUG).lib /pdb:$(CARES_OUTDIR)\$(LIB_BASENAME_DEBUG).pdb $(PDBTYPE_CONSOLIDATE)
SPROG_CFLAGS =
SPROG_LFLAGS = /libpath:$(CARES_OUTDIR) $(EX_LIBS) $(IMPLIB_BASENAME_DEBUG).lib
CARES_LINK   = $(LINK_CMD_DLL)
SPROG_LINK   = $(LINK_CMD_EXE_DEBUG)
CC_CMD       = $(CC_CMD_DEBUG)
USE_RES_FILE = TRUE
RC_CMD       = $(RC_CMD_DEBUG)
!ENDIF

# --------------------------------------------
# Makefile.inc provides lists of source files
# --------------------------------------------

!INCLUDE .\Makefile.inc

# ----------------------------
# Build lists of object files
# ----------------------------

!IF "$(VALID_CFGSET)" == "TRUE"

!IF [ECHO CARES_OBJS=^$(CARES_OBJDIR)\$(CSOURCES: = $(CARES_OBJDIR^)\) > .\cares_objs.inc] == 0
!INCLUDE .\cares_objs.inc
!IF [DEL .\cares_objs.inc]
!ENDIF
!ELSE
!ERROR Problem generating CARES_OBJS list.
!ENDIF
CARES_OBJS = $(CARES_OBJS:.c=.obj)
!IF "$(USE_RES_FILE)" == "TRUE"
CARES_OBJS = $(CARES_OBJS) $(CARES_OBJDIR)\cares.res
!ENDIF

!IF [ECHO PROG1_OBJS=^$(PROG1_OBJDIR)\$(SAMPLESOURCES: = $(PROG1_OBJDIR^)\) > .\prog1_objs.inc] == 0
!INCLUDE .\prog1_objs.inc
!IF [DEL .\prog1_objs.inc]
!ENDIF
!ELSE
!ERROR Problem generating PROG1_OBJS list.
!ENDIF
PROG1_OBJS = $(PROG1_OBJS:.c=.obj)
PROG1_OBJS = $(PROG1_OBJS) $(PROG1_OBJDIR)\acountry.obj

!IF [ECHO PROG2_OBJS=^$(PROG2_OBJDIR)\$(SAMPLESOURCES: = $(PROG2_OBJDIR^)\) > .\prog2_objs.inc] == 0
!INCLUDE .\prog2_objs.inc
!IF [DEL .\prog2_objs.inc]
!ENDIF
!ELSE
!ERROR Problem generating PROG2_OBJS list.
!ENDIF
PROG2_OBJS = $(PROG2_OBJS:.c=.obj)
PROG2_OBJS = $(PROG2_OBJS) $(PROG2_OBJDIR)\adig.obj

!IF [ECHO PROG3_OBJS=^$(PROG3_OBJDIR)\$(SAMPLESOURCES: = $(PROG3_OBJDIR^)\) > .\prog3_objs.inc] == 0
!INCLUDE .\prog3_objs.inc
!IF [DEL .\prog3_objs.inc]
!ENDIF
!ELSE
!ERROR Problem generating PROG3_OBJS list.
!ENDIF
PROG3_OBJS = $(PROG3_OBJS:.c=.obj)
PROG3_OBJS = $(PROG3_OBJS) $(PROG3_OBJDIR)\ahost.obj

!ENDIF

# --------------------------------
# Only our custom inference rules
# --------------------------------

.SUFFIXES:
.SUFFIXES: .c .rc

{$(SRCDIR)}.rc{$(CARES_OBJDIR)}.res:
    $(RC_CMD) /Fo $@ $<

{$(SRCDIR)}.c{$(CARES_OBJDIR)}.obj:
    $(CC_CMD) $(CC_CFLAGS) $(CARES_CFLAGS) /Fo$@ /Fd$(@D)\ /c $<

{$(SRCDIR)}.c{$(PROG1_OBJDIR)}.obj:
    $(CC_CMD) $(CC_CFLAGS) $(SPROG_CFLAGS) /Fo$@ /Fd$(@D)\ /c $<

{$(SRCDIR)}.c{$(PROG2_OBJDIR)}.obj:
    $(CC_CMD) $(CC_CFLAGS) $(SPROG_CFLAGS) /Fo$@ /Fd$(@D)\ /c $<

{$(SRCDIR)}.c{$(PROG3_OBJDIR)}.obj:
    $(CC_CMD) $(CC_CFLAGS) $(SPROG_CFLAGS) /Fo$@ /Fd$(@D)\ /c $<

# ------------------------------------------------------------- #
# ------------------------------------------------------------- #
# Default target when no CFG library type has been specified,   #
# results in building target ALL for all c-ares library types.  #
# ------------------------------------------------------------- #
# ------------------------------------------------------------- #

!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

clean:
    @-RMDIR /S /Q $(BASE_DIR) >NUL 2>&1

!ENDIF

# ---------------------------------------------------------------------
# Targets only available when a proper CFG library type has been given
# ---------------------------------------------------------------------

!IF "$(VALID_CFGSET)" == "TRUE"

ALL: c-ares acountry adig ahost
    @

c-ares: $(HHEADERS) $(CSOURCES) $(CARES_OBJDIR) $(CARES_OBJS) $(CARES_OUTDIR)
    $(CARES_LINK) $(CARES_LFLAGS) /out:$(CARES_OUTDIR)\$(CARES_TARGET) $(CARES_OBJS)

acountry: c-ares acountry.c $(SAMPLESOURCES) $(SAMPLEHEADERS) $(PROG1_OBJDIR) $(PROG1_OBJS) $(PROG1_OUTDIR)
    $(SPROG_LINK) $(SPROG_LFLAGS) /out:$(PROG1_OUTDIR)\acountry.exe $(PROG1_OBJS)

adig: c-ares adig.c $(SAMPLESOURCES) $(SAMPLEHEADERS) $(PROG2_OBJDIR) $(PROG2_OBJS) $(PROG2_OUTDIR)
    $(SPROG_LINK) $(SPROG_LFLAGS) /out:$(PROG2_OUTDIR)\adig.exe $(PROG2_OBJS)

ahost: c-ares ahost.c $(SAMPLESOURCES) $(SAMPLEHEADERS) $(PROG3_OBJDIR) $(PROG3_OBJS) $(PROG3_OUTDIR)
    $(SPROG_LINK) $(SPROG_LFLAGS) /out:$(PROG3_OUTDIR)\ahost.exe $(PROG3_OBJS)

$(CARES_OUTDIR): $(CARES_DIR)
    @if not exist $(CARES_OUTDIR) mkdir $(CARES_OUTDIR)

$(PROG1_OUTDIR): $(PROG1_DIR)
    @if not exist $(PROG1_OUTDIR) mkdir $(PROG1_OUTDIR)

$(PROG2_OUTDIR): $(PROG2_DIR)
    @if not exist $(PROG2_OUTDIR) mkdir $(PROG2_OUTDIR)

$(PROG3_OUTDIR): $(PROG3_DIR)
    @if not exist $(PROG3_OUTDIR) mkdir $(PROG3_OUTDIR)

$(CARES_OBJDIR): $(CARES_OUTDIR)
    @if not exist $(CARES_OBJDIR) mkdir $(CARES_OBJDIR)

$(PROG1_OBJDIR): $(PROG1_OUTDIR)
    @if not exist $(PROG1_OBJDIR) mkdir $(PROG1_OBJDIR)

$(PROG2_OBJDIR): $(PROG2_OUTDIR)
    @if not exist $(PROG2_OBJDIR) mkdir $(PROG2_OBJDIR)

$(PROG3_OBJDIR): $(PROG3_OUTDIR)
    @if not exist $(PROG3_OBJDIR) mkdir $(PROG3_OBJDIR)

clean:
    @-RMDIR /S /Q $(CARES_OUTDIR) >NUL 2>&1
    @-RMDIR /S /Q $(PROG1_OUTDIR) >NUL 2>&1
    @-RMDIR /S /Q $(PROG2_OUTDIR) >NUL 2>&1
    @-RMDIR /S /Q $(PROG3_OUTDIR) >NUL 2>&1

!ENDIF

$(BASE_DIR):
    @if not exist $(BASE_DIR) mkdir $(BASE_DIR)

$(CARES_DIR): $(BASE_DIR)
    @if not exist $(CARES_DIR) mkdir $(CARES_DIR)

$(PROG1_DIR): $(BASE_DIR)
    @if not exist $(PROG1_DIR) mkdir $(PROG1_DIR)

$(PROG2_DIR): $(BASE_DIR)
    @if not exist $(PROG2_DIR) mkdir $(PROG2_DIR)

$(PROG3_DIR): $(BASE_DIR)
    @if not exist $(PROG3_DIR) mkdir $(PROG3_DIR)