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
|
# File 'lib/ryb/xcode.rb', line 24
def self.generate_project_files_for(project, opts={})
xc_proj = Xcodeproj::Project.new("#{project.name}.xcodeproj")
puts "Generating #{xc_proj.path}..."
xc_products_group = xc_proj.main_group['Products']
xc_products_group_for_libs = xc_products_group.new_group('lib', 'lib')
xc_products_group_for_bins = xc_products_group.new_group('bin', 'bin')
project.configurations.each do |name, config|
xc_build_configuration = xc_proj.build_configuration_list[config.name]
xc_build_configuration ||= xc_proj.build_configuration_list[config.name.capitalize]
xc_build_configuration ||= xc_proj.add_build_configuration(config.name, :release)
xc_build_configuration.name = (config.name.pretty || config.name.capitalize)
defines = project.defines.merge(config.defines)
xc_build_configuration.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] = defines.map {|name, value| "#{name}=#{value}"}
end
xc_proj.build_configuration_list.set_setting('SYMROOT', opts[:built])
xc_proj.build_configuration_list.set_setting('CONFIGURATION_BUILD_DIR', opts[:built])
xc_proj.build_configuration_list.sort
(project.libraries + project.applications).each do |target|
puts " Adding '#{target.name.pretty || target.name}' as target..."
type = :application if target.is_a? Ryb::Application
type = {:static => :static_library, :dynamic => :dynamic_library}[target.linkage] if target.is_a? Ryb::Library
name = target.name
platform = :osx
deployment_target = (target.targets[:macosx].version.to_s if (target.targets[:macosx] and target.targets[:macosx].verison))
xc_target = xc_proj.new_target(type, name, platform, deployment_target)
if target.targets[:macosx] and target.targets[:macosx].verison
Target.setup_for_version(xc_proj, xc_target, target.targets[:macosx].version)
end
configs = ((project.configurations.keys | target.configurations.keys).map do |config|
project_config = project.configurations[config]
if project_config
project_config = project_config.dup
project_config.instance_variable_set(:@defines, project.defines.merge(project_config.defines))
end
target_config = target.configurations[config]
if target_config
target_config = target_config.dup
target_config.instance_variable_set(:@defines, target.defines.merge(target_config.defines))
end
config = if project_config and target_config
project_config.instance_variable_set(:@defines, project_config.defines.merge(target_config.defines))
project_config
else
project_config || target_config
end
[config.name, config]
end).to_h
configs.each do |name, config|
xc_build_configuration = xc_target.build_configuration_list[config.name]
xc_build_configuration ||= xc_target.build_configuration_list[config.name.capitalize]
xc_build_configuration ||= xc_target.add_build_configuration(config.name, :release)
xc_build_configuration.name = (config.name.pretty || config.name.capitalize)
xc_build_configuration.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] = config.defines.map {|name, value| "#{name}=#{value}"}
end
expand_path_variables = lambda { |path|
path.gsub(/\:built/, opts[:built])
}
includes = target.paths[:includes].map(&expand_path_variables).map(&File.method(:expand_path))
xc_target.build_configuration_list.set_setting('USER_HEADER_SEARCH_PATHS', includes)
libraries = target.paths[:libraries].map(&expand_path_variables).map(&File.method(:expand_path))
libraries.each(&FileUtils.method(:mkdir_p))
xc_target.build_configuration_list.set_setting('LIBRARY_SEARCH_PATHS', libraries)
binaries = target.paths[:binaries].map(&expand_path_variables).map(&File.method(:expand_path))
binaries.each(&FileUtils.method(:mkdir_p))
xc_target.build_configuration_list.sort
xc_target.build_configuration_list.set_setting('BUILT_PRODUCTS_DIR', opts[:built])
case type
when :application
xc_target.build_configuration_list.set_setting('CONFIGURATION_BUILD_DIR', File.join(opts[:built], 'bin'))
when :static_library
xc_target.build_configuration_list.set_setting('CONFIGURATION_BUILD_DIR', File.join(opts[:built], 'lib'))
when :dynamic_library
xc_target.build_configuration_list.set_setting('CONFIGURATION_BUILD_DIR', File.join(opts[:built], 'bin'))
end
Target.add_file_references(xc_proj, xc_target, target.files[:source])
target.dependencies.each do |dependency|
xc_target_for_dep = [*(xc_proj.targets.objects.select {|target| target.product_name == dependency})].first
if xc_target_for_dep
xc_target.add_dependency(xc_target_for_dep)
xc_target
else
raise "Not implemented, yet!"
end
end
end
xc_proj.save
end
|