cocoapods-mapfile 0.2.0 → 0.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +80 -43
- data/bin/{hmap_writer → hmapfile} +2 -2
- data/lib/cocoapods_plugin.rb +18 -6
- data/lib/hmap/command/hmap_gen.rb +52 -0
- data/lib/{cocoapods-hmap → hmap}/command/hmap_reader.rb +14 -11
- data/lib/hmap/command/hmap_writer.rb +55 -0
- data/lib/hmap/command.rb +28 -0
- data/lib/hmap/constants.rb +198 -0
- data/lib/{cocoapods-hmap → hmap}/exceptions.rb +0 -0
- data/lib/{cocoapods-hmap → hmap/helper}/executable.rb +5 -6
- data/lib/{cocoapods-hmap → hmap/helper}/utils.rb +0 -4
- data/lib/hmap/hmap/hmap_bucketstr.rb +20 -0
- data/lib/{cocoapods-hmap → hmap/hmap}/hmap_reader.rb +4 -19
- data/lib/{cocoapods-hmap/hmap_save.rb → hmap/hmap/hmap_saver.rb} +21 -6
- data/lib/{cocoapods-hmap → hmap/hmap}/hmap_struct.rb +5 -4
- data/lib/hmap/hmap/hmap_writer.rb +52 -0
- data/lib/{cocoapods-hmap → hmap/hmap}/mapfile.rb +1 -1
- data/lib/hmap/user_interface.rb +22 -0
- data/lib/hmap/version.rb +5 -0
- data/lib/hmap/xc/context.rb +23 -0
- data/lib/hmap/xc/header_entry.rb +55 -0
- data/lib/hmap/xc/header_type.rb +32 -0
- data/lib/hmap/xc/pbx_helper.rb +68 -0
- data/lib/hmap/xc/product_helper.rb +36 -0
- data/lib/hmap/xc/resolver.rb +129 -0
- data/lib/hmap/xc/target/build_setting.rb +126 -0
- data/lib/hmap/xc/target/target.rb +76 -0
- data/lib/hmap/xc/target/target_context.rb +29 -0
- data/lib/hmap/xc/target/target_helper.rb +114 -0
- data/lib/hmap/xc/target/target_vfs.rb +122 -0
- data/lib/hmap/xc/target/xcconfig_helper.rb +109 -0
- data/lib/hmap/xc/workspace/project.rb +120 -0
- data/lib/hmap/xc/workspace/project_helper.rb +92 -0
- data/lib/hmap/xc/workspace/workspace.rb +83 -0
- data/lib/hmap.rb +24 -0
- metadata +76 -38
- data/bin/hmap_reader +0 -12
- data/lib/cocoapods-hmap/command/hmap_gen.rb +0 -52
- data/lib/cocoapods-hmap/framework/framework_vfs.rb +0 -95
- data/lib/cocoapods-hmap/helper/build_setting_helper.rb +0 -40
- data/lib/cocoapods-hmap/helper/pods_helper.rb +0 -104
- data/lib/cocoapods-hmap/helper/xcconfig_helper.rb +0 -82
- data/lib/cocoapods-hmap/hmap_writer.rb +0 -107
- data/lib/cocoapods-hmap/pods_specification.rb +0 -60
- data/lib/cocoapods-hmap/version.rb +0 -5
- data/lib/cocoapods-hmap/view.rb +0 -34
- data/lib/cocoapods_hmap.rb +0 -21
@@ -0,0 +1,126 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'hmap/xc/target/target_vfs'
|
3
|
+
|
4
|
+
module HMap
|
5
|
+
class Platform
|
6
|
+
attr_reader :configuration, :platform
|
7
|
+
|
8
|
+
def self.new_from_platforms(configuration, platforms)
|
9
|
+
Utils.effective_platforms_names(platforms).map { |pl| new(configuration, pl) }
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize(configuration, platform)
|
13
|
+
@configuration = configuration
|
14
|
+
@platform = platform
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_s
|
18
|
+
"#{configuration}-#{platform}"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
module HMap
|
24
|
+
class BuildSettings
|
25
|
+
attr_reader :type, :platform
|
26
|
+
|
27
|
+
def self.new_from_platforms(type, platforms, context)
|
28
|
+
platforms.map { |platform| new(type, platform.to_s, context) }
|
29
|
+
end
|
30
|
+
|
31
|
+
def initialize(type, platform, context)
|
32
|
+
@type = type
|
33
|
+
@platform = platform.to_s || ''
|
34
|
+
@context = context
|
35
|
+
end
|
36
|
+
|
37
|
+
def write_or_symlink(path, data, need_platform)
|
38
|
+
return if data.nil? && path.nil?
|
39
|
+
|
40
|
+
if data.nil?
|
41
|
+
dir = platform if type == :all_product_headers
|
42
|
+
path = Constants.instance.full_hmap_filepath(type, path, dir)
|
43
|
+
symlink_to(path, need_platform)
|
44
|
+
else
|
45
|
+
write(data, need_platform)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def file_name
|
52
|
+
return @file_name if defined? @file_name
|
53
|
+
|
54
|
+
product_name = @context.product_name if @context.respond_to? :product_name
|
55
|
+
@file_name = Constants.instance.full_hmap_filename(type, product_name)
|
56
|
+
end
|
57
|
+
|
58
|
+
def hmap_filepath(need_platform)
|
59
|
+
platform = ''
|
60
|
+
platform = @platform if need_platform
|
61
|
+
hmap_root = File.join(@context.hmap_root, platform, @context.temp_name)
|
62
|
+
File.join(hmap_root, file_name)
|
63
|
+
end
|
64
|
+
|
65
|
+
def symlink_to(path, need_platform)
|
66
|
+
return unless path.exist?
|
67
|
+
|
68
|
+
filepath = Pathname.new(hmap_filepath(need_platform))
|
69
|
+
filepath.dirname.mkpath unless filepath.exist?
|
70
|
+
return if File.identical?(filepath, path)
|
71
|
+
|
72
|
+
filepath.make_symlink(path)
|
73
|
+
end
|
74
|
+
|
75
|
+
def write(data, need_platform)
|
76
|
+
path = Constants.instance.full_hmap_filepath(type, hmap_filepath(need_platform))
|
77
|
+
if type == :all_product_headers
|
78
|
+
da = data[platform] || []
|
79
|
+
TargetVFSWriter.new(da).write!(path)
|
80
|
+
else
|
81
|
+
HMapSaver.new_from_buckets(data).write_to(path)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
class BuildSettingsWriter
|
87
|
+
attr_reader :platforms
|
88
|
+
|
89
|
+
# Initialize a new instance
|
90
|
+
#
|
91
|
+
# @param [Array<HMap::Platform>] platforms
|
92
|
+
# the platforms to lint.
|
93
|
+
#
|
94
|
+
# @param [HMap::Context] context
|
95
|
+
# the Project or target information.
|
96
|
+
#
|
97
|
+
def initialize(platforms, context)
|
98
|
+
@platforms = platforms
|
99
|
+
@context = context
|
100
|
+
end
|
101
|
+
|
102
|
+
def write_or_symlink(path, data, platforms = [])
|
103
|
+
build_settings.each do |setting|
|
104
|
+
type_data = data[setting.type] unless data.nil?
|
105
|
+
next if type_data.nil? && path.nil?
|
106
|
+
|
107
|
+
need_platform = platforms.include?(setting.type)
|
108
|
+
setting.write_or_symlink(path, type_data, need_platform)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
private
|
113
|
+
|
114
|
+
def build_settings
|
115
|
+
return @build_settings if defined? @build_settings
|
116
|
+
|
117
|
+
@build_settings = Constants::HMAP_FILE_TYPE.flat_map do |type|
|
118
|
+
if @platforms.empty?
|
119
|
+
BuildSettings.new(type, nil, @context)
|
120
|
+
else
|
121
|
+
BuildSettings.new_from_platforms(type, @platforms, @context)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'hmap/xc/target/build_setting'
|
4
|
+
require 'hmap/xc/target/target_helper'
|
5
|
+
require 'hmap/xc/target/xcconfig_helper'
|
6
|
+
|
7
|
+
module HMap
|
8
|
+
class Target
|
9
|
+
include HMap::Target::Helper
|
10
|
+
|
11
|
+
attr_reader :entrys, :target, :project
|
12
|
+
|
13
|
+
def initialize(entrys, target, project)
|
14
|
+
@entrys = entrys || []
|
15
|
+
@target = target
|
16
|
+
@project = project
|
17
|
+
end
|
18
|
+
|
19
|
+
def platforms
|
20
|
+
project.platforms
|
21
|
+
end
|
22
|
+
|
23
|
+
def write_hmapfile!
|
24
|
+
datas = headers_hash(:own_target_headers)
|
25
|
+
build_settings = BuildSettingsWriter.new(platforms, context)
|
26
|
+
build_settings.write_or_symlink(project.context.hmap_root, datas, Constants::HMAP_FILE_TYPE)
|
27
|
+
end
|
28
|
+
|
29
|
+
def save_hmap_settings!
|
30
|
+
xcconfig_paths.each do |path|
|
31
|
+
settings = Constants.instance.hmap_build_settings
|
32
|
+
XcodeprojHelper.new(path).add_build_settings_and_save(settings, use_origin: Resolver.instance.use_origin)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def remove_hmap_settings!
|
37
|
+
xcconfig_paths.each { |path| HMap::XcodeprojHelper.new(path).remove_build_settings_and_save }
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def xcconfig_paths
|
43
|
+
return @xcconfig_paths if defined?(@xcconfig_paths)
|
44
|
+
|
45
|
+
@xcconfig_paths = target.build_configuration_list.build_configurations.flat_map do |configuration|
|
46
|
+
if configuration.is_a?(Constants::XCBuildConfiguration)
|
47
|
+
bcr = configuration.base_configuration_reference
|
48
|
+
unless bcr.nil?
|
49
|
+
s_path = PBXHelper.group_paths(bcr)
|
50
|
+
x = bcr.instance_variable_get('@simple_attributes_hash')['path'] || ''
|
51
|
+
File.expand_path File.join(project.project_dir, s_path, x)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end.compact
|
55
|
+
# @xcconfig_paths = TargetConfiguration.new_from_xc(target, project.project_dir).map do |c|
|
56
|
+
# c.xcconfig_path unless c.xcconfig_path.nil?
|
57
|
+
# end.compact
|
58
|
+
# @xcconfig_paths = bc.map(&:xcconfig_path).compact
|
59
|
+
# xc_type = 'XCConfigurationList'
|
60
|
+
# xcs = target.build_configuration_list.build_configurations
|
61
|
+
# @xcconfig_paths = xcs.map do |xc|
|
62
|
+
# if xc.isa == xc_type
|
63
|
+
# xc_path = xc.instance_variable_get('@simple_attributes_hash')['path'] || ''
|
64
|
+
# { xc => File.join(project.project_dir, xc_path) }
|
65
|
+
# else
|
66
|
+
# # ab_path = Pathname(project.project_dir + "hmap-#{name}.#{xc.name}.xcconfig")
|
67
|
+
# # File.new(ab_path, 'w') unless ab_path.exist?
|
68
|
+
# # xc_ref = target.project.new_file(ab_path)
|
69
|
+
# # xc.base_configuration_reference = xc_ref
|
70
|
+
# # target.project.save
|
71
|
+
# # ab_path
|
72
|
+
# end
|
73
|
+
# end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module HMap
|
4
|
+
class Target
|
5
|
+
class TargetContext < Context
|
6
|
+
attr_reader :product_name
|
7
|
+
def initialize(build_root, temp_dir, hmap_root, temp_name, build_dir, product_name, full_product_name, defines_modules, build_as_framework_swift)
|
8
|
+
super(build_root, temp_dir, hmap_root, temp_name, build_dir)
|
9
|
+
@full_product_name = full_product_name
|
10
|
+
@product_name = product_name
|
11
|
+
@defines_modules = defines_modules
|
12
|
+
@build_as_framework_swift = build_as_framework_swift
|
13
|
+
end
|
14
|
+
|
15
|
+
def build_as_framework_swift?
|
16
|
+
@build_as_framework_swift
|
17
|
+
end
|
18
|
+
|
19
|
+
def defines_modules?
|
20
|
+
@defines_modules
|
21
|
+
end
|
22
|
+
|
23
|
+
def build_path(platform)
|
24
|
+
path = super(platform)
|
25
|
+
File.join(path, @full_product_name)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
require 'hmap/xc/target/target_context'
|
2
|
+
|
3
|
+
module HMap
|
4
|
+
class Target
|
5
|
+
module Helper
|
6
|
+
include HMap::HeaderType
|
7
|
+
|
8
|
+
define_method(:all_product_headers) do
|
9
|
+
return @all_product_headers if defined? @all_product_headers
|
10
|
+
|
11
|
+
public_headers = public_entrys.map(&:path)
|
12
|
+
private_headers = private_entrys.map(&:path)
|
13
|
+
@all_product_headers = TargetVFS.new(public_headers, private_headers, platforms, context).vfs_entrys
|
14
|
+
end
|
15
|
+
|
16
|
+
define_method(:all_non_framework_target_headers) do
|
17
|
+
return if build_as_framework?
|
18
|
+
|
19
|
+
p_h = public_entrys + private_entrys
|
20
|
+
p_h.flat_map { |entry| entry.full_module_buckets(product_name) }
|
21
|
+
end
|
22
|
+
|
23
|
+
# all_targets include header full module path
|
24
|
+
define_method(:all_target_headers) do
|
25
|
+
p_h = public_entrys + private_entrys
|
26
|
+
p_h.flat_map do |entry|
|
27
|
+
entry.full_module_buckets_extra(product_name) + entry.module_buckets(product_name)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
define_method(:project_headers) do
|
32
|
+
all_target_headers + project_entrys.flat_map(&:project_buckets_extra)
|
33
|
+
end
|
34
|
+
|
35
|
+
define_method(:own_target_headers) do
|
36
|
+
headers = public_entrys + private_entrys
|
37
|
+
headers = headers.flat_map { |entry| entry.module_buckets(product_name) }
|
38
|
+
headers + project_entrys.flat_map do |entry|
|
39
|
+
entry.project_buckets + entry.full_module_buckets(product_name)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
def build_root
|
43
|
+
project.build_root
|
44
|
+
end
|
45
|
+
|
46
|
+
def hmap_root
|
47
|
+
project.hmap_root
|
48
|
+
end
|
49
|
+
|
50
|
+
def target_name
|
51
|
+
target.name
|
52
|
+
end
|
53
|
+
|
54
|
+
def product_name
|
55
|
+
target.product_name.gsub(/[-]/, '_')
|
56
|
+
end
|
57
|
+
|
58
|
+
def full_product_name
|
59
|
+
target.product_reference.instance_variable_get('@simple_attributes_hash')['path'] || ''
|
60
|
+
end
|
61
|
+
|
62
|
+
def temp_name
|
63
|
+
"#{target_name}.build"
|
64
|
+
end
|
65
|
+
|
66
|
+
def temp_dir
|
67
|
+
project.temp_dir
|
68
|
+
end
|
69
|
+
|
70
|
+
def build_dir
|
71
|
+
return @build_dir if defined?(@build_dir)
|
72
|
+
|
73
|
+
b_d = xcconfig_paths.any? do |path|
|
74
|
+
xc = Xcodeproj::Config.new(path)
|
75
|
+
!xc.attributes[Constants::CONFIGURATION_BUILD_DIR].nil?
|
76
|
+
end
|
77
|
+
@build_dir = target_name if b_d
|
78
|
+
end
|
79
|
+
|
80
|
+
def build_as_framework?
|
81
|
+
PBXHelper.build_as_framework?(target)
|
82
|
+
end
|
83
|
+
|
84
|
+
def build_as_framework_swift?
|
85
|
+
uses_swift? && build_as_framework?
|
86
|
+
end
|
87
|
+
|
88
|
+
def uses_swift?
|
89
|
+
return @uses_swift if defined?(@uses_swift)
|
90
|
+
|
91
|
+
@uses_swift = PBXHelper.uses_swift?(target)
|
92
|
+
end
|
93
|
+
|
94
|
+
def defines_module?
|
95
|
+
return @defines_module if defined?(@defines_module)
|
96
|
+
return @defines_module = true if build_as_framework?
|
97
|
+
|
98
|
+
@defines_module = PBXHelper.defines_module?(target)
|
99
|
+
end
|
100
|
+
|
101
|
+
def context
|
102
|
+
TargetContext.new(build_root,
|
103
|
+
temp_dir,
|
104
|
+
hmap_root,
|
105
|
+
temp_name,
|
106
|
+
build_dir,
|
107
|
+
product_name,
|
108
|
+
full_product_name,
|
109
|
+
defines_module?,
|
110
|
+
build_as_framework_swift?)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
@@ -0,0 +1,122 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'yaml_vfs'
|
4
|
+
|
5
|
+
module HMap
|
6
|
+
class TargetVFSEntry
|
7
|
+
attr_reader :real_path, :virtual_path
|
8
|
+
|
9
|
+
def initialize(build_dir, file)
|
10
|
+
@real_path = file
|
11
|
+
@virtual_path = File.join(build_dir, File.basename(file))
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class TargetPlatformVFS
|
16
|
+
def initialize(platform, setting)
|
17
|
+
@platform = platform
|
18
|
+
@setting = setting
|
19
|
+
end
|
20
|
+
|
21
|
+
def product_name
|
22
|
+
File.basename(build_dir, '.*')
|
23
|
+
end
|
24
|
+
|
25
|
+
def build_dir
|
26
|
+
@setting.build_path(@platform)
|
27
|
+
end
|
28
|
+
|
29
|
+
def temp_dir
|
30
|
+
@setting.temp_path(@platform)
|
31
|
+
end
|
32
|
+
|
33
|
+
def defines_modules?
|
34
|
+
@setting.defines_modules?
|
35
|
+
end
|
36
|
+
|
37
|
+
def module_path
|
38
|
+
File.join(temp_dir, 'module.modulemap') if defines_modules?
|
39
|
+
end
|
40
|
+
|
41
|
+
def private_module_path
|
42
|
+
File.join(temp_dir, 'module.private.modulemap') if defines_modules?
|
43
|
+
end
|
44
|
+
|
45
|
+
def swift_header_path
|
46
|
+
File.join(build_dir, 'Headers', "#{product_name}-Swift.h") if @setting.build_as_framework_swift?
|
47
|
+
end
|
48
|
+
|
49
|
+
def public_headers_dir
|
50
|
+
File.join(build_dir, 'Headers')
|
51
|
+
end
|
52
|
+
|
53
|
+
def private_headers_dir
|
54
|
+
File.join(build_dir, 'PrivateHeaders')
|
55
|
+
end
|
56
|
+
|
57
|
+
def module_dir
|
58
|
+
File.join(build_dir, 'Modules')
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
# A collection of Each TargetVFSEntry
|
64
|
+
class TargetVFS
|
65
|
+
def initialize(public_headers, private_headers, platforms, setting)
|
66
|
+
@setting = setting
|
67
|
+
@platforms = platforms
|
68
|
+
@public_headers = public_headers
|
69
|
+
@private_headers = private_headers
|
70
|
+
end
|
71
|
+
|
72
|
+
def add_headers_modules(config)
|
73
|
+
r_public_paths = []
|
74
|
+
r_public_paths += @public_headers
|
75
|
+
s_h = config.swift_header_path
|
76
|
+
r_public_paths << s_h unless s_h.nil?
|
77
|
+
r_private_paths = []
|
78
|
+
r_private_paths += @private_headers
|
79
|
+
headers = []
|
80
|
+
headers += add_files(r_public_paths, config.public_headers_dir)
|
81
|
+
headers += add_files(r_private_paths, config.private_headers_dir)
|
82
|
+
modules_real_paths = []
|
83
|
+
if config.defines_modules?
|
84
|
+
modules_real_paths << config.module_path
|
85
|
+
modules_real_paths << config.private_module_path unless r_private_paths.empty?
|
86
|
+
end
|
87
|
+
headers += add_files(modules_real_paths, config.module_dir) || []
|
88
|
+
headers
|
89
|
+
end
|
90
|
+
|
91
|
+
def add_files(files, virtual_dir)
|
92
|
+
return if files.nil?
|
93
|
+
|
94
|
+
files.map { |file| TargetVFSEntry.new(virtual_dir, file) }
|
95
|
+
end
|
96
|
+
|
97
|
+
def vfs_entrys
|
98
|
+
Hash[@platforms.map do |platform|
|
99
|
+
config = TargetPlatformVFS.new(platform, @setting)
|
100
|
+
[platform.to_s, add_headers_modules(config)]
|
101
|
+
end]
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
class TargetVFSWriter
|
106
|
+
attr_reader :entrys
|
107
|
+
|
108
|
+
def initialize(entrys)
|
109
|
+
@entrys = entrys
|
110
|
+
end
|
111
|
+
|
112
|
+
def write!(path)
|
113
|
+
es = @entrys.map do |entry|
|
114
|
+
VFS::FileCollectorEntry.new(entry.real_path, entry.virtual_path)
|
115
|
+
end.uniq
|
116
|
+
fc = VFS::FileCollector.new(es)
|
117
|
+
pa = Pathname.new(path)
|
118
|
+
pa.dirname.mkpath unless pa.exist?
|
119
|
+
fc.write_mapping(pa)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module HMap
|
4
|
+
# A collection of xcodeproj Helper functions used throughout hmap.
|
5
|
+
class XcodeprojHelper
|
6
|
+
HMAP_XCKEY_START = 'HMAP_'
|
7
|
+
SAVE_XCKEY_START = 'SAVE_'
|
8
|
+
private_constant :HMAP_XCKEY_START, :SAVE_XCKEY_START
|
9
|
+
|
10
|
+
attr_reader :xcconfig_path
|
11
|
+
|
12
|
+
def initialize(path)
|
13
|
+
xc = Pathname(path)
|
14
|
+
@xcconfig_path = xc
|
15
|
+
@xcconfig = Xcodeproj::Config.new(xc)
|
16
|
+
end
|
17
|
+
|
18
|
+
def add_build_settings_and_save(settings, use_origin: true)
|
19
|
+
add_build_settings(settings, use_origin)
|
20
|
+
build_settings = [Constants::HEADER_SEARCH_PATHS, Constants::USER_HEADER_SEARCH_PATHS]
|
21
|
+
if use_origin
|
22
|
+
remove_build_settings(settings)
|
23
|
+
else
|
24
|
+
save_build_settings(settings)
|
25
|
+
end
|
26
|
+
save_as
|
27
|
+
end
|
28
|
+
|
29
|
+
def add_build_settings(settings, use_origin)
|
30
|
+
settings.each do |key, value|
|
31
|
+
add_build_setting(key.to_s, value, use_origin)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def add_build_setting(key, value, use_origin)
|
36
|
+
return if value.nil?
|
37
|
+
|
38
|
+
if key.start_with?(HMAP_XCKEY_START)
|
39
|
+
@xcconfig.attributes[key] = value
|
40
|
+
else
|
41
|
+
save_origin = save_build_setting(key)
|
42
|
+
e_value = value
|
43
|
+
e_value = "#{e_value} ${#{save_xckey(key)}}" if use_origin && !save_origin.nil?
|
44
|
+
@xcconfig.attributes[hmap_xckey(key)] = e_value
|
45
|
+
@xcconfig.attributes[key] = "${#{hmap_xckey(key)}}"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def save_build_settings(settings)
|
50
|
+
settings ||= []
|
51
|
+
settings.each { |key| save_build_setting(key) }
|
52
|
+
end
|
53
|
+
|
54
|
+
def save_build_setting(key)
|
55
|
+
origin = @xcconfig.attributes[key]
|
56
|
+
if origin.nil? || !origin.include?(hmap_xckey(key))
|
57
|
+
@xcconfig.attributes[save_xckey(key)] = origin unless origin.nil?
|
58
|
+
@xcconfig.attributes.delete(key)
|
59
|
+
end
|
60
|
+
@xcconfig.attributes[save_xckey(key)]
|
61
|
+
end
|
62
|
+
|
63
|
+
def remove_build_settings_and_save
|
64
|
+
|
65
|
+
hmap_ks = @xcconfig.attributes.keys.each_with_object([]) do |key, sum|
|
66
|
+
sum << key[HMAP_XCKEY_START.length..-1] if key.start_with?(HMAP_XCKEY_START)
|
67
|
+
sum << key[SAVE_XCKEY_START.length..-1] if key.start_with?(SAVE_XCKEY_START)
|
68
|
+
end.compact
|
69
|
+
remove_build_settings(hmap_ks)
|
70
|
+
save_as
|
71
|
+
end
|
72
|
+
|
73
|
+
def remove_build_settings(settings)
|
74
|
+
settings ||= []
|
75
|
+
settings.each { |setting| remove_build_setting(setting) }
|
76
|
+
end
|
77
|
+
|
78
|
+
def remove_build_setting(setting)
|
79
|
+
save_origin = @xcconfig.attributes[save_xckey(setting)]
|
80
|
+
origin = @xcconfig.attributes[setting]
|
81
|
+
if save_origin.nil? && !origin.nil? && origin.include?(hmap_xckey(setting))
|
82
|
+
@xcconfig.attributes.delete(setting)
|
83
|
+
end
|
84
|
+
@xcconfig.attributes[setting] = save_origin unless save_origin.nil?
|
85
|
+
@xcconfig.attributes.delete(hmap_xckey(setting))
|
86
|
+
@xcconfig.attributes.delete(save_xckey(setting))
|
87
|
+
end
|
88
|
+
|
89
|
+
def save_as(path = nil)
|
90
|
+
path = xcconfig_path if path.nil?
|
91
|
+
@xcconfig.save_as(path)
|
92
|
+
end
|
93
|
+
|
94
|
+
private
|
95
|
+
|
96
|
+
def build_setting?(key)
|
97
|
+
!@xcconfig.attributes[key].nil?
|
98
|
+
end
|
99
|
+
|
100
|
+
|
101
|
+
def hmap_xckey(key)
|
102
|
+
"#{HMAP_XCKEY_START}#{key}"
|
103
|
+
end
|
104
|
+
|
105
|
+
def save_xckey(key)
|
106
|
+
"#{SAVE_XCKEY_START}#{key}"
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
@@ -0,0 +1,120 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'hmap/xc/workspace/project_helper'
|
4
|
+
require 'hmap/xc/target/target'
|
5
|
+
|
6
|
+
module HMap
|
7
|
+
HEADER_FILES_EXTENSIONS = %w[.h .hh .hpp .ipp .tpp .hxx .def .inl .inc .pch]
|
8
|
+
|
9
|
+
class Project
|
10
|
+
include HMap::Project::Helper
|
11
|
+
|
12
|
+
attr_reader :project, :workspace
|
13
|
+
|
14
|
+
def initialize(project, workspace)
|
15
|
+
@project = project
|
16
|
+
@workspace = workspace
|
17
|
+
end
|
18
|
+
|
19
|
+
def platforms
|
20
|
+
return @platforms if defined? @platforms
|
21
|
+
|
22
|
+
build_configurations = project.build_configuration_list.build_configurations
|
23
|
+
build_configurations += project.targets.flat_map do |target|
|
24
|
+
target.build_configuration_list.build_configurations
|
25
|
+
end
|
26
|
+
|
27
|
+
ps = build_configurations.flatten.each_with_object({}) do |configuration, sum|
|
28
|
+
bs = configuration.build_settings
|
29
|
+
d_t = []
|
30
|
+
d_t << :osx unless bs['MACOSX_DEPLOYMENT_TARGET'].nil?
|
31
|
+
d_t << :ios unless bs['IPHONEOS_DEPLOYMENT_TARGET'].nil?
|
32
|
+
d_t << :watchos unless bs['WATCHOS_DEPLOYMENT_TARGET'].nil?
|
33
|
+
d_t << :tvos unless bs['TVOS_DEPLOYMENT_TARGET'].nil?
|
34
|
+
sum[configuration.name] ||= []
|
35
|
+
sum[configuration.name] += d_t unless d_t.empty?
|
36
|
+
end
|
37
|
+
|
38
|
+
@platforms = ps.flat_map do |key, value|
|
39
|
+
Platform.new_from_platforms(key, value.uniq)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def targets
|
44
|
+
return @targets if defined?(@targets)
|
45
|
+
|
46
|
+
project_dir = project.project_dir
|
47
|
+
|
48
|
+
h_ts = project.targets.map do |target|
|
49
|
+
next if target.is_a?(Constants::PBXAggregateTarget)
|
50
|
+
|
51
|
+
name = target.name
|
52
|
+
headers = target.build_phases.flat_map do |phase|
|
53
|
+
next unless phase.is_a?(Constants::PBXHeadersBuildPhase)
|
54
|
+
|
55
|
+
phase.files.flat_map do |file|
|
56
|
+
ff = file.file_ref
|
57
|
+
f_path = ff.instance_variable_get('@simple_attributes_hash')['path'] || ''
|
58
|
+
g_path = PBXHelper.group_paths(ff)
|
59
|
+
header_entry(project_dir, g_path, f_path, file)
|
60
|
+
end
|
61
|
+
end.compact
|
62
|
+
Target.new(headers, target, self)
|
63
|
+
end.compact
|
64
|
+
@targets = h_ts || []
|
65
|
+
end
|
66
|
+
|
67
|
+
def write_hmapfile!
|
68
|
+
hmap_writer = BuildSettingsWriter.new(platforms, context)
|
69
|
+
types = %i[all_non_framework_target_headers project_headers all_target_headers all_product_headers]
|
70
|
+
datas = headers_hash(*types)
|
71
|
+
hmap_writer.write_or_symlink(nil, datas, %i[all_product_headers])
|
72
|
+
targets.each(&:write_hmapfile!)
|
73
|
+
end
|
74
|
+
|
75
|
+
def save_hmap_settings!
|
76
|
+
targets.each(&:save_hmap_settings!)
|
77
|
+
end
|
78
|
+
|
79
|
+
def remove_hmap_settings!
|
80
|
+
targets.each(&:remove_hmap_settings!)
|
81
|
+
end
|
82
|
+
|
83
|
+
private
|
84
|
+
|
85
|
+
def header_entry(project_dir, group, file, xc)
|
86
|
+
settings_h = xc.instance_variable_get('@simple_attributes_hash') || {}
|
87
|
+
settings = settings_h['settings'] || {}
|
88
|
+
attributes = settings['ATTRIBUTES']
|
89
|
+
full_path = File.expand_path(File.join(project_dir, group, file))
|
90
|
+
extra_headers = []
|
91
|
+
extra_headers << File.join(group, file)
|
92
|
+
extra_headers << File.join(file)
|
93
|
+
extra_headers.uniq!
|
94
|
+
types = %i[Public Private Project]
|
95
|
+
attributes = 'Project' if attributes.nil?
|
96
|
+
ts = types.select { |type| attributes.include?(type.to_s) }
|
97
|
+
ts.map { |t| HeaderEntry.new(full_path, extra_headers, t) }
|
98
|
+
end
|
99
|
+
|
100
|
+
def entrys
|
101
|
+
return @entrys if defined?(@entrys)
|
102
|
+
|
103
|
+
project_dir = project.project_dir
|
104
|
+
@entrys = project.objects_by_uuid.flat_map do |_uuid, ff|
|
105
|
+
next unless ff.is_a?(Constants::PBXFileReference)
|
106
|
+
|
107
|
+
f_path = ff.instance_variable_get('@simple_attributes_hash')['path'] || ''
|
108
|
+
next unless HEADER_FILES_EXTENSIONS.include?(File.extname(f_path))
|
109
|
+
|
110
|
+
builds = ff.referrers.select { |e| e.is_a?(Constants::PBXBuildFile) } || []
|
111
|
+
g_path = PBXHelper.group_paths(ff)
|
112
|
+
if builds.empty?
|
113
|
+
header_entry(project_dir, g_path, f_path, nil)
|
114
|
+
else
|
115
|
+
builds.flat_map { |bf| header_entry(project_dir, g_path, f_path, bf) }
|
116
|
+
end
|
117
|
+
end.compact
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|