cocoapods-mapfile 0.2.0 → 0.2.2

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.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +52 -22
  3. data/bin/{hmap_writer → hmapfile} +2 -2
  4. data/lib/cocoapods_plugin.rb +18 -4
  5. data/lib/{cocoapods-hmap → hmap}/command/hmap_gen.rb +16 -8
  6. data/lib/{cocoapods-hmap → hmap}/command/hmap_reader.rb +12 -9
  7. data/lib/hmap/command/hmap_writer.rb +53 -0
  8. data/lib/hmap/command.rb +26 -0
  9. data/lib/{cocoapods-hmap → hmap}/exceptions.rb +0 -0
  10. data/lib/{cocoapods-hmap → hmap}/executable.rb +0 -0
  11. data/lib/{cocoapods-hmap → hmap}/framework/framework_vfs.rb +12 -13
  12. data/lib/hmap/helper/build_setting_constants.rb +13 -0
  13. data/lib/hmap/helper/hmap_helper.rb +212 -0
  14. data/lib/hmap/helper/pods_helper.rb +98 -0
  15. data/lib/{cocoapods-hmap → hmap/helper}/utils.rb +0 -4
  16. data/lib/hmap/helper/xcconfig_helper.rb +105 -0
  17. data/lib/{cocoapods-hmap → hmap}/hmap_reader.rb +1 -0
  18. data/lib/{cocoapods-hmap/hmap_save.rb → hmap/hmap_saver.rb} +11 -1
  19. data/lib/{cocoapods-hmap → hmap}/hmap_struct.rb +5 -4
  20. data/lib/hmap/hmap_writer.rb +99 -0
  21. data/lib/{cocoapods-hmap → hmap}/mapfile.rb +0 -0
  22. data/lib/hmap/pods_specification.rb +65 -0
  23. data/lib/hmap/version.rb +5 -0
  24. data/lib/hmap.rb +22 -0
  25. metadata +34 -34
  26. data/bin/hmap_reader +0 -12
  27. data/lib/cocoapods-hmap/helper/build_setting_helper.rb +0 -40
  28. data/lib/cocoapods-hmap/helper/pods_helper.rb +0 -104
  29. data/lib/cocoapods-hmap/helper/xcconfig_helper.rb +0 -82
  30. data/lib/cocoapods-hmap/hmap_writer.rb +0 -107
  31. data/lib/cocoapods-hmap/pods_specification.rb +0 -60
  32. data/lib/cocoapods-hmap/version.rb +0 -5
  33. data/lib/cocoapods-hmap/view.rb +0 -34
  34. data/lib/cocoapods_hmap.rb +0 -21
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7e843368c99922210970ea7de9ab8d2bcc895a158901d054a1cd076d29d73310
4
- data.tar.gz: 8f7430064b4472cb4fd6c9fa42dfdd7a144d314c702ab7500a42b0ff302d9ab5
3
+ metadata.gz: 7638b72b3d9fe0246d6dd7a06aba65b29ad95ccc30fdf7567626141f90c58d43
4
+ data.tar.gz: 62b76aa9a97ada6c2e0e187092c2c8ad669e1d55bd07e6efe0f95f00cc0ba5a1
5
5
  SHA512:
6
- metadata.gz: e1b0fbf54c2976dd6f7fcba6eca0d1d421a1df6360216e2049643d6ec1133592f19ce49786f58d0c100d71ce923492cf0135be75cbffbaae6e5a40f8b2a1c749
7
- data.tar.gz: 9429682a00e5c633baf19f845f691b7fd64b6fa687af9afcb776b5beb86245338e5d1b2d910482809f66d91f660fb02e69c6ce1d3026922f1c6cf447e4345d0d
6
+ metadata.gz: 723055fb0d1a47079499121296b2c0236f007a96a6cc023f6518a1888a3cb0d87e09de92dc6a820193187e1b9e3e8cdfc5d7c4d6fa2820942768b4972ddde1a7
7
+ data.tar.gz: 05d078150dca66846048b6dc73b29e2c6dd8d8e182bf1504dd3a17b973cd5101c2429d8c63cbd0d4d886ef92d920116481415c56542f1ae4adeda7574b48691d
data/README.md CHANGED
@@ -7,11 +7,13 @@ A CocoaPods plugin which can gen/read header map file.
7
7
  **hmap-gen** is able to scan the header files of the target referenced components in the specified Cocoapods project, and generates a header map file that public to all the components
