[439] | 1 | MRuby::Toolchain.new(:gcc) do |conf, params|
|
---|
| 2 | default_command = params[:default_command] || 'gcc'
|
---|
| 3 | compiler_flags = %w(-g3 -Og -Wall -Wundef)
|
---|
| 4 | c_mandatory_flags = %w(-std=gnu99)
|
---|
| 5 | cxx_invalid_flags = %w(-Wdeclaration-after-statement -Werror-implicit-function-declaration)
|
---|
[270] | 6 |
|
---|
[439] | 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
|
---|
[270] | 21 | end
|
---|
| 22 |
|
---|
| 23 | conf.linker do |linker|
|
---|
[439] | 24 | linker.command = ENV['LD'] || ENV['CXX'] || ENV['CC'] || default_command
|
---|
[270] | 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'
|
---|
[439] | 30 | linker.link_options = '%{flags} -o "%{outfile}" %{objs} %{flags_before_libraries} %{libs} %{flags_after_libraries}'
|
---|
[270] | 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
|
---|
[439] | 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
|
---|
[270] | 65 | end
|
---|