Description:
change compile to remove package from java change box command for run script
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r167:9db5952d7bb1 - - 2 files changed: 10 inserted, 3 deleted

@@ -63,101 +63,108
63 else
63 else
64 params[param_name] = default
64 params[param_name] = default
65 end
65 end
66 talk "#{param_name}: #{params[param_name]}"
66 talk "#{param_name}: #{params[param_name]}"
67 end
67 end
68
68
69 # Remove any remaining output files or message files.
69 # Remove any remaining output files or message files.
70 if FileTest.exists? params[:output_file]
70 if FileTest.exists? params[:output_file]
71 FileUtils.rm(params[:output_file])
71 FileUtils.rm(params[:output_file])
72 end
72 end
73 if FileTest.exists? params[:message_file]
73 if FileTest.exists? params[:message_file]
74 FileUtils.rm(params[:message_file])
74 FileUtils.rm(params[:message_file])
75 end
75 end
76
76
77 # Check if the source file exists before attempt compiling.
77 # Check if the source file exists before attempt compiling.
78 if !FileTest.exists? params[:source_file]
78 if !FileTest.exists? params[:source_file]
79 talk("ERROR: The source file does not exist!")
79 talk("ERROR: The source file does not exist!")
80 open(params[:message_file],"w") do |f|
80 open(params[:message_file],"w") do |f|
81 f.puts "ERROR: The source file did not exist."
81 f.puts "ERROR: The source file did not exist."
82 end
82 end
83 exit(127)
83 exit(127)
84 end
84 end
85
85
86 if params[:prog_lang]=='cpp'
86 if params[:prog_lang]=='cpp'
87 params[:prog_lang] = 'c++'
87 params[:prog_lang] = 'c++'
88 end
88 end
89
89
90 # Compile.
90 # Compile.
91 case params[:prog_lang]
91 case params[:prog_lang]
92
92
93 when "c"
93 when "c"
94 command = "#{C_COMPILER} #{params[:source_file]} -o #{params[:output_file]} #{C_OPTIONS} 2> #{params[:message_file]}"
94 command = "#{C_COMPILER} #{params[:source_file]} -o #{params[:output_file]} #{C_OPTIONS} 2> #{params[:message_file]}"
95 system(command)
95 system(command)
96
96
97 when "c++"
97 when "c++"
98 command = "#{CPLUSPLUS_COMPILER} #{params[:source_file]} -o #{params[:output_file]} #{CPLUSPLUS_OPTIONS} 2> #{params[:message_file]}"
98 command = "#{CPLUSPLUS_COMPILER} #{params[:source_file]} -o #{params[:output_file]} #{CPLUSPLUS_OPTIONS} 2> #{params[:message_file]}"
99 system(command)
99 system(command)
100
100
101 when "pas"
101 when "pas"
102 command = "#{PASCAL_COMPILER} #{params[:source_file]} -ooutpas #{PASCAL_OPTIONS} > #{params[:message_file]}"
102 command = "#{PASCAL_COMPILER} #{params[:source_file]} -ooutpas #{PASCAL_OPTIONS} > #{params[:message_file]}"
103 system(command)
103 system(command)
104 FileUtils.mv("output", params[:output_file])
104 FileUtils.mv("output", params[:output_file])
105
105
106 when "java"
106 when "java"
107 #rename the file to the public class name
107 #rename the file to the public class name
108
108
109 #get the class name
109 #get the class name
110 classname = 'DUMMY'
110 classname = 'DUMMY'
111 + source = Array.new
111 File.foreach(params[:source_file]) do |line|
112 File.foreach(params[:source_file]) do |line|
112 md = /\s*public\s*class\s*(\w*)/.match(line)
113 md = /\s*public\s*class\s*(\w*)/.match(line)
113 classname=md[1] if md
114 classname=md[1] if md
115 + source << line unless line =~ /\s*package\s*\w+\s*\;/
114 end
116 end
115 - system("cp #{params[:source_file]} #{classname}.java")
117 + File.open("#{classname}.java","w") do |file|
118 + source.each do |s|
119 + file.puts s
120 + end
121 + end
122 + #system("cp #{params[:source_file]} #{classname}.java")
116 command = "#{JAVA_COMPILER} #{classname}.java 2> #{params[:message_file]}"
123 command = "#{JAVA_COMPILER} #{classname}.java 2> #{params[:message_file]}"
117 system(command)
124 system(command)
118 if File.exists?(classname + ".class")
125 if File.exists?(classname + ".class")
119 File.open(params[:output_file],"w") {|file| file.write("#{classname}")}
126 File.open(params[:output_file],"w") {|file| file.write("#{classname}")}
120 end
127 end
121 if classname == 'DUMMY'
128 if classname == 'DUMMY'
122 File.open(params[:message_file],"w") {|file| file.write("Cannot find any public class in the source code\n")}
129 File.open(params[:message_file],"w") {|file| file.write("Cannot find any public class in the source code\n")}
123 end
130 end
124
131
125 when "ruby"
132 when "ruby"
126 command = "#{RUBY_INTERPRETER} -c #{params[:source_file]} 2> #{params[:message_file]}"
133 command = "#{RUBY_INTERPRETER} -c #{params[:source_file]} 2> #{params[:message_file]}"
127 if system(command)
134 if system(command)
128 File.open(params[:output_file],"w") do |out_file|
135 File.open(params[:output_file],"w") do |out_file|
129 out_file.puts "#!#{RUBY_INTERPRETER}"
136 out_file.puts "#!#{RUBY_INTERPRETER}"
130 File.open(params[:source_file],"r").each do |line|
137 File.open(params[:source_file],"r").each do |line|
131 out_file.print line
138 out_file.print line
132 end
139 end
133 end
140 end
134 File.chmod(0755, params[:output_file])
141 File.chmod(0755, params[:output_file])
135 end
142 end
136
143
137 when "python"
144 when "python"
138 command = "#{PYTHON_CHECKER} #{params[:source_file]} > #{params[:message_file]}"
145 command = "#{PYTHON_CHECKER} #{params[:source_file]} > #{params[:message_file]}"
139 if system(command)
146 if system(command)
140 #compile to python bytecode
147 #compile to python bytecode
141 command = "#{PYTHON_INTERPRETER} -m py_compile #{params[:source_file]}"
148 command = "#{PYTHON_INTERPRETER} -m py_compile #{params[:source_file]}"
142 puts "compile: #{command}"
149 puts "compile: #{command}"
143 system(command)
150 system(command)
144 puts "pwd: " + Dir.pwd
151 puts "pwd: " + Dir.pwd
145 Dir.new('.').each {|file| puts file}
152 Dir.new('.').each {|file| puts file}
146 File.open(params[:output_file],"w") do |out_file|
153 File.open(params[:output_file],"w") do |out_file|
147 out_file.puts "#!#{PYTHON_INTERPRETER} #{params[:source_file]}c"
154 out_file.puts "#!#{PYTHON_INTERPRETER} #{params[:source_file]}c"
148 end
155 end
149 File.chmod(0755, params[:output_file])
156 File.chmod(0755, params[:output_file])
150 FileUtils.cp("#{params[:source_file]}c",params[:output_file])
157 FileUtils.cp("#{params[:source_file]}c",params[:output_file])
151 end
158 end
152
159
153 else
160 else
154 talk("ERROR: Invalid language specified!")
161 talk("ERROR: Invalid language specified!")
155 open(params[:message_file],"w") do |f|
162 open(params[:message_file],"w") do |f|
156 f.puts "ERROR: Invalid language specified!"
163 f.puts "ERROR: Invalid language specified!"
157 end
164 end
158 exit(127)
165 exit(127)
159 end
166 end
160
167
161 # Report success or failure.
168 # Report success or failure.
162 if FileTest.exists? params[:output_file]
169 if FileTest.exists? params[:output_file]
163 talk "Compilation was successful!"
170 talk "Compilation was successful!"
@@ -46,98 +46,98
46 source_name = ENV['SOURCE_NAME']
46 source_name = ENV['SOURCE_NAME']
47 require "#{problem_home}/script/test_dsl.rb"
47 require "#{problem_home}/script/test_dsl.rb"
48 load "#{problem_home}/test_cases/all_tests.cfg"
48 load "#{problem_home}/test_cases/all_tests.cfg"
49 problem = Problem.get_instance
49 problem = Problem.get_instance
50
50
51 sandbox_dir = Dir.getwd
51 sandbox_dir = Dir.getwd
52
52
53 if problem.well_formed? == false
53 if problem.well_formed? == false
54 log "The problem specification is not well formed."
54 log "The problem specification is not well formed."
55 exit(127)
55 exit(127)
56 end
56 end
57
57
58 # Check if the test number is okay.
58 # Check if the test number is okay.
59 if test_num <= 0 || test_num > problem.num_tests
59 if test_num <= 0 || test_num > problem.num_tests
60 log "You have specified a wrong test number."
60 log "You have specified a wrong test number."
61 exit(127)
61 exit(127)
62 end
62 end
63
63
64 #####################################
64 #####################################
65 # Set the relavant file names here. #
65 # Set the relavant file names here. #
66 #####################################
66 #####################################
67
67
68 input_file_name = "#{problem_home}/test_cases/#{test_num}/input-#{test_num}.txt"
68 input_file_name = "#{problem_home}/test_cases/#{test_num}/input-#{test_num}.txt"
69
69
70 #####################################
70 #####################################
71
71
72 time_limit = problem.get_time_limit test_num
72 time_limit = problem.get_time_limit test_num
73 mem_limit = problem.get_mem_limit(test_num) * 1024
73 mem_limit = problem.get_mem_limit(test_num) * 1024
74
74
75 # Copy the input file.
75 # Copy the input file.
76 #`cp #{problem_home}/test_cases/#{test_num}/#{input_file_name} .`
76 #`cp #{problem_home}/test_cases/#{test_num}/#{input_file_name} .`
77
77
78 # check if box is there, if not, compile it!
78 # check if box is there, if not, compile it!
79 if !File.exists?("#{problem_home}/script/box")
79 if !File.exists?("#{problem_home}/script/box")
80 log "WARNING: Compiling box: to increase efficiency, it should be compile manually"
80 log "WARNING: Compiling box: to increase efficiency, it should be compile manually"
81 compile_box("#{problem_home}/script/box.cc",
81 compile_box("#{problem_home}/script/box.cc",
82 "#{problem_home}/script/box")
82 "#{problem_home}/script/box")
83 end
83 end
84
84
85 # Hide PROBLEM_HOME
85 # Hide PROBLEM_HOME
86 ENV['PROBLEM_HOME'] = nil
86 ENV['PROBLEM_HOME'] = nil
87 ENV['SOURCE_NAME'] = nil
87 ENV['SOURCE_NAME'] = nil
88
88
89 # Run the program.
89 # Run the program.
90 #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}"
90 #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}"
91 #
91 #
92
92
93 JAVA_OPTION = "-s set_robust_list -s futex -s clone -s getppid -s clone -s wait4 -p /usr/bin/ -p ./"
93 JAVA_OPTION = "-s set_robust_list -s futex -s clone -s getppid -s clone -s wait4 -p /usr/bin/ -p ./"
94 - RUBY_OPTION = "-p /usr/lib64/ -p /lib64/ -p /dev/urandom -p #{sandbox_dir}/#{program_name} -s set_robust_list -s sched_getaffinity -s clock_gettime -s sigaltstack -s pipe2 -s clone -s futex -s openat"
94 + RUBY_OPTION = "-p /usr/lib64/ -p /usr/local/lib/ -p /lib64/ -p /dev/urandom -p #{sandbox_dir}/#{program_name} -p #{sandbox_dir}/ -s set_robust_list -s sched_getaffinity -s clock_gettime -s sigaltstack -s pipe2 -s clone -s futex -s openat -s pipe"
95 - PYTHON_OPTION = "-p /usr/lib64/ -p /lib64/ -p /usr/bin/ -p /usr/local/lib64/ -p /usr/local/lib/ -p #{sandbox_dir}/#{program_name} -p ./#{program_name} -p #{sandbox_dir}/#{source_name} -s set_robust_list -s openat -s recvmsg -s connect -s socket -s sendto -E PYTHONNOUSERSITE=yes"
95 + PYTHON_OPTION = "-p /usr/lib64/ -p /lib64/ -p /usr/bin/ -p /usr/local/lib64/ -p /usr/local/lib/ -p #{sandbox_dir}/#{program_name} -p ./#{program_name} -p #{sandbox_dir}/#{source_name} -s set_robust_list -s openat -s recvmsg -s connect -s socket -s sendto -s futex -E PYTHONNOUSERSITE=yes"
96
96
97 case language
97 case language
98 when "java"
98 when "java"
99 # for java, extract the classname
99 # for java, extract the classname
100 # wne have to add additional systemcall and we don't check the mem limit (dunno how to fix...)
100 # wne have to add additional systemcall and we don't check the mem limit (dunno how to fix...)
101 classname = 'DUMMY'
101 classname = 'DUMMY'
102 File.open(program_name,"r").each do |line|
102 File.open(program_name,"r").each do |line|
103 classname = line
103 classname = line
104 end
104 end
105 #for java, we cannot really check the memory limit...
105 #for java, we cannot really check the memory limit...
106 run_command = "#{problem_home}/script/box -a 3 -f -T -t #{time_limit} #{JAVA_OPTION} -i #{input_file_name} -o output.txt /usr/bin/java #{classname} 2>run_result"
106 run_command = "#{problem_home}/script/box -a 3 -f -T -t #{time_limit} #{JAVA_OPTION} -i #{input_file_name} -o output.txt /usr/bin/java #{classname} 2>run_result"
107 when "ruby"
107 when "ruby"
108 run_command = "#{problem_home}/script/box -a 2 -f -T -t #{time_limit} -m #{mem_limit} #{RUBY_OPTION} -i #{input_file_name} -o output.txt /usr/bin/ruby #{program_name} 2>run_result"
108 run_command = "#{problem_home}/script/box -a 2 -f -T -t #{time_limit} -m #{mem_limit} #{RUBY_OPTION} -i #{input_file_name} -o output.txt /usr/bin/ruby #{program_name} 2>run_result"
109 when "python"
109 when "python"
110 run_command = "#{problem_home}/script/box -a 2 -f -T -t #{time_limit} -m #{mem_limit} #{PYTHON_OPTION} -i #{input_file_name} -o output.txt /usr/bin/python #{program_name} 2>run_result"
110 run_command = "#{problem_home}/script/box -a 2 -f -T -t #{time_limit} -m #{mem_limit} #{PYTHON_OPTION} -i #{input_file_name} -o output.txt /usr/bin/python #{program_name} 2>run_result"
111 else # for c++, pascal, we do the normal checking
111 else # for c++, pascal, we do the normal checking
112 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"
112 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"
113 end
113 end
114
114
115
115
116 log "Running test #{test_num}..."
116 log "Running test #{test_num}..."
117 log run_command
117 log run_command
118 log
118 log
119 system(run_command)
119 system(run_command)
120
120
121 # Restore PROBLEM_HOME
121 # Restore PROBLEM_HOME
122 ENV['PROBLEM_HOME'] = problem_home
122 ENV['PROBLEM_HOME'] = problem_home
123
123
124 # Create the result file.
124 # Create the result file.
125 result_file = File.new("result", "w")
125 result_file = File.new("result", "w")
126 comment_file = File.new("comment", "w")
126 comment_file = File.new("comment", "w")
127
127
128 # Check if the program actually produced any output.
128 # Check if the program actually produced any output.
129 run_result_file = File.new("run_result", "r")
129 run_result_file = File.new("run_result", "r")
130 run_result = run_result_file.readlines
130 run_result = run_result_file.readlines
131 run_result_file.close
131 run_result_file.close
132
132
133 run_stat = run_result[run_result.length-1]
133 run_stat = run_result[run_result.length-1]
134 running_time = extract_time(run_stat)
134 running_time = extract_time(run_stat)
135
135
136 report = lambda{ |status, points, comment|
136 report = lambda{ |status, points, comment|
137 result_file.write status.strip
137 result_file.write status.strip
138 result_file.write "\n"
138 result_file.write "\n"
139 result_file.write points.to_s.strip
139 result_file.write points.to_s.strip
140 result_file.write "\n"
140 result_file.write "\n"
141 result_file.write run_stat.strip
141 result_file.write run_stat.strip
142 result_file.write "\n"
142 result_file.write "\n"
143 result_file.close
143 result_file.close
You need to be logged in to leave comments. Login now