8
8
  as well as generates a public and private header map file for each referenced component.
9
9
 
10
- - `<header.h>` : -I<hmap file path>
11
- - `header.h` : iquote <hmap file path>
10
+ - <header.h> : -I<hmap file path>
11
+ - "header.h" : -iquote <hmap file path>
12
12
 
13
13
  For framework, use [yaml-vfs](https://github.com/Cat1237/yaml-vfs) create VFS file to map framework Headers and Modules dir and pass VFS file to `-ivfsoverlay` parameter.
14
14
 
15
+ - vfs : -ivfsoverlay <all-product-headers.yaml>
16
+
15
17
  A hmap file includes four types of headers:
16
18
 
17
19
  - header.h
@@ -19,12 +21,6 @@ A hmap file includes four types of headers:
19
21
  - <project_name/header.h> **based on podspec**
20
22
  - <podspec source header/**/header.h> **based on podspec**
21
23
 
22
- At the same time, **hmap-reader** can read the header, bucktes, string_table information saved in the header map file.
23
-
24
- - ✅ It can read hmap file.
25
-
26
- - ✅ It can generate header map file.
27
-
28
24
  ## Installation
29
25
 
30
26
  Add this line to your application's Gemfile:
@@ -64,39 +60,73 @@ $ pod hmap-gen --project-directory=/project/dir/ --nosave-origin-header-search-p
64
60
  # cleanup the hmap file
65
61
  $ pod hmap-gen --clean-hmap
66
62
 
63
+ # no keep xcconfig file [HEADER_SEARCH_PATHS] and [USER_HEADER_SEARCH_PATHS] value
64
+ $ pod hmap-gen --fno-save-origin
65
+
66
+ # ⚠️no keep xcconfig file [HEADER_SEARCH_PATHS] and [USER_HEADER_SEARCH_PATHS] value, except for the values ​​set by[--allow-targets]
67
+ $ pod hmap-gen --fno-save-origin --allow-targets=Realm, YYKit
68
+
69
+ # not use automatically generated hmap file from Xcode, use [hmap-gen]
70
+ $ pod hmap-gen --fno-use-origin-headermap
71
+
67
72
  # read the hmap file from /hmap/dir/file
68
73
  $ pod hmap-reader --hmap-path=/hmap/dir/file
69
74
  ```
70
75
 
71
- At same time, you can put this line in your podfile:
72
-
73
76
  ```rb
74
77
  plugin 'cocoapods-mapfile'
75
78
  ```
76
79
  This was equl:
77
80
  ```rb
78
- pod hmap-gen --project-directory=/project/dir/
81
+ $ pod hmap-gen --project-directory=/project/dir/
79
82
  ```
83
+ or, you can set some value:
80
84
 
81
- Every time you execute pod install or pod update, `cocoapods-mapfile` will automatically generate a `header map file` for you and modify `HEAD_SEARCH_PATHS`.
85
+ ```rb
86
+ plugin('cocoapods-mapfile', allow_targets: ['Realm', 'YYKit'], save_origin: false, use_origin_headermap: false)
87
+ ```
88
+ This was equl:
89
+ ```rb
90
+ $ pod hmap-gen --fno-save-origin --fno-use-origin-headermap --allow-targets=Realm, YYKit
91
+ ```
82
92
 
83
- ### Option && Flags
93
+ Every time you execute pod install or pod update, `cocoapods-mapfile` will automatically generate a `header map file` for you and modify:
94
+ - `OTHER_CPLUSPLUSFLAGS`
95
+ - `OTHER_CFLAGS`
96
+ - `USE_HEADERMAP`
97
+ - `USER_HEADER_SEARCH_PATHS`
98
+ - `HEAD_SEARCH_PATHS`
84
99
 
85
- `hmap-gen/hmap-writer`:
100
+ ## Command Line Tool
86
101
 
87
- - `--project-directory=/project/dir/`: The path to the root of the project directory.
88
- - `--nosave-origin-header-search-paths`: This option will not save xcconfig origin [HEADER_SEARCH_PATHS] and put `hmap file path` first.
89
- - `--clean-hmap`: This option will clean up all `hmap-gen/hmap-writer` setup for hmap.
102
+ Installing the `cocoapods-mapfile` gem will also install two command-line tool `hmapfile reader` and `hmapfile writer` which you can use to generate header map file and read hmap file.
90
103
 
91
- `hmap-reader`:
104
+ For more information consult
105
+ - `hmapfile --help`,
106
+ - `hmapfile reader --help`
107
+ - `hmapfile writer --help`
92
108
 
93
- - `--hmap-path=/hmap/dir/file`: The path of the hmap file.
109
+ ### Usage
94
110
 
95
- ## Command Line Tool
111
+ ```shell
112
+ # Read or write header map file.
113
+ $ hmapfile COMMAND
114
+ ```
115
+ #### Commands
116
+ `hmapfile reader`:
117
+ - `--hmap-path=/hmap/dir/file`: Read this path of the hmap file.
118
+
119
+ `hmapfile writer`:
120
+ - `--json-path=/project/dir/json`: The path to the hmap json data.
121
+ - `--output-path=/project/dir/hmap file`: The path json data to the hmap file.
96
122
 
97
- Installing the 'cocoapods-mapfile' gem will also install two command-line tool `hmap_reader` and `hmap-writer` which you can use to generate header map file and read hmap file.
123
+ example:
98
124
 
99
- For more information consult `hmap_reader --help` or `hmap_writer --help`.
125
+ ```shell
126
+ hmapfile writer --json-path=../cat.json --output-path=../cat.hmap
127
+
128
+ hmapfile reader --hmap-path=../cat.hmap
129
+ ```
100
130
 
101
131
  ## Contributing
102
132
 
@@ -6,6 +6,6 @@ if $PROGRAM_NAME == __FILE__
6
6
  require 'bundler/setup'
7
7
  end
8
8
 
9
- require 'cocoapods-hmap/command/hmap_gen'
9
+ require 'hmap'
10
10
 
11
- Pod::Command::HMapGen.run(ARGV)
11
+ HMap::Command.run(ARGV)
@@ -1,13 +1,27 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'cocoapods-hmap/command/hmap_gen'
4
- require 'cocoapods-hmap/command/hmap_reader'
3
+ require 'hmap/command/hmap_gen'
5
4
 
6
5
  module Pod
7
6
  # hook
8
7
  module CocoaPodsHMapHook
9
- HooksManager.register('cocoapods-mapfile', :post_install) do
10
- Command::HMapGen.run(["--project-directory=#{Config.instance.installation_root}"])
8
+ @HooksManager = HooksManager
9
+ @HooksManager.register('cocoapods-mapfile', :post_install) do |_, options|
10
+ args = ["--project-directory=#{Config.instance.installation_root}"]
11
+ allow_targets = options['allow_targets']
12
+ unless allow_targets.nil?
13
+ if allow_targets.is_a?(Array)
14
+ args << "--allow-targets=#{allow_targets.join(', ')}" unless allow_targets.empty?
15
+ else
16
+ print 'waring:'.yellow, \
17
+ 'plugin cocoapods-mapfile args allow_targets must be a array, like ## allow_targets: [target1, targte2] ##'
18
+ end
19
+ end
20
+ save_origin = options['save_oripodgin'].nil? ? true : options['save_origin']
21
+ use_origin_headermap = options['use_origin_headermap'].nil? ? true : options['use_origin_headermap']
22
+ args << '--fno-save-origin' unless save_origin
23
+ args << '--fno-use-origin-headermap' unless use_origin_headermap
24
+ Command::HMapGen.run(args)
11
25
  end
12
26
  end
13
27
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'cocoapods_hmap'
4
- require 'cocoapods'
3
+ require 'hmap'
5
4
 
6
5
  module Pod
7
6
  class Command
@@ -17,9 +16,11 @@ module Pod
17
16
  def initialize(argv)
18
17
  super
19
18
  project_directory = argv.option('project-directory')
20
- @save_origin_header_search_paths = !argv.flag?('nosave-origin-header-search-paths', false)
19
+ targets = argv.option('allow-targets') || ''
20
+ @allow_targets = targets.split(%r{,\s*})
21
+ @no_use_build_in_headermap = !argv.flag?('fno-use-origin-headermap', false)
22
+ @save_origin_build_setting = !argv.flag?('fno-save-origin', false)
21
23
  @clean_hmap = argv.flag?('clean-hmap', false)
22
-
23
24
  return if project_directory.nil?
24
25
 
25
26
  @project_directory = Pathname.new(project_directory).expand_path
@@ -34,16 +35,23 @@ module Pod
34
35
  # help
35
36
  def self.options
36
37
  [
37
- ['--project-directory=/project/dir/', 'The path to the root of the project
38
- directory'],
39
- ['--nosave-origin-header-search-paths', 'This option will not save xcconfig origin [HEADER_SEARCH_PATHS] and put hmap file first'],
38
+ ['--project-directory=/project/dir/', 'The path to the root of the project directory'],
39
+ ['--allow-targets=target, target1, target2', 'If we set --fno-use-origin-headermap and ' \
40
+ '--fno-save-origin, we can use this option to decide which targets to use hmap file while keeping the initial settings'],
41
+ ['--fno-save-origin',
42
+ 'This option will not save xcconfig origin [HEADER_SEARCH_PATHS] and put hmap file first'],
43
+ ['--fno-use-origin-headermap',
44
+ 'This option will use Xcode built-in options Use Header Maps and not use this code gen hmap file'],
40
45
  ['--clean-hmap', 'This option will clean up all hmap-gen setup for hmap.']
41
46
  ].concat(super)
42
47
  end
43
48
 
44
49
  def run
45
50
  UI.section "\n[hmap-gen] start.............." do
46
- HMap::MapFileWriter.new(@save_origin_header_search_paths, @clean_hmap)
51
+ HMap::MapFileWriter.new(@save_origin_build_setting,
52
+ @clean_hmap,
53
+ @allow_targets,
54
+ use_build_in_headermap: @no_use_build_in_headermap)
47
55
  end
48
56
  UI.puts('[hmap-gen] finish..............')
49
57
  end
@@ -1,18 +1,22 @@
1
1
  # frozen_string_literal: false
2
2
 
3
- require 'cocoapods_hmap'
4
- require 'cocoapods'
3
+ require 'hmap'
5
4
 
6
- module Pod
5
+ module HMap
7
6
  class Command
8
7
  # hmap file reader cmd
9
- class HMapReader < Command
8
+ class Reader < Command
10
9
  self.summary = 'Read mapfile and puts result.'
11
10
 
12
11
  self.description = <<-DESC
13
12
  Read mapfile and puts result, header, buckets, string_table.
14
13
  DESC
15
14
 
15
+ self.arguments = [
16
+ # framework_p, r_header, r_m
17
+ CLAide::Argument.new('--hmap-path', true)
18
+ ]
19
+
16
20
  def initialize(argv)
17
21
  super
18
22
  mapfile_path = argv.option('hmap-path')
@@ -21,7 +25,7 @@ module Pod
21
25
 
22
26
  def validate!
23
27
  super
24
- banner! if help?
28
+ # banner! if help?
25
29
  raise '[ERROR]: --hmap-path no set'.red unless File.exist?(@mapfile_path)
26
30
  end
27
31
 
@@ -32,10 +36,9 @@ module Pod
32
36
  end
33
37
 
34
38
  def run
35
- UI.section "\n[hmap-reader] start..............\n".yellow do
36
- HMap::MapFileReader.new(@mapfile_path)
37
- end
38
- UI.puts("\n[hmap-reader] finish..............\n".yellow)
39
+ puts "\n[hmap-reader] start..............\n".yellow
40
+ HMap::MapFileReader.new(@mapfile_path)
41
+ puts "\n[hmap-reader] finish..............\n".yellow
39
42
  end
40
43
  end
41
44
  end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ module HMap
4
+ class Command
5
+ # hmap file gen cmd
6
+ class Writer < Command
7
+ # summary
8
+ self.summary = 'Analyzes the input json and gen each dependencie mapfile.'
9
+
10
+ self.description = <<-DESC
11
+ Analyzes the input json and gen each dependencie mapfile.
12
+ DESC
13
+
14
+ self.arguments = [
15
+ # framework_p, r_header, r_m
16
+ CLAide::Argument.new('--json-path', true),
17
+ CLAide::Argument.new('--output-path', false)
18
+ ]
19
+
20
+ def initialize(argv)
21
+ super
22
+ json_path = argv.option('json-path')
23
+ @json_path = json_path unless json_path.nil?
24
+ output_path = argv.option('output-path')
25
+ @output_path = output_path.nil? ? Pathname('.') : Pathname(output_path)
26
+ end
27
+
28
+ def validate!
29
+ super
30
+ help! 'error: no input json files which to use with the `--json-path` option.' if @json_path.nil?
31
+ help! "error: Input json file #{@json_path}: no such file" unless File.exist?(@json_path)
32
+ end
33
+
34
+ # help
35
+ def self.options
36
+ [
37
+ ['--json-path=/project/dir/json', 'The path to the hmap json data.'],
38
+ ['--output-path=/project/dir/hmap file', 'The path json data to the hmap file.']
39
+ ].concat(super)
40
+ end
41
+
42
+ def run
43
+ puts "\n[hmap-gen-from-json] start..............".yellow
44
+ json_file = File.read(@json_path)
45
+ json = JSON.parse(json_file)
46
+ path = @output_path
47
+ path = path.join("#{File.basename(@json_path, '.*')}.hmap") if path.directory?
48
+ HMapSaver.new_from_buckets(json).write_to(path)
49
+ puts '[hmap-gen-from-json] finish..............'.yellow
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ # The primary namespace for VFS.
4
+ module HMap
5
+ require 'colored2'
6
+ require 'claide'
7
+ # The primary Command for VFS.
8
+ class Command < CLAide::Command
9
+ require 'hmap/command/hmap_writer'
10
+ require 'hmap/command/hmap_reader'
11
+
12
+ self.abstract_command = false
13
+ self.command = 'hmapfile'
14
+ self.version = VERSION
15
+ self.description = 'Read or write header map file.'
16
+ self.plugin_prefixes = %w[claide writer reader]
17
+
18
+ def initialize(argv)
19
+ super
20
+ return if ansi_output?
21
+
22
+ Colored2.disable!
23
+ String.send(:define_method, :colorize) { |string, _| string }
24
+ end
25
+ end
26
+ end
File without changes
File without changes
@@ -1,5 +1,8 @@
1
+ require 'yaml_vfs'
2
+
1
3
  module HMap
2
4
  module Target
5
+ # Each fremaework vfs informations
3
6
  class FrameworkEntry
4
7
  attr_reader :configuration, :platform, :app_build_dir, :project_temp_dir
5
8
  attr_accessor :headers_real_paths, :modules_real_paths
@@ -40,16 +43,15 @@ module HMap
40
43
  has_private_module = module_path.glob('module*.modulemap').length > 1
41
44
  e_headers = ->(path, *names) { names.inject(Pathname(path)) { |e, n| e.join(n) } }
42
45
  @headers_real_paths += headers
43
- @headers_real_paths << e_headers.call(app_build_dir, 'Headers',
44
- "#{framework_name}-Swift.h")
46
+ @headers_real_paths << e_headers.call(app_build_dir, 'Headers', "#{framework_name}-Swift.h")
45
47
  @modules_real_paths << e_headers.call(project_temp_dir, 'module.modulemap')
46
- if has_private_module
47
- @modules_real_paths << e_headers.call(entry.project_temp_dir,
48
- 'module.private.modulemap')
49
- end
48
+ return unless has_private_module
49
+
50
+ @modules_real_paths << e_headers.call(entry.project_temp_dir, 'module.private.modulemap')
50
51
  end
51
52
  end
52
53
 
54
+ # A collection of Each FrameworkEntrys
53
55
  class FrameworkVFS
54
56
  attr_reader :entrys
55
57
 
@@ -75,17 +77,14 @@ module HMap
75
77
  vfs_path.select { |k, _| k.include?(key) }
76
78
  end
77
79
 
78
- def write(path = nil)
80
+ def write(path)
79
81
  vfs_path.each do |key, values|
80
82
  es = values.map do |value|
81
- headers_real_paths = value.headers_real_paths
82
- modules_real_paths = value.modules_real_paths
83
- VFS::FileCollectorEntry.new(Pathname(value.app_build_dir), modules_real_paths, headers_real_paths)
83
+ VFS::FileCollectorEntry.new(Pathname(value.app_build_dir), value.modules_real_paths,
84
+ value.headers_real_paths)
84
85
  end
85
86
  fc = VFS::FileCollector.new(es)
86
- pa = Helper::Pods.vfs_files_dir.join(key)
87
- pa = File.join(path, key) unless path.nil?
88
- pa = Pathname(pa)
87
+ pa = path.join(key)
89
88
  pa.mkpath unless pa.exist?
90
89
  fc.write_mapping(pa)
91
90
  end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module HMap
4
+ # A collection of build settings key.
5
+ module BuildSettingConstants
6
+ OTHER_CFLAGS = 'OTHER_CFLAGS'
7
+ OTHER_CPLUSPLUSFLAGS = 'OTHER_CPLUSPLUSFLAGS'
8
+ HEAD_SEARCH_PATHS = 'HEADER_SEARCH_PATHS'
9
+ USER_HEADER_SEARCH_PATHS = 'USER_HEADER_SEARCH_PATHS'
10
+ USE_HEADERMAP = 'USE_HEADERMAP'
11
+ INGERITED = '$(inherited)'
12
+ end
13
+ end
@@ -0,0 +1,212 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'set'
4
+
5
+ module HMap
6
+ # HMap file information
7
+ class HMapHeaderEntry
8
+ attr_reader :type, :headers
9
+
10
+ def initialize(type)
11
+ @type = type
12
+ @headers = []
13
+ end
14
+
15
+ def add_header(header)
16
+ headers << header
17
+ end
18
+
19
+ def file_name(name)
20
+ name = 'hmap' if name.nil?
21
+ [name, '-', type, '.hmap'].join
22
+ end
23
+
24
+ def build_setting_key
25
+ case type
26
+ when :i_headers, :iextra_headers
27
+ yield('-I', :HEADER_SEARCH_PATHS) if block_given?
28
+ when :iquote_headers, :extra_headers
29
+ yield('-iquote', :USER_HEADER_SEARCH_PATHS) if block_given?
30
+ else
31
+ raise Informative, "Error: header type not expect#{type}"
32
+ end
33
+ end
34
+
35
+ def build_setting(path, name)
36
+ full_path = File.join(path, file_name(name))
37
+ build_setting_key do |key|
38
+ [key, "\"#{full_path}\""]
39
+ end
40
+ end
41
+
42
+ def build_setting_xcconfig(path, name)
43
+ full_path = File.join(path, file_name(name))
44
+ build_setting_key do |_, xc|
45
+ [xc, "\"#{full_path}\""]
46
+ end
47
+ end
48
+ end
49
+
50
+ # A collection of Each HMapHeaderEntry
51
+ class HMapHeaders
52
+ def initialize
53
+ @public_headers = HMapHeaderEntry.new(:i_headers)
54
+ @public_headers_e = HMapHeaderEntry.new(:iextra_headers)
55
+ @private_headers = HMapHeaderEntry.new(:iquote_headers)
56
+ @private_headers_e = HMapHeaderEntry.new(:extra_headers)
57
+ @unqi_headers = Set.new
58
+ end
59
+
60
+ def headers
61
+ public_headers + private_headers
62
+ end
63
+
64
+ def public_headers
65
+ [@public_headers, @public_headers_e]
66
+ end
67
+
68
+ def private_headers
69
+ [@private_headers, @private_headers_e]
70
+ end
71
+
72
+ def private_setting_for_reference(path, name)
73
+ headers_build_settings_for_reference(private_headers, path, name)
74
+ end
75
+
76
+ def public_setting_for_reference(path, name)
77
+ headers_build_settings_for_reference(public_headers, path, name)
78
+ end
79
+
80
+ def private_setting_for_options(path, name)
81
+ headers_build_settings_for_options(private_headers, path, name, ' ').join(' ')
82
+ end
83
+
84
+ def public_setting_for_options(path, name)
85
+ headers_build_settings_for_options(public_headers, path, name).join(' ')
86
+ end
87
+
88
+ def headers_build_settings_for_reference(headers, path, name)
89
+ headers.each_with_object({}) do |header, setting|
90
+ se = header.build_setting_xcconfig(path, name)
91
+ setting.merge!(Hash[*se]) { |_, oldval, newval| [oldval, newval].join(' ') }
92
+ end
93
+ end
94
+
95
+ def headers_build_settings_for_options(headers, path, name, key = '')
96
+ headers.each_with_object([]) do |header, setting|
97
+ setting << header.build_setting(path, name).join(key)
98
+ end
99
+ end
100
+
101
+ def add_headers(type, headers, module_name, headers_sandbox)
102
+ headers.each do |header|
103
+ next unless @unqi_headers.add?(header)
104
+
105
+ header_name = header.basename.to_s
106
+ header_dir = "#{header.dirname}/"
107
+ header_module_path = "#{module_name}/#{header_name}"
108
+ header_module_name = "#{module_name}/"
109
+ header_relative_path = header.relative_path_from(headers_sandbox).to_s
110
+ header_last_dir_name = "#{header.dirname.basename}/#{header_name}"
111
+ case type
112
+ when :private_header_files, :public_header_files
113
+ @public_headers.add_header([header_name, header_module_name, header_name]) if type == :public_header_files
114
+ @public_headers_e.add_header([header_module_path, header_dir, header_name])
115
+ @private_headers.add_header([header_name, header_module_name, header_name])
116
+ unless header_relative_path == header_module_path || header_relative_path == header_name
117
+ @private_headers_e.add_header([header_relative_path, header_dir, header_name])
118
+ end
119
+ unless header_last_dir_name == header_module_path
120
+ @private_headers_e.add_header([header_last_dir_name, header_dir, header_name])
121
+ end
122
+ when :source_files
123
+ @private_headers_e.add_header([header_name, header_dir, header_name])
124
+ @private_headers_e.add_header([header_last_dir_name, header_dir, header_name])
125
+ @private_headers_e.add_header([header_relative_path, header_dir, header_name])
126
+ end
127
+ end
128
+ end
129
+ end
130
+
131
+ # Gen hmap file and vfs file
132
+ class HMapHelper
133
+ attr_reader :i_headers, :iquote_headers, :directory, :framework_entrys, :headers
134
+
135
+ def initialize(directory)
136
+ puts "Current hmap files dir: #{directory}"
137
+ @directory = Pathname(directory)
138
+ @framework_entrys = []
139
+ @headers = HMapHeaders.new
140
+ end
141
+
142
+ def write_hmapfile(name = nil)
143
+ return if directory.nil?
144
+
145
+ @headers.headers.each do |entry|
146
+ path = directory.join(entry.file_name(name))
147
+ hmap_write_headers_to_path(path, entry.headers)
148
+ end
149
+ end
150
+
151
+ def write_vfsfiles(name = '')
152
+ return if framework_entrys.empty?
153
+
154
+ vfs_directory = directory.join(name).join('vfs')
155
+ puts "Current vfs files dir: #{vfs_directory}"
156
+ Target::FrameworkVFS.new(framework_entrys).write(vfs_directory)
157
+ puts 'vfs files write finish.'
158
+ end
159
+
160
+ def write_hmap_vfs_to_paths(hmap_name = nil, vfs_name = '')
161
+ write_vfsfiles(vfs_name)
162
+ write_hmapfile(hmap_name)
163
+ end
164
+
165
+ def add_framework_entry(configurations, platforms,
166
+ name, framework_name, module_path, headers)
167
+ entry = Target::FrameworkEntry.new_entrys_from_configurations_platforms(configurations, platforms, name,
168
+ framework_name, module_path, headers)
169
+ @framework_entrys += entry
170
+ end
171
+
172
+ def header_mappings(headers, headers_sandbox, module_name, type)
173
+ @headers.add_headers(type, headers, module_name, headers_sandbox)
174
+ end
175
+
176
+ def xcconfig_header_setting(is_framework, path = nil, name = nil)
177
+ i_s = @headers.public_setting_for_options(path, name)
178
+ setting_values = [[BuildSettingConstants::INGERITED, i_s].join(' ')]
179
+ setting_values << xcconfig_vfs_setting(path) if is_framework
180
+ setting_values << @headers.private_setting_for_options(path, name)
181
+ setting_values.each_with_object({}) do |value, setting|
182
+ setting.merge!({
183
+ BuildSettingConstants::OTHER_CFLAGS => value,
184
+ BuildSettingConstants::OTHER_CPLUSPLUSFLAGS => value
185
+ }) { |_, oldval, newval| [oldval, newval].join(' ') }
186
+ end
187
+ end
188
+
189
+ private
190
+
191
+ def xcconfig_vfs_setting(path)
192
+ path = directory if path.nil?
193
+ "-ivfsoverlay \"#{path}/vfs/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/all-product-headers.yaml\""
194
+ end
195
+
196
+ def i_headers_name(name)
197
+ directory.join("#{name}.hmap")
198
+ end
199
+
200
+ def iquote_headers_name
201
+ directory.join("#{name}-iquote.hmap")
202
+ end
203
+
204
+ def hmap_write_headers_to_path(path, headers)
205
+ return if headers.empty?
206
+
207
+ print "\t - Save hmap file to path: "
208
+ puts path.to_s.yellow
209
+ HMapSaver.new_from_buckets(headers).write_to(path)
210
+ end
211
+ end
212
+ end