2016-02-24 16:56:39 +01:00

166 lines
4.4 KiB
Ruby
Executable File

#!/usr/bin/env ruby
class Builder
def initialize
@env = Environment.new()
@worker = CompositeWorker.new([Logger.new(), Executer.new()])
end
def makeRelease
createWorkingDirectories
downloadSource
copySource
buildModules
createPackage "ocmock-2.1.1.dmg", "OCMock 2.1.1"
openPackageDir
end
def justBuild
createWorkingDirectories
downloadSource
buildModules
openPackageDir
end
def createWorkingDirectories
@worker.run("mkdir -p #{@env.sourcedir}")
@worker.run("mkdir -p #{@env.productdir}")
@worker.run("mkdir -p #{@env.packagedir}")
end
def downloadSource
@worker.run("git archive master | tar -x -v -C #{@env.sourcedir}")
end
def copySource
@worker.run("cp -R #{@env.sourcedir}/Source #{@env.productdir}")
end
def buildModules
@worker.chdir("#{@env.sourcedir}/Source")
@worker.run("xcodebuild -project OCMock.xcodeproj -target OCMock")
osxproductdir = "#{@env.productdir}/OSX"
@worker.run("mkdir -p #{osxproductdir}")
@worker.run("cp -R build/Release/OCMock.framework #{osxproductdir}")
@worker.run("xcodebuild -project OCMock.xcodeproj -target OCMockLib -sdk iphoneos6.1")
@worker.run("xcodebuild -project OCMock.xcodeproj -target OCMockLib -sdk iphonesimulator6.1")
@worker.run("lipo -create -output build/Release/libOCMock.a build/Release-*/libOCMock.a")
iosproductdir = "#{@env.productdir}/iOS"
@worker.run("mkdir -p #{iosproductdir}")
@worker.run("cp -R build/Release/libOCMock.a #{iosproductdir}")
@worker.run("cp -R build/Release-iphoneos/OCMock #{iosproductdir}")
end
def createPackage(packagename, volumename)
@worker.chdir(@env.packagedir)
@worker.run("hdiutil create -size 4m temp.dmg -layout NONE")
disk_id = nil
@worker.run("hdid -nomount temp.dmg") { |hdid| disk_id = hdid.readline.split[0] }
@worker.run("newfs_hfs -v '#{volumename}' #{disk_id}")
@worker.run("hdiutil eject #{disk_id}")
@worker.run("hdid temp.dmg") { |hdid| disk_id = hdid.readline.split[0] }
@worker.run("cp -R #{@env.productdir}/* '/Volumes/#{volumename}'")
@worker.run("hdiutil eject #{disk_id}")
@worker.run("hdiutil convert -format UDZO temp.dmg -o #{@env.packagedir}/#{packagename} -imagekey zlib-level=9")
@worker.run("hdiutil internet-enable -yes #{@env.packagedir}/#{packagename}")
@worker.run("rm temp.dmg")
end
def openPackageDir
@worker.run("open #{@env.packagedir}")
end
def upload(packagename, dest)
@worker.run("scp #{@env.packagedir}/#{packagename} #{dest}")
end
def cleanup
@worker.run("chmod -R u+w #{@env.tmpdir}")
@worker.run("rm -rf #{@env.tmpdir}");
end
end
## Environment
## use attributes to configure manager for your environment
class Environment
def initialize()
@tmpdir = "/tmp/ocmock.#{Process.pid}"
@sourcedir = tmpdir + "/Source"
@productdir = tmpdir + "/Products"
@packagedir = tmpdir
end
attr_accessor :tmpdir, :sourcedir, :productdir, :packagedir
end
## Logger (Worker)
## prints commands
class Logger
def chdir(dir)
puts "## chdir #{dir}"
end
def run(cmd)
puts "## #{cmd}"
end
end
## Executer (Worker)
## actually runs commands
class Executer
def chdir(dir)
Dir.chdir(dir)
end
def run(cmd, &block)
if block == nil
system(cmd)
else
IO.popen(cmd, &block)
end
end
end
## Composite Worker (Worker)
## sends commands to multiple workers
class CompositeWorker
def initialize(workers)
@workers = workers
end
def chdir(dir)
@workers.each { |w| w.chdir(dir) }
end
def run(cmd)
@workers.each { |w| w.run(cmd) }
end
def run(cmd, &block)
@workers.each { |w| w.run(cmd, &block) }
end
end
if /Tools$/.match(Dir.pwd)
Dir.chdir("..")
end
if ARGV[0] == '-r'
Builder.new.makeRelease
else
Builder.new.justBuild
end