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(.\src\lib\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 iphlpapi.lib 188EX_LIBS_DBG = ws2_32.lib advapi32.lib kernel32.lib iphlpapi.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.\src\lib /I.\include /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 .\src\lib\Makefile.inc 284!INCLUDE .\src\tools\Makefile.inc 285 286# ---------------------------- 287# Build lists of object files 288# ---------------------------- 289 290!IF "$(VALID_CFGSET)" == "TRUE" 291 292!IF [ECHO CARES_OBJS=^$(CARES_OBJDIR)\$(CSOURCES: = $(CARES_OBJDIR^)\) > .\cares_objs.inc] == 0 293!INCLUDE .\cares_objs.inc 294!IF [DEL .\cares_objs.inc] 295!ENDIF 296!ELSE 297!ERROR Problem generating CARES_OBJS list. 298!ENDIF 299CARES_OBJS = $(CARES_OBJS:.c=.obj) 300!IF "$(USE_RES_FILE)" == "TRUE" 301CARES_OBJS = $(CARES_OBJS) $(CARES_OBJDIR)\cares.res 302!ENDIF 303 304!IF [ECHO PROG1_OBJS=^$(PROG1_OBJDIR)\$(SAMPLESOURCES: = $(PROG1_OBJDIR^)\) > .\prog1_objs.inc] == 0 305!INCLUDE .\prog1_objs.inc 306!IF [DEL .\prog1_objs.inc] 307!ENDIF 308!ELSE 309!ERROR Problem generating PROG1_OBJS list. 310!ENDIF 311PROG1_OBJS = $(PROG1_OBJS:.c=.obj) 312PROG1_OBJS = $(PROG1_OBJS:/=\) 313PROG1_OBJS = $(PROG1_OBJS) $(PROG1_OBJDIR)\acountry.obj 314 315!IF [ECHO PROG2_OBJS=^$(PROG2_OBJDIR)\$(SAMPLESOURCES: = $(PROG2_OBJDIR^)\) > .\prog2_objs.inc] == 0 316!INCLUDE .\prog2_objs.inc 317!IF [DEL .\prog2_objs.inc] 318!ENDIF 319!ELSE 320!ERROR Problem generating PROG2_OBJS list. 321!ENDIF 322PROG2_OBJS = $(PROG2_OBJS:.c=.obj) 323PROG2_OBJS = $(PROG2_OBJS:/=\) 324PROG2_OBJS = $(PROG2_OBJS) $(PROG2_OBJDIR)\adig.obj 325 326!IF [ECHO PROG3_OBJS=^$(PROG3_OBJDIR)\$(SAMPLESOURCES: = $(PROG3_OBJDIR^)\) > .\prog3_objs.inc] == 0 327!INCLUDE .\prog3_objs.inc 328!IF [DEL .\prog3_objs.inc] 329!ENDIF 330!ELSE 331!ERROR Problem generating PROG3_OBJS list. 332!ENDIF 333PROG3_OBJS = $(PROG3_OBJS:.c=.obj) 334PROG3_OBJS = $(PROG3_OBJS:/=\) 335PROG3_OBJS = $(PROG3_OBJS) $(PROG3_OBJDIR)\ahost.obj 336 337!ENDIF 338 339 340# -------------------------------- 341# Only our custom inference rules 342# -------------------------------- 343 344.SUFFIXES: 345.SUFFIXES: .c .rc 346 347{$(SRCDIR)\src\lib}.rc{$(CARES_OBJDIR)}.res: 348 $(RC_CMD) /Fo $@ $< 349 350{$(SRCDIR)\src\lib}.c{$(CARES_OBJDIR)}.obj: 351 $(CC_CMD) $(CC_CFLAGS) $(CARES_CFLAGS) /Fo$@ /Fd$(@D)\ /c $< 352 353{$(SRCDIR)\src\tools}.c{$(PROG1_OBJDIR)}.obj: 354 $(CC_CMD) $(CC_CFLAGS) $(SPROG_CFLAGS) /Fo$@ /Fd$(@D)\ /c $< 355 356{$(SRCDIR)\src\tools}.c{$(PROG2_OBJDIR)}.obj: 357 $(CC_CMD) $(CC_CFLAGS) $(SPROG_CFLAGS) /Fo$@ /Fd$(@D)\ /c $< 358 359{$(SRCDIR)\src\tools}.c{$(PROG3_OBJDIR)}.obj: 360 $(CC_CMD) $(CC_CFLAGS) $(SPROG_CFLAGS) /Fo$@ /Fd$(@D)\ /c $< 361 362# Hack Alert! we reference ../lib/ files in the Makefile.inc for tools as they 363# share some files with the library itself. We need to hack around that here. 364 365{$(SRCDIR)\src\lib}.c{$(PROG1_OBJDIR)\..\lib}.obj: 366 $(CC_CMD) $(CC_CFLAGS) $(SPROG_CFLAGS) /Fo$(PROG1_OBJDIR)\$(@F) /Fd$(PROG1_OBJDIR)\ /c $< 367 368{$(SRCDIR)\src\lib}.c{$(PROG2_OBJDIR)\..\lib}.obj: 369 $(CC_CMD) $(CC_CFLAGS) $(SPROG_CFLAGS) /Fo$(PROG2_OBJDIR)\$(@F) /Fd$(PROG2_OBJDIR)\ /c $< 370 371{$(SRCDIR)\src\lib}.c{$(PROG3_OBJDIR)\..\lib}.obj: 372 $(CC_CMD) $(CC_CFLAGS) $(SPROG_CFLAGS) /Fo$(PROG3_OBJDIR)\$(@F) /Fd$(PROG3_OBJDIR)\ /c $< 373 374# ------------------------------------------------------------- # 375# ------------------------------------------------------------- # 376# Default target when no CFG library type has been specified, # 377# results in building target ALL for all c-ares library types. # 378# ------------------------------------------------------------- # 379# ------------------------------------------------------------- # 380 381!IF "$(VALID_CFGSET)" == "FALSE" 382 383ALL: 384 $(MAKE) /NOLOGO /f .\Makefile.msvc CFG=lib-release ALL 385 $(MAKE) /NOLOGO /f .\Makefile.msvc CFG=lib-debug ALL 386 $(MAKE) /NOLOGO /f .\Makefile.msvc CFG=dll-release ALL 387 $(MAKE) /NOLOGO /f .\Makefile.msvc CFG=dll-debug ALL 388 389clean: 390 @-RMDIR /S /Q $(BASE_DIR) >NUL 2>&1 391 392install: 393 @$(MAKE) /nologo /f .\Makefile.msvc CFG=lib-release install 394 @$(MAKE) /nologo /f .\Makefile.msvc CFG=lib-debug install 395 @$(MAKE) /nologo /f .\Makefile.msvc CFG=dll-release install 396 @$(MAKE) /nologo /f .\Makefile.msvc CFG=dll-debug install 397 398!ENDIF 399 400# --------------------------------------------------------------------- 401# Targets only available when a proper CFG library type has been given 402# --------------------------------------------------------------------- 403 404!IF "$(VALID_CFGSET)" == "TRUE" 405 406ALL: c-ares acountry adig ahost 407 @ 408 409# $(HHEADERS) $(CSOURCES) 410c-ares: $(CARES_OBJDIR) $(CARES_OBJS) $(CARES_OUTDIR) 411 $(CARES_LINK) $(CARES_LFLAGS) /out:$(CARES_OUTDIR)\$(CARES_TARGET) $(CARES_OBJS) 412! IF "$(USE_RES_FILE)" == "TRUE" 413 @if exist $(CARES_OUTDIR)\$(CARES_TARGET).manifest mt -nologo -manifest $(CARES_OUTDIR)\$(CARES_TARGET).manifest -outputresource:$(CARES_OUTDIR)\$(CARES_TARGET);2 414! ENDIF 415 416# acountry.c $(SAMPLESOURCES) $(SAMPLEHEADERS) 417acountry: c-ares $(PROG1_OBJDIR) $(PROG1_OBJS) $(PROG1_OUTDIR) 418 $(SPROG_LINK) $(SPROG_LFLAGS) /out:$(PROG1_OUTDIR)\acountry.exe $(PROG1_OBJS:..\lib=) 419 @if exist $(PROG1_OUTDIR)\acountry.exe.manifest mt -nologo -manifest $(PROG1_OUTDIR)\acountry.exe.manifest -outputresource:$(PROG1_OUTDIR)\acountry.exe;1 420 421# adig.c $(SAMPLESOURCES) $(SAMPLEHEADERS) 422adig: c-ares $(PROG2_OBJDIR) $(PROG2_OBJS) $(PROG2_OUTDIR) 423 $(SPROG_LINK) $(SPROG_LFLAGS) /out:$(PROG2_OUTDIR)\adig.exe $(PROG2_OBJS:..\lib=) 424 @if exist $(PROG2_OUTDIR)\adig.exe.manifest mt -nologo -manifest $(PROG2_OUTDIR)\adig.exe.manifest -outputresource:$(PROG2_OUTDIR)\adig.exe;1 425 426# ahost.c $(SAMPLESOURCES) $(SAMPLEHEADERS) 427ahost: c-ares $(PROG3_OBJDIR) $(PROG3_OBJS) $(PROG3_OUTDIR) 428 $(SPROG_LINK) $(SPROG_LFLAGS) /out:$(PROG3_OUTDIR)\ahost.exe $(PROG3_OBJS:..\lib=) 429 @if exist $(PROG3_OUTDIR)\ahost.exe.manifest mt -nologo -manifest $(PROG3_OUTDIR)\ahost.exe.manifest -outputresource:$(PROG3_OUTDIR)\ahost.exe;1 430 431$(CARES_OUTDIR): $(CARES_DIR) 432 @if not exist $(CARES_OUTDIR) mkdir $(CARES_OUTDIR) 433 434$(PROG1_OUTDIR): $(PROG1_DIR) 435 @if not exist $(PROG1_OUTDIR) mkdir $(PROG1_OUTDIR) 436 437$(PROG2_OUTDIR): $(PROG2_DIR) 438 @if not exist $(PROG2_OUTDIR) mkdir $(PROG2_OUTDIR) 439 440$(PROG3_OUTDIR): $(PROG3_DIR) 441 @if not exist $(PROG3_OUTDIR) mkdir $(PROG3_OUTDIR) 442 443$(CARES_OBJDIR): $(CARES_OUTDIR) 444 @if not exist $(CARES_OBJDIR) mkdir $(CARES_OBJDIR) 445 446$(PROG1_OBJDIR): $(PROG1_OUTDIR) 447 @if not exist $(PROG1_OBJDIR) mkdir $(PROG1_OBJDIR) 448 449$(PROG2_OBJDIR): $(PROG2_OUTDIR) 450 @if not exist $(PROG2_OBJDIR) mkdir $(PROG2_OBJDIR) 451 452$(PROG3_OBJDIR): $(PROG3_OUTDIR) 453 @if not exist $(PROG3_OBJDIR) mkdir $(PROG3_OBJDIR) 454 455clean: 456 @-RMDIR /S /Q $(CARES_OUTDIR) >NUL 2>&1 457 @-RMDIR /S /Q $(PROG1_OUTDIR) >NUL 2>&1 458 @-RMDIR /S /Q $(PROG2_OUTDIR) >NUL 2>&1 459 @-RMDIR /S /Q $(PROG3_OUTDIR) >NUL 2>&1 460 461install: 462 @if not exist $(CARES_OUTDIR)\$(CARES_TARGET) \ 463 $(MAKE) /f .\Makefile.msvc CFG=$(CFG) c-ares 464 @if not exist "$(INSTALL_DIR)" mkdir "$(INSTALL_DIR)" 465 @if not exist "$(INSTALL_DIR_LIB)" mkdir "$(INSTALL_DIR_LIB)" 466 @if not exist "$(INSTALL_DIR_INC)" mkdir "$(INSTALL_DIR_INC)" 467 @copy /y $(CARES_OUTDIR)\*.* "$(INSTALL_DIR_LIB)" >NUL 468 @copy /y $(SRCDIR)\include\ares.h "$(INSTALL_DIR_INC)" >NUL 469 @copy /y $(SRCDIR)\include\ares_build.h "$(INSTALL_DIR_INC)" >NUL 470 @copy /y $(SRCDIR)\include\ares_rules.h "$(INSTALL_DIR_INC)" >NUL 471 @copy /y $(SRCDIR)\include\ares_version.h "$(INSTALL_DIR_INC)" >NUL 472 @echo Installed c-ares $(CFG) 473 474!ENDIF 475 476$(BASE_DIR): 477 @if not exist $(BASE_DIR) mkdir $(BASE_DIR) 478 479$(CARES_DIR): $(BASE_DIR) 480 @if not exist $(CARES_DIR) mkdir $(CARES_DIR) 481 482$(PROG1_DIR): $(BASE_DIR) 483 @if not exist $(PROG1_DIR) mkdir $(PROG1_DIR) 484 485$(PROG2_DIR): $(BASE_DIR) 486 @if not exist $(PROG2_DIR) mkdir $(PROG2_DIR) 487 488$(PROG3_DIR): $(BASE_DIR) 489 @if not exist $(PROG3_DIR) mkdir $(PROG3_DIR) 490 491# End of Makefile.msvc 492