Commit a1c49929 authored by Yuichiro MASUI's avatar Yuichiro MASUI

Added flags_before_libraries to linker

parent cc2e4e73
......@@ -29,6 +29,7 @@ MRuby::Build.new do |conf|
# conf.linker do |linker|
# linker.command = ENV['LD'] || 'gcc'
# linker.flags = [ENV['LDFLAGS'] || []]
# linker.flags_before_libraries = []
# linker.libraries = %w()
# linker.library_paths = []
# linker.option_library = '-l%s'
......
......@@ -118,6 +118,7 @@ Configuration of the Linker binary, flags and library paths.
conf.linker do |linker|
linker.command = ...
linker.flags = ...
linker.flags_before_libraries = ...
linker.libraries = ...
linker.library_paths = ....
linker.option_library = ...
......
......@@ -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
......@@ -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|
......
......@@ -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
......
......@@ -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
......@@ -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|
......
......@@ -10,11 +10,12 @@ MRuby.each_target do
objs = [objfile("#{build_dir}/#{dir}/driver"), mlib].flatten
file exec => objs + gems.map(&:testlib) + [libfile("#{build_dir}/lib/libmruby")] do |t|
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_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
linker.run t.name, t.prerequisites, gem_libraries, gem_library_paths, gem_flags, gem_flags_before_libraries
end
file mlib => [clib]
......
......@@ -7,9 +7,10 @@ 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_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
linker.run t.name, t.prerequisites, gem_libraries, gem_library_paths, gem_flags, gem_flags_before_libraries
end
end
end
......@@ -7,9 +7,10 @@ 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_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
linker.run t.name, t.prerequisites, gem_libraries, gem_library_paths, gem_flags, gem_flags_before_libraries
end
end
end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment