diff --git a/AVRsack/ASBuilder.swift b/AVRsack/ASBuilder.swift index a9aef6d..e114ce2 100644 --- a/AVRsack/ASBuilder.swift +++ b/AVRsack/ASBuilder.swift @@ -21,15 +21,40 @@ class ASBuilder { task!.currentDirectoryPath = dir.path! task!.launchPath = NSBundle.mainBundle().pathForResource("BuildProject", ofType: "")! + let fileManager = NSFileManager.defaultManager() let libPath = (ASLibraries.instance().directories as NSArray).componentsJoinedByString(":") var args = [NSString]() let boardProp = ASHardware.instance().boards[board]! + var corePath = "" + var variantPath : NSString? + for hw in ASHardware.instance().directories { + corePath = hw+"/cores/"+boardProp["build.core"] + if fileManager.fileExistsAtPath(corePath) { + if boardProp["build.variant"] != "" { + variantPath = hw+"/variants/"+boardProp["build.variant"] + if !fileManager.fileExistsAtPath(corePath) { + variantPath = nil + } + } + break + } else { + corePath = "" + } + } + if corePath == "" { + NSLog("Unable to find core %s\n", boardProp["build.core"]) + return + } args.append("board="+board) args.append("mcu="+boardProp["build.mcu"]) args.append("f_cpu="+boardProp["build.f_cpu"]) args.append("core="+boardProp["build.core"]) args.append("variant="+boardProp["build.variant"]) args.append("libs="+libPath) + args.append("core_path="+corePath) + if variantPath != nil { + args.append("variant_path="+variantPath!) + } args.append("--") args += files.paths task!.arguments = args; diff --git a/AVRsack/BuildProject b/AVRsack/BuildProject index 03d61d2..830361e 100755 --- a/AVRsack/BuildProject +++ b/AVRsack/BuildProject @@ -9,6 +9,7 @@ # require 'fileutils.rb' +require 'rake' BUILD = { 'board' => 'uno', @@ -33,9 +34,31 @@ def createBuildDirectory FileUtils::mkdir_p "#{$SKETCH_DIR}", :verbose => true end +HEADERMAP = {} +def buildHeaderMap + paths = Rake::FileList.new(BUILD['libs'].split(':').reverse) + paths.each do |path| + libs = Rake::FileList.new(path+"/*") + libs.each do |lib| + headers = Rake::FileList.new(lib+"/**/*.h") + headers.each do |h| + name = h[lib.length+1..-1] + next if name =~ %r|^utility/| + if !HEADERMAP[name] or HEADERMAP[name].pathmap('%f') != name.pathmap('%X') + HEADERMAP[name] = lib + end + end + end + end + p HEADERMAP +end + def parseInoFiles - $LIBPATH = BUILD['libs'].split(':').reverse $LIBRARIES = [] + $CORES = [BUILD['core_path']] + if BUILD['variant_path'] + $CORES << BUILD['variant_path'] + end ARGV.each_index do |arg| if ARGV[arg] =~ /\.ino$/ outName = "#{$SKETCH_DIR}/"+File.basename(ARGV[arg], '.ino')+".cpp" @@ -81,25 +104,41 @@ def smashSpaces(s) end def addLibrary(header) - $LIBPATH.each do |path| - Dir.glob("#{path}/*").each do |lib| - if File.exists?("#{lib}/#{header}") - $LIBRARIES << lib - end - end + lib = HEADERMAP[header] + if lib && !$LIBRARIES.include?(lib) + $LIBRARIES << lib end end parseArguments createBuildDirectory +buildHeaderMap parseInoFiles File.open("#{$BUILD_DIR}/Rakefile", 'w') do |rakeFile| + SOURCES = FileList.new(ARGV).select {|f| f =~ /\.(c|cpp|cp|cxx|S)$/} + INCLUDES= ($CORES+$LIBRARIES).map {|l| " +\n \" -I'#{l}'\""}.join('') rakeFile.print < sources[i] do + sh "%s '%s' -o '%s'" % [CC, sources[i], objects[i]] + end + end + file archive => objects do + sh ("%s '%s' " % [AR, archive])+objects.map {|o| "'"+o+"'"}.join(" ") + end +end + +compile('sketch', #{SOURCES.map{|f| "'../../"+f+"'"}.join(', ')}) END_RAKE end