# encoding: utf-8 # ruby: 2.1.0 =begin Rakefile to manage hardware projects uses following tools: - QEDA https://github.com/qeda/qeda - PcbDraw https://github.com/yaqwsx/PcbDraw - KiKit https://github.com/yaqwsx/KiKit - KiAuto https://github.com/INTI-CMNB/KiAuto - KiBoM https://github.com/SchrodingersGat/KiBoM Rakefile instead of Makefile for better text file parsing capabilities. =end require 'rake/clean' require 'csv' # to export BOM and costs # ================= # project variables # ================= # common name used for file names name = ENV["NAME"] || "usb-c_cable_tester" # project version, read from "version" file raise "define project version in 'version' file" unless File.exist? "version" version = IO.read("version").split("\n")[0] # current date for stamping output date = Time.now.strftime("%Y-%m-%d") # revision based on number of changes on schematic or board layout and current git commit changes = `git log --pretty=oneline "#{name}.kicad_sch" "#{name}.kicad_pcb" | wc -l`.chomp.to_i commit = `git rev-parse --short HEAD`.chomp revision = "#{changes} #{commit}" # path to qeda" qeda = "~/tmp/qeda/bin/qeda" # ========== # main tasks # ========== desc "main building task" task :default => [:print, :fabrication, :bom] desc "print schematic and layout (as pdf)" prints = [ "#{name}.sch.pdf", "#{name}.brd-top.png", "#{name}.brd-bot.png" ] task :print => prints CLEAN.include([ "#{name}.versioned.kicad_sch", "#{name}.versioned.kicad_pcb" ]) CLOBBER.include(prints) desc "generate fabrication files (gerbers/drill/BoM/PnP)" FABRICATION_DIR = "fabrication" task :fabrication => [ "#{name}.versioned.kicad_sch", "#{name}.versioned.kicad_pcb" ] do |t| sh "kikit fab jlcpcb --drc --assembly --missingError --schematic #{t.prerequisites[0]} #{t.prerequisites[1]} #{FABRICATION_DIR}" end CLEAN.include(FABRICATION_DIR) desc "generate symbols and footprints from parts" task :library do sh "#{qeda} config output kicad" sh "#{qeda} generate mylib" end desc "export Bill of Material (as CSV)" boms = [ "#{name}.bom.csv" ] task :bom => boms CLEAN.include([ "#{name}.versioned.xml" ]) CLOBBER.include(boms) desc "generate panel" PANEL_DIR = "panel" panels = ["panel.kicad_pcb", "panel.kicad_pro", "panel.top.png", "panel.bot.png"] task :panel => panels CLOBBER.include(panels) CLOBBER.include(PANEL_DIR) # =============== # file generation # =============== desc "generate file with version information" VERSIONED = [".kicad_sch", ".kicad_pcb", ".kicad_pro"] VERSIONED.each do |ext| rule ".versioned" + ext => ext do |t| sh "cp #{t.source} #{t.name}" sh "sed --in-place 's/\\$version\\$/#{version}/g' #{t.name}" sh "sed --in-place 's/\\$date\\$/#{date}/g' #{t.name}" sh "sed --in-place 's/\\$revision\\$/#{revision}/g' #{t.name}" end end desc "generate printable version (PDF) of schematic" rule ".sch.pdf" => [".versioned.kicad_sch", ".versioned.kicad_pro"] do |t| sh "eeschema_do export #{t.prerequisites[0]} ." sh "mv #{t.prerequisites[0].split('.kicad_sch')[0]}.pdf #{t.name}" end desc "generate render from layout (top side)" rule ".brd-top.png" => ".versioned.kicad_pcb" do |t| sh "pcbdraw --silent #{t.source} --dpi 600 #{t.name}" end desc "generate render from layout (bottom side)" rule ".brd-bot.png" => ".versioned.kicad_pcb" do |t| sh "pcbdraw --silent #{t.source} --dpi 600 --back #{t.name}" end desc "generate netlist" rule ".versioned.xml" => ".versioned.kicad_sch" do |t| sh "eeschema_do bom_xml #{t.source} ." end desc "generate BOM" rule ".bom.csv" => ".versioned.xml" do |t| sh "kibom #{t.source} #{t.name}" end desc "generate panel" rule panels[0] => ["#{name}.versioned.kicad_pcb", "#{name}.versioned.kicad_pro", "#{name}.versioned.kicad_sch", "panel.json"] do |t| sh "kikit panelize -p #{t.prerequisites[3]} #{t.prerequisites[0]} #{panels[0]}" sh "pcbdraw --silent #{t.name} --dpi 600 #{panels[2]}" sh "pcbdraw --silent #{t.name} --dpi 600 --back #{panels[3]}" sh "sed --in-place 's/\"missing_courtyard\": \"warning\"/\"missing_courtyard\": \"ignore\"/g' #{panels[1]}" # the mouse bites don't have a courtyard sh "kikit fab jlcpcb --drc --assembly --missingError --schematic #{t.prerequisites[2]} #{panels[0]} #{PANEL_DIR}" end