1
require 'rake/loaders/makefile'
5
@makedepend = 'makedepend'
6
@frameworkPaths = %w(~/Library/Frameworks /Library/Frameworks /System/Library/Frameworks)
18
@systemFrameworks = []
24
@commonflags += ' -arch ppc -arch i386 -isysroot /Developer/SDKs/MacOSX10.4u.sdk '
25
@ldflags += ' -arch ppc -arch i386 -isysroot /Developer/SDKs/MacOSX10.4u.sdk '
34
@includes += " -I#{BUILDDIR} "
44
task(:clean) do |task|
54
def installRule(dir, file)
55
target = File::join(dir, File::basename(file))
56
file(target => [dir, file]) do |t|
61
def installTask(taskName, dir, files)
62
if files.is_a?(String)
68
array << File::join(dir, File::basename(f))
71
task(taskName => array)
74
def installTaskRecursive(taskName, dest, src)
75
target = File::join(dest, File::basename(src))
76
file(target => [dest, src]) do |t|
78
cp_r(t.prerequisites[1], t.prerequisites[0])
80
task(taskName => target)
85
sh("/Developer/Tools/SetFile -a B #{dir}")
89
def setCurrentVersion(taskName)
90
task(taskName => "#{VERSIONSDIR}/#{FRAMEWORKVERSION}") do |t|
91
for file in Dir::glob("#{t.prerequisites[0]}/*") do
92
filename = File::basename(file)
93
ln_s("Contents/Versions/#{FRAMEWORKVERSION}/#{filename}", "#{BUNDLEDIR}/#{filename}", :force => true)
100
directory(BUNDLEDIR = "#{BUILDDIR}#{NAME}.framework")
101
directory(CONTENTSDIR = "#{BUNDLEDIR}/Contents")
102
directory(VERSIONSDIR = "#{CONTENTSDIR}/Versions")
103
directory(VERSIONDIR = "#{VERSIONSDIR}/#{FRAMEWORKVERSION}")
104
directory(RESOURCEDIR = "#{VERSIONDIR}/Resources")
105
directory(HEADERDIR = "#{VERSIONDIR}/Headers")
107
@ldflags += " -dynamiclib -install_name @executable_path/../Frameworks/#{VERSIONDIR}/#{NAME}"
109
directory(BUNDLEDIR = "#{BUILDDIR}#{NAME}.app")
110
directory(CONTENTSDIR = "#{BUNDLEDIR}/Contents")
111
directory(RESOURCEDIR = "#{CONTENTSDIR}/Resources")
112
directory(BINDIR = "#{CONTENTSDIR}/MacOS")
113
directory(FRAMEWORKDIR = "#{CONTENTSDIR}/Frameworks")
115
rescue NameError => e
116
if e.name == :FRAMEWORK
125
task(:bundle => BUNDLEDIR)
131
def installFrameworks(task)
132
for name in [@frameworks, @systemFrameworks].flatten
134
for path in @frameworkPaths
135
try = "#{File::expand_path(path)}/#{name}.framework"
136
if File::directory?(try)
143
puts "Framework #{name} missing!"
147
@frameworkFlags += " -framework #{name} "
148
@includes += " -I#{framework}/Headers "
150
if @frameworks.include?(name)
151
installTaskRecursive(task, FRAMEWORKDIR, framework)
152
bundleDir("#{FRAMEWORKDIR}/#{name}.framework")
156
for dir in @frameworkPaths
157
@cflags += " -F#{File::expand_path(dir)} "
158
@ldflags += " -F#{File::expand_path(dir)} "
166
def cTask(object, source)
167
file(object => source) do |task|
168
sh("#{@cc} #{@commonflags} #{@cflags} #{@includes} #{@defines} -o \"#{task.name}\" -c #{task.prerequisites[0]}")
172
def objcTask(object, source)
173
file(object => source) do |task|
174
sh("#{@cc} #{@commonflags} #{@objcflags} #{@includes} #{@defines} -o \"#{task.name}\" -c #{task.prerequisites[0]}")
178
def objcxxTask(object, source)
179
file(object => source) do |task|
180
sh("#{@cc} #{@commonflags} #{@cxxflags} #{@objcflags} #{@includes} #{@defines} -o \"#{task.name}\" -c #{task.prerequisites[0]}")
184
def cxxTask(object, source)
185
file(object => source) do |task|
186
sh("#{@cc} #{@commonflags} #{@cxxflags} #{@includes} #{@defines} -o \"#{task.name}\" -c #{task.prerequisites[0]}")
190
def buildBinary(task, path, file, sources)
192
target = "#{path}/#{file}"
193
for source in sources
194
object = "#{BUILDDIR}#{File::dirname(source)}/#{File::basename(source, '.*')}.o"
195
if ['.m'].include?(File::extname(source))
196
objcTask(object, source)
197
elsif ['.M', '.mm'].include?(File::extname(source))
198
objcxxTask(object, source)
199
elsif ['.cxx', '.cc', '.cpp', '.C'].include?(File::extname(source))
200
cxxTask(object, source)
202
cTask(object, source)
205
@cleanfiles.push(object)
209
dir = "#{BUILDDIR}#{File::dirname(source)}"
213
depfile = "#{BUILDDIR}#{File::dirname(source)}/.#{File::basename(source, '.*')}.dep.mf"
214
file(depfile => deps) do |task|
215
prefix = File::join(File::dirname(task.prerequisites[0]), '')
216
sh("#{@makedepend} -p#{BUILDDIR}#{prefix} -f- -- #{@includes} #{@defines} -- #{task.prerequisites[0]} > #{task.name} 2> /dev/null")
219
@cleanfiles.push(depfile)
222
file(target => [path, *objects]) do |task|
223
sh("#{@linker} #{@frameworkFlags} #{@ldflags} #{@libs} -o \"#{task.name}\" #{task.prerequisites[1..-1].join(' ')}")