forked from MacRuby/MacRuby
/
options.rb
234 lines (197 loc) · 9.02 KB
/
options.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
# User customizable variables.
# These variables can be set from the command line. Example:
# $ rake framework_instdir=~/Library/Frameworks sym_instdir=~/bin
class Builder
def self.options
@options ||= {}
end
def self.option(name, default)
options[name] = default
if val = ENV[name]
block_given? ? yield(val) : val
else
default
end
end
end
b = Builder
ARCHS =
if s = ENV['RC_ARCHS']
$stderr.puts "Getting archs from RC_ARCHS!"
s.strip.split(/\s+/)
else
b.option('archs', `arch`.include?('ppc') ? 'ppc' : %w{x86_64}) { |x| x.split(',') }
end
llvm_default_path = '/usr/local'
if `sw_vers -productVersion`.strip.to_f >= 10.7 and File.exist?('/AppleInternal')
$stderr.puts "Welcome bleeding-edge adventurer!"
llvm_default_path = '/Developer/usr/local'
ENV['LLVM_TOT'] = '1'
end
RUBY_INSTALL_NAME = b.option('ruby_install_name', 'macruby')
RUBY_SO_NAME = b.option('ruby_so_name', RUBY_INSTALL_NAME)
LLVM_PATH = b.option('llvm_path', llvm_default_path)
FRAMEWORK_NAME = b.option('framework_name', 'MacRuby')
FRAMEWORK_INSTDIR = b.option('framework_instdir', '/Library/Frameworks')
SYM_INSTDIR = b.option('sym_instdir', '/usr/local')
ENABLE_STATIC_LIBRARY = b.option('enable_static_library', false) { |x| x == 'true' }
ENABLE_DEBUG_LOGGING = b.option('enable_debug_logging', true) { |x| x == 'true' }
SIMULTANEOUS_JOBS = b.option('jobs', 1) { |x| x.to_i }
COMPILE_STDLIB = b.option('compile_stdlib', true) { |x| x == 'true' }
OPTZ_LEVEL = b.option('optz_level', 3) { |x| x.to_i }
IPHONEOS_SDK = b.option('iphoneos_sdk', nil)
default_CC = '/usr/bin/gcc-4.2'
unless File.exist?(default_CC)
default_CC = '/usr/bin/gcc'
end
CC = b.option('CC', default_CC)
default_CXX = '/usr/bin/g++-4.2'
unless File.exist?(default_CXX)
default_CXX = '/usr/bin/g++'
end
CXX = b.option('CXX', default_CXX)
EXTRA_CFLAGS = b.option('CFLAGS', '')
# Everything below this comment should *not* be modified.
if ENV['build_as_embeddable']
$stderr.puts "The 'build_as_embeddable' build configuration has been removed because it is no longer necessary. To package a full version of MacRuby inside your application, please use the `Embed MacRuby' target for Xcode apps or `macruby_deploy` in a script."
exit 1
end
#verbose(true)
if `sw_vers -productVersion`.strip < '10.5.6'
$stderr.puts "Sorry, your environment is not supported. MacRuby requires Mac OS X 10.5.6 or higher."
exit 1
end
if `arch`.include?('ppc')
$stderr.puts "You appear to be using a PowerPC machine. MacRuby's primary architectures are Intel 32-bit and 64-bit (i386 and x86_64). Consequently, PowerPC support may be lacking some features."
end
LLVM_CONFIG = File.join(LLVM_PATH, 'bin/llvm-config')
unless File.exist?(LLVM_CONFIG)
$stderr.puts "The llvm-config executable was not located at #{LLVM_CONFIG}. Please make sure LLVM is correctly installed on your machine and pass the llvm_path option to rake if necessary. Example: $ rake llvm_path=/path/"
exit 1
end
if OPTZ_LEVEL < 0 || OPTZ_LEVEL > 4
$stderr.puts "Incorrect optimization level: #{OPTZ_LEVEL}"
exit 1
end
version_h = File.read('version.h')
NEW_RUBY_VERSION = version_h.scan(/#\s*define\s+RUBY_VERSION\s+\"([^"]+)\"/)[0][0]
NEW_RUBY_MAJOR_VERSION = NEW_RUBY_VERSION.to_i
NEW_RUBY_MINOR_VERSION = NEW_RUBY_VERSION.match(/\d+\.(\d+)\./)[1]
unless defined?(MACRUBY_VERSION)
MACRUBY_VERSION = version_h.scan(/#\s*define\s+MACRUBY_VERSION\s+\"(.*)\"/)[0][0]
end
INSTALL_VERSION = b.option('install_version', MACRUBY_VERSION)
uname_release_number = (ENV['UNAME_RELEASE'] or `uname -r`.scan(/^(\d+)\.\d+\.(\d+)/)[0].join('.'))
NEW_RUBY_PLATFORM = 'universal-darwin' + uname_release_number
FRAMEWORK_PATH = File.join(FRAMEWORK_INSTDIR, FRAMEWORK_NAME + '.framework')
FRAMEWORK_VERSION = File.join(FRAMEWORK_PATH, 'Versions', INSTALL_VERSION)
FRAMEWORK_USR = File.join(FRAMEWORK_VERSION, 'usr')
FRAMEWORK_USR_BIN = File.join(FRAMEWORK_USR, 'bin')
FRAMEWORK_USR_LIB = File.join(FRAMEWORK_USR, 'lib')
FRAMEWORK_USR_SHARE = File.join(FRAMEWORK_USR, 'share')
FRAMEWORK_USR_LIB_RUBY = File.join(FRAMEWORK_USR_LIB, 'ruby')
FRAMEWORK_RESOURCES = File.join(FRAMEWORK_VERSION, 'Resources')
RUBY_LIB = File.join(FRAMEWORK_USR_LIB_RUBY, NEW_RUBY_VERSION)
RUBY_ARCHLIB = File.join(RUBY_LIB, NEW_RUBY_PLATFORM)
RUBY_SITE_LIB = File.join(FRAMEWORK_USR_LIB_RUBY, 'site_ruby')
RUBY_SITE_LIB2 = File.join(RUBY_SITE_LIB, NEW_RUBY_VERSION)
RUBY_SITE_ARCHLIB = File.join(RUBY_SITE_LIB2, NEW_RUBY_PLATFORM)
RUBY_VENDOR_LIB = File.join(FRAMEWORK_USR_LIB_RUBY, 'vendor_ruby')
RUBY_VENDOR_LIB2 = File.join(RUBY_VENDOR_LIB, NEW_RUBY_VERSION)
RUBY_VENDOR_ARCHLIB = File.join(RUBY_VENDOR_LIB2, NEW_RUBY_PLATFORM)
INSTALL_NAME = File.join(FRAMEWORK_USR_LIB, 'lib' + RUBY_SO_NAME + '.dylib')
# NOTE This gets expanded here instead of in rbconfig.rb
DYLIB_ALIASES = "lib#{RUBY_SO_NAME}.#{NEW_RUBY_MAJOR_VERSION}.#{NEW_RUBY_MINOR_VERSION}.dylib lib#{RUBY_SO_NAME}.dylib"
LLVM_MODULES = "core jit nativecodegen bitwriter bitreader ipo"
EXPORTED_SYMBOLS_LIST = "./exported_symbols_list"
# Full list of objects to build.
OBJS = %w{
array bignum class compar complex enum enumerator error eval file load proc
gc hash env inits io math numeric object pack parse prec dir process
random range rational re ruby signal sprintf st string struct time strftime
util variable version thread id objc bs ucnv encoding main dln dmyext marshal
gcd vm_eval gc-stub bridgesupport compiler dispatcher vm symbol debugger
interpreter MacRuby MacRubyDebuggerConnector NSArray NSDictionary NSString
transcode sandbox
}
# Static MacRuby builds less objects.
STATIC_OBJS = OBJS - %w{
bs compiler debugger interpreter MacRubyDebuggerConnector parse
}
# Additional compilation flags for certain objects.
OBJS_CFLAGS = {
'dispatcher' => '-x objective-c++', # compile as Objective-C++.
'bs' => '-I/usr/include/libxml2' # need to access libxml2
}
class BuilderConfig
attr_reader :objs, :archs, :cflags, :cxxflags, :objc_cflags, :ldflags,
:objsdir, :objs_cflags, :dldflags, :CC, :CXX
def initialize(opt)
@CC = (opt.delete(:CC) || CC)
@CXX = (opt.delete(:CXX) || CXX)
@objs = (opt.delete(:objs) || OBJS)
@archs = (opt.delete(:archs) || ARCHS)
sdk = opt.delete(:sdk)
has_libauto = sdk ? File.exist?("#{sdk}/usr/lib/libauto.dylib") : true
archflags = archs.map { |x| "-arch #{x}" }.join(' ')
@cflags = "-std=c99 -I. -I./include -pipe -fno-common -fexceptions -fblocks -fwrapv -g -O#{OPTZ_LEVEL} -Wall -Wno-deprecated-declarations -Werror #{archflags} #{EXTRA_CFLAGS}"
@cxxflags = "-I. -I./include -fblocks -g -Wall -Wno-deprecated-declarations -Werror #{archflags} #{EXTRA_CFLAGS}"
@ldflags = '-lpthread -ldl -lxml2 -lobjc -licucore -framework Foundation'
@ldflags << " -lauto" if has_libauto
if opt.delete(:static)
@cflags << ' -DMACRUBY_STATIC'
@cxxflags << ' -DMACRUBY_STATIC'
@cxxflags << " -O#{OPTZ_LEVEL} "
else
@cxxflags << ' ' << `#{LLVM_CONFIG} --cxxflags #{LLVM_MODULES}`.sub(/-DNDEBUG/, '').sub(/-fno-exceptions/, '').sub(/-Wcast-qual/, '').sub!(/-O\d/, "-O#{OPTZ_LEVEL}").strip.gsub(/\n/, '')
@cxxflags << ' -DLLVM_TOT' if ENV['LLVM_TOT']
@ldflags << ' ' << `#{LLVM_CONFIG} --ldflags --libs #{LLVM_MODULES}`.strip.gsub(/\n/, '')
end
unless has_libauto
@cflags << ' -DNO_LIBAUTO'
@cxxflags << ' -DNO_LIBAUTO'
end
@cxxflags << " -fno-rtti" unless @cxxflags.index("-fno-rtti")
@dldflags = "-dynamiclib -undefined suppress -flat_namespace -install_name #{INSTALL_NAME} -current_version #{MACRUBY_VERSION} -compatibility_version #{MACRUBY_VERSION} -exported_symbols_list #{EXPORTED_SYMBOLS_LIST}"
@cflags << ' -I./icu-1060 -I./plblockimp'
@cxxflags << ' -I./icu-1060 -I./plblockimp'
if sdk
sdk_flags = "--sysroot=#{sdk}"
@cflags << " #{sdk_flags}"
@cxxflags << " #{sdk_flags}"
end
@objc_cflags = cflags.dup
@objc_cflags << ' -fobjc-gc-only' if has_libauto
@objs_cflags = OBJS_CFLAGS
@objsdir = opt.delete(:objsdir)
end
end
FULL_CONFIG = BuilderConfig.new(:objsdir => '.objs')
STATIC_CONFIG = BuilderConfig.new(:objsdir => '.static-objs', :static => true, :objs => STATIC_OBJS)
CONFIGS = [FULL_CONFIG, STATIC_CONFIG]
# We monkey-patch the method that Rake uses to display the tasks so we can add
# the build options.
require 'rake'
module Rake
class Application
def formatted_macruby_options
Builder.options.sort_by { |name, _| name }.map do |name, default|
default = default.join(',') if default.is_a?(Array)
" #{name.ljust(30)} \"#{default}\""
end.join("\n")
end
alias_method :display_tasks_and_comments_without_macruby_options, :display_tasks_and_comments
def display_tasks_and_comments
display_tasks_and_comments_without_macruby_options
puts %{
To change any of the default build options, use the rake build task
of choice with any of these following option-value pairs:
Usage: $ rake [task] [option=value, ...]
#{'Option:'.ljust(30)} Default value:
#{formatted_macruby_options}
Example:
$ rake all archs="i386,x86_64" framework_instdir="~/Library/Frameworks"
}
end
end
end