Description:
added quick hack on running scripts, and compiler calls
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r111:06c23d391544 - - 4 files changed: 12 inserted, 10 deleted

@@ -96,49 +96,49
96 96 rescue RuntimeError => msg
97 97 @reporter.report_error(submission, msg)
98 98
99 99 ensure
100 100 @room_maker.clean_up(submission)
101 101 Dir.chdir(current_dir) # this is really important
102 102 end
103 103 end
104 104
105 105 protected
106 106
107 107 def talk(str)
108 108 if @config.talkative
109 109 puts str
110 110 end
111 111 end
112 112
113 113 def call_judge(problem_home,language,grading_dir,fname)
114 114 ENV['PROBLEM_HOME'] = problem_home
115 115
116 116 talk grading_dir
117 117 Dir.chdir grading_dir
118 118 cmd = "#{problem_home}/script/judge #{language} #{fname}"
119 119 talk "CMD: #{cmd}"
120 - system(cmd)
120 + system("ruby " + cmd)
121 121 end
122 122
123 123 def get_std_script_dir
124 124 GRADER_ROOT + '/std-script'
125 125 end
126 126
127 127 def copy_script(problem_home)
128 128 script_dir = "#{problem_home}/script"
129 129 std_script_dir = get_std_script_dir
130 130
131 131 raise "std-script directory not found" if !FileTest.exist?(std_script_dir)
132 132
133 133 scripts = Dir[std_script_dir + '/*']
134 134
135 135 copied = []
136 136
137 137 scripts.each do |s|
138 138 fname = File.basename(s)
139 139 next if FileTest.directory?(s)
140 140 if !FileTest.exist?("#{script_dir}/#{fname}")
141 141 copied << fname
142 142 FileUtils.cp(s, "#{script_dir}")
143 143 end
144 144 end
@@ -2,51 +2,51
2 2
3 3 require 'fileutils'
4 4
5 5 ##############################
6 6 #
7 7 # Standard Compile Script
8 8 #
9 9 # Supported compilers:
10 10 # gcc, g++, and fpc.
11 11 #
12 12 ##############################
13 13
14 14 def talk(msg)
15 15 if ENV['TALKATIVE']!=nil
16 16 puts str
17 17 end
18 18 if ENV['GRADER_LOGGING']!=nil
19 19 log_fname = ENV['GRADER_LOGGING']
20 20 fp = File.open(log_fname,"a")
21 21 fp.puts("run: #{Time.new.strftime("%H:%M")} #{str}")
22 22 fp.close
23 23 end
24 24 end
25 25
26 - C_COMPILER = "/usr/bin/gcc"
27 - CPLUSPLUS_COMPILER = "/usr/bin/g++"
28 - PASCAL_COMPILER = "/usr/bin/fpc"
26 + C_COMPILER = "gcc"
27 + CPLUSPLUS_COMPILER = "g++"
28 + PASCAL_COMPILER = "fpc"
29 29
30 30 C_OPTIONS = "-O2 -s -static -std=c99 -DCONTEST -lm -Wall"
31 31 CPLUSPLUS_OPTIONS = "-O2 -s -static -DCONTEST -lm -Wall"
32 32 PASCAL_OPTIONS = "-O1 -XS -dCONTEST"
33 33
34 34 # Check for the correct number of arguments. Otherwise, print usage.
35 35 if ARGV.length == 0 or ARGV.length > 4
36 36 puts "Usage: compile <language> [<source-file>] [<output-file>] [<message-file>]"
37 37 puts
38 38 puts "<source-file> is defaulted to \"source\"."
39 39 puts "<output-file> is defaulted to \"a.out\"."
40 40 puts "<message-file> is defaulted to \"compiler_message\"."
41 41 puts
42 42 exit(127)
43 43 end
44 44
45 45 PARAMS = {
46 46 :source_file => [1,'source'],
47 47 :output_file => [2,'a.out'],
48 48 :message_file => [3,'compiler_message']
49 49 }
50 50
51 51 params = {}
52 52 params[:prog_lang] = ARGV[0]
@@ -77,96 +77,98
77 77
78 78 log "Test result directory: #{test_result_dir}"
79 79 clear_and_create_empty_dir(test_result_dir)
80 80
81 81 if ARGV.length >= 4
82 82 sandbox_dir = ARGV[3]
83 83 else
84 84 sandbox_dir = "#{current_dir}/sandbox"
85 85 end
86 86 log "Sandbox directory: #{sandbox_dir}"
87 87 clear_and_create_empty_dir(sandbox_dir)
88 88
89 89 # Compile
90 90 log
91 91 log "Compiling..."
92 92 call_and_log("Cannot copy the source file to #{sandbox_dir}") {
93 93 FileUtils.cp(source_file, sandbox_dir)
94 94 }
95 95 begin
96 96 Dir.chdir sandbox_dir
97 97 rescue
98 98 log "ERROR: Cannot change directory to #{sandbox_dir}."
99 99 exit(127)
100 100 end
101 - execute("#{problem_home}/script/compile #{language} #{source_file}", "Compilation error!")
102 - compile_message = open("compiler_message").read
101 + execute("ruby #{problem_home}/script/compile #{language} #{source_file}", "Compilation error!")
102 + open("compiler_message") do |f|
103 + compile_message = f.read
103 104 compile_message.strip!
105 + end
104 106 call_and_log("Cannot move the compiler message to #{test_result_dir}.") {
105 107 FileUtils.mv("compiler_message", test_result_dir)
106 108 }
107 109 if !FileTest.exist?("a.out")
108 110 log "Cannot compile the source code. See message in #{test_result_dir}/compile_message"
109 111 exit(127)
110 112 else
111 113 call_and_log("Cannot move the compiled program to #{test_result_dir}") {
112 114 FileUtils.mv("a.out",test_result_dir)
113 115 }
114 116 FileUtils.rm_rf("#{sandbox_dir}/.")
115 117 end
116 118
117 119 require "#{problem_home}/script/test_dsl.rb"
118 120 load "#{problem_home}/test_cases/all_tests.cfg"
119 121 problem = Problem.get_instance
120 122
121 123 if problem.well_formed? == false
122 124 log "The problem specification is not well formed."
123 125 exit(127)
124 126 end
125 127
126 128 # Doing the testing.
127 129 (1..(problem.num_tests)).each do |test_num|
128 130
129 131 $stdout.print "[#{test_num}]"
130 132 $stdout.flush
131 133
132 134 log "Test number: #{test_num}"
133 135 call_and_log("Cannot copy the compiled program into #{sandbox_dir}") {
134 136 FileUtils.cp("#{test_result_dir}/a.out", sandbox_dir)
135 137 }
136 138 begin
137 - execute("#{problem_home}/script/run #{language} #{test_num}", "Error occured during execution of the run script")
139 + execute("ruby #{problem_home}/script/run #{language} #{test_num}", "Error occured during execution of the run script")
138 140 rescue
139 141 # do nothing
140 142 end
141 143 call_and_log("Cannot create directory #{test_result_dir}/#{test_num}") {
142 144 FileUtils.mkdir "#{test_result_dir}/#{test_num}"
143 145 }
144 146 call_and_log("Cannot copy the result file into #{test_result_dir}/#{test_num}") {
145 147 FileUtils.mv "#{sandbox_dir}/result", "#{test_result_dir}/#{test_num}"
146 148 }
147 149 call_and_log("Cannot copy the comment file into #{test_result_dir}/#{test_num}") {
148 150 FileUtils.mv "#{sandbox_dir}/comment", "#{test_result_dir}/#{test_num}"
149 151 }
150 152 call_and_log("Cannot copy the output file into #{test_result_dir}/#{test_num}") {
151 153 FileUtils.mv "#{sandbox_dir}/output.txt", "#{test_result_dir}/#{test_num}"
152 154 }
153 155 call_and_log("Cannot clear #{sandbox_dir}") {
154 156 FileUtils.rm_rf(Dir.glob("#{sandbox_dir}/*"), :secure => true)
155 157 }
156 158 end
157 159
158 160 $stdout.print "[done]\n"
159 161
160 162 # Grade
161 163 log
162 164 log "Grading..."
163 165 begin
164 166 Dir.chdir test_result_dir
165 167 rescue
166 168 log "ERROR: Cannot change directory to #{test_result_dir}."
167 169 exit(127)
168 170 end
169 - execute("#{problem_home}/script/grade", "An error occured during grading!")
171 + execute("ruby #{problem_home}/script/grade", "An error occured during grading!")
170 172
171 173 log
172 174 log "All done!"
@@ -52,49 +52,49
52 52 exit(127)
53 53 end
54 54
55 55 # Check if the test number is okay.
56 56 if test_num <= 0 || test_num > problem.num_tests
57 57 log "You have specified a wrong test number."
58 58 exit(127)
59 59 end
60 60
61 61 #####################################
62 62 # Set the relavant file names here. #
63 63 #####################################
64 64
65 65 input_file_name = "#{problem_home}/test_cases/#{test_num}/input-#{test_num}.txt"
66 66
67 67 #####################################
68 68
69 69 time_limit = problem.get_time_limit test_num
70 70 mem_limit = problem.get_mem_limit(test_num) * 1024
71 71
72 72 # Copy the input file.
73 73 #`cp #{problem_home}/test_cases/#{test_num}/#{input_file_name} .`
74 74
75 75 # check if box is there, if not, compile it!
76 - if !File.exists?("#{problem_home}/script/box")
76 + if !File.exists?("#{problem_home}/script/box") and !File.exists?("#{problem_home}/script/box.exe")
77 77 log "WARNING: Compiling box: to increase efficiency, it should be compile manually"
78 78 compile_box("#{problem_home}/script/box.cc",
79 79 "#{problem_home}/script/box")
80 80 end
81 81
82 82 # Hide PROBLEM_HOME
83 83 ENV['PROBLEM_HOME'] = nil
84 84
85 85 # Run the program.
86 86 #run_command = "/usr/bin/time -f \"#{time_output_format}\" 2>run_result #{problem_home}/script/box_new -a 2 -f -t #{time_limit} -m #{mem_limit} -i #{input_file_name} -o output.txt #{program_name}"
87 87 run_command = "#{problem_home}/script/box -a 2 -f -T -t #{time_limit} -m #{mem_limit} -i #{input_file_name} -o output.txt #{program_name} 2>run_result"
88 88 log "Running test #{test_num}..."
89 89 log run_command
90 90 log
91 91 system(run_command)
92 92
93 93 # Restore PROBLEM_HOME
94 94 ENV['PROBLEM_HOME'] = problem_home
95 95
96 96 # Create the result file.
97 97 result_file = File.new("result", "w")
98 98 comment_file = File.new("comment", "w")
99 99
100 100 # Check if the program actually produced any output.
@@ -124,34 +124,34
124 124 comment_file.write l
125 125 end
126 126
127 127 comment_file.close
128 128
129 129 log "Done!"
130 130 exit(0)
131 131 }
132 132
133 133 if run_result[0][0,2] != "OK"
134 134 log "There was a runtime error."
135 135 report.call(run_result[0], 0, "No comment.\n")
136 136 end
137 137
138 138 if running_time[:user].to_f + running_time[:sys].to_f > time_limit
139 139 log "Time limit exceeded."
140 140 report.call("Time limit exceeded", 0, "No comment.\n")
141 141 end
142 142
143 143 # Run 'check' to evaluate the output.
144 144 #puts "There was no runtime error. Proceed to checking the output."
145 145 check_command = "#{problem_home}/script/check #{language} #{test_num}"
146 146 log "Checking the output..."
147 147 log check_command
148 - if not system(check_command)
148 + if not system("ruby " + check_command)
149 149 log "Problem with check script"
150 150 report.call("Incorrect",0,"Check script error.\n")
151 151 exit(127)
152 152 end
153 153
154 154 check_file = File.new("check_result", "r")
155 155 check_file_lines = check_file.readlines
156 156
157 157 report.call(check_file_lines[0], check_file_lines[1], "No comment.\n")
You need to be logged in to leave comments. Login now