home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / vc98 / include / msitool.mak < prev    next >
Text File  |  1998-04-24  |  12KB  |  366 lines

  1. # Makefile for use with MSI to build custom actions, tests or tools.
  2. #
  3. # THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
  4. # EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
  5. # WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.
  6. #
  7. # Copyright (C) 1997  Microsoft Corporation.  All Rights Reserved.
  8. #
  9. # Must define the following (unless optional or default is indicated) using one of:
  10. #   1. command line to nmake.exe (syntax: MACRO=value) (highest precedence)
  11. #   2. in outer makefile that !include this (typically a header section in .CPP file)
  12. #   3. environment variable
  13. #
  14. #  MODULENAME=   base name of .cpp file to build .exe or .dll with same base name
  15. #  SUBSYSTEM=    "console" or "windows" for EXE, do not define if DLL unless "RESOURCE"
  16. #  UNICODE=1  to compile Unicode executables (default is ANSI)
  17. #  ENTRY=     entrypoints (comma separated) for DLL or non-standard entry point for EXE
  18. #  VERSION=  "SHIP" or "DEBUG" or "CVPACK" or "NOBSC"(no browser files, the default)
  19.  
  20. # Options to generate a version resource (recommended)
  21. #
  22. #  FILEVERSION=  specify MM.mm to generate version resource (=MSI to track MSI version)
  23. #  PRODUCTVERSION=  product version for resource, defaults to FILEVERSION
  24. #  DESCRIPTION=  description for use in version resource (if FILEVERSION defined)
  25. #  COMPANYNAME=  company name to use in version resource (if FILEVERSION defined)
  26.  
  27. # Build options that will generally need to be set
  28. #
  29. #  INCLUDE=   include path for compiler, should include MSI.H, MSIQUERY.H (unless MSIPROJ set)
  30. #  LIB=       lib path for use by linker, should include MSI.LIB (unless MSIPROJ set)
  31.  
  32. # Options that may be used in special cases, not needed for simple builds
  33. #
  34. #  ADDCPP=    optional comma-separated list of additional CPP files to compile
  35. #  DEPEND=    optional list of additional make dependents, normally include files
  36. #  LINKLIBS=  additional libraries to link, standard libraries are:
  37. #             kernel32.lib user32.lib advapi32.lib libc.lib version.lib gdi32.lib
  38. #  BUILDDIR=  to override default: SHIP|DEBUG|CVPACK under current dir (unless MSIPROJ set)
  39. #  MSILIB=    full path to MSI import lib, defaults to MSI.LIB using lib path search rules
  40. #  VCBIN=     directory of all MSVC executables, else uses MSDevDir & MSVCDir, else PATH
  41. # Note: For VC5 use, if MSDevDir is defined, then MSVCDir must also be defined (VCVARS32.BAT)
  42.  
  43. #-----------------------------------------------------------------------------
  44. # directory resolution
  45. #-----------------------------------------------------------------------------
  46.  
  47. !ifndef MODULENAME
  48. !error Must define MODULENAME to base name of .cpp file
  49. !endif
  50.  
  51. !ifndef MODULESRC
  52. MODULESRC = .
  53. !endif
  54.  
  55. !ifndef VERSION
  56. VERSION = NOBSC
  57. !endif
  58. !if "$(VERSION)"=="SHIP"
  59. _subdir_ = SHIP
  60. !else if "$(VERSION)"=="DEBUG" || "$(VERSION)"=="NOBSC"
  61. _subdir_ = DEBUG
  62. !else if "$(VERSION)"=="CVPACK"
  63. _subdir_ = CVPACK
  64. !else
  65. !error Must define VERSION to SHIP or CVPACK, or DEBUG or NOBSC(default)
  66. !endif
  67.  
  68. !ifdef MSIPROJ
  69. BUILDDIR   = $(MSIPROJ)\build\$(_subdir_)
  70. COMMONDIR  = $(MSIPROJ)\build\common
  71. MSICPP     = -I$(COMMONDIR)
  72. !else
  73. !ifndef BUILDDIR
  74. BUILDDIR   = $(MODULESRC)\$(_subdir_)
  75. !endif
  76. !endif
  77.  
  78. OBJDIR = $(BUILDDIR)\OBJECT
  79.  
  80. #-----------------------------------------------------------------------------
  81. # build model processing
  82. #-----------------------------------------------------------------------------
  83.  
  84. !ifdef PROCESSOR_ARCHITECTURE
  85. PLATFORM = $(PROCESSOR_ARCHITECTURE)
  86. !else
  87. PLATFORM = x86
  88. !endif
  89. !if "$(PLATFORM)" == "x86" || "$(PLATFORM)" == "X86"
  90. _machine_ = /MACHINE:IX86
  91. !else if "$(PLATFORM)" == "alpha" || "$(PLATFORM)" == "ALPHA"
  92. _machine_ = /MACHINE:ALPHA
  93. !else
  94. !error Must define PLATFORM to x86 or ALPHA
  95. !endif
  96.  
  97. ALIGN = -align:0x1000
  98.  
  99. _objects_ = $(OBJDIR)\$(MODULENAME).obj
  100. !ifdef SUBSYSTEM
  101. !if defined(ENTRY)
  102. ENTRY = /ENTRY:$(ENTRY)
  103. !else if "$(SUBSYSTEM)" == "console" || "$(SUBSYSTEM)" == "CONSOLE"
  104. !ifdef UNICODE
  105. ENTRY = /ENTRY:wmainCRTStartup
  106. !else
  107. ENTRY = /ENTRY:mainCRTStartup
  108. !endif
  109. !endif
  110. !if "$(SUBSYSTEM)" == "resource" || "$(SUBSYSTEM)" == "RESOURCE"
  111. SUBSYSTEM = /DLL
  112. TARGET = $(MODULENAME).dll
  113. _objects_ =
  114. ALIGN = -align:0x1000
  115. ENTRY = /NOENTRY $(_machine_)
  116. !else if "$(SUBSYSTEM)" == "windows" || "$(SUBSYSTEM)" == "WINDOWS"
  117. SUBSYSTEM = /SUBSYSTEM:$(SUBSYSTEM),4.0
  118. TARGET = $(MODULENAME).exe
  119. EXCEPTIONS = -GX
  120. !ifdef UNICODE
  121. ENTRY = /ENTRY:wWinMainCRTStartup
  122. !else
  123. ENTRY = /ENTRY:WinMainCRTStartup
  124. !endif
  125. !else
  126. SUBSYSTEM = /SUBSYSTEM:$(SUBSYSTEM),4.0
  127. TARGET = $(MODULENAME).exe
  128. EXCEPTIONS = -GX
  129. !endif
  130. !else # DLL
  131. !if defined(AUTOMATION) && "$(AUTOMATION)" != "NOEXCEPTIONS"
  132. EXCEPTIONS = -GX
  133. !else
  134. EXCEPTIONS = # exceptions not supported in DLL at this time
  135. !endif
  136. SUBSYSTEM = /DLL
  137. TARGET = $(MODULENAME).dll
  138. !if defined(ENTRY)
  139. ENTRY = /EXPORT:$(ENTRY:,= /EXPORT:)
  140. !endif
  141. !if defined(AUTOMATION)
  142. ENTRY = $(ENTRY) /EXPORT:DllGetClassObject /EXPORT:DllCanUnloadNow /EXPORT:DllRegisterServer /EXPORT:DllUnregisterServer
  143. !endif
  144. !endif # SUBSYTEM | DLL
  145.  
  146. !if !defined(MSILIB) && "$(_objects_)" != ""
  147. !ifdef MSIPROJ
  148. MSILIB     = $(BUILDDIR)\Msi.lib  # should be COMMONDIR?
  149. !else
  150. MSILIB     = Msi.lib
  151. !endif
  152. !endif
  153.  
  154. #-----------------------------------------------------------------------------
  155. # default build target object dependencies
  156. #-----------------------------------------------------------------------------
  157.  
  158. all: $(BUILDDIR)\$(TARGET)
  159.  
  160. !if defined(ADDCPP) && [echo _objects_=$(_objects_) $(OBJDIR)\$(ADDCPP:,=.obj $(OBJDIR^)\).obj > $(OBJDIR)\obj.tmp] == 0
  161. !include $(OBJDIR)\obj.tmp
  162. !endif
  163.  
  164. #-----------------------------------------------------------------------------
  165. # tools
  166. #-----------------------------------------------------------------------------
  167.  
  168. !ifdef VCBIN
  169. _vcbin_ = $(VCBIN)\#
  170. _msdevbin_ = $(VCBIN)\#
  171. !else # VCBIN not defined
  172. !ifdef MSVCDIR # VC5
  173. _vcbin_ = $(MSVCDIR)\bin\#
  174. !endif
  175. !ifdef MSDEVDIR # VC vars set
  176. _msdevbin_ = $(MSDEVDIR)\bin\#
  177. !ifndef MSVCDIR # VC 4.x
  178. _vcbin_ = $(MSDEVDIR)\bin\#
  179. !endif
  180. !endif
  181. !endif
  182.  
  183. CC      = "$(_vcbin_)cl"
  184. RC      = "$(_msdevbin_)rc"
  185. LINK    = "$(_vcbin_)link"
  186. BSCMAKE = "$(_vcbin_)bscmake"
  187. MKTYPLIB= "$(_vcbin_)mktyplib" /cpp_cmd $(_vcbin_)cl
  188.  
  189. #-----------------------------------------------------------------------------
  190. # flags
  191. #-----------------------------------------------------------------------------
  192.  
  193. DFLAGS = -DWIN -D_WIN32 -DWIN32
  194.  
  195. cppflags = -c -W3 -WX -DSTRICT -nologo -J -Gf $(EXCEPTIONS) $(DFLAGS) 
  196. linkcommon = /NODEFAULTLIB /MAP $(ALIGN)
  197. linkexe = $(lflags)
  198. linkdll = $(lflags) -entry:_DllMainCRTStartup@12 -dll
  199. linkDEBUG = -debug:full -debugtype:cv
  200. linkCVPACK = -debug:full -debugtype:both,fixup /opt:ref
  201.  
  202. !ifdef UNICODE
  203. cppflags = $(cppflags) -DUNICODE -D_UNICODE
  204. !endif
  205.  
  206. !if "$(VERSION)"=="DEBUG"
  207. #cppflags= $(cppflags) /Fd$(@D)\msitool.pdb -Zi -DDEBUG /Fr$(@R).sbr -Ob1
  208. #cppflags= $(cppflags) /Fd$(@D)\msitool.pdb -Zi -DDEBUG /Fr$(@R).sbr -Ox
  209. cppflags = $(cppflags) /Fd$(@D)\msitool.pdb -Zi -DDEBUG /Fr$(@R).sbr
  210. linkflags = $(linkcommon) $(linkDEBUG)
  211. !else if "$(VERSION)"=="NOBSC"
  212. cppflags = $(cppflags) /Fd$(@D)\msitool.pdb -Zi -DDEBUG
  213. linkflags = $(linkcommon) $(linkDEBUG)
  214. !else if "$(VERSION)"=="SHIP"
  215. cppflags = $(cppflags) -Ox -Gy
  216. linkflags = $(linkcommon)
  217. !else
  218. cppflags= $(cppflags) -DCVPACK
  219. linkflags = $(linkcommon) $(linkCVPACK)
  220. !endif
  221. !ifdef LINKBASE
  222. linkflags = $(linkflags) /BASE:$(LINKBASE)
  223. !endif
  224.  
  225. rcflags  = -r -d_RC32 $(DFLAGS) -i $(OBJDIR)
  226. !if "$(VERSION)"=="DEBUG" || "$(VERSION)"=="NOBSC" 
  227. rcflags = $(rcflags) -DDEBUG
  228. !endif
  229.  
  230. impflags = -nologo
  231. bscflags = -nologo -n
  232.  
  233. #-----------------------------------------------------------------------------
  234.  
  235. !if "$(_objects_)" != ""
  236. LIBS =  kernel32.lib user32.lib advapi32.lib libc.lib version.lib gdi32.lib
  237. !endif
  238. !ifdef AUTOMATION
  239. _typelib_ = $(OBJDIR)\$(MODULENAME).tlb
  240. !endif
  241.  
  242. #-----------------------------------------------------------------------------
  243. # MSI header file dependencies
  244. #-----------------------------------------------------------------------------
  245.  
  246. !if "$(FILEVERSION)"=="Msi" || "$(FILEVERSION)"=="msi"
  247. FILEVERSION = MSI
  248. !endif
  249. !if "$(PRODUCTVERSION)"=="Msi" || "$(PRODUCTVERSION)"=="msi"
  250. PRODUCTVERSION = MSI
  251. !endif
  252. !ifdef MSIPROJ
  253. _depend_ = $(DEPEND:,= ) $(COMMONDIR)\msiquery.h
  254. !if "$(FILEVERSION)"=="MSI" || "$(PRODUCTVERSION)"=="MSI"
  255. _depend_ = $(_depend_) $(OBJDIR)\verdate.h
  256. !endif
  257. !else
  258. _depend_ = $(DEPEND:,= )
  259. !endif
  260.  
  261. #-----------------------------------------------------------------------------
  262. # version resource generation
  263. #-----------------------------------------------------------------------------
  264.  
  265. !if defined(FILEVERSION) && (defined(MSIPROJ) || !("$(FILEVERSION)"=="MSI" || "$(PRODUCTVERSION)"=="MSI"))
  266. !ifndef PRODUCTVERSION
  267. PRODUCTVERSION = $(FILEVERSION)
  268. !endif
  269. !ifndef COMPANYNAME
  270. COMPANYNAME = Microsoft Corporation
  271. !endif
  272. $(OBJDIR)\$(MODULENAME).res : $(MODULESRC)\$(MODULENAME).cpp $(MAKEFILE) $(_typelib_)
  273.     $(RC) $(rcflags) -Fo$(OBJDIR)\$(MODULENAME).res <<$(OBJDIR)\$(MODULENAME).rc
  274. #include "$(MODULESRC)\$(MODULENAME).cpp"
  275. !if "$(FILEVERSION)"=="MSI" || "$(PRODUCTVERSION)"=="MSI"
  276. #include "$(OBJDIR)\verdate.h"
  277. !endif
  278. VS_VERSION_INFO VERSIONINFO
  279. !if "$(FILEVERSION)"=="MSI"
  280. FILEVERSION    nVersionMajor,nVersionMinor,0,nVersionBuild
  281. !else
  282. FILEVERSION    $(FILEVERSION:.=,)
  283. !endif
  284. !if "$(PRODUCTVERSION)"=="MSI"
  285. PRODUCTVERSION    nVersionMajor,nVersionMinor,0,nVersionBuild
  286. !else
  287. PRODUCTVERSION $(PRODUCTVERSION:.=,)
  288. !endif
  289. FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
  290. !if "$(VERSION)"=="DEBUG" || "$(VERSION)"=="NOBSC"
  291. FILEFLAGS VS_FF_DEBUG
  292. !else
  293. FILEFLAGS 0L
  294. !endif
  295. FILEOS VOS__WINDOWS32
  296. !if "$(SUBSYSTEM)"=="/DLL"
  297. FILETYPE VFT_DLL
  298. !else
  299. FILETYPE VFT_APP
  300. !endif
  301. FILESUBTYPE 0L
  302. {
  303.   BLOCK "StringFileInfo"
  304.   {
  305.     BLOCK "040904E4"
  306.     {
  307.       VALUE "CompanyName",     "$(COMPANYNAME)\0"
  308.       VALUE "FileDescription", "$(DESCRIPTION)\0"
  309. !if "$(FILEVERSION)"=="MSI"
  310.       VALUE "FileVersion",     szVerNum
  311. !else
  312.       VALUE "FileVersion",     "$(FILEVERSION)\0"
  313. !endif
  314.       VALUE "InternalName",    "$(TARGET) $(VERSION)\0"
  315.       VALUE "LegalCopyright",  "Copyright \251 $(COMPANYNAME) 1997\0"
  316.       VALUE "ProductName",     "MSI\0"
  317. !if "$(PRODUCTVERSION)"=="MSI"
  318.       VALUE "ProductVersion",  szVerNum
  319. !else
  320.       VALUE "ProductVersion",  "$(PRODUCTVERSION)\0"
  321. !endif
  322.     }
  323.   }
  324.   BLOCK "VarFileInfo" { VALUE "Translation", 0x409, 0x4E4 }
  325. }
  326. <<KEEP
  327. !else #!defined(FILEVERSION)
  328. $(OBJDIR)\$(MODULENAME).res : $(MODULESRC)\$(MODULENAME).cpp $(_typelib_) $(OBJDIR)
  329.     $(RC) $(rcflags) -Fo$@ $(MODULESRC)\$(MODULENAME).cpp
  330. !endif #defined(FILEVERSON)
  331.  
  332. #-----------------------------------------------------------------------------
  333. # build rules
  334. #-----------------------------------------------------------------------------
  335.  
  336. .SUFFIXES : .exe .obj .cpp .res .rc
  337.  
  338. ## can't find path! MAKEFILE = MsiTool.mak  # build targets are dependent upon makefile changes
  339.  
  340. $(BUILDDIR) : 
  341.     if not exist $(BUILDDIR)\NUL md $(BUILDDIR)
  342.  
  343. $(OBJDIR) : $(BUILDDIR)
  344.     if not exist $(BUILDDIR)\OBJECT\NUL md $(BUILDDIR)\OBJECT
  345.  
  346. {$(MODULESRC)}.cpp{$(OBJDIR)}.obj:
  347.     $(CC) $(cppflags) -Fo$*.obj $(MSICPP) $< 
  348.  
  349. !if "$(_objects_)" != ""
  350. $(_objects_) : $(_depend_) $(OBJDIR)
  351. !endif
  352.  
  353. !ifdef AUTOMATION
  354. $(OBJDIR)\$(MODULENAME).tlb : $(MODULESRC)\$(MODULENAME).cpp
  355.     $(MKTYPLIB) /w0 $(MODULESRC)\$(MODULENAME).cpp /tlb $(OBJDIR)\$(MODULENAME).tlb
  356. !endif
  357.  
  358. $(BUILDDIR)\$(TARGET): $(MAKEFILE) $(_objects_) $(OBJDIR)\$(MODULENAME).res
  359.     $(LINK) -out:$@ $(linkflags) $(SUBSYSTEM) $(ENTRY) @<<$(OBJDIR)\$(MODULENAME).lrf
  360.         $(_objects_)
  361.         $(OBJDIR)\$(MODULENAME).res
  362.         $(MSILIB) $(LINKLIBS) $(LIBS)
  363. <<KEEP
  364. !if "$(VERSION)"=="DEBUG" && "$(_objects_)" != ""
  365.     $(BSCMAKE) $(bscflags) -o $(BUILDDIR)\$(*B) $(_objects_:.obj=.sbr)
  366. !endif