From a1c4992905e6e3df1e6841085c552b33cf525b0f Mon Sep 17 00:00:00 2001 From: Yuichiro MASUI Date: Mon, 21 Jan 2013 22:15:15 +0900 Subject: Added flags_before_libraries to linker --- tasks/libmruby.rake | 9 ++++++--- tasks/mrbgem_spec.rake | 4 ++-- tasks/mruby_build_commands.rake | 32 ++++++++++++++++++-------------- tasks/toolchains/gcc.rake | 2 +- tasks/toolchains/vs2012.rake | 2 +- 5 files changed, 28 insertions(+), 21 deletions(-) (limited to 'tasks') diff --git a/tasks/libmruby.rake b/tasks/libmruby.rake index 108f42f59..4cfebacaf 100644 --- a/tasks/libmruby.rake +++ b/tasks/libmruby.rake @@ -2,14 +2,17 @@ MRuby.each_target do file libfile("#{build_dir}/lib/libmruby") => libmruby.flatten do |t| archiver.run t.name, t.prerequisites open("#{build_dir}/lib/libmruby.flags.mak", 'w') do |f| - f.puts 'CFLAGS = "%s"' % cc.all_flags.gsub('"', '\\"') + f.puts 'MRUBY_CFLAGS = "%s"' % cc.all_flags.gsub('"', '\\"') gem_flags = gems.map { |g| g.linker.flags } gem_library_paths = gems.map { |g| g.linker.library_paths } - f.puts 'LDFLAGS = "%s"' % linker.all_flags(gem_library_paths, gem_flags).gsub('"', '\\"') + f.puts 'MRUBY_LDFLAGS = "%s"' % linker.all_flags(gem_library_paths, gem_flags).gsub('"', '\\"') + + gem_flags_before_libraries = gems.map { |g| g.linker.flags_before_libraries } + f.puts 'MRUBY_LDFLAGS_BEFORE_LIBS = "%s"' % [linker.flags_before_libraries, gem_flags_before_libraries].flatten.join(' ').gsub('"', '\\"') gem_libraries = gems.map { |g| g.linker.libraries } - f.puts 'LIBS = "%s"' % linker.library_flags(gem_libraries).gsub('"', '\\"') + f.puts 'MRUBY_LIBS = "%s"' % linker.library_flags(gem_libraries).gsub('"', '\\"') end end end diff --git a/tasks/mrbgem_spec.rake b/tasks/mrbgem_spec.rake index 906f47ad0..612ff242a 100644 --- a/tasks/mrbgem_spec.rake +++ b/tasks/mrbgem_spec.rake @@ -6,7 +6,7 @@ module MRuby class << self attr_accessor :current end - LinkerConfig = Struct.new(:libraries, :library_paths, :flags) + LinkerConfig = Struct.new(:libraries, :library_paths, :flags, :flags_before_libraries) class Specification include Rake::DSL @@ -43,7 +43,7 @@ module MRuby MRuby::Build::COMMANDS.each do |command| instance_variable_set("@#{command}", @build.send(command).clone) end - @linker = LinkerConfig.new([], [], []) + @linker = LinkerConfig.new([], [], [], []) @rbfiles = Dir.glob("#{dir}/mrblib/*.rb") @objs = Dir.glob("#{dir}/src/*.{c,cpp,m,asm,S}").map do |f| diff --git a/tasks/mruby_build_commands.rake b/tasks/mruby_build_commands.rake index 8ffafe9b0..abaf3a72c 100644 --- a/tasks/mruby_build_commands.rake +++ b/tasks/mruby_build_commands.rake @@ -48,18 +48,16 @@ module MRuby def all_flags(_defineds=[], _include_paths=[], _flags=[]) define_flags = [defines, _defineds].flatten.map{ |d| option_define % d } - include_path_flags = [include_paths, _include_paths].flatten.map{ |f| option_include_path % filename(f) } + include_path_flags = [include_paths, _include_paths].flatten.map do |f| + option_include_path % filename(f) + end [flags, define_flags, include_path_flags, _flags].flatten.join(' ') end def run(outfile, infile, _defineds=[], _include_paths=[], _flags=[]) FileUtils.mkdir_p File.dirname(outfile) - define_flags = [defines, _defineds].flatten.map{ |d| option_define % d } - include_path_flags = [include_paths, _include_paths, File.dirname(infile)].flatten.map do |f| - option_include_path % filename(f) - end _pp "CC #{filename(infile)} > #{filename(outfile)}" - _run compile_options, { :flags => (flags + define_flags + include_path_flags + _flags).join(' '), + _run compile_options, { :flags => all_flags(_defineds, [_include_paths, File.dirname(infile)], _flags), :infile => filename(infile), :outfile => filename(outfile) } end @@ -104,36 +102,42 @@ module MRuby end class Command::Linker < Command - attr_accessor :flags, :libraries, :library_paths + attr_accessor :flags, :flags_before_libraries, :libraries, :library_paths attr_accessor :link_options, :option_library, :option_library_path def initialize(build) super @command = ENV['LD'] || 'gcc' @flags = (ENV['LDFLAGS'] || []) + @flags_before_libraries = [] @libraries = [] @library_paths = [] @option_library = '-l%s' @option_library_path = '-L%s' - @link_options = "%{flags} -o %{outfile} %{objs} %{libs}" + @link_options = "%{flags} -o %{outfile} %{objs} %{flags_before_libraries} %{libs}" end def all_flags(_library_paths=[], _flags=[]) - library_path_flags = [library_paths, _library_paths].flatten.map{ |f| option_library_path % filename(f) } + library_path_flags = [library_paths, _library_paths].flatten.map do |f| + option_library_path % filename(f) + end [flags, library_path_flags, _flags].flatten.join(' ') end def library_flags(_libraries) - [libraries, _libraries].flatten.reverse.map{ |d| option_library % d }.join(' ') + [libraries, _libraries].flatten.reverse.map do |d| + option_library % d + end.join(' ') end - def run(outfile, objfiles, _libraries=[], _library_paths=[], _flags=[]) + def run(outfile, objfiles, _libraries=[], _library_paths=[], _flags=[], _flags_before_libraries=[]) FileUtils.mkdir_p File.dirname(outfile) - library_flags = [libraries, _libraries].flatten.reverse.map{ |d| option_library % d } - library_path_flags = [library_paths, _library_paths].flatten.map{ |f| option_library_path % filename(f) } + library_flags = [libraries, _libraries].flatten.reverse.map { |d| option_library % d } + library_path_flags = [library_paths, _library_paths].flatten.map { |f| option_library_path % filename(f) } _pp "LD #{filename(outfile)}" - _run link_options, { :flags => (flags + library_path_flags + _flags).join(' '), + _run link_options, { :flags => all_flags(_library_paths, _flags), :outfile => filename(outfile) , :objs => filename(objfiles).join(' '), + :flags_before_libraries => [flags_before_libraries, _flags_before_libraries].flatten.join(' '), :libs => library_flags.join(' ') } end end diff --git a/tasks/toolchains/gcc.rake b/tasks/toolchains/gcc.rake index c624c8fc9..3a3485a17 100644 --- a/tasks/toolchains/gcc.rake +++ b/tasks/toolchains/gcc.rake @@ -16,6 +16,6 @@ MRuby::Toolchain.new(:gcc) do |conf| linker.library_paths = [] linker.option_library = '-l%s' linker.option_library_path = '-L%s' - linker.link_options = '%{flags} -o %{outfile} %{objs} %{libs}' + linker.link_options = '%{flags} -o %{outfile} %{objs} %{flags_before_libraries} %{libs}' end end diff --git a/tasks/toolchains/vs2012.rake b/tasks/toolchains/vs2012.rake index c3599a59b..108b4333f 100644 --- a/tasks/toolchains/vs2012.rake +++ b/tasks/toolchains/vs2012.rake @@ -16,7 +16,7 @@ MRuby::Toolchain.new(:vs2012) do |conf| linker.library_paths = %w() linker.option_library = '%s' linker.option_library_path = '/LIBPATH:%s' - linker.link_options = "%{flags} /OUT:%{outfile} %{objs} %{libs}" + linker.link_options = "%{flags} /OUT:%{outfile} %{objs} %{flags_before_libraries} %{libs}" end conf.archiver do |archiver| -- cgit v1.2.3 From dd680b6e67ab3da85e32bb7cf42b5a20822b27bc Mon Sep 17 00:00:00 2001 From: Yuichiro MASUI Date: Thu, 24 Jan 2013 11:33:56 +0900 Subject: Add flags_after_libraries --- build_config.rb | 1 + doc/compile/README.md | 1 + tasks/mrbgem_spec.rake | 2 +- tasks/mruby_build_commands.rake | 11 ++++++----- tasks/toolchains/gcc.rake | 2 +- tasks/toolchains/vs2012.rake | 2 +- test/mrbtest.rake | 1 + tools/mirb/mirb.rake | 1 + tools/mruby/mruby.rake | 1 + 9 files changed, 14 insertions(+), 8 deletions(-) (limited to 'tasks') diff --git a/build_config.rb b/build_config.rb index 1eeff4bf4..16826e478 100644 --- a/build_config.rb +++ b/build_config.rb @@ -31,6 +31,7 @@ MRuby::Build.new do |conf| # linker.flags = [ENV['LDFLAGS'] || []] # linker.flags_before_libraries = [] # linker.libraries = %w() + # linker.flags_after_libraries = [] # linker.library_paths = [] # linker.option_library = '-l%s' # linker.option_library_path = '-L%s' diff --git a/doc/compile/README.md b/doc/compile/README.md index 05d56064c..ec995bd74 100644 --- a/doc/compile/README.md +++ b/doc/compile/README.md @@ -120,6 +120,7 @@ conf.linker do |linker| linker.flags = ... linker.flags_before_libraries = ... linker.libraries = ... + linker.flags_after_libraries = ... linker.library_paths = .... linker.option_library = ... linker.option_library_path = ... diff --git a/tasks/mrbgem_spec.rake b/tasks/mrbgem_spec.rake index 3e37f454d..0e228629b 100644 --- a/tasks/mrbgem_spec.rake +++ b/tasks/mrbgem_spec.rake @@ -6,7 +6,7 @@ module MRuby class << self attr_accessor :current end - LinkerConfig = Struct.new(:libraries, :library_paths, :flags, :flags_before_libraries) + LinkerConfig = Struct.new(:libraries, :library_paths, :flags, :flags_before_libraries, :flags_after_libraries) class Specification include Rake::DSL diff --git a/tasks/mruby_build_commands.rake b/tasks/mruby_build_commands.rake index 23d2c31ae..8056a9f7c 100644 --- a/tasks/mruby_build_commands.rake +++ b/tasks/mruby_build_commands.rake @@ -106,19 +106,19 @@ module MRuby end class Command::Linker < Command - attr_accessor :flags, :flags_before_libraries, :libraries, :library_paths + attr_accessor :flags, :library_paths, :flags_before_libraries, :libraries, :flags_after_libraries attr_accessor :link_options, :option_library, :option_library_path def initialize(build) super @command = ENV['LD'] || 'gcc' @flags = (ENV['LDFLAGS'] || []) - @flags_before_libraries = [] + @flags_before_libraries, @flags_after_libraries = [], [] @libraries = [] @library_paths = [] @option_library = '-l%s' @option_library_path = '-L%s' - @link_options = "%{flags} -o %{outfile} %{objs} %{flags_before_libraries} %{libs}" + @link_options = "%{flags} -o %{outfile} %{objs} %{flags_before_libraries} %{libs} %{flags_after_libraries}" end def all_flags(_library_paths=[], _flags=[]) @@ -132,14 +132,15 @@ module MRuby [libraries, _libraries].flatten.map{ |d| option_library % d }.join(' ') end - def run(outfile, objfiles, _libraries=[], _library_paths=[], _flags=[], _flags_before_libraries=[]) + def run(outfile, objfiles, _libraries=[], _library_paths=[], _flags=[], _flags_before_libraries=[], _flags_after_libraries=[]) FileUtils.mkdir_p File.dirname(outfile) library_flags = [libraries, _libraries].flatten.map { |d| option_library % d } library_path_flags = [library_paths, _library_paths].flatten.map { |f| option_library_path % filename(f) } - _pp "LD #{filename(outfile)}" + _pp "LD", "#{filename(outfile)}" _run link_options, { :flags => all_flags(_library_paths, _flags), :outfile => filename(outfile) , :objs => filename(objfiles).join(' '), :flags_before_libraries => [flags_before_libraries, _flags_before_libraries].flatten.join(' '), + :flags_after_libraries => [flags_after_libraries, _flags_after_libraries].flatten.join(' '), :libs => library_flags.join(' ') } end end diff --git a/tasks/toolchains/gcc.rake b/tasks/toolchains/gcc.rake index 8d83c8407..2c160683d 100644 --- a/tasks/toolchains/gcc.rake +++ b/tasks/toolchains/gcc.rake @@ -16,6 +16,6 @@ MRuby::Toolchain.new(:gcc) do |conf| linker.library_paths = [] linker.option_library = '-l%s' linker.option_library_path = '-L%s' - linker.link_options = '%{flags} -o %{outfile} %{objs} %{flags_before_libraries} %{libs}' + linker.link_options = '%{flags} -o %{outfile} %{objs} %{flags_before_libraries} %{libs} %{flags_after_libraries}' end end diff --git a/tasks/toolchains/vs2012.rake b/tasks/toolchains/vs2012.rake index 0662ba27d..e3b80b98b 100644 --- a/tasks/toolchains/vs2012.rake +++ b/tasks/toolchains/vs2012.rake @@ -16,7 +16,7 @@ MRuby::Toolchain.new(:vs2012) do |conf| linker.library_paths = %w() linker.option_library = '%s' linker.option_library_path = '/LIBPATH:%s' - linker.link_options = "%{flags} /OUT:%{outfile} %{objs} %{flags_before_libraries} %{libs}" + linker.link_options = "%{flags} /OUT:%{outfile} %{objs} %{flags_before_libraries} %{libs} %{flags_after_libraries}" end conf.archiver do |archiver| diff --git a/test/mrbtest.rake b/test/mrbtest.rake index a86be2b13..4d4a7e57c 100644 --- a/test/mrbtest.rake +++ b/test/mrbtest.rake @@ -13,6 +13,7 @@ MRuby.each_target do file exec => objs + gems.map(&:testlib).flatten + [libfile("#{build_dir}/lib/libmruby")] do |t| gem_flags = gems.map { |g| g.linker.flags } gem_flags_before_libraries = gems.map { |g| g.linker.flags_before_libraries } + gem_flags_after_libraries = gems.map { |g| g.linker.flags_after_libraries } gem_libraries = gems.map { |g| g.linker.libraries } gem_library_paths = gems.map { |g| g.linker.library_paths } linker.run t.name, t.prerequisites, gem_libraries, gem_library_paths, gem_flags, gem_flags_before_libraries diff --git a/tools/mirb/mirb.rake b/tools/mirb/mirb.rake index dbce4f180..46e69136e 100644 --- a/tools/mirb/mirb.rake +++ b/tools/mirb/mirb.rake @@ -8,6 +8,7 @@ MRuby.each_target do file exec => objs + [libfile("#{build_dir}/lib/libmruby")] do |t| gem_flags = gems.map { |g| g.linker.flags } gem_flags_before_libraries = gems.map { |g| g.linker.flags_before_libraries } + gem_flags_after_libraries = gems.map { |g| g.linker.flags_after_libraries } gem_libraries = gems.map { |g| g.linker.libraries } gem_library_paths = gems.map { |g| g.linker.library_paths } linker.run t.name, t.prerequisites, gem_libraries, gem_library_paths, gem_flags, gem_flags_before_libraries diff --git a/tools/mruby/mruby.rake b/tools/mruby/mruby.rake index 7111dc06d..fccebff63 100644 --- a/tools/mruby/mruby.rake +++ b/tools/mruby/mruby.rake @@ -8,6 +8,7 @@ MRuby.each_target do file exec => objs + [libfile("#{build_dir}/lib/libmruby")] do |t| gem_flags = gems.map { |g| g.linker.flags } gem_flags_before_libraries = gems.map { |g| g.linker.flags_before_libraries } + gem_flags_after_libraries = gems.map { |g| g.linker.flags_after_libraries } gem_libraries = gems.map { |g| g.linker.libraries } gem_library_paths = gems.map { |g| g.linker.library_paths } linker.run t.name, t.prerequisites, gem_libraries, gem_library_paths, gem_flags, gem_flags_before_libraries -- cgit v1.2.3