def execute(src, opts)
program = Array(opts[:define]).map do |key, value|
"#ifndef \#{key}\n#define \#{key} \#{value}\n#endif\n"
end.join("\n")
program << "\n"
includes = Array(opts[:include]) + DEFAULT_INCLUDES
program << includes.map { |include| "#include <#{include}>" }.join("\n")
program << "\n#{src}"
File.open(TMP_PROGRAM, 'w') do |file|
file << program
end
cmd = "#{@cc} #{TMP_PROGRAM} -o #{EXE_NAME}"
system cmd
unless $?.success?
raise "failed to compile program: #{cmd.inspect}\n#{program}"
end
output = `./#{EXE_NAME} 2>&1`
unless $?.success?
raise "failed to run program: #{cmd.inspect}\n#{output}"
end
output.chomp
ensure
File.delete TMP_PROGRAM if File.exist?(TMP_PROGRAM)
File.delete EXE_NAME if File.exist?(EXE_NAME)
end