#!/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 [] [] []" puts puts " is defaulted to \"source\"." puts " is defaulted to \"a.out\"." puts " 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