# Compile and link .c, .obj and/or .lib files for Windows NT, Release 2.2.59 # Copyright (c) 1992-1995 by Hamilton Laboratories. All rights reserved. # If NTVersion >= 612 (Daytona beta or later) then # The compiler is assumed to be cl.exe on both Intel and MIPS and # cl.exe (VC++) or the older claxp.exe on Alpha. # If CPU == PPC then # If NTVersion >= 944 then # The compiler is cl.exe. # else # It's mcl.exe. # else # On Intel, the compiler is cl386.exe. # If CPU == MIPS then # Either the old MIPS compiler or the new hybrid Microsoft/MIPS # compiler may be used. # If NTVersion < 404 (not March beta) then # The old MIPS compiler is the default # else # The new compiler is the default. # You may explicitly specify old or new using the -old or -new options. # If CPU == ALPHA then # Either the old Alpha compiler or the new hybrid Microsoft/DEC # compiler may be used. # If NTVersion < 404 (not March beta) then # The old ALPHA compiler is the default # else # The new compiler is the default. # You may explicitly specify old or new using the -old or -new options. # If CPU == PPC then the compiler is mcl.exe. # By default or if the -console flag is specified, cl will assume it's # building a console application. If -GUI is specified, it expects to # build a graphical application. # Compilation options: # i386 Compile: -c -Od -Zi -W4 -DNT -Di386=1 -D_X86_=1 -DWIN32 # -D_WIN32 -Dend=EndOfData # MIPS Compile: # using MIPS: -c -std -O -o $i:b.obj -EL -DNT -DMIPS=1 # -D_MIPS_=1 -DWIN32 -D_WIN32 -Dend=EndOfData # using new MS: -c -Od -Zi -W4 -DNT -DMIPS=1 -D_MIPS_=1 -DWIN32 # -D_WIN32 -Dend=EndOfData # ALPHA Compile: # using DEC: -c -std -G 0 -o $i:b.obj -checkstack 4096 -00 -EL # -Dend=EndOfData -DNT -DALPHA=1 -DWIN32 -D_WIN32 -excpt # -DDEVL=1 -I<include directories> # using new MS: -c -Od -Zi -W4 -DNT -DALPHA=1 -D_ALPHA_=1 -DWIN32 # -D_WIN32 -Dend=EndOfData -D__stdcall= -D_cdecl= # PPC Compile: -c -Od -Zi -W4 -DNT -DPPC=1 -D_PPC_=1 -DWIN32 -D_WIN32 # -Dend=EndOfData # In addition, if NTVersion >= 807 (Daytona final release), the # following compile options will be added: # # -Dtry=__try -Dexcept=__except -Dleave=__leave # -Dfinally=__finally -DCRTAPI1=_cdecl -DCRTAPI2=_cdecl # Link options: # Console Link: -subsystem:console -entry:mainCRTStartup -debug:full # -debugtype:both # GUI Link: -subsystem:windows -entry:WinMainCRTStartup -debug:full # -debugtype:both # If NTVersion >= 612 then then additional # option, -NODEFAULTLIB, will be added to the # link parameters. # If NTVersion >= 807 then the additional # options, -INCREMENTAL:NO -PDB:NONE -RELEASE # will be added to the link parameters. # (Note that this script uses the single-threaded C run-time library. # unless you compile with -D_MT. We recommend using the single-threaded # library even if you are building a multi-threaded application, because # the CRTL _beginthread routine is inherently unsafe. The handle it # returns is closed by the CRTL's thread epilogue when the child thread # exits. Since the scheduling of threads is indeterminate and NT reuses # handle values quickly, the handle returned by _beginthread is not # dependable. We recommend instead that the single-threaded library be # used, with critical section calls around any use of a CRTL function.) # All the output is filtered thru ferr which filters out nuisance # error messages such as the warnings about no modules extracted from # a given .lib file or about assignments inside conditional tests. # The list of nuisance messages is kept in skip file pointed to by the # skip variable. If skip isn't set or doesn't point to a real file, cl.csh # wil attempt to look for a skip file in the same directory with this # script. if (! $?skip || ! -e $skip) then # Look for the filter file in the same directory with this cl.csh script. set s = `whereis cl.csh` if ($#s && -e $s[0]:h\skip) then set skip = $fullpath($s[0]:h\skip) alias ferr fgrep -vqf $skip else echo -2 Warning: Output filter file not found! No filtering will be done. alias ferr cat end else alias ferr fgrep -vqf $skip end proc cl(args) local i, j, ^ debug, c_only, O_opt, O_opt_specified, options, ^ c_files, obj_files, res_files, rc_files, lib_files, ^ exe, ldir, stdlibs, ntdll, use_old_cc, GUI_app, linker, ^ D_MT, DSE switch (upper(CPU)) case "MIPS": @ O_opt = (use_old_cc = NTVersion < 404) ? "-O" : "-Od" break case "ALPHA": @ O_opt = (use_old_cc = NTVersion < 404) ? "-O0" : "-Od" break default: @ O_opt = "-Od" end @ c_only = 0 for i = 0 to $#args - 1 do @ j = substr(args[i], 1, 1) if (j == '-' || j == '/') then if (substr(args[i], 2) == 'c') then @ c_only = 1 else if (substr(args[i], 2, 1) == 'O') then set O_opt = $args[i] @ O_opt_specified = 1 else switch (substr(args[i], 2)) case "old": @ use_old_cc = 1 if (!O_opt_specifed) then switch (upper(CPU)) case "MIPS": @ O_opt = "-O" break case "ALPHA": @ O_opt = "-O0" end end break case "new": @ use_old_cc = 0 if (!O_opt_specifed) then switch (upper(CPU)) case "MIPS": @ O_opt = "-Od" break case "ALPHA": @ O_opt = "-Od" end end break case "console": @ GUI_app = 0 break case "GUI": @ GUI_app = 1 break case "D_MT": @ D_MT = 1 default: set options = $options $args[i] end end end else switch ($args[i]:e) case 'c': case 'cxx': case 'cpp': set c_files = $c_files $args[i] set obj_files = $obj_files $args[i]:b.obj break case 'obj': case 'rbj': set obj_files = $obj_files $args[i] break case 'exe': set exe = $args[i] break case 'rc': set rc_files = $rc_files $args[i] break case 'res': set res_files = $res_files $args[i] break case 'lib': default: set lib_files = $lib_files $args[i] end end end # Run the resource compiler and cvtres on each .rc file foreach i ($rc_files) echo rc -r $i rc -r $i echo cvtres -$CPU $i:b.res -o $i:b.rbj cvtres -$CPU $i:b.res -o $i:b.rbj set obj_files = $obj_files $i:b.rbj end # Run cvtres on each .res file foreach i ($res_files) echo cvtres -$CPU $i -o $i:b.rbj cvtres -$CPU $i -o $i:b.rbj set obj_files = $obj_files $i:b.rbj end # Run the compile step on each .c file. if (NTVersion >= 807) then set DSE = -Dtry=__try -Dexcept=__except -Dleave=__leave ^ -Dfinally=__finally -DCRTAPI1=_cdecl -DCRTAPI2=_cdecl end (switch (upper(CPU)) case "MIPS": if (NTVersion < 612 && use_old_cc) then foreach i ($c_files) echo cc -c -std -O -o $i:b.obj -EL -DNT -DMIPS=1 -D_MIPS_=1 ^ -DWIN32 -D_WIN32 -Dend=EndOfData $options $i cc -c -std -O -o $i:b.obj -EL -DNT -DMIPS=1 -D_MIPS_=1 ^ -DWIN32 -D_WIN32 -Dend=EndOfData $options $i if ($status) return echo mip2coff $i:b.obj mip2coff $i:b.obj if ($status) return end else local cc @ cc = NTVersion < 612 ? "mcl.exe" : "cl.exe" foreach i ($c_files) echo $cc -c $O_opt -Zi -W4 -DNT -DMIPS=1 -D_MIPS_=1 -DWIN32 ^ -D_WIN32 -Dend=EndOfData $DSE $options $i $cc -c $O_opt -Zi -W4 -DNT -DMIPS=1 -D_MIPS_=1 -DWIN32 ^ -D_WIN32 -Dend=EndOfData $DSE $options $i if ($status) return end end break case "ALPHA": if (NTVersion < 612 && use_old_cc) then if (NTVersion < 522) then # Alpha compiler doesn't handle the INCLUDE environment # variable properly -- it has to be passed on the command # line. set Inc = -I$INCLUDE:gs/;/ -I/ if (NTVersion < 404) set options = -EL -excpt -DDEVL=1 $options end foreach i ($c_files) echo acc -c -std -G 0 -o $i:b.obj -checkstack 4096 ^ $O_opt -Dend=EndOfData -DNT -DALPHA=1 -D_ALPHA_=1 ^ -DWIN32 -D_WIN32 $options $Inc $i acc -c -std -G 0 -o $i:b.obj -checkstack 4096 ^ $O_opt -Dend=EndOfData -DNT -DALPHA=1 -D_ALPHA_=1 ^ -DWIN32 -D_WIN32 $options $Inc $i if ($status) return echo a2coff $i:b.obj a2coff $i:b.obj if ($status) return end else @ cc = `whereis cl.exe` != '' ? "cl.exe" : "claxp" foreach i ($c_files) echo $cc -c $O_opt -Zi -W4 -DNT -DALPHA=1 -D_ALPHA_=1 ^ -DWIN32 -D_WIN32 -Dend=EndOfData -D__stdcall= ^ -D_cdecl= $DSE $options $i $cc -c $O_opt -Zi -W4 -DNT -DALPHA=1 -D_ALPHA_=1 -DWIN32 ^ -D_WIN32 -Dend=EndOfData -D__stdcall= -D_cdecl= $DSE ^ $options $i if ($status) return end end break case "PPC": @ cc = NTVersion >= 944 ? "cl.exe" : "mcl" foreach i ($c_files) echo $cc -c $O_opt -Zi -W4 -DNT -DPPC=1 -D_PPC_=1 -DWIN32 ^ -D_WIN32 -Dend=EndOfData $DSE $options $i $cc -c $O_opt -Zi -W4 -DNT -DPPC=1 -D_PPC_=1 -DWIN32 ^ -D_WIN32 -Dend=EndOfData $DSE $options $i if ($status) return end break default: local cc @ cc = NTVersion < 612 ? "cl386.exe" : "cl.exe" foreach i ($c_files) echo $cc -c $O_opt -Zi -W4 -DNT -Di386=1 -D_X86_=1 -DWIN32 ^ -D_WIN32 -Dend=EndOfData $DSE $options $i $cc -c $O_opt -Zi -W4 -DNT -Di386=1 -D_X86_=1 -DWIN32 ^ -D_WIN32 -Dend=EndOfData $DSE $options $i if ($status) return end end if (! $c_only) then local defflag if (NTVersion >= 612) then if (NTVersion >= 807) then set defflag = -NODEFAULTLIB -INCREMENTAL:NO -PDB:NONE -RELEASE else set defflag = -NODEFAULTLIB end end # If no .exe file was specified, name the output to match the # first .c or .obj file on the command line. if (exe == '') then @ exe = $#c_files == 0 ? $obj_files[0]:b.exe : $c_files[0]:b.exe end @ stdlibs = D_MT ? "libcmt.lib" : "libc.lib" if (NTVersion >= 404) then # Figure out whether ntdll.lib exists on this build. if (LIB =~ "*;*") then foreach i ($LIB:gs/;/ /) if (-e $i\ntdll.lib) then set ntdll = ntdll.lib break; else if (CPU == "ALPHA" && -e $i\alpha\ntdll.lib) then set ntdll = ntdll.lib end end end else if (-e $LIB\ntdll.lib) set ntdll = ntdll.lib end if (NTVersion < 807) then set linker = link32 else set linker = link end if (GUI_app) then set stdlibs = $stdlibs $ntdll kernel32.lib advapi32.lib ^ user32.lib gdi32.lib winspool.lib comdlg32.lib else set stdlibs = $stdlibs $ntdll kernel32.lib user32.lib advapi32.lib end else # Figure out where libc.lib (or libcmt.lib) lives on the LIB path. if (LIB =~ "*;*") then foreach i ($LIB:gs/;/ /) if (-e $i\$stdlibs) then @ ldir = i break else if (CPU == "ALPHA" && -e $i\alpha\$stdlibs) then set ldir = $i\alpha break end end end else @ ldir = LIB end set linker = coff -link if (CPU == "ALPHA") then if (GUI_app) then set stdlibs = $ldir\{$stdlibs,{ntdll,kernel32,advapi32}.lib} ^ $ldir\{user32,gdi32,winspool,comdlg32}.lib else set stdlibs = $ldir\{$stdlibs,{ntdll,kernel32,user32,advapi32}.lib} end else set stdlibs = $ldir\{$stdlibs,^*.lib} end end # Run the link step, with debug info. if (GUI_app) then echo $linker -subsystem:windows -entry:WinMainCRTStartup -debug:full ^ -debugtype:both -out:$exe $defflag $obj_files $lib_files "$stdlibs" $linker -subsystem:windows -entry:WinMainCRTStartup -debug:full ^ -debugtype:both -out:$exe $defflag $obj_files $lib_files $stdlibs else echo $linker -subsystem:console -entry:mainCRTStartup -debug:full ^ -debugtype:both -out:$exe $defflag $obj_files $lib_files "$stdlibs" $linker -subsystem:console -entry:mainCRTStartup -debug:full ^ -debugtype:both -out:$exe $defflag $obj_files $lib_files $stdlibs end end) |& ferr end cl $argv
Hamilton C shell |
Free Updates |
Free Demo Software |
Win32 Training
Y2K |
Customer Testimonials |
On-line Hamilton C shell User Guide
Home |
Email |
Support |
Company Profile |
Distributors |
Links
Copyright © 1997-2001 by Hamilton Laboratories.
All rights reserved.
You are visitor number
999.
This page was last modified August 14, 2001.