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)
References:
File last commit:
Show/Diff file:
Action:
std-script/compile
| 113 lines
| 2.8 KiB
| text/plain
| TextLexer
|
|
r137 | #!/usr/bin/env ruby | ||
|
r107 | |||
require 'fileutils' | ||||
|
r0 | |||
############################## | ||||
# | ||||
# Standard Compile Script | ||||
# | ||||
# Supported compilers: | ||||
|
r53 | # gcc, g++, and fpc. | ||
|
r0 | # | ||
############################## | ||||
r148 | def talk(str='') | |||
|
r107 | if ENV['TALKATIVE']!=nil | ||
puts str | ||||
end | ||||
if ENV['GRADER_LOGGING']!=nil | ||||
log_fname = ENV['GRADER_LOGGING'] | ||||
fp = File.open(log_fname,"a") | ||||
r148 | fp.puts("run: #{Time.new.strftime("%H:%M")} #{str}") | |||
|
r107 | fp.close | ||
end | ||||
end | ||||
|
r22 | |||
|
r107 | C_COMPILER = "/usr/bin/gcc" | ||
CPLUSPLUS_COMPILER = "/usr/bin/g++" | ||||
PASCAL_COMPILER = "/usr/bin/fpc" | ||||
|
r0 | |||
|
r107 | C_OPTIONS = "-O2 -s -static -std=c99 -DCONTEST -lm -Wall" | ||
CPLUSPLUS_OPTIONS = "-O2 -s -static -DCONTEST -lm -Wall" | ||||
PASCAL_OPTIONS = "-O1 -XS -dCONTEST" | ||||
|
r0 | |||
# Check for the correct number of arguments. Otherwise, print usage. | ||||
|
r107 | 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 | ||||
|
r0 | |||
|
r107 | PARAMS = { | ||
:source_file => [1,'source'], | ||||
:output_file => [2,'a.out'], | ||||
:message_file => [3,'compiler_message'] | ||||
} | ||||
|
r0 | |||
|
r107 | 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 | ||||
|
r0 | |||
# Remove any remaining output files or message files. | ||||
|
r107 | if FileTest.exists? params[:output_file] | ||
FileUtils.rm(params[:output_file]) | ||||
end | ||||
if FileTest.exists? params[:message_file] | ||||
FileUtils.rm(params[:message_file]) | ||||
end | ||||
|
r0 | |||
# Check if the source file exists before attempt compiling. | ||||
|
r107 | 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 | ||||
|
r0 | |||
|
r137 | if params[:prog_lang]=='cpp' | ||
params[:prog_lang] = 'c++' | ||||
|
r119 | end | ||
|
r0 | # Compile. | ||
|
r107 | 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 | ||||
|
r0 | |||
# Report success or failure. | ||||
|
r107 | if FileTest.exists? params[:output_file] | ||
talk "Compilation was successful!" | ||||
|
r0 | else | ||
|
r107 | talk "ERROR: Something was wrong during the compilation!" | ||
end | ||||