home *** CD-ROM | disk | FTP | other *** search
- $ Verifying:= 'f$verify(0)'
- $!
- $! GNU "CC" Compiler command file
- $!
- $! Invoked from the GCC compile driver via LIB$DO_COMMAND:
- $! P1 = File to compile
- $! P2 = Options: O - Optimize
- $! D - Debug
- $! M - Produce Machine Code
- $! V - Be verbose during compilation
- $! P3 = "," separated Defines
- $! P4 = "," separated Undefines
- $! P5 = "," separated Include directories
- $! P6 = CC1 compilation phase options, including:
- $! -mdont-save-r2-r5 (PCC style register saving)
- $! -mpcc-alignment (PCC style struct align)
- $!
- $!
- $! Constants:
- $!
- $ Version:='f$trnlnm("GNU_CC_VERSION")'
- $ gcc_cpp="$GNU_CC:[000000]GCC-CPP"
- $ gcc_cc1="$GNU_CC:[000000]GCC-CC1"
- $ gcc_as= "$GNU_CC:[000000]GCC-AS ""-vGNU CC V''Version'"""
- $!
- $! Parse the options
- $! -----------------
- $ P2_Length = f$length(P2) ! So we only have to calculate it once
- $ Optimize = "" ! Default = No Optimize
- $ Debug = "" ! Default = No Debug
- $ Machine_Code = 0 ! Default = No Machine Code
- $ Quiet = " -quiet" ! Default = Silent
- $ if f$locate("O",p2) .ne. P2_Length then Optimize = " -opt"
- $ if f$locate("D",p2) .ne. P2_Length then Debug = " ""-G"""
- $ if f$locate("M",p2) .ne. P2_Length then Machine_Code = 1
- $ if f$locate("V",p2) .ne. P2_Length then Quiet = ""
- $ Temp_File = "" ! For Control_Y abort check
- $ On Control_Y then Goto Ctly_Abort
- $!
- $! Do the CC1 compilation phase options
- $!
- $ CC1_Options = P6
- $ Save_R2_R5 = ""
- $ if f$locate("-mdont-save-r2-r5",P6) .eq. f$length(P6) then goto 10$
- $ Save_R2_R5 = " -fcall-used-r2 -fcall-used-r3 -fcall-used-r4 -fcall-used-r5"
- $ l = f$locate("-mdont-save-r2-r5",P6)
- $ l1 = l + 17
- $ CC1_Options = "''f$extract(0,l,P6)'''f$extract(l1,255,P6)'"
- $ 10$:
- $ Alignment = " -mvaxc-alignment"
- $ if f$locate("-mpcc-alignment",P6) .eq. f$length(P6) then goto 20$
- $ Alignment = ""
- $ Alignment_Define = " ""-DPCC_ALIGNMENT"""
- $ l = f$locate("-mpcc-alignment",CC1_Options)
- $ l1 = l + 15
- $ CC1_Options = "''f$extract(0,l,CC1_Options)'''f$extract(l1,255,CC1_Options)'"
- $ 20$:
- $!
- $! Do the filename (default to ".C")
- $!
- $ Filename:='p1'
- $ Extension:='f$parse(p1,,,"TYPE","SYNTAX_ONLY")'
- $ if Extension .eqs. "." then Filename:='p1'.C
- $!
- $! Do the object file
- $!
- $ Object_File:='f$parse(p1,,,"NAME","SYNTAX_ONLY")'
- $!
- $! Start the pre-processor invocation string
- $!
- $ cpp_args=""
- $!
- $! Do any defines
- $!
- $ inArg = p3
- $ if inArg .nes. "" then gosub parseList
- $!
- $! Do any undefines
- $!
- $ inArg = p4
- $ if inArg .nes. "" then gosub parseList
- $!
- $! Do any include directories
- $!
- $ Includes_Loop:
- $ if p5 .eqs. "" then goto Includes_Done
- $ l = f$locate(",",p5)
- $ l1 = l
- $ arg = f$extract(0,l,p5)
- $ l1 = l1 + 1
- $ p5 = f$extract(l1,255,p5)
- $ l = l + 5
- $ gosub doubleQuotes
- $ cpp_args = cpp_args + " ""-I" + arg + """"
- $ goto Includes_Loop
- $!
- $ Includes_Done:
- $!
- $! Calculate the Temp file name
- $!
- $ Temp_File:=GCC_'f$getjpi(0,"PID")'
- $!
- $! Do the "C" pre-processor
- $!
- $ if Quiet .eqs. "" then set verify
- $ gcc_cpp 'cpp_args''Alignment_Define' 'Filename' 'Temp_File'.CPP
- $ Status=$status
- $ l = 'f$verify(0)'
- $ if Status .nes. "%X00000001" then goto CPP_Error
- $!
- $! Do the "C" compilation
- $!
- $ Assembly_File:='Temp_File'.S
- $ if Machine_Code then Assembly_File:='Object_File'.S
- $ if Quiet .eqs. "" then set verify
- $ gcc_cc1 'Temp_File'.CPP'Quiet' -dumpbase 'Filename''Optimize''Debug' -mgnu 'CC1_Options''Save_R2_R5''Alignment' -o 'Assembly_File'
- $ Status=$status
- $ l = 'f$verify(0)'
- $ delete/nolog/noconfirm 'Temp_File'.CPP;
- $ if Status .nes. "%X00000001" then goto CC1_Error
- $!
- $! Do the assembly
- $!
- $ if Machine_Code then goto Exit
- $ if Quiet .eqs. "" then set verify
- $ gcc_as 'Temp_File'.S -o 'Object_File'.OBJ
- $ Status=$status
- $ l = 'f$verify(0)'
- $ delete/nolog/noconfirm 'Assembly_File';
- $ if Status .nes. "%X00000001" then goto Gas_Error
- $ goto Exit
- $!
- $! ERRORS:
- $! ------
- $ Ctly_Abort:
- $ if Temp_File .eqs. "" then exit 4
- $
- $ Gas_Error:
- $ delete/nolog/noconfirm 'Temp_File'.OBJ;
- $ if verifying then set verify
- $ exit Status ! Error in Assembly phase
- $ CC1_Error:
- $ delete/nolog/noconfirm 'Assembly_File';
- $ if verifying then set verify
- $ exit Status ! Error in "C" Compilation phase
- $ CPP_Error:
- $ delete/nolog/noconfirm 'Temp_File'.CPP;
- $ if verifying then set verify
- $ exit Status ! Error in "C" Pre-Processor phase
- $!
- $! Done
- $!
- $ Exit:
- $ if verifying then set verify
- $ exit 1
- $!
- $! Double up them double quotes
- $!
- $doubleQuotes:
- $ k = f$length(arg)
- $ if k .eq. 0 then goto noQuotes
- $ j = 0
- $ newArg = ""
- $ dq1$:
- $ c = f$extract(j,1,arg)
- $ if c .eqs. """" then newArg = newArg + """"
- $ newArg = newArg + c
- $ j = j+1
- $ if j .lt. k then goto dq1$
- $ arg = newArg
- $ noQuotes:
- $ return
- $!
- $! Parse a list of comma-separated tokens
- $!
- $! inArg = input string
- $!
- $parseList:
- $!echo = "write sys$output"
- $ DQUOTE = """"
- $ i = 0
- $ len = f$length(inArg)
- $ arg = ""
- $ 1$:
- $ if i .ge. len then goto noMoreDefines
- $ c = f$extract(i, 1, inArg)
- $ if c .eqs. DQUOTE then goto quotedString
- $ if c .eqs. "," then goto OneDefineDone
- $ arg = arg + c
- $ goto 4$
- $ quotedString:
- $ arg = arg + c
- $ i = i+1
- $ 2$:
- $ if i .ge. len then goto noMoreDefines
- $ c = f$extract(i, 1, inArg)
- $ if c .nes. DQUOTE then goto 3$
- $ if f$extract(i+1, 1, inArg) .eqs. DQUOTE then goto 2a$
- $ arg = arg + c
- $ goto 4$
- $ 2a$:
- $ arg = arg + c
- $ i = i+1
- $ 3$:
- $ arg = arg + c
- $ i = i+1
- $ goto 2$
- $ OneDefineDone:
- $ gosub doubleQuotes
- $! echo "arg: ", arg
- $ cpp_args = cpp_args + " ""-D" + arg + """
- $ arg = ""
- $ goto 4$
- $ 4$:
- $ i = i+1
- $ goto 1$
- $ noMoreDefines:
- $ if arg .eqs. "" then goto Defines_Done
- $ gosub doubleQuotes
- $! echo "arg: ", arg
- $ cpp_args = cpp_args + " " + DQUOTE + "-D" + arg + DQUOTE
- $!
- $ Defines_Done:
- $! echo "cpp_args: ", cpp_args
- $ return
-