# File lib/childprocess/tools/generator.rb, line 87
      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