1# makefile.vc -- -*- Makefile -*- 2# 3# Microsoft Visual C++ makefile for use with nmake.exe v1.62+ (VC++ 5.0+) 4# 5# This makefile is based upon the Tcl 8.4 Makefile.vc and modified to 6# make it suitable as a general package makefile. Look for the word EDIT 7# which marks sections that may need modification. As a minumum you will 8# need to change the PROJECT, DOTVERSION and DLLOBJS variables to values 9# relevant to your package. 10# 11# See the file "license.terms" for information on usage and redistribution 12# of this file, and for a DISCLAIMER OF ALL WARRANTIES. 13# 14# Copyright (c) 1995-1996 Sun Microsystems, Inc. 15# Copyright (c) 1998-2000 Ajuba Solutions. 16# Copyright (c) 2001 ActiveState Corporation. 17# Copyright (c) 2001-2002 David Gravereaux. 18# Copyright (c) 2003 Pat Thoyts 19# 20#------------------------------------------------------------------------- 21# RCS: @(#)$Id: makefile.vc,v 1.4 2004/07/26 08:22:05 patthoyts Exp $ 22#------------------------------------------------------------------------- 23 24!if !defined(MSDEVDIR) && !defined(MSVCDIR) && !defined(VCINSTALLDIR) && !defined(MSSDK) && !defined(WINDOWSSDKDIR) 25MSG = ^ 26You will need to run vcvars32.bat from Developer Studio, first, to setup^ 27the environment. Jump to this line to read the new instructions. 28!error $(MSG) 29!endif 30 31#------------------------------------------------------------------------------ 32# HOW TO USE this makefile: 33# 34# 1) It is now necessary to have %MSVCDir% set in the environment. This is 35# used as a check to see if vcvars32.bat had been run prior to running 36# nmake or during the installation of Microsoft Visual C++, MSVCDir had 37# been set globally and the PATH adjusted. Either way is valid. 38# 39# You'll need to run vcvars32.bat contained in the MsDev's vc(98)/bin 40# directory to setup the proper environment, if needed, for your current 41# setup. This is a needed bootstrap requirement and allows the swapping of 42# different environments to be easier. 43# 44# 2) To use the Platform SDK (not expressly needed), run setenv.bat after 45# vcvars32.bat according to the instructions for it. This can also turn on 46# the 64-bit compiler, if your SDK has it. 47# 48# 3) Targets are: 49# all -- Builds everything. 50# <project> -- Builds the project (eg: nmake sample) 51# test -- Builds and runs the test suite. 52# install -- Installs the built binaries and libraries to $(INSTALLDIR) 53# in an appropriate subdirectory. 54# clean/realclean/distclean -- varying levels of cleaning. 55# 56# 4) Macros usable on the commandline: 57# INSTALLDIR=<path> 58# Sets where to install Tcl from the built binaries. 59# C:\Progra~1\Tcl is assumed when not specified. 60# 61# OPTS=static,msvcrt,staticpkg,threads,symbols,profile,loimpact,none 62# Sets special options for the core. The default is for none. 63# Any combination of the above may be used (comma separated). 64# 'none' will over-ride everything to nothing. 65# 66# static = Builds a static library of the core instead of a 67# dll. The shell will be static (and large), as well. 68# msvcrt = Effects the static option only to switch it from 69# using libcmt(d) as the C runtime [by default] to 70# msvcrt(d). This is useful for static embedding 71# support. 72# staticpkg = Effects the static option only to switch 73# tclshXX.exe to have the dde and reg extension linked 74# inside it. 75# threads = Turns on full multithreading support. 76# thrdalloc = Use the thread allocator (shared global free pool). 77# symbols = Adds symbols for step debugging. 78# profile = Adds profiling hooks. Map file is assumed. 79# loimpact = Adds a flag for how NT treats the heap to keep memory 80# in use, low. This is said to impact alloc performance. 81# 82# STATS=memdbg,compdbg,none 83# Sets optional memory and bytecode compiler debugging code added 84# to the core. The default is for none. Any combination of the 85# above may be used (comma separated). 'none' will over-ride 86# everything to nothing. 87# 88# memdbg = Enables the debugging memory allocator. 89# compdbg = Enables byte compilation logging. 90# 91# MACHINE=(IX86|IA64|ALPHA) 92# Set the machine type used for the compiler, linker, and 93# resource compiler. This hook is needed to tell the tools 94# when alternate platforms are requested. IX86 is the default 95# when not specified. 96# 97# TMP_DIR=<path> 98# OUT_DIR=<path> 99# Hooks to allow the intermediate and output directories to be 100# changed. $(OUT_DIR) is assumed to be 101# $(BINROOT)\(Release|Debug) based on if symbols are requested. 102# $(TMP_DIR) will de $(OUT_DIR)\<buildtype> by default. 103# 104# TESTPAT=<file> 105# Reads the tests requested to be run from this file. 106# 107# CFG_ENCODING=encoding 108# name of encoding for configuration information. Defaults 109# to cp1252 110# 111# 5) Examples: 112# 113# Basic syntax of calling nmake looks like this: 114# nmake [-nologo] -f makefile.vc [target|macrodef [target|macrodef] [...]] 115# 116# Standard (no frills) 117# c:\tcl_src\win\>c:\progra~1\micros~1\vc98\bin\vcvars32.bat 118# Setting environment for using Microsoft Visual C++ tools. 119# c:\tcl_src\win\>nmake -f makefile.vc all 120# c:\tcl_src\win\>nmake -f makefile.vc install INSTALLDIR=c:\progra~1\tcl 121# 122# Building for Win64 123# c:\tcl_src\win\>c:\progra~1\micros~1\vc98\bin\vcvars32.bat 124# Setting environment for using Microsoft Visual C++ tools. 125# c:\tcl_src\win\>c:\progra~1\platfo~1\setenv.bat /pre64 /RETAIL 126# Targeting Windows pre64 RETAIL 127# c:\tcl_src\win\>nmake -f makefile.vc MACHINE=IA64 128# 129#------------------------------------------------------------------------------ 130#============================================================================== 131############################################################################### 132#------------------------------------------------------------------------------ 133 134!if !exist("makefile.vc") 135MSG = ^ 136You must run this makefile only from the directory it is in.^ 137Please `cd` to its location first. 138!error $(MSG) 139!endif 140 141#------------------------------------------------------------------------- 142# Project specific information (EDIT) 143# 144# You should edit this with the name and version of your project. This 145# information is used to generate the name of the package library and 146# it's install location. 147# 148# For example, the sample extension is going to build sample04.dll and 149# would install it into $(INSTALLDIR)\lib\sample04 150# 151# You need to specify the object files that need to be linked into your 152# binary here. 153# 154#------------------------------------------------------------------------- 155 156PROJECT = sqlite3 157!include "rules.vc" 158 159# nmakehelp -V <file> <tag> will search the file for tag, skips until a 160# number and returns all character until a character not in [0-9.ab] 161# is read. 162 163!if [echo REM = This file is generated from Makefile.vc > versions.vc] 164!endif 165# get project version from row "AC_INIT([sqlite], [3.7.14])" 166!if [echo DOTVERSION = \>> versions.vc] \ 167 && [nmakehlp -V ..\configure.in AC_INIT >> versions.vc] 168!endif 169!include "versions.vc" 170 171VERSION = $(DOTVERSION:.=) 172STUBPREFIX = $(PROJECT)stub 173 174DLLOBJS = \ 175 $(TMP_DIR)\tclsqlite3.obj 176 177#------------------------------------------------------------------------- 178# Target names and paths ( shouldn't need changing ) 179#------------------------------------------------------------------------- 180 181BINROOT = . 182ROOT = .. 183 184PRJIMPLIB = $(OUT_DIR)\$(PROJECT)$(VERSION)$(SUFX).lib 185PRJLIBNAME = $(PROJECT)$(VERSION)$(SUFX).$(EXT) 186PRJLIB = $(OUT_DIR)\$(PRJLIBNAME) 187 188PRJSTUBLIBNAME = $(STUBPREFIX)$(VERSION).lib 189PRJSTUBLIB = $(OUT_DIR)\$(PRJSTUBLIBNAME) 190 191### Make sure we use backslash only. 192PRJ_INSTALL_DIR = $(_INSTALLDIR)\$(PROJECT)$(DOTVERSION) 193LIB_INSTALL_DIR = $(PRJ_INSTALL_DIR) 194BIN_INSTALL_DIR = $(PRJ_INSTALL_DIR) 195DOC_INSTALL_DIR = $(PRJ_INSTALL_DIR) 196SCRIPT_INSTALL_DIR = $(PRJ_INSTALL_DIR) 197INCLUDE_INSTALL_DIR = $(_TCLDIR)\include 198 199### The following paths CANNOT have spaces in them. 200GENERICDIR = $(ROOT)\generic 201WINDIR = $(ROOT)\win 202LIBDIR = $(ROOT)\library 203DOCDIR = $(ROOT)\doc 204TOOLSDIR = $(ROOT)\tools 205COMPATDIR = $(ROOT)\compat 206 207#--------------------------------------------------------------------- 208# Compile flags 209#--------------------------------------------------------------------- 210 211!if !$(DEBUG) 212!if $(OPTIMIZING) 213### This cranks the optimization level to maximize speed 214cdebug = -O2 -Op -Gs 215!else 216cdebug = 217!endif 218!else if "$(MACHINE)" == "IA64" 219### Warnings are too many, can't support warnings into errors. 220cdebug = -Z7 -Od -GZ 221!else 222cdebug = -Z7 -WX -Od -GZ 223!endif 224 225### Declarations common to all compiler options 226cflags = -nologo -c -W3 -YX -Fp$(TMP_DIR)^\ 227 228!if $(MSVCRT) 229!if $(DEBUG) 230crt = -MDd 231!else 232crt = -MD 233!endif 234!else 235!if $(DEBUG) 236crt = -MTd 237!else 238crt = -MT 239!endif 240!endif 241 242INCLUDES = $(TCL_INCLUDES) -I"$(WINDIR)" -I"$(GENERICDIR)" \ 243 -I"$(ROOT)\.." 244BASE_CLFAGS = $(cflags) $(cdebug) $(crt) $(INCLUDES) \ 245 -DSQLITE_3_SUFFIX_ONLY=1 -DSQLITE_ENABLE_RTREE=1 \ 246 -DSQLITE_ENABLE_FTS3=1 -DSQLITE_OMIT_DEPRECATED=1 247CON_CFLAGS = $(cflags) $(cdebug) $(crt) -DCONSOLE -DSQLITE_ENABLE_FTS3=1 248TCL_CFLAGS = -DBUILD_sqlite -DUSE_TCL_STUBS \ 249 -DPACKAGE_VERSION="\"$(DOTVERSION)\"" $(BASE_CLFAGS) \ 250 $(OPTDEFINES) 251 252#--------------------------------------------------------------------- 253# Link flags 254#--------------------------------------------------------------------- 255 256!if $(DEBUG) 257ldebug = -debug:full -debugtype:cv 258!else 259ldebug = -release -opt:ref -opt:icf,3 260!endif 261 262### Declarations common to all linker options 263lflags = -nologo -machine:$(MACHINE) $(ldebug) 264 265!if $(PROFILE) 266lflags = $(lflags) -profile 267!endif 268 269!if $(ALIGN98_HACK) && !$(STATIC_BUILD) 270### Align sections for PE size savings. 271lflags = $(lflags) -opt:nowin98 272!else if !$(ALIGN98_HACK) && $(STATIC_BUILD) 273### Align sections for speed in loading by choosing the virtual page size. 274lflags = $(lflags) -align:4096 275!endif 276 277!if $(LOIMPACT) 278lflags = $(lflags) -ws:aggressive 279!endif 280 281dlllflags = $(lflags) -dll 282conlflags = $(lflags) -subsystem:console 283guilflags = $(lflags) -subsystem:windows 284baselibs = $(TCLSTUBLIB) 285 286#--------------------------------------------------------------------- 287# TclTest flags 288#--------------------------------------------------------------------- 289 290!IF "$(TESTPAT)" != "" 291TESTFLAGS = $(TESTFLAGS) -file $(TESTPAT) 292!ENDIF 293 294#--------------------------------------------------------------------- 295# Project specific targets (EDIT) 296#--------------------------------------------------------------------- 297 298all: setup $(PROJECT) 299$(PROJECT): setup $(PRJLIB) 300install: install-binaries install-libraries install-docs 301 302# Tests need to ensure we load the right dll file we 303# have to handle the output differently on Win9x. 304# 305!if "$(OS)" == "Windows_NT" || "$(MSVCDIR)" == "IDE" 306test: setup $(PROJECT) 307 set TCL_LIBRARY=$(ROOT)/library 308 $(TCLSH) << 309load $(PRJLIB:\=/) 310cd "$(ROOT)/tests" 311set argv "$(TESTFLAGS)" 312source all.tcl 313<< 314!else 315test: setup $(PROJECT) 316 echo Please wait while the test results are collected 317 set TCL_LIBRARY=$(ROOT)/library 318 $(TCLSH) << >tests.log 319load $(PRJLIB:\=/) 320cd "$(ROOT)/tests" 321set argv "$(TESTFLAGS)" 322source all.tcl 323<< 324 type tests.log | more 325!endif 326 327setup: 328 @if not exist $(OUT_DIR)\nul mkdir $(OUT_DIR) 329 @if not exist $(TMP_DIR)\nul mkdir $(TMP_DIR) 330 331$(PRJLIB): $(DLLOBJS) 332 $(link32) $(dlllflags) -out:$@ $(baselibs) @<< 333$** 334<< 335 -@del $*.exp 336 337$(PRJSTUBLIB): $(PRJSTUBOBJS) 338 $(lib32) -nologo -out:$@ $(PRJSTUBOBJS) 339 340#--------------------------------------------------------------------- 341# Implicit rules 342#--------------------------------------------------------------------- 343 344{$(WINDIR)}.c{$(TMP_DIR)}.obj:: 345 $(cc32) $(TCL_CFLAGS) -DBUILD_$(PROJECT) -Fo$(TMP_DIR)\ @<< 346$< 347<< 348 349{$(GENERICDIR)}.c{$(TMP_DIR)}.obj:: 350 $(cc32) $(TCL_CFLAGS) -DBUILD_$(PROJECT) -Fo$(TMP_DIR)\ @<< 351$< 352<< 353 354{$(COMPATDIR)}.c{$(TMP_DIR)}.obj:: 355 $(cc32) $(TCL_CFLAGS) -DBUILD_$(PROJECT) -Fo$(TMP_DIR)\ @<< 356$< 357<< 358 359{$(WINDIR)}.rc{$(TMP_DIR)}.res: 360 $(rc32) -fo $@ -r -i "$(GENERICDIR)" -D__WIN32__ \ 361!if $(DEBUG) 362 -d DEBUG \ 363!endif 364!if $(TCL_THREADS) 365 -d TCL_THREADS \ 366!endif 367!if $(STATIC_BUILD) 368 -d STATIC_BUILD \ 369!endif 370 $< 371 372.SUFFIXES: 373.SUFFIXES:.c .rc 374 375#--------------------------------------------------------------------- 376# Installation. (EDIT) 377# 378# You may need to modify this section to reflect the final distribution 379# of your files and possibly to generate documentation. 380# 381#--------------------------------------------------------------------- 382 383install-binaries: 384 @echo Installing binaries to '$(SCRIPT_INSTALL_DIR)' 385 @if not exist "$(SCRIPT_INSTALL_DIR)" mkdir "$(SCRIPT_INSTALL_DIR)" 386 @$(CPY) $(PRJLIB) "$(SCRIPT_INSTALL_DIR)" >NUL 387 388install-libraries: 389 @echo Installing libraries to '$(SCRIPT_INSTALL_DIR)' 390 @if exist $(LIBDIR) $(CPY) $(LIBDIR)\*.tcl "$(SCRIPT_INSTALL_DIR)" 391 @echo Installing package index in '$(SCRIPT_INSTALL_DIR)' 392 @type << >"$(SCRIPT_INSTALL_DIR)\pkgIndex.tcl" 393package ifneeded $(PROJECT) $(DOTVERSION) \ 394 [list load [file join $$dir $(PRJLIBNAME)] sqlite3] 395<< 396 397install-docs: 398 @echo Installing documentation files to '$(DOC_INSTALL_DIR)' 399 @if exist $(DOCDIR) $(CPY) $(DOCDIR)\*.n "$(DOC_INSTALL_DIR)" 400 401#--------------------------------------------------------------------- 402# Clean up 403#--------------------------------------------------------------------- 404 405clean: 406 @if exist $(TMP_DIR)\nul $(RMDIR) $(TMP_DIR) 407 @if exist $(WINDIR)\version.vc del $(WINDIR)\version.vc 408 409realclean: clean 410 @if exist $(OUT_DIR)\nul $(RMDIR) $(OUT_DIR) 411 412distclean: realclean 413 @if exist $(WINDIR)\nmakehlp.exe del $(WINDIR)\nmakehlp.exe 414 @if exist $(WINDIR)\nmakehlp.obj del $(WINDIR)\nmakehlp.obj 415