windows-nt/Source/XPSP1/NT/sdktools/build/build.htm
2020-09-26 16:20:57 +08:00

325 lines
17 KiB
HTML

<HTML>
<BODY>
<A NAME=BASEDIR><H3>BASEDIR</H3></A>
The BASEDIR macro refers to the base of the source tree.
By default,
<PRE> BASEDIR=$(_NTDRIVE)$(_NTROOT)</PRE>
The following three statements are equivalent, but using the third one is recommended.
<PRE>
TARGETLIBS=d:\nt\public\sdk\lib\*\kernel32.lib
TARGETLIBS=$(BASEDIR)\public\sdk\lib\*\kernel32.lib
TARGETLIBS=$(<A HREF=#SDK_LIB_PATH>SDK_LIB_PATH</A>)\kernel32.lib
</PRE>
sources
dirs
makefile
makefile.inc
makefile.def
makefile.plt
build.dat
objects.mac
<A NAME=BUILD_DEFAULT_TARGETS><H3>BUILD_DEFAULT_TARGETS</H3></A>
This envirnoment variable specifies the platform for which you are building. This variables allows the possibly of cross platform compilation, when such compilers are available.
Here is an exmaple of this environment variable:
<PRE> BUILD_DEFAULT_TARGETS=-axp64</PRE>
<A NAME=BUILD_DEFAULT><H3>BUILD_DEFAULT</H3></A>
This envirnoment variable specifies the default options used by build.exe
Here is an example of this environment variable:
<PRE> BUILD_DEFAULT=-eswM -nmake -i</PRE>
<A NAME=BUILD_MAKE_PROGRAM><H3>BUILD_MAKE_PROGRAM</H3></A>
This envirnoment variable specifies the default program make executed by build.exe to in order to compile a directory.
The default value of this environment variable should be nmake.exe.
<A NAME=BUILD_OTPIONS><H3>BUILD_OPTIONS</H3></A>
By default, build.exe will traverse the entire source tree, processing the directories listed in the DIRS section of the dirs file.
This envirnoment variable specifies which of the optional directories, listed under </A HREF=#OPTIONAL_DIRS>OPTIONAL_DIRS</A> should be processed by build.exe
Here are some examples of this environment variable:
<PRE> BUILD_OPTIONS=OptDir1 OptDir2</PRE>
would cause build to also process all OptDir1 and OptDir2 directories listed under an OPTIONAL_DIRS section.
<PRE> BUILD_OPTIONS=~OptDir1 OptDir2</PRE>
would cause build to all OptDir2 directories listed under an OPTIONAL_DIRS section, but force it to skip over all OptDir1 directories, whether listed in the DIRS or OPTIONAL_DIRS section of a dirs file.
<A NAME=CRT_INC_PATH><H3>CRT_INC_PATH</H3></A>
<P>This envirnoment variable specifies the location of the C Runtime header files. The default value of this macro is:</P>
<PRE> $(BASEDIR)\public\sdk\inc\crt</PRE>
<P>Set this macro in your environment variables if you wish to override the default location of the C Runtime header files.<BR>
This macro should no be redefined from within a sources file.</P>
<A NAME=CRT_LIB_PATH><H3>CRT_LIB_PATH</H3></A>
<P>This envirnoment variable specifies the location of the C Runtime libraries. The default value of this macro is:</P>
<PRE> $(BASEDIR)\public\sdk\lib\crt</PRE>
<P>Set this macro in your environment variables if you wish to override the default location of the C runtime libraries.<BR>
This macro should no be redefined from within a sources file.</P>
<P>Here is an example of the usage of this macro:</P>
<PRE> TARGETLIB=$(CRT_LIB_PATH)\libcntpr.lib \<BR> $(SDK_LIB_PATH)\advapi32.lib</PRE>
<A NAME=DDK_INC_PATH><H3>DDK_INC_PATH</H3></A>
<P>This macro specifies the location of the DDK header files. The default value of this macro is:</P>
<PRE> $(BASEDIR)\public\ddk\inc</PRE>
<P>Set this macro in your environment variables if you wish to override the default location of the DDK header files.<BR>
This macro should no be redefined from within a sources file.</P>
<A NAME=DDK_LIB_DEST><H3>DDK_LIB_DEST</H3></A>
<P>This macro specifies the destination location of a DDK library. The default value of this macro is:</P>
<PRE> $(BASEDIR)\public\ddk\lib\*</PRE>
<P>Set this macro in your environment variables if you wish to override the default location of the DDK libraries.<BR>
This macro should no be redefined from within a sources file.</P>
<P>Here is an example of the usage of this macro:</P>
<PRE> TARGETPATHLIB=$(DDK_LIB_DEST)\ndis.lib</PRE>
<A NAME=DDK_LIB_PATH><H3>DDK_LIB_PATH</H3></A>
<P>This macro specifies the location of the DDK libraries. The default value of this macro is:</P>
<PRE> $(BASEDIR)\public\ddk\lib</PRE>
<P>Set this macro in your environment variables if you wish to override the default location of the DDK libraries.<BR>
This macro should no be redefined from within a sources file.</P>
<P>Here is an example of the usage of this macro:</P>
<PRE> TARGETLIB=$(DDK_LIB_PATH)\ndis.lib \<BR> $(DDK_LIB_PATH)\tdikrnl.lib</PRE>
<A NAME=DDK_LIB_PATH><H3>DDK_LIB_PATH</H3></A>
<P>This macro specifies the location of the DDK libraries. The default value of this macro is:</P>
<PRE> $(BASEDIR)\public\ddk\lib</PRE>
<P>Set this macro in your environment variables if you wish to override the default location of the DDK libraries.<BR>
This macro should no be redefined from within a sources file.</P>
<P>Here is an example of the usage of this macro:</P>
<PRE> TARGETLIB=$(DDK_LIB_PATH)\ndis.lib \<BR> $(DDK_LIB_PATH)\tdikrnl.lib</PRE>
<A NAME=MASTER_VERSION_FILE><H3>MASTER_VERSION_FILE</H3></A>
This macro contains the name of the master version file for Windows 2000.
It contains, among other things, the default operating system version number
which all binaries should have defined in the resource section.
The default value of this variable is $(<A HREF=#SDK_INC_PATH>SDK_INC_PATH</A>)\ntverp.h
You should not override this value in your environment variables unless your component is not integrated in the Windows 2000 product (please contact BryanT for more information).
<A NAME=OAK_INC_PATH><H3>OAK_INC_PATH</H3></A>
<P>This macro specifies the location of the OAK header files. The default value of this macro is:</P>
<PRE> $(BASEDIR)\public\oak\inc</PRE>
<P>Set this macro in your environment variables if you wish to override the default location of the OAK header files.<BR>
This macro should no be redefined from within a sources file.</P>
<A NAME=PRIVATE_INC_PATH><H3>PRIVATE_INC_PATH</H3></A>
<P>This macro specifies the location of the private windows 2000 header files. The default value of this macro is:</P>
<PRE> $(BASEDIR)\private\inc</PRE>
<P>Set this macro in your environment variables if you wish to override the default location of the private windows 2000 header files.<BR>
This macro should no be redefined from within a sources file.</P>
<A NAME=SDK_LIB_DEST><H3>SDK_LIB_DEST</H3></A>
<P>This macro specifies the destination location of a SDK library. The default value of this macro is:</P>
<PRE> $(BASEDIR)\public\sdk\lib\*</PRE>
<P>Set this macro in your environment variables if you wish to override the default location of the SDK libraries.<BR>
This macro should no be redefined from within a sources file.</P>
<P>Here is an example of the usage of this macro:</P>
<PRE> TARGETPATHLIB=$(SDK_LIB_DEST)\kernel32.lib</PRE>
<A NAME=SDK_LIB_PATH><H3>SDK_LIB_PATH</H3></A>
<P>This macro specifies the location of the SDK libraries. The default value of this macro is:</P>
<PRE> $(BASEDIR)\public\sdk\lib</PRE>
<P>Set this macro in your environment variables if you wish to override the default location of the SDK libraries.<BR>
This macro should no be redefined from within a sources file.</P>
<P>Here is an example of the usage of this macro:</P>
<PRE> TARGETLIB=$(SDK_LIB_PATH)\kernel32.lib \<BR> $(SDK_LIB_PATH)\advapi32.lib</PRE>
<A NAME=WDM_INC_PATH><H3>WDM_INC_PATH</H3></A>
<P>This macro specifies the location of the WDM header file. The default value of this macro is:</P>
<PRE> $(BASEDIR)\public\ddk\inc\wdm</PRE>
<P>Set this macro in your environment variables if you wish to override the default location of the WDM header files.<BR>
This macro should no be redefined from within a sources file.</P>
<A NAME=C_DEFINES><H3>C_DEFINES - <SMALL>optional</SMALL></H3></A>
Use this macro to specify switches you want passed to the compiler.
Typically, they are compiler #defines.
You might specify:
<PRE> C_DEFINES = -DENABLE_FEATURE1</PRE>
to define ENABLE_FEATURE1 to the compiler.
C_DEFINES gets passed to both the C compiler and the MIDL compiler.
Therefore, you cannot put compiler optimization or other machine or
tool specific switches in the C_DEFINES macro.
Use <A HREF=#MSC_OPTIMIZATION>MSC_OPTIMIZATION</A> for C compiler only optimizations
See also <A HREF=#ASM_DEFINES>ASM_DEFINES</A>, <A HREF=#RC_DEFINES>RC_DEFINES</A>
<A NAME=DLLORDER><H3>DLLORDER - <SMALL>optional</SMALL></H3></A>
When you are building a DLL, you can specify an order file that will be passed
to the linker. This order file lists the order in which functions should be
layed out in the image.
This is the same as <A HREF=#NTPROFILEINPUT>NTPROFILEINPUT</A> except that
a full name for the profile can be specified.
<A NAME=EXEPROFILEINPUT><H3>EXEPROFILEINPUT - <SMALL>obsolete</SMALL></H3></A>
Use <A HREF=#NTPROFILEINPUT>NTPROFILEINPUT</A> instead.
<A NAME=INCLUDES><H3>INCLUDES - <SMALL>optional</SMALL></H3></A>
<P>Build.exe use a default list of public include directories from which to search for header files.
The default list of include directories is dependent on the value of <A HREF=#TARGETTYPE>TARGETTYPE</A> in the sources file.</P>
<P>Use the INCLUDES macro to indicate an additional list of private include directories to be searched for include files during compilation.
Separate the entries in this list with a semicolon.
Path names can be absolute or relative.</P>
For example:
<PRE>
INCLUDES=..\inc;..\..\inc
INCLUDES=$(INCLUDES); \
h; \
..\headers;
</PRE>
The INCLUDES macro is read by build.exe and passed to the MAKE program.
The list of directories in the INCULDES macro will have precedence over the default include directories.
<A NAME=MAJORCOMP><H3>MAJORCOMP - <SMALL>obsolete</SMALL></H3></A>
Please remove from your sources file
<A NAME=MINORCOMP><H3>MINORCOMP - <SMALL>obsolete</SMALL></H3></A>
Please remove from your sources file
<A NAME=NO_NTDLL><H3>NO_NTDLL - <SMALL>optional</SMALL></H3></A>
Set this macro to 0 to force your binary <I>not</I> to link against NTDLL.LIB.
<A NAME=NTPROFILEINPUT><H3>NTPROFILEINPUT - <SMALL>optional</SMALL></H3></A>
When you are building a DLL, you can specify an order file that will be passed
to the linker. This order file lists the order in which functions should be
layed out in the image.
To use the profile, specify the following in your sources file:
<PRE> NTPROFILEINPUT=1</PRE>
If you set this value, build.exe expect to find
<PRE> $(TARGETNAME).prf</PRE>
in the current subdirectory.
<P> See also <A HREF=#DLLORDER>DLLORDER</A></P>
<A NAME=PNP_POWER><H3>PNP_POWER - <SMALL>obsolete</SMALL></H3></A>
Please remove from your sources file
<A NAME=SOURCES><H3>SOURCES - <SMALL>required</SMALL></H3></A>
<P>The SOURCES macro is the most important macro in a sources file.
It specifies the list of files to be compiled.
Build.exe will look at these files and generate a dependency list.
For any source file whose dependencies changed, build.exe will rebuild
this file.</P>
<P>Use this macro to list your source filenames (except for the file containing
main in the case where <A HREF=#UMAPPL>UMAPPL</A> or <A HREF=#UMTEST>UMTEST</A>
is used. Include the filename extension and separate the entries in this list
with spaces or tabs.</P>
<A NAME=TARGETEXT><H3>TARGETEXT - <SMALL>optional</SMALL></H3></A>
Set this macro to specify the extension name (such as .cpl) when you want your binary to have something other than the default extension generated by <A HREF=#TARGETTYPE>TARGETTYPE</A>.
If you specify something unexpected, you will see a message "Unexpected Target Ext." If you want an extension added to the Build Utility, contact Bryan Tuttle (bryant).
<A NAME=TARGETLIBS><H3>TARGETLIBS - <SMALL>required</SMALL></H3></A>
<P>Set this macro to specify the set of libraries with which your final image must be linked.</P>
If your components generates a library (.lib) and this library must link in code from other libraries, use the <A HREF=#LINKLIBS>LINKLIBS</A> macro.
Use LINKLIBS only for the case that meets the following conditions:
You are building a dynamic link.
You are exporting something that's defined in some other component library that you also build.
In your dirs file in the subdirectory above, you have ordered it so that the component libraries are around before you build the dynamic link.
There is a similar macro called UMLIBSUMLIBS that you can use if you are building UMAPPLs.
<A NAME=TARGETNAME><H3>TARGETNAME - <SMALL>required</SMALL></H3></A>
Use this macro to specify the name of the binary being built, excluding the filename extension.
You must have this macro in your sources file.
<A NAME=TARGETPATH><H3>TARGETPATH - <SMALL>required</SMALL></H3></A>
Use this macro to specify the target directory in which the resulting binary will be placed.
Notice that object files always end up in the obj subdirectory. Object file can only be generated in the <A HREF=#$(O)>$(O)</A> directory.
You must have this macro in your sources file. For example:
<PRE> TARGETPATH=obj</PRE>
See Also <A HREF=#TARGETPATHLIB>TARGETPATHLIB</A>
<A NAME=TARGETPATHLIB><H3>TARGETPATHLIB - <SMALL>optional</SMALL></H3></A>
Set this value to specify where to put the import library associated with this binary. <BR>
When you are building a DLL, you create the DLL itself and you create an import library that other images can use to reference functions exported by your DLL. <BR>
<PRE> TARGETPATHLIB=$(SDK_LIB_PATH)mydll.lib</PRE>
<P>Setting <A HREF=#TARGETPATH>TARGETPATH</A> independently from TARGETPATHLIB allows the binary to be kept in the
current directory, while the .lib and .exp files can be shared with other components. </P>
<A NAME=TARGETTYPE><H3>TARGETTYPE - <SMALL>required</SMALL></H3></A>
Use this macro to specify the type of binary being built. This is typically LIBRARY or
DYNLINK (for DLLs), but can take other values. This is a required field in the sources file.
TARGETTYPE allows build.exe to select appropriate defaults for include paths and link options.
You must have this macro in your sources file.
The valid values for TARGETYPE include:
<TABLE CELLPADDING=3 BORDER=3>
<TR VALIGN=TOP><TH> TARGETTYPE values </TH><TH> File Extension </TH><TH> Description </TH>
<TR VALIGN=TOP><TD><A NAME=PROGLIB>PROGLIB</A> </TD><TD> .exe </TD><TD> Executable program which also exports functions for other programs. </TD></TR>
<TR VALIGN=TOP><TD><A NAME=PROGRAM>PROGRAM</A> </TD><TD> .exe </TD><TD> Simple user mode program. </TD></TR>
<TR VALIGN=TOP><TD><A NAME=DYNLINK>DYNLINK</A> </TD><TD> .dll </TD><TD> Dynamic Link Library (dll). </TD></TR>
<TR VALIGN=TOP><TD><A NAME=LIBRARY>LIBRARY</A> </TD><TD> .lib </TD><TD> Component library whose code will be linked into another binary (such as a dll). </TD></TR>
<TR VALIGN=TOP><TD><A NAME=DRIVER_LIBRARY>DRIVER_LIBRARY</A> </TD><TD> .lib </TD><TD> Component library for a driver. The only difference with the LIBRARY type is that the default header file include path is different. </TD></TR>
<TR VALIGN=TOP><TD><A NAME=DRIVER>DRIVER</A> </TD><TD> .sys </TD><TD> Kernel mode driver.
<TR VALIGN=TOP><TD><A NAME=EXPORT_DRIVER>EXPORT_DRIVER</A> </TD><TD> .sys </TD><TD> Kernel mode driver which also exports routines other drivers can link against and call. </TD></TR>
<TR VALIGN=TOP><TD><A NAME=HAL>HAL</A> </TD><TD> .dll </TD><TD> Hardware Abstraction Layer (HAL) </TD></TR>
<TR VALIGN=TOP><TD><A NAME=BOOTPGM>BOOTPGM</A> </TD><TD> .exe </TD><TD> Kernel mode driver. </TD></TR>
<TR VALIGN=TOP><TD><A NAME=MINIPORT>MINIPORT</A> </TD><TD> .sys </TD><TD> Kernel mode driver which does not link against ntoskrnl.lib or hal.lib. </TD></TR>
<TR VALIGN=TOP><TD><A NAME=GDI_DRIVER>GDI_DRIVER</A> </TD><TD> .dll </TD><TD> Kernel mode driver which only links against win32k.sys (Display or print driver). </TD></TR>
</TABLE>
<A NAME=UMAPPL><H3>UMAPPL</H3></A>
<A NAME=UMAPPLEXT><H3>UMAPPLEXT</H3></A>
Use this macro to specify the extension name (for example .COM or .SCR) that
will be appended to the name specified in <A HREF=#UMAPPL>UMAPPL</A>.
Use UMAPPLEXT when you want the extension to be something other than .exe.
Contact Bryan Tuttle if you need to add a new type of extension.
<A NAME=UMLIBS><H3>UMLIBS</H3></A>
<A NAME=UMTEST><H3>UMTEST</H3></A>
<H2>Sample Driver Sources File</H2>
<PRE>
<A HREF=#TARGETNAME>TARGETNAME</A>=sample
<A HREF=#TARGETPATH>TARGETPATH</A>=obj
<A HREF=#TARGETTYPE>TARGETTYPE</A>=<A HREF=#DRIVER>DRIVER</A>
<A HREF=#TARGETLIBS>TARGETLIBS</A>=$(<A HREF=#DDK_LIB_PATH>DDK_LIB_PATH</A>)\videoprt.lib
<A HREF=#SOURCES>SOURCES</A>=file1.c \<BR> file2.c \<BR> file3.c
</PRE>
</BODY></HTML>