|
|
#!/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
|
|
|
|