Imported Upstream version 1.46.0
[platform/upstream/nghttp2.git] / third-party / mruby / tasks / toolchains / gcc.rake
1 MRuby::Toolchain.new(:gcc) do |conf, params|
2   default_command = params[:default_command] || 'gcc'
3   compiler_flags = %w(-g -O3 -Wall -Wundef)
4   c_mandatory_flags = %w(-std=gnu99)
5   cxx_invalid_flags = %w(-Wdeclaration-after-statement -Werror-implicit-function-declaration)
6
7   [conf.cc, conf.objc, conf.asm, conf.cxx].each do |compiler|
8     if compiler == conf.cxx
9       compiler.command = ENV['CXX'] || default_command.sub(/cc|$/, '++')
10       compiler.flags = [ENV['CXXFLAGS'] || ENV['CFLAGS'] || compiler_flags]
11     else
12       compiler.command = ENV['CC'] || default_command
13       compiler.flags = [c_mandatory_flags, ENV['CFLAGS'] || [compiler_flags, cxx_invalid_flags, %w(-Wwrite-strings)]]
14     end
15     compiler.option_include_path = %q[-I"%s"]
16     compiler.option_define = '-D%s'
17     compiler.compile_options = %q[%{flags} -MMD -o "%{outfile}" -c "%{infile}"]
18     compiler.cxx_compile_flag = '-x c++ -std=gnu++03'
19     compiler.cxx_exception_flag = '-fexceptions'
20     compiler.cxx_invalid_flags = c_mandatory_flags + cxx_invalid_flags
21   end
22
23   conf.linker do |linker|
24     linker.command = ENV['LD'] || ENV['CXX'] || ENV['CC'] || default_command
25     linker.flags = [ENV['LDFLAGS'] || %w()]
26     linker.libraries = %w(m)
27     linker.library_paths = []
28     linker.option_library = '-l%s'
29     linker.option_library_path = '-L%s'
30     linker.link_options = '%{flags} -o "%{outfile}" %{objs} %{flags_before_libraries} %{libs} %{flags_after_libraries}'
31   end
32
33   [[conf.cc, 'c'], [conf.cxx, 'c++']].each do |cc, lang|
34     cc.instance_variable_set :@header_search_language, lang
35     def cc.header_search_paths
36       if @header_search_command != command
37         result = `echo | #{build.filename command} -x#{@header_search_language} -Wp,-v - -fsyntax-only 2>&1`
38         result = `echo | #{command} -x#{@header_search_language} -Wp,-v - -fsyntax-only 2>&1` if $?.exitstatus != 0
39         return include_paths if  $?.exitstatus != 0
40
41         @frameworks = []
42         @header_search_paths = result.lines.map { |v|
43           framework = v.match(/^ (.*)(?: \(framework directory\))$/)
44           if framework
45             @frameworks << framework[1]
46             next nil
47           end
48
49           v.match(/^ (.*)$/)
50         }.compact.map { |v| v[1] }.select { |v| File.directory? v }
51         @header_search_paths += include_paths
52         @header_search_command = command
53       end
54       @header_search_paths
55     end
56   end
57
58   def conf.enable_sanitizer(*opts)
59     fail 'sanitizer already set' if @sanitizer_list
60
61     @sanitizer_list = opts
62     flg = "-fsanitize=#{opts.join ','}"
63     [self.cc, self.cxx, self.linker].each{|cmd| cmd.flags << flg }
64   end
65 end