Cl.csh



#  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.