Show More
Commit Description:
handle the case when problem id or submission id is null. Grader will simply skip such request. Add more report on console (for command line grading)...
Commit Description:
handle the case when problem id or submission id is null. Grader will simply skip such request. Add more report on console (for command line grading) (mercurial grafted from d233105d3965c5368c9b33125f390e39b25f910e)
File last commit:
Show/Diff file:
Action:
std-script/compile | 113 lines | 2.8 KiB | text/plain | TextLexer |
#!/usr/bin/env ruby
require 'fileutils'
##############################
#
# Standard Compile Script
#
# Supported compilers:
# gcc, g++, and fpc.
#
##############################
def talk(str='')
if ENV['TALKATIVE']!=nil
puts str
end
if ENV['GRADER_LOGGING']!=nil
log_fname = ENV['GRADER_LOGGING']
fp = File.open(log_fname,"a")
fp.puts("run: #{Time.new.strftime("%H:%M")} #{str}")
fp.close
end
end
C_COMPILER = "/usr/bin/gcc"
CPLUSPLUS_COMPILER = "/usr/bin/g++"
PASCAL_COMPILER = "/usr/bin/fpc"
C_OPTIONS = "-O2 -s -static -std=c99 -DCONTEST -lm -Wall"
CPLUSPLUS_OPTIONS = "-O2 -s -static -DCONTEST -lm -Wall"
PASCAL_OPTIONS = "-O1 -XS -dCONTEST"
# Check for the correct number of arguments. Otherwise, print usage.
if ARGV.length == 0 or ARGV.length > 4
puts "Usage: compile <language> [<source-file>] [<output-file>] [<message-file>]"
puts
puts "<source-file> is defaulted to \"source\"."
puts "<output-file> is defaulted to \"a.out\"."
puts "<message-file> is defaulted to \"compiler_message\"."
puts
exit(127)
end
PARAMS = {
:source_file => [1,'source'],
:output_file => [2,'a.out'],
:message_file => [3,'compiler_message']
}
params = {}
params[:prog_lang] = ARGV[0]
PARAMS.each_key do |param_name|
index, default = PARAMS[param_name]
if ARGV.length > index
params[param_name] = ARGV[index]
else
params[param_name] = default
end
talk "#{param_name}: #{params[param_name]}"
end
# Remove any remaining output files or message files.
if FileTest.exists? params[:output_file]
FileUtils.rm(params[:output_file])
end
if FileTest.exists? params[:message_file]
FileUtils.rm(params[:message_file])
end
# Check if the source file exists before attempt compiling.
if !FileTest.exists? params[:source_file]
talk("ERROR: The source file does not exist!")
open(params[:message_file],"w") do |f|
f.puts "ERROR: The source file did not exist."
end
exit(127)
end
if params[:prog_lang]=='cpp'
params[:prog_lang] = 'c++'
end
# Compile.
case params[:prog_lang]
when "c"
command = "#{C_COMPILER} #{params[:source_file]} -o #{params[:output_file]} #{C_OPTIONS} 2> #{params[:message_file]}"
system(command)
when "c++"
command = "#{CPLUSPLUS_COMPILER} #{params[:source_file]} -o #{params[:output_file]} #{CPLUSPLUS_OPTIONS} 2> #{params[:message_file]}"
system(command)
when "pas"
command = "#{PASCAL_COMPILER} #{params[:source_file]} -ooutpas #{PASCAL_OPTIONS} > #{params[:message_file]}"
system(command)
FileUtils.mv("output", params[:output_file])
else
talk("ERROR: Invalid language specified!")
open(params[:message_file],"w") do |f|
f.puts "ERROR: Invalid language specified!"
end
exit(127)
end
# Report success or failure.
if FileTest.exists? params[:output_file]
talk "Compilation was successful!"
else
talk "ERROR: Something was wrong during the compilation!"
